changeset 2544:9ac44adeeec1

Merge remote-tracking branch 'github/merge-requests/464' * github/merge-requests/464: Eliminate some deprecations
author Klaus Ethgen <Klaus@Ethgen.de>
date Sat, 08 Jul 2017 10:32:34 +0100
parents 85a4f55d2b33 (diff) 09b3121f1975 (current diff)
children 232c912de355 73e74df0f3a3 6e9aad93a5c0
files
diffstat 120 files changed, 15427 insertions(+), 9732 deletions(-) [+]
line wrap: on
line diff
--- a/.gitignore	Wed Jan 11 22:00:49 2017 +0000
+++ b/.gitignore	Sat Jul 08 10:32:34 2017 +0100
@@ -73,6 +73,10 @@
 /src/pan-view/.deps
 /src/pan-view/.dirstamp
 
+# /src/view_file/
+/src/view_file/.deps
+/src/view_file/.dirstamp
+
 /build-stamp
 /debian/geeqie*
 /debian/files
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.travis.yml	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,32 @@
+language: c
+os: linux
+dist: trusty
+sudo: required
+compiler:
+  - gcc
+  - clang
+addons:
+  apt:
+    sources:
+      - trusty
+    packages:
+      - autoconf
+      - automake
+      - autotools-dev
+      - build-essential
+      - debhelper
+      - dh-autoreconf
+      - dpkg-dev
+      - gnome-doc-utils
+      - gnome-doc-utils
+      - imagemagick
+      - intltool
+      - libexiv2-dev
+      - libgtk2.0-dev
+      - libjpeg-dev
+      - liblcms2-dev
+      - liblircclient-dev
+      - liblua5.1-0-dev
+      - libtiff-dev
+      - libtool
+script: (CFLAGS= ./autogen.sh) && make
--- a/Makefile.am	Wed Jan 11 22:00:49 2017 +0000
+++ b/Makefile.am	Sat Jul 08 10:32:34 2017 +0100
@@ -8,7 +8,7 @@
 man_MANS = geeqie.1
 
 readmedir = @readmedir@
-readme_DATA = README COPYING ChangeLog TODO README.lirc
+readme_DATA = README.md COPYING ChangeLog TODO README.lirc
 
 desktopdir = $(datadir)/applications
 desktop_in_files = geeqie.desktop.in
--- a/README	Wed Jan 11 22:00:49 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,331 +0,0 @@
-      ###################################################################
-      ##                          Geeqie x.x                           ##
-      ##                                                               ##
-      ##              Copyright (C) 2008 - 2016 The Geeqie Team        ##
-      ##              Copyright (C) 1999 - 2006 John Ellis.            ##
-      ##                                                               ##
-      ##                      Use at your own risk!                    ##
-      ##                                                               ##
-      ##  This software released under the GNU General Public License. ##
-      ##       Please read the COPYING file for more information.      ##
-      ###################################################################
-
-This is Geeqie, a successor of GQview.
-
-Geeqie has been forked from GQview project, because it was not possible to
-contact GQview author and the only maintainer. Geeqie projects goal is to move
-the development forward and also integrate the existing patches.
-
-Geeqie is currently considered stable. Please report any crash or odd behavior
-to the [mailing list](https://lists.sourceforge.net/lists/listinfo/geeqie-devel)
-and/or to [Github](https://github.com/BestImageViewer/geeqie/issues)
-
-For more info see: http://www.geeqie.org/
-
-Please send any question or suggestions to geeqie-devel@lists.sourceforge.net or
-open an issue on Github (https://github.com/BestImageViewer/geeqie/issues)
-
-# README contents:
-
-    * Requirements
-    * Notes and changes for this release
-    * Installation
-    * Description / Features
-    * Documentation (keyboard shortcuts)
-    * Editor command macros
-    * Additional comments
-    * Translation status
-    * Credits
-
-## Requirements
-
-  Required libraries:
-    GTK+ 3.00
-               www.gtk.org
-               enabled by default
-               disable with configure option: --disable-gtk3
-    or
-    GTK+ 2.20
-               disabled by default when GTK+3 libraries are found.
-               enable with configure option: --disable-gtk3
-	       optional items map display and GPU acceleration are not available
-	       with GTK2
-
-	       Note: GTK+3 is still somehow experimental. It is needed for some
-	       features but we have several complains about the GTK+3 usability.
-
-	       So if you need a stable version, you are advised to compile it
-	       with GTK+2. If you want to play with the cool new features, use
-	       GTK+3.
-
-  Optional libraries:
-    lcms2 2.0
-    or
-    lcms 1.14
-               www.littlecms.com
-               for color management support
-               enabled by default
-               disable with configure option: --disable-lcms
-
-    exiv2 0.11
-               www.exiv2.org
-               for enhanced exif support
-               enabled by default
-               disable with configure option: --disable-exiv2
-
-    lirc
-               www.lirc.org
-               for remote control support
-               enabled by default
-               disable with configure option: --disable-lirc
-
-    libchamplain-gtk 0.12
-    libchamplain 0.12
-    libclutter 1.0
-               wiki.gnome.org/Projects/libchamplain
-               for map display
-               disabled by default
-               enable with configure option: --enable-map
-               enabling will also enable GPU acceleration
-
-    libclutter 1.0
-               www.clutter-project.org
-               for GPU acceleration (a check-box on Preferences/Image must also be ticked)
-               disabled by default
-               enable with configure option: --enable-gpu-accel
-               explicitly disabling will also disable the map feature
-
-    lua 5.1
-               www.lua.org
-               support for lua scripting
-               enabled by default
-               disable with configure option: --disable-lua
-
-## Notes and changes for this release            [section:release_notes]
-
-See NEWS file.
-
-  Code hackers:
-
-    If you plan on making any major changes to the code that will be offered for
-    inclusion to the main source, please contact us first - so that we can avoid
-    duplication of effort.
-                                                         The Geeqie Team
-
-  Known bugs:
-
-    See the Geeqie Bug Tracker at https://github.com/BestImageViewer/geeqie/issues
-
-## Installation
-
-  Compilation: ./autogen.sh ; make
-  Show compile options: ./autogen.sh --help
-  General install: make install
-  Removal: make uninstall
-
-## Description / Features
-
-  Geeqie is a graphics file viewer. Basic features:
-
-    - Single click image viewing / navigation.
-    - Zoom functions.
-    - Thumbnails, with optional caching and .xvpics support.
-    - Multiple file selection for move, copy, delete, rename, drag and drop.
-    - Drag and drop.
-    - Slideshow.
-    - Full screen.
-    - Ability to open images in external editors (configurable).
-    - Collections.
-    - Comparison of images to find duplicates by name, size, date,
-      dimensions, or image content similarity.
-      - Rotation invariant detection
-    - EXIF support.
-    - support for stereoscopic images
-      - input: side-by-side (JPS) and MPO format
-      - output: single image, anaglyph, SBS, mirror, SBS half size (3DTV)
-
-## Credits                                             [section:credits]
-
-  Translations:
-
-     Grzegorz Kowal <g_kowal@poczta.onet.pl>
-     Zbigniew Chyla <cyba@gnome.pl>
-     Emil Nowak <emil5@go2.pl>
-     Wit Wilinski <wit.wilinski@gmail.com>
-     Tomasz Golinski <tomaszg@math.uwb.edu.pl>
-         for Polish translation
-
-     Christopher R. Gabriel <cgabriel@pluto.linux.it>
-     Di Maggio Salvatore <Salvatore.Dimaggio@bologna.marelli.it>
-     Costantino <inverness1ATvirgilio.it>
-         for Italian translation
-
-     Sandokan <cortex@nextra.sk>
-     Ivan Priesol <priesol@iris-sk.sk>
-     Mgr. Peter Tuharsky <tuharsky@misbb.sk>
-         for Slovak translation
-
-     Rodrigo Sancho Senosiain <ruy_ikari@bigfoot.com>
-     Ariel Fermani <the_end@bbs.frc.utn.edu.ar>
-         for Spanish translation
-
-     Laurent Monin <i18n@norz.org>
-     Eric Lassauge <lassauge@users.sf.net>
-     Jean-Pierre Pedron <jppedron@club-internet.fr>
-     Pascal Bleser <pascal.bleser@atosorigin.com>
-     Nicolas Boos <nicolas.boos@wanadoo.fr>
-     Nicolas Bonifas <nicolas_bonifas@users.sf.net>
-         for French translation
-
-     Fâtih Demir <kabalak@gmx.net>
-         for Turkish translation
-
-     Kam Tik <kamtik@hongkong.com>
-     Abel Cheung <deaddog@deaddog.ws>
-     S.J. Luo <crystal@mickey.ee.nctu.edu.tw>
-     Levin <zjlevin@hotmail.com>
-         for Traditional Chinese (Big5) translation
-
-     Junichi Uekawa <dancer@debian.org>
-     Oleg Andrjushenko <oandr@itec.cn.ua>
-     Michael Bravo <mbravo@tag-ltd.spb.ru>
-     Sergey Pinaev <dfo@antex.ru>
-         for Russian translation
-
-     Guilherme M. Schroeder <slump@ieg.com.br>
-     Vitor Fernandes <vitor_fernandes@SoftHome.net>
-     Herval Ribeiro de Azevêdo <heraze@gmail.com>
-         for Brazilian Portuguese translation
-
-     Shingo Akagaki <akagaki@ece.numazu-ct.ac.jp>
-     Yuuki Ninomiya <gm@debian.or.jp>
-     Sato Satoru <ss@gnome.gr.jp>
-     Takeshi AIHANA <aihana@gnome.gr.jp>
-         for Japanese translation
-
-     Matthias Warkus <mawarkus@t-online.de>
-     Thomas Klausner <wiz@danbala.ifoer.tuwien.ac.at>
-     Danny Milosavljevic <danny_milo@yahoo.com>
-     Ronny Steiner <Post@SIRSteiner.de>
-     Klaus Ethgen <Klaus@Ethgen.de>
-         for German translation
-
-     Matej Erman <matej.erman@guest.arnes.si>
-         for Slovene translation
-
-     MÃtyÃs Tibor <templar@tempi.scene.hu>
-     Koblinger Egmont <egmont@uhulinux.hu>
-     Sári Gábor <saga@externet.hu>
-         for Hungarian translation
-
-     Wu Yulun <migr@operamail.com>
-     Charles Wang <charlesw1234cn@yahoo.com.cn>
-         for simplified Chinese translation
-
-     H.J.Visser <H.J.Visser@harrie.mine.nu>
-     Tino Meinen <a.t.meinen@chello.nl>
-         for Dutch translation
-
-     Lauri Nurmi <lanurmi@iki.fi>
-         for Finnish translation
-
-     Ilmar Kerm <ikerm@hot.ee>
-         for Estonian translation
-
-     Volodymyr M. Lisivka <lvm@mystery.lviv.net>
-         for Ukrainian translation
-
-     Birger Langkjer <birger.langkjer@image.dk>
-         for Danish translation
-
-     Torgeir Ness Sundli <torgeir@mp3bil.no>
-         for Norwegian translation
-
-     Jan Raska <jan.raska@tiscali.cz>
-     Michal Bukovjan <bukm@centrum.cz>
-         for Czech translation
-
-     Phanumas Thanyaboon <maskung@hotmail.com>
-         for Thai translation
-
-     Harald Ersch <hersch@romatsa.ro>
-         for Romanian translation
-
-     pclouds <pclouds@vnlinux.org>
-         for Vietnamese translation
-
-     Tedi Heriyanto <tedi_h@gmx.net>
-         for Indonesian translation
-
-     Vladimir Petrov <vladux@mail.bg>
-         for Bulgarian translation
-
-     Hans Öfverbeck <hans.ofverbeck@home.se>
-         for Swedish translation
-
-     Youssef Assad <youssef@devcabal.org>
-         for Arabic translation
-
-     catux.org <mecatxis@ya.com>
-         for Catalan translation
-
-     Hyun-Jin Moon <moonhyunjin@gmail.com
-         for Korean translation
-
-     Pavel Piatruk <berserker@neolocation.com>
-         for Belarusian translation
-
-     Piarres Beobide <pi@beobide.net>
-         for Basque translation
-
-     Antonio C. Codazzi <f_sophia@libero.it>
-         for Esperanto translation
-
-     Nikos Papadopoulos
-	 for Greek translation
-
- Fixes, additions, and patches:
-
-     Eric Swalens
-     Quy Tonthat
-         for initial Exif support.
-
-     Daniel M. German <dmgerman at uvic.ca>
-         for Canon raw image support.
-
-     Lars Ellenberg
-         for Fujifilm raw image support.
-
-     Diederen Damien <D.Diederen@student.ulg.ac.be>
-         for .xvpics thumbnail reading support.
-
-     Nick Rusnov <nick@grawk.net>
-     Ryan Murray <rmurray@debian.org>
-         for man page.
-
-     Martin Pool <mbp@samba.org>
-         for sort by number, misc. improvements.
-
-     Jörg Mensmann <joerg.mensmann@gmx.de>
-         for Xinerama support patch.
-
-     Vadim Shliakhov
-         for miscellaneous fixes.
-
-     Uwe Ohse
-         for Exif enhancements, histogram and other patches
-
-     Timo Horstschäfer
-         for customizable fullscreen overlay
-
-     Michael Mokeev
-         for print related enhancements
-
-     Carles Pina i Estany
-         for copy path to clipboard patch
-
-     Kjell Morgenstern
-         for random slide show speedup patch
-
-     And...
-         Thanks to the users for finding Geeqie useful.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,335 @@
+      ###################################################################
+      ##                          Geeqie x.x                           ##
+      ##                                                               ##
+      ##              Copyright (C) 2008 - 2016 The Geeqie Team        ##
+      ##              Copyright (C) 1999 - 2006 John Ellis.            ##
+      ##                                                               ##
+      ##                      Use at your own risk!                    ##
+      ##                                                               ##
+      ##  This software released under the GNU General Public License. ##
+      ##       Please read the COPYING file for more information.      ##
+      ###################################################################
+
+This is Geeqie, a successor of GQview.
+
+[![Build Status](https://api.travis-ci.org/BestImageViewer/geeqie.svg?branch=master)](https://travis-ci.org/BestImageViewer/geeqie)
+
+Geeqie has been forked from GQview project, because it was not possible to
+contact GQview author and the only maintainer. Geeqie projects goal is to move
+the development forward and also integrate the existing patches.
+
+Geeqie is currently considered stable. Please report any crash or odd behavior
+to the [mailing list](https://lists.sourceforge.net/lists/listinfo/geeqie-devel)
+and/or to [Github](https://github.com/BestImageViewer/geeqie/issues)
+
+For more info see: http://www.geeqie.org/
+
+Please send any question or suggestions to geeqie-devel@lists.sourceforge.net or
+open an issue on Github (https://github.com/BestImageViewer/geeqie/issues)
+
+# README contents:
+
+* Requirements
+* Notes and changes for this release
+* Installation
+* Description / Features
+* Documentation (keyboard shortcuts)
+* Editor command macros
+* Additional comments
+* Translation status
+* Credits
+
+## Requirements
+
+### Required libraries:
+    GTK+ 3.00
+        www.gtk.org
+        enabled by default
+        disable with configure option: --disable-gtk3
+    or
+    GTK+ 2.20
+        disabled by default when GTK+3 libraries are found.
+        enable with configure option: --disable-gtk3
+        optional items map display and GPU acceleration are not available
+        with GTK2
+
+        Note: GTK+3 is still somehow experimental. It is needed for some
+        features but we have several complains about the GTK+3 usability.
+
+        So if you need a stable version, you are advised to compile it
+        with GTK+2. If you want to play with the cool new features, use
+        GTK+3.
+
+### Optional libraries:
+    lcms2 2.0
+    or
+    lcms 1.14
+        www.littlecms.com
+        for color management support
+        enabled by default
+        disable with configure option: --disable-lcms
+
+    exiv2 0.11
+        www.exiv2.org
+        for enhanced exif support
+        enabled by default
+        disable with configure option: --disable-exiv2
+
+    lirc
+        www.lirc.org
+        for remote control support
+        enabled by default
+        disable with configure option: --disable-lirc
+
+    libchamplain-gtk 0.12
+    libchamplain 0.12
+    libclutter 1.0
+        wiki.gnome.org/Projects/libchamplain
+        for map display
+        disabled by default
+        enable with configure option: --enable-map
+        enabling will also enable GPU acceleration
+
+    libclutter 1.0
+        www.clutter-project.org
+        for GPU acceleration (a check-box on Preferences/Image must also be ticked)
+        disabled by default
+        enable with configure option: --enable-gpu-accel
+        explicitly disabling will also disable the map feature
+
+    lua 5.1
+        www.lua.org
+        support for lua scripting
+        enabled by default
+        disable with configure option: --disable-lua
+
+## Notes and changes for this release            [section:release_notes]
+
+See NEWS file.
+
+### Code hackers:
+
+If you plan on making any major changes to the code that will be offered for
+inclusion to the main source, please contact us first - so that we can avoid
+duplication of effort.
+                                                         The Geeqie Team
+
+### Known bugs:
+
+See the Geeqie Bug Tracker at https://github.com/BestImageViewer/geeqie/issues
+
+## Installation
+
+Compilation: `./autogen.sh ; make`
+
+Show compile options: `./autogen.sh --help`
+
+General install: `make install`
+
+Removal: `make uninstall`
+
+## Description / Features
+
+Geeqie is a graphics file viewer. Basic features:
+
+* Single click image viewing / navigation.
+* Zoom functions.
+* Thumbnails, with optional caching and .xvpics support.
+* Multiple file selection for move, copy, delete, rename, drag and drop.
+* Drag and drop.
+* Slideshow.
+* Full screen.
+* Ability to open images in external editors (configurable).
+* Collections.
+* Comparison of images to find duplicates by name, size, date, dimensions, or image content similarity.
+    * Rotation invariant detection
+* EXIF support.
+* support for stereoscopic images
+    * input: side-by-side (JPS) and MPO format
+    * output: single image, anaglyph, SBS, mirror, SBS half size (3DTV)
+
+## Credits                                             [section:credits]
+
+### Translations:
+
+    Grzegorz Kowal <g_kowal@poczta.onet.pl>
+    Zbigniew Chyla <cyba@gnome.pl>
+    Emil Nowak <emil5@go2.pl>
+    Wit Wilinski <wit.wilinski@gmail.com>
+    Tomasz Golinski <tomaszg@math.uwb.edu.pl>
+        for Polish translation
+
+    Christopher R. Gabriel <cgabriel@pluto.linux.it>
+    Di Maggio Salvatore <Salvatore.Dimaggio@bologna.marelli.it>
+    Costantino <inverness1ATvirgilio.it>
+        for Italian translation
+
+    Sandokan <cortex@nextra.sk>
+    Ivan Priesol <priesol@iris-sk.sk>
+    Mgr. Peter Tuharsky <tuharsky@misbb.sk>
+        for Slovak translation
+
+    Rodrigo Sancho Senosiain <ruy_ikari@bigfoot.com>
+    Ariel Fermani <the_end@bbs.frc.utn.edu.ar>
+        for Spanish translation
+
+    Laurent Monin <i18n@norz.org>
+    Eric Lassauge <lassauge@users.sf.net>
+    Jean-Pierre Pedron <jppedron@club-internet.fr>
+    Pascal Bleser <pascal.bleser@atosorigin.com>
+    Nicolas Boos <nicolas.boos@wanadoo.fr>
+    Nicolas Bonifas <nicolas_bonifas@users.sf.net>
+        for French translation
+
+    Fâtih Demir <kabalak@gmx.net>
+        for Turkish translation
+
+    Kam Tik <kamtik@hongkong.com>
+    Abel Cheung <deaddog@deaddog.ws>
+    S.J. Luo <crystal@mickey.ee.nctu.edu.tw>
+    Levin <zjlevin@hotmail.com>
+        for Traditional Chinese (Big5) translation
+
+    Junichi Uekawa <dancer@debian.org>
+    Oleg Andrjushenko <oandr@itec.cn.ua>
+    Michael Bravo <mbravo@tag-ltd.spb.ru>
+    Sergey Pinaev <dfo@antex.ru>
+        for Russian translation
+
+    Guilherme M. Schroeder <slump@ieg.com.br>
+    Vitor Fernandes <vitor_fernandes@SoftHome.net>
+    Herval Ribeiro de Azevêdo <heraze@gmail.com>
+        for Brazilian Portuguese translation
+
+    Shingo Akagaki <akagaki@ece.numazu-ct.ac.jp>
+    Yuuki Ninomiya <gm@debian.or.jp>
+    Sato Satoru <ss@gnome.gr.jp>
+    Takeshi AIHANA <aihana@gnome.gr.jp>
+        for Japanese translation
+
+    Matthias Warkus <mawarkus@t-online.de>
+    Thomas Klausner <wiz@danbala.ifoer.tuwien.ac.at>
+    Danny Milosavljevic <danny_milo@yahoo.com>
+    Ronny Steiner <Post@SIRSteiner.de>
+    Klaus Ethgen <Klaus@Ethgen.de>
+        for German translation
+
+    Matej Erman <matej.erman@guest.arnes.si>
+        for Slovene translation
+
+    MÃtyÃs Tibor <templar@tempi.scene.hu>
+    Koblinger Egmont <egmont@uhulinux.hu>
+    Sári Gábor <saga@externet.hu>
+        for Hungarian translation
+
+    Wu Yulun <migr@operamail.com>
+    Charles Wang <charlesw1234cn@yahoo.com.cn>
+        for simplified Chinese translation
+
+    H.J.Visser <H.J.Visser@harrie.mine.nu>
+    Tino Meinen <a.t.meinen@chello.nl>
+        for Dutch translation
+
+    Lauri Nurmi <lanurmi@iki.fi>
+        for Finnish translation
+
+    Ilmar Kerm <ikerm@hot.ee>
+        for Estonian translation
+
+    Volodymyr M. Lisivka <lvm@mystery.lviv.net>
+        for Ukrainian translation
+
+    Birger Langkjer <birger.langkjer@image.dk>
+        for Danish translation
+
+    Torgeir Ness Sundli <torgeir@mp3bil.no>
+        for Norwegian translation
+
+    Jan Raska <jan.raska@tiscali.cz>
+    Michal Bukovjan <bukm@centrum.cz>
+        for Czech translation
+
+    Phanumas Thanyaboon <maskung@hotmail.com>
+        for Thai translation
+
+    Harald Ersch <hersch@romatsa.ro>
+        for Romanian translation
+
+    pclouds <pclouds@vnlinux.org>
+        for Vietnamese translation
+
+    Tedi Heriyanto <tedi_h@gmx.net>
+        for Indonesian translation
+
+    Vladimir Petrov <vladux@mail.bg>
+        for Bulgarian translation
+
+    Hans Öfverbeck <hans.ofverbeck@home.se>
+        for Swedish translation
+
+    Youssef Assad <youssef@devcabal.org>
+        for Arabic translation
+
+    catux.org <mecatxis@ya.com>
+        for Catalan translation
+
+    Hyun-Jin Moon <moonhyunjin@gmail.com
+        for Korean translation
+
+    Pavel Piatruk <berserker@neolocation.com>
+        for Belarusian translation
+
+    Piarres Beobide <pi@beobide.net>
+        for Basque translation
+
+    Antonio C. Codazzi <f_sophia@libero.it>
+        for Esperanto translation
+
+    Nikos Papadopoulos
+        for Greek translation
+
+### Fixes, additions, and patches:
+
+    Eric Swalens
+    Quy Tonthat
+        for initial Exif support.
+
+    Daniel M. German <dmgerman at uvic.ca>
+        for Canon raw image support.
+
+    Lars Ellenberg
+        for Fujifilm raw image support.
+
+    Diederen Damien <D.Diederen@student.ulg.ac.be>
+        for .xvpics thumbnail reading support.
+
+    Nick Rusnov <nick@grawk.net>
+    Ryan Murray <rmurray@debian.org>
+        for man page.
+
+    Martin Pool <mbp@samba.org>
+        for sort by number, misc. improvements.
+
+    Jörg Mensmann <joerg.mensmann@gmx.de>
+        for Xinerama support patch.
+
+    Vadim Shliakhov
+        for miscellaneous fixes.
+
+    Uwe Ohse
+        for Exif enhancements, histogram and other patches
+
+    Timo Horstschäfer
+        for customizable fullscreen overlay
+
+    Michael Mokeev
+        for print related enhancements
+
+    Carles Pina i Estany
+        for copy path to clipboard patch
+
+    Kjell Morgenstern
+        for random slide show speedup patch
+
+    And...
+        Thanks to the users for finding Geeqie useful.
--- a/configure.in	Wed Jan 11 22:00:49 2017 +0000
+++ b/configure.in	Sat Jul 08 10:32:34 2017 +0100
@@ -25,13 +25,16 @@
 
 AC_CONFIG_AUX_DIR(auxdir)
 # Require Automake 1.14 for %reldir% support
-AM_INIT_AUTOMAKE([1.14.1 subdir-objects])
+AM_INIT_AUTOMAKE([1.14.1 subdir-objects foreign])
 
 AC_CONFIG_HEADER([config.h])
 
 # Only for developers
 AM_MAINTAINER_MODE
 
+# Silent build for automake >= 1.11
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
 AC_ARG_ENABLE(developer, [
 Development options:
 AC_HELP_STRING([--enable-developer], [turn on developers mode [default=no]])],
--- a/doc/docbook/GuideCollections.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideCollections.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -29,6 +29,23 @@
     </menuchoice>
     . A dialog will appear requesting the location of the collection file. A window will the open containing the selected collection. Recently opened or saved collections can also be opened by selecting the collection's file name from the Open recent sub menu of the file menu.
   </para>
+  <para>
+    To delete or rename a collection, select
+    <menuchoice>
+      <shortcut>
+        <keycombo>
+          <keycap>O</keycap>
+        </keycombo>
+      </shortcut>
+      <guimenu>File</guimenu>
+      <guimenuitem>Open collection</guimenuitem>
+    </menuchoice>
+    , right-click on the collection you wish to delete or rename, and then select
+    <emphasis role="strong">Delete</emphasis>
+    or
+    <emphasis role="strong">Rename</emphasis>
+    .
+  </para>
   <para>The collection window consists of a pane to display the contents of the collection, and a status bar along the bottom of the window.</para>
   <para />
   <section id="Iconpane">
@@ -76,4 +93,18 @@
     </note>
     <para />
   </section>
+  <section id="AppendImages">
+    <title>Append Images</title>
+    <para>Right-click menu items permit images to be appended from either another collection or from the currently selected folder.</para>
+    <para />
+  </section>
+  <section id="RandomizedSort">
+    <title>Randomized Sort</title>
+    <para>
+      Right-click menu item
+      <emphasis role="strong">Sort</emphasis>
+      , in addition to the standard sort methods, permits images to be randomly arranged.
+    </para>
+    <para />
+  </section>
 </section>
--- a/doc/docbook/GuideEditorsConfig.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideEditorsConfig.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -214,7 +214,11 @@
       <programlisting>X-Geeqie-Filter=true</programlisting>
     </para>
     <para>
-      When the external editor is executed, you are presented with a dialogue which enables a path to be selected. The path selected, appended by the filename currently being processed, is made available to the editor script either as an environment variable or via a call to geeqie --remote. The following code demonstrates the use of both methods:
+      Desktop files containing this entry will be displayed in the Folder action list of the
+      <link linkend="CopyMoveandLink" endterm="titleGuideSidebarsSortManager" />
+      . The path of the bookmark clicked will be used by the desktop file.
+      <para />
+      If the desktop file is called from the menu, when the external editor is executed you are presented with a dialogue which enables a path to be selected. The path selected, appended by the filename currently being processed, is made available to the editor script either as an environment variable or via a call to geeqie --remote. The following code demonstrates the use of both methods:
       <programlisting xml:space="preserve">
         for file in "$@"
         do
--- a/doc/docbook/GuideFaq.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideFaq.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -47,4 +47,45 @@
       <para />
     </section>
   </section>
-</chapter>
+  <section id="ExifRotation">
+    <title>Exif Auto Rotation</title>
+    <para />
+    <section id="HowdotheExifauto-rotationcommandswork">
+      <title>How do the Exif auto-rotation commands work?</title>
+      <para>
+        Image auto-rotation works in either of two modes, set by
+        <link linkend="MetadataMiscellaneous">Write altered image orientation to the metadata</link>
+        option.
+      </para>
+      <para>
+        <guilabel>Write altered image orientation to the metadata not set</guilabel>
+        <para />
+        If you change the orientation of an image using any of the available commands, the image will always be displayed in the modified orientation. This new orientation is stored in temporary data structures associated with each image file. When Geeqie closes, these changes will be lost.
+      </para>
+      <warning>
+        <para>It is not possible to determine if the image as displayed is the original image or one which has been temporarily rotated.</para>
+      </warning>
+      <para>
+        If the option
+        <link linkend="Editmenu">Auto rotate image using EXIF information</link>
+        is selected, any images which have Exif orientation data will also be shown rotated. However, any rotation you have selected manually will always over-ride the embedded Exif rotation value.
+      </para>
+      <para>
+        <guilabel>Write altered image orientation to the metadata set</guilabel>
+        <para />
+        <para>If you change the orientation of an image using any of the available commands, this new orientation is stored in a metadata write queue.</para>
+        <para>
+          If the option
+          <link linkend="Editmenu">Auto rotate image using EXIF information</link>
+          is selected, any images which have Exif orientation data will be shown rotated, including any in the metadata write queue.
+        </para>
+        <para>
+          However if the option
+          <link linkend="Editmenu">Auto rotate image using EXIF information</link>
+          is not selected, no images will be auto-rotated. If you have manually rotated any images, the metadata write icon on the status bar will alert you to that fact. Clicking the icon will give a list of the modified files.
+        </para>
+      </para>
+      <para />
+    </section>
+  </section>
+</chapter>
--- a/doc/docbook/GuideImageSearchFindingDuplicates.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideImageSearchFindingDuplicates.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -132,9 +132,7 @@
         </term>
         <listitem>
           <para>
-            Similar image content, the value to use to consider two images a match is configured in the
-            <link linkend="GuideOptionsBehavior">Behaviour tab</link>
-            of the preferences dialog by setting <emphasis>Custom similarity threshold</emphasis>.
+            The percentage value to used to consider two images a match is configured in the spin box at the bottom of the window.
           </para>
         </listitem>
       </varlistentry>
@@ -183,6 +181,18 @@
     <title>Thumbnails</title>
     <para>Thumbnails can be displayed beside each image in the result list by enabling the Thumbnails check box.</para>
   </section>
+  <section id="Rotation">
+    <title>Ignore Rotation</title>
+    <para>When checked, the rotational orientation of images will be ignored.</para>
+  </section>
+  <section id="Sort">
+    <title>Sort</title>
+    <para>
+      The normal sort order is for groups (in the case of Similarity checks) with the highest number of near-100% matches to be at the top of the list.
+      <para />
+      If this box is checked, groups with the lowest number of matches are placed at the top of the list.
+    </para>
+  </section>
   <section id="Comparetwofilesets">
     <title>Compare two file sets</title>
     <para>Sometimes it is useful to compare one group of files to another, different group of files. Enable this check box to compare two groups of files. When enabled, a second list will appear and files can be added to this list using the same methods for the main list.</para>
@@ -200,4 +210,4 @@
     </para>
     <para />
   </section>
-</section>
+</section>
--- a/doc/docbook/GuideImageSearchSearch.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideImageSearchSearch.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -101,7 +101,11 @@
               </guiicon>
             </guibutton>
           </code>
-          button displays a pop up calendar to enter the date
+          button displays a pop up calendar to enter the date.
+          <para />
+          The
+          <emphasis role="strong">Exif date</emphasis>
+          checkbox permits searches to be made on the exif date of images. If an image does not have an exif date, it will default to 01 January 1970.
         </listitem>
       </varlistentry>
       <varlistentry>
@@ -132,6 +136,31 @@
         </term>
         <listitem>The search will match if the file's associated keywords match all, match any, or exclude the entered keywords, depending on the method selected from the drop down menu. Keywords can be separated with a space, comma, or tab character.</listitem>
       </varlistentry>
+      <varlistentry>
+        <term>
+          <guilabel>Geocoded position</guilabel>
+        </term>
+        <listitem>
+          The search will match if the file's GPS position is less than or greater than the selected distance from the specified position, or is not geocoded, depending on the method selected from the drop down menu.
+          The search location can be specified by
+          <itemizedlist>
+            <listitem>
+              Type in a latitude/longitude in the format
+              <code>89.123 179.123</code>
+            </listitem>
+            <listitem>Drag-and-drop a geocoded image onto the search box</listitem>
+            <listitem>If Geeqie's map is displayed, a left-click on the map will store the latitude/longitude under the mouse cursor into the clipboard. It can then be pasted into the search box.</listitem>
+            <listitem>Copy-and-paste (in some circumstances drag-and-drop) the result of an Internet search.</listitem>
+          </itemizedlist>
+          <note>
+            In this last case, the result of a search may contain the latitude/longitude embedded in the URL. This may be automatically decoded with the help of an external file:-
+            <programlisting xml:space="preserve">~/.config/geeqie/geocode-parameters.awk</programlisting>
+            See
+            <link linkend="GuideReferenceDecodeLatLong">Decoding Latitude and Longitude</link>
+            for details on how to create this file.
+          </note>
+        </listitem>
+      </varlistentry>
     </variablelist>
     <para />
     <para />
@@ -210,4 +239,4 @@
     <para>Drag and drop can be initiated with the primary or middle mouse buttons. Dragging a file that is selected will include all selected files in the drag. Dragging a file that is not selected will first change the selection to the dragged file, and clear the previous selection.</para>
     <para />
   </section>
-</section>
+</section>
--- a/doc/docbook/GuideMainWindowFolderPane.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideMainWindowFolderPane.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -183,13 +183,49 @@
   </section>
   <section id="Folderlist">
     <title>Folder list</title>
-    <para>This displays a list of sub folders contained in the active folder, or a tree that includes all folders in the file system.</para>
-    <para>
-      A
-      <emphasis role="strong">context menu</emphasis>
-      can be displayed by clicking the right mouse button on the folder pane or pressing the menu key while the folder pane has the focus
-    </para>
-    <para />
+    <para>This pane consists of two sections: a folder pane and a shortcuts pane. The shortcuts pane may be hidden or revealed simply by moving the vertical divider to or from the extreme left.</para>
+    <section id="folders">
+      <title>Folders</title>
+      <para>This displays a list of sub folders contained in the active folder, or a tree that includes all folders in the file system.</para>
+      <para>
+        A
+        <emphasis role="strong">context menu</emphasis>
+        can be displayed by clicking the right mouse button on the folder pane or pressing the menu key while the folder pane has the focus
+      </para>
+    </section>
+    <section id="Shortcutslist">
+      <title>Shortcuts</title>
+      <para>This is a list of shortcuts (bookmarks) to commonly used folders or images. A context menu will appear by right clicking on an item, or pressing the menu key when the item has the focus.</para>
+      <para>Folders or images can be added to the list by activating the Add button at the bottom of the pane, or dragging a folder or image onto the list.</para>
+      <para>
+        To edit an item select
+        <emphasis role="bold">Properties</emphasis>
+        from its context menu. A dialog will appear allowing the Name, Path, and Icon for the item to be changed. Select OK to close the dialog and apply the changes, or Cancel to close the dialog and discard the changes.
+      </para>
+      <para>
+        To change the order of the list, select
+        <emphasis role="bold">Move up</emphasis>
+        or
+        <emphasis role="bold">Move down</emphasis>
+        from the item's context menu. To move an item with the keyboard move the focus to that item, then press
+        <keycombo>
+          <keycap>Shift</keycap>
+          <keycap>Up</keycap>
+        </keycombo>
+        or
+        <keycombo>
+          <keycap>Shift</keycap>
+          <keycap>Down</keycap>
+        </keycombo>
+        to move the item.
+      </para>
+      <para>
+        To remove an item from the list select
+        <emphasis role="bold">Remove</emphasis>
+        from it's context menu.
+      </para>
+      <para />
+    </section>
   </section>
   <section id="Listview">
     <title>List view</title>
--- a/doc/docbook/GuideMainWindowImagePane.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideMainWindowImagePane.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -48,7 +48,6 @@
     </para>
     <para />
   </section>
-
   <section id="Imagepanningandmanipulation">
     <title>Image panning and manipulation</title>
     <para>When the image size is larger than the image pane, the visible region can be changed with the keyboard or mouse. The keyboard can also be used to adjust the orientation of the image.</para>
@@ -93,6 +92,20 @@
         <para>To start the smooth scroll function hold down the Shift key and click the primary mouse button. An icon will appear at the location of the mouse pointer, the mouse can then be positioned to pan the image. The image will pan in the direction of the mouse pointer relative to the icon. The pan speed will increase in proportion to the distance that the pointer is from the center of the icon. To end the smooth scroll function click the primary mouse button within the image pane.</para>
         <para />
       </section>
+      <section id="MouseWheelMode">
+        <title>Mouse Wheel Mode</title>
+        <para>A single click on the mouse middle button will toggle the function of the mouse wheel between "change image" and "change zoom".</para>
+        <note>
+          <para>
+            This option cannot be used if either the Preference
+            <emphasis>Mouse wheel scrolls image</emphasis>
+            or
+            <emphasis>Navigation by left or middle click on image</emphasis>
+            are selected.
+          </para>
+        </note>
+        <para>In Split View mode, each window can be clicked individually so that, in Quad View for example, Connected Zoom can be on 2, 3 or all 4 windows.</para>
+      </section>
     </section>
   </section>
   <section id="Navigation">
--- a/doc/docbook/GuideMainWindowMenus.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideMainWindowMenus.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -81,7 +81,14 @@
       </varlistentry>
       <varlistentry>
         <term>
-          <guimenu>Find duplicates…</guimenu>
+          <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>D</keycap>
+              </keycombo>
+            </shortcut>
+            <guimenu>Find duplicates...</guimenu>
+          </menuchoice>
         </term>
         <listitem>
           <para>Opens a new Find Duplicates window.</para>
@@ -253,7 +260,7 @@
           <menuchoice>
             <shortcut>
               <keycombo>
-                <keycap>4</keycap>
+                <keycap>Backspace</keycap>
               </keycombo>
             </shortcut>
             <guimenu>Previous Image</guimenu>
@@ -330,6 +337,12 @@
       <varlistentry>
         <term>
           <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>Ctrl</keycap>
+                <keycap>A</keycap>
+              </keycombo>
+            </shortcut>
             <guimenu>Select all</guimenu>
           </menuchoice>
         </term>
@@ -340,6 +353,13 @@
       <varlistentry>
         <term>
           <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>Ctrl</keycap>
+                <keycap>Shift</keycap>
+                <keycap>A</keycap>
+              </keycombo>
+            </shortcut>
             <guimenu>Select none</guimenu>
           </menuchoice>
         </term>
@@ -350,7 +370,14 @@
       <varlistentry>
         <term>
           <menuchoice>
-            <guimenu>Invert Selection</guimenu>
+            <shortcut>
+              <keycombo>
+                <keycap>Ctrl</keycap>
+                <keycap>Shift</keycap>
+                <keycap>I</keycap>
+              </keycombo>
+            </shortcut>
+            <guimenu>Invert selection</guimenu>
           </menuchoice>
         </term>
         <listitem>
@@ -360,6 +387,22 @@
       <varlistentry>
         <term>
           <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>Alt</keycap>
+                <keycap>R</keycap>
+              </keycombo>
+            </shortcut>
+            <guimenu>Rectangular selection</guimenu>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>Toggles rectangular selection mode for icons</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
             <guimenu>Copy path</guimenu>
           </menuchoice>
         </term>
@@ -370,6 +413,11 @@
       <varlistentry>
         <term>
           <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>M</keycap>
+              </keycombo>
+            </shortcut>
             <guimenu>Show marks</guimenu>
           </menuchoice>
         </term>
@@ -597,6 +645,18 @@
         </term>
         <listitem>
           <para>Swaps the top and bottom sides of the image, does not modify the file on disk.</para>
+          <warning>
+            <para>
+              The above orientation commands - Rotate, Mirror and Flip - do not change the image on disk. The changes will be lost when Geeqie closes. Refer to the
+              <link linkend="MetadataMiscellaneous">Metadata tab of the Preferences Dialog</link>
+              if you wish these changes to be written to metadata.
+            </para>
+            <para>
+              Refer also to the
+              <link linkend="HowdotheExifauto-rotationcommandswork">FAQ</link>
+              .
+            </para>
+          </warning>
         </listitem>
       </varlistentry>
       <varlistentry>
@@ -613,7 +673,19 @@
           </menuchoice>
         </term>
         <listitem>
-          <para>Removes all effects applied through the Adjust menu, reverting image to its original state.</para>
+          <para>Removes all temporary effects applied through the above commands, reverting the image according to its Exif Orientation tag.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <guilabel>Auto rotate image using EXIF information</guilabel>
+        </term>
+        <listitem>
+          <para>
+            Auto rotates images based on metadata stored in images that have Exif data. Refer also to the
+            <link linkend="HowdotheExifauto-rotationcommandswork">FAQ</link>
+            .
+          </para>
         </listitem>
       </varlistentry>
       <varlistentry>
@@ -624,9 +696,118 @@
           </menuchoice>
         </term>
         <listitem>
-          The commands above modifies image metadata only. This commands actually transforms image pixels. See
-          <link linkend="GuideImageManagementExternalEditing">Editors section</link>
-          for details
+          <para>This command affects only jpeg, tiff and png files. The image file on disk is rotated to the orientation as specified by its Exif Orientation tag.</para>
+          <warning>
+            <para>
+              The file rotate.desktop, using external commands exiftran, exiv2 and mogrify, is used to implement this command. Refer to
+              <link linkend="GuideImageManagementExternalEditing">Editors section</link>
+              for details.
+            </para>
+          </warning>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>[</keycap>
+              </keycombo>
+            </shortcut>
+            <guimenu>Orientation</guimenu>
+            <guimenuitem>Rotate counterclockwise</guimenuitem>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>Rotates the current image counterclockwise 90 degrees, does not modify the file on disk.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>Shift</keycap>
+                <keycap>R</keycap>
+              </keycombo>
+            </shortcut>
+            <guimenu>Orientation</guimenu>
+            <guimenuitem>Rotate 180</guimenuitem>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>Rotates the current image 180 degrees, does not modify the file on disk.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <guimenu>Orientation</guimenu>
+            <guimenuitem>Write orientation to file</guimenuitem>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>
+            Saves the current image orientation to the disk file. This operation can only be carried out on jpeg, tiff and png files. Jpeg rotations are lossless.
+            <note>
+              The Preferences/Metadata option "Write altered image orientation to the metadata" must be off.
+              <para />
+              Exiftran and mogrify must be installed.
+            </note>
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <guimenu>Orientation</guimenu>
+            <guimenuitem>Write orientation to file (preserve timestamp)</guimenuitem>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>As above, but the file date and time are preserved.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <guimenu>Rating</guimenu>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>Set a Rating value for each image.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>Alt+Keypad+n</keycap>
+              </keycombo>
+            </shortcut>
+            <guimenu>Rating</guimenu>
+            <guimenuitem>n</guimenuitem>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>"n" is in the range 0 to 5. Sets the Rating value for the image.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <shortcut>
+              <keycombo>
+                <keycap>Alt+Keypad+Minus</keycap>
+              </keycombo>
+            </shortcut>
+            <guimenu>Rating</guimenu>
+            <guimenuitem>-1</guimenuitem>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>Sets the Rating value to -1 for the image.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
@@ -1173,6 +1354,14 @@
       </varlistentry>
       <varlistentry>
         <term>
+          <guimenu>Hide Bars</guimenu>
+        </term>
+        <listitem>
+          <para>This item is intended to be used by its shortcut key - by default this is the backtick key. When pressed, the info sidebar, sort manager and file list will be hidden (if displayed). Pressing backtick again will revert the display to its previous layout.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
           <guimenu>Toggle slideshow</guimenu>
         </term>
         <listitem>
--- a/doc/docbook/GuideMainWindowStatusBar.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideMainWindowStatusBar.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -82,16 +82,82 @@
     <para>This section displays the dimensions (width x height) and file byte size of the image that is active in the image pane. When the format of the file in the image pane can not be determined the dimensions will show as “(0 x 0)”, in addition “(no read permision)” may appear if the file permissions do not allow reading the contents of the file.</para>
     <para />
   </section>
-  <section id="Zoom">
-    <title>Zoom</title>
-    <para>This section displays the current zoom ratio. A ratio of 1:1 is the image's original size. When the left number is larger the image is displayed larger than original size, when the right number is larger the image is displayed smaller.</para>
-    <para>A tilde (~) appears within the ratio display when the zoom is set to fit the image within the display area. In this zoom mode the ratio is automatically adjusted, and the displayed ratio may not be the actual ratio because the status bar display rounds the actual value to the nearest tenth (0.1).</para>
-    <para />
-  </section>
   <section id="Buttons">
     <title>Buttons</title>
     <para>Statusbar buttons corresponds to selected menu action.</para>
     <para />
+    <section id="Zoom">
+      <title>Zoom</title>
+      <para>The button label displays the current zoom ratio. A ratio of 1:1 is the image's original size. When the left number is larger the image is displayed larger than original size, when the right number is larger the image is displayed smaller.</para>
+      <para>A tilde (~) appears within the ratio display when the zoom is set to fit the image within the display area. In this zoom mode the ratio is automatically adjusted, and the displayed ratio may not be the actual ratio because the status bar display rounds the actual value to the nearest tenth (0.1).</para>
+      <para />
+      <para>Clicking this button permits control of the behavior of the zoom and scroll settings used when changing the displayed image.</para>
+      <variablelist>
+        <varlistentry>
+          <term>
+            <guilabel>Zoom to original size</guilabel>
+          </term>
+          <listitem>
+            <para>The new image is set to its original size.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term>
+            <guilabel>Fit image to window</guilabel>
+          </term>
+          <listitem>
+            <para>The new image's zoom is changed so that the image will fit within the current view area.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term>
+            <guilabel>Leave zoom at previous setting</guilabel>
+          </term>
+          <listitem>
+            <para>The zoom setting is unchanged, the new image will be scaled the same as the previous image.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+      <variablelist>
+        <varlistentry>
+          <term>
+            <guilabel>Scroll to top left corner</guilabel>
+          </term>
+          <listitem>
+            <para>The new image is displayed from top left corner.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term>
+            <guilabel>Scroll to image center</guilabel>
+          </term>
+          <listitem>
+            <para>The new image is centered</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term>
+            <guilabel>Keep the region from previous iamge</guilabel>
+          </term>
+          <listitem>
+            <para>The new image is positioned as the previous one, whenever possible.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+    </section>
+    <section id="ExifRotate">
+      <title>Exif rotate</title>
+      <para>
+        <guiicon>
+          <inlinegraphic fileref="gtk-color-picker.png" />
+        </guiicon>
+        Toggles the auto-rotation of images if they have Exif orientation data.
+        Refer also to the
+        <link linkend="HowdotheExifauto-rotationcommandswork">FAQ</link>
+        .
+      </para>
+      <para />
+    </section>
     <section id="ShowPixelInfo">
       <title>Show Pixel Info</title>
       <para>
@@ -123,4 +189,4 @@
       <para />
     </section>
   </section>
-</section>
+</section>
--- a/doc/docbook/GuideOptionsBehavior.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideOptionsBehavior.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -99,14 +99,6 @@
     <variablelist>
       <varlistentry>
         <term>
-          <guilabel>Rectangular selection in icon view</guilabel>
-        </term>
-        <listitem>
-          <para>Enable this to change the selection method used when selecting multiple items in an icon view.</para>
-        </listitem>
-      </varlistentry>
-      <varlistentry>
-        <term>
           <guilabel>Descend folders in tree view</guilabel>
         </term>
         <listitem>
@@ -126,10 +118,18 @@
       </varlistentry>
       <varlistentry>
         <term>
-          <guilabel>Open recent list maximum size</guilabel>
+          <guilabel>List directory view uses single click to enter</guilabel>
         </term>
         <listitem>
-          <para>This is the number of entries saved in the recent open file list.</para>
+          <para>If selected, a single click will enter a directory, rather than the GTK+ default of a double click.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <guilabel>Recent folder list maximum size</guilabel>
+        </term>
+        <listitem>
+          <para>This is the number of entries to be saved from the recent open folder list drop-down box. The number of entries displayed in the current session is unlimited.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
@@ -155,6 +155,14 @@
       </varlistentry>
       <varlistentry>
         <term>
+          <guilabel>Keyboard scrolling step multiplier:</guilabel>
+        </term>
+        <listitem>
+          <para>Defines the amount to pan an image when using the keyboard arrows.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
           <guilabel>Mouse wheel scrolls image</guilabel>
         </term>
         <listitem>
@@ -167,23 +175,12 @@
           </para>
         </listitem>
       </varlistentry>
-    </variablelist>
-  </section>
-  <section id="Miscellaneous">
-    <title>Miscellaneous</title>
-    <variablelist>
       <varlistentry>
         <term>
-          <guilabel>Custom similarity threshold</guilabel>
+          <guilabel>Navigation by left or middle click on image</guilabel>
         </term>
         <listitem>
-          <para>
-            This setting is used by the compare method
-            <emphasis>Similarity (custom)</emphasis>
-            , located in the
-            <link linkend="GuideImageSearchFindingDuplicates" endterm="titleGuideImageSearchFindingDuplicates" />
-            section.
-          </para>
+          <para>If selected, mouse left-click will select the next image; mouse middle-click will select the previous image.</para>
         </listitem>
       </varlistentry>
     </variablelist>
@@ -199,6 +196,14 @@
           <para>Displayed when compiled with the option --enable-debug-log. This defines the verbosity of debug info sent to console and log window (0 disables the debug output).</para>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term>
+          <guilabel>Log Window max. lines</guilabel>
+        </term>
+        <listitem>
+          <para>The maximum number of data lines to be displayed. The window will show the most recent data.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </section>
 </section>
--- a/doc/docbook/GuideOptionsGeneral.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideOptionsGeneral.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -68,7 +68,8 @@
         <listitem>
           <para>
             Enable this to save thumbnails to disk, subsequent requests for a thumbnail will be faster. Thumbnails are cached into:
-            <programlisting>$HOME/.cache/.geeqie/thumbnails</programlisting>
+            <programlisting>$XDG_CACHE_HOME/geeqie/thumbnails/</programlisting>
+            <programlisting>($~/.cache/geeqie/thumbnails/)</programlisting>
             Refer to
             <link linkend="GuideReferenceThumbnails">Thumbnails Reference</link>
             for additional details.
@@ -203,4 +204,19 @@
       </varlistentry>
     </variablelist>
   </section>
+  <section id="InfoSidebar">
+    <title>Info Sidebar component heights</title>
+    <para>
+      The heights of the following components can be set individually:
+      <itemizedlist>
+        <listitem>Keywords</listitem>
+        <listitem>Title</listitem>
+        <listitem>Comments</listitem>
+      </itemizedlist>
+    </para>
+    <note>
+      <para>Geeqie must be restarted for changes to take effect.</para>
+    </note>
+    <variablelist />
+  </section>
 </section>
--- a/doc/docbook/GuideOptionsImage.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideOptionsImage.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -79,7 +79,7 @@
           <para>
             Enable this to allow Geeqie to increase the image size for images that are smaller than the current view area when the zoom is set to
             <emphasis>Fit image to window</emphasis>
-            .
+            . The value in the adjoining spin box sets the maximum size permitted in percent i.e. 100% is full-size.
           </para>
         </listitem>
       </varlistentry>
@@ -105,62 +105,6 @@
       </varlistentry>
     </variablelist>
   </section>
-  <section id="Whennewimageisselected">
-    <title>When new image is selected</title>
-    <para>This controls the behavior of the zoom and scroll settings when changing the displayed image.</para>
-    <variablelist>
-      <varlistentry>
-        <term>
-          <guilabel>Zoom to original size</guilabel>
-        </term>
-        <listitem>
-          <para>The new image is set to it's original size.</para>
-        </listitem>
-      </varlistentry>
-      <varlistentry>
-        <term>
-          <guilabel>Fit image to window</guilabel>
-        </term>
-        <listitem>
-          <para>The new image's zoom is changed so that the image will fit within the current view area.</para>
-        </listitem>
-      </varlistentry>
-      <varlistentry>
-        <term>
-          <guilabel>Leave zoom at previous setting</guilabel>
-        </term>
-        <listitem>
-          <para>The zoom setting is unchanged, the new image will be scaled the same as the previous image.</para>
-        </listitem>
-      </varlistentry>
-    </variablelist>
-    <variablelist>
-      <varlistentry>
-        <term>
-          <guilabel>Scroll to top left corner</guilabel>
-        </term>
-        <listitem>
-          <para>The new image is displayed from top left corner.</para>
-        </listitem>
-      </varlistentry>
-      <varlistentry>
-        <term>
-          <guilabel>Scroll to image center</guilabel>
-        </term>
-        <listitem>
-          <para>The new image is centered</para>
-        </listitem>
-      </varlistentry>
-      <varlistentry>
-        <term>
-          <guilabel>Keep the region from previous iamge</guilabel>
-        </term>
-        <listitem>
-          <para>The new image is positioned as the previous one, whenever possible.</para>
-        </listitem>
-      </varlistentry>
-    </variablelist>
-  </section>
   <section id="Appearance">
     <title>Appearance</title>
     <variablelist>
@@ -190,24 +134,26 @@
         </listitem>
       </varlistentry>
     </variablelist>
+    <variablelist>
+      <varlistentry>
+        <term>
+          <guilabel>Alpha channel color 1/2</guilabel>
+        </term>
+        <listitem>
+          <para>These two colors define the checkerboard background used when images with an alpha channel are displayed.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
   </section>
   <section id="Convenience">
     <title>Convenience</title>
     <variablelist>
       <varlistentry>
         <term>
-          <guilabel>Auto rotate image using EXIF information</guilabel>
-        </term>
-        <listitem>
-          <para>Auto rotates images based on metadata stored in images that have Exif data.</para>
-        </listitem>
-      </varlistentry>
-      <varlistentry>
-        <term>
           <guilabel>Auto rotate proofs using EXIF information</guilabel>
         </term>
         <listitem>
-          <para>TBD</para>
+          <para>Auto rotate images on print proof sheet.</para>
         </listitem>
       </varlistentry>
     </variablelist>
--- a/doc/docbook/GuideOptionsLayout.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideOptionsLayout.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -58,6 +58,17 @@
       </term>
       <listitem>
         <para>This may be set for each instance of Geeqie.</para>
+        <itemizedlist spacing="compact">
+          <listitem>
+            <para>No change: Use the Current Working Directory. If called from a system menu rather than the command line, the Home directory will probably be used.</para>
+          </listitem>
+          <listitem>
+            <para>Restore last path: Use the folder in use when Geeqie was previously closed.</para>
+          </listitem>
+          <listitem>
+            <para>Home path: Use the folder specified in the Home Path box.</para>
+          </listitem>
+        </itemizedlist>
       </listitem>
     </varlistentry>
     <varlistentry>
--- a/doc/docbook/GuideOptionsMetadata.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideOptionsMetadata.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -70,6 +70,13 @@
           If checked, open a confirmation dialogue before writing to the file
         </para>
       </listitem>
+      <listitem>
+        <para>
+          <guilabel>Create sidecar files named image.ext.xmp (as opposed to image.xmp)</guilabel>
+          <para />
+          If checked, new sidecar files will use image.ext.xmp naming scheme
+        </para>
+      </listitem>
     </itemizedlist>
   </section>
   <section id="WriteToGeeqiePrivateFiles">
@@ -112,8 +119,14 @@
         <para>
           <guilabel>Write altered image orientation to the metadata</guilabel>
           <para />
-          TBD
+          If checked, the results of orientation commands (Rotate, Mirror and Flip) issued on an image will be written to metadata either automatically as specified below or when manually initiated. This option also affects the
+          <link linkend="Editmenu">Auto rotate image using EXIF information</link>
+          menu item.
         </para>
+        <warning>
+          <para>If this option is not checked, the results of orientation commands will be lost when Geeqie closes.</para>
+          <para>Do not change this option while you have temporary rotations applied to images.</para>
+        </warning>
       </listitem>
     </itemizedlist>
     <para />
--- a/doc/docbook/GuideOptionsWindow.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideOptionsWindow.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -17,6 +17,29 @@
     <variablelist>
       <varlistentry>
         <term>
+          <guilabel>Use saved window positions also for new windows</guilabel>
+        </term>
+        <listitem>
+          <para>
+            A new window opened by menu
+            <menuchoice>
+              <shortcut>
+                <keycombo>
+                  <keycap>Ctrl</keycap>
+                  <keycap>N</keycap>
+                </keycombo>
+              </shortcut>
+              <guimenu>File</guimenu>
+              <guimenuitem>New Window</guimenuitem>
+            </menuchoice>
+            will use the saved window positions also.
+          </para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+    <variablelist>
+      <varlistentry>
+        <term>
           <guilabel>Remember tool state</guilabel>
         </term>
         <listitem>
@@ -157,7 +180,11 @@
           </row>
           <row>
             <entry>comment</entry>
-            <entry>Image comment from metadata</entry>
+            <entry>Image comment from XMP metadata</entry>
+          </row>
+          <row>
+            <entry>imagecomment</entry>
+            <entry>JPEG image comment</entry>
           </row>
           <row>
             <entry>&lt;meta_tag&gt;</entry>
--- a/doc/docbook/GuideReference.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideReference.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -9,6 +9,8 @@
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="GuideReferenceConfig.xml" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="GuideReferenceLIRC.xml" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="GuideReferenceStandards.xml" />
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="GuideReferenceTags.xml" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="GuideReferenceSupportedFormats.xml" />
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="GuideReferenceDecodeLatLong.xml" />
   <para />
-</chapter>
+</chapter>
--- a/doc/docbook/GuideReferenceCommandLine.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideReferenceCommandLine.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -9,7 +9,7 @@
   <table frame="all">
     <tgroup cols="3" rowsep="1" colsep="1">
       <thead rowsep="1" colsep="1">
-        <row >
+        <row>
           <entry>Short Option</entry>
           <entry>Long Option</entry>
           <entry>Description</entry>
@@ -77,6 +77,21 @@
           <entry>Turn on debugging output (when compiled with Debug enabled). &lt;level&gt; is 0 to 4.</entry>
         </row>
         <row>
+          <entry>-g:&lt;regexp&gt;</entry>
+          <entry>--grep:&lt;regexp&gt;</entry>
+          <entry>Filter debug output with regular expression</entry>
+        </row>
+        <row>
+          <entry>+w</entry>
+          <entry>--show-log-window</entry>
+          <entry>Display log window</entry>
+        </row>
+        <row>
+          <entry>-o:&lt;file&gt;</entry>
+          <entry>--log-file:&lt;file&gt;</entry>
+          <entry>Save log data to file</entry>
+        </row>
+        <row>
           <entry />
           <entry>--alternate</entry>
           <entry>Use alternate similarity algorithm - experimental - requires re-compile.</entry>
@@ -88,16 +103,17 @@
   <section id="Remotecommands">
     <title>Remote commands</title>
     <para>The --remote command line option will send all entered commands to an existing Geeqie process, a new process will be started if one does not exist. These are the additional commands that can be used with the remote command:</para>
-  <table frame="all">
-    <tgroup cols="3" rowsep="1" colsep="1">
-      <thead rowsep="1" colsep="1">
-
+    <table frame="all">
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead rowsep="1" colsep="1">
           <row>
             <entry>Short Option</entry>
             <entry>Long Option</entry>
             <entry>Description</entry>
-          </row></thead>
-        <tbody>          <row>
+          </row>
+        </thead>
+        <tbody>
+          <row>
             <entry>-n</entry>
             <entry>--next</entry>
             <entry>Change main window to display next image.</entry>
@@ -190,7 +206,17 @@
           <row>
             <entry />
             <entry>file:&lt;file&gt;</entry>
-            <entry>Change main window to display &lt;file&gt;</entry>
+            <entry>Open  &lt;file&gt; and bring Geeqie window to the top</entry>
+          </row>
+          <row>
+            <entry />
+            <entry>File:&lt;file&gt;</entry>
+            <entry>Open  &lt;file&gt; and do not bring Geeqie window to the top</entry>
+          </row>
+          <row>
+            <entry />
+            <entry>--tell</entry>
+            <entry>Print filename of current image</entry>
           </row>
           <row>
             <entry />
@@ -212,9 +238,49 @@
             <entry>raise</entry>
             <entry>Bring the geeqie window to the top</entry>
           </row>
+          <row>
+            <entry>-ct:clear|clean</entry>
+            <entry>--cache-thumbs:clear|clean</entry>
+            <entry>clear or clean thumbnail cache</entry>
+          </row>
+          <row>
+            <entry>-cs:clear|clean</entry>
+            <entry>--cache-shared:clear|clean</entry>
+            <entry>clear or clean shared thumbnail cache</entry>
+          </row>
+          <row>
+            <entry>-cm</entry>
+            <entry>--cache-metadata</entry>
+            <entry>clean the metadata cache</entry>
+          </row>
+          <row>
+            <entry>-cr:&lt;folder&gt;</entry>
+            <entry>--cache-render:&lt;folder&gt;</entry>
+            <entry>render thumbnails</entry>
+          </row>
+          <row>
+            <entry>-crr:&lt;folder&gt;</entry>
+            <entry>--cache-render-recurse:&lt;folder&gt;</entry>
+            <entry>render thumbnails recursively</entry>
+          </row>
+          <row>
+            <entry>-crs:&lt;folder&gt;</entry>
+            <entry>--cache-render-shared:&lt;folder&gt;</entry>
+            <entry>
+              render thumbnails
+              <footnote id='ref2'>
+                <para>If standard thumbnail cache is not enabled, this command will be ignored.</para>
+              </footnote>
+            </entry>
+          </row>
+          <row>
+            <entry>-crsr:&lt;folder&gt;</entry>
+            <entry>--cache-render-shared-recurse:&lt;folder&gt;</entry>
+            <entry>render thumbnails recursively</entry>
+          </row>
         </tbody>
       </tgroup>
     </table>
     <para />
   </section>
-</section>
+</section>
--- a/doc/docbook/GuideReferenceConfig.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideReferenceConfig.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -3,8 +3,13 @@
   <title id="titleGuideReferenceConfig">Configuration Files and Locations</title>
   <para>The following data lists the locations Geeqie uses for various actions. The uppercase symbols are environment variables. If they are not set on your system the fallback locations are listed in parentheses.</para>
   <para>
+    Geqqie will first attempt to load a configuration file from:
+    <programlisting xml:space="preserve">/etc/geeqie/geeqierc.xml</programlisting>
+  </para>
+  <para>It will then continue with the following locations.</para>
+  <para>
     Most of Geeqie's configuration files are contained in the folder, and sub-folders of:
-    <programlisting xml:space="preserve">$HOME/$XDG_CONFIG_HOME/geeqie/</programlisting>
+    <programlisting xml:space="preserve">$XDG_CONFIG_HOME/geeqie/</programlisting>
     <programlisting xml:space="preserve">($~/.config/geeqie/)</programlisting>
   </para>
   <para>
@@ -36,8 +41,9 @@
     <programlisting xml:space="preserve">.../accels</programlisting>
   </para>
   <para>
-    The default location for Collections is in the folder:
-    <programlisting xml:space="preserve">$HOME/.local/share/geeqie/collections</programlisting>
+    The location for Collections is in the folder:
+    <programlisting xml:space="preserve">$XDG_DATA_HOME/geeqie/collections</programlisting>
+    <programlisting xml:space="preserve">($~/.local/share/geeqie/collections)</programlisting>
   </para>
   <para>
     The lirc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/docbook/GuideReferenceDecodeLatLong.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<section id="GuideReferenceDecodeLatLong">
+  <title id="titleGuideReferenceDecodeLatLong">Decoding Latitude and Longitude</title>
+  <para>This section is relevent to geocode searches and the map display of Geeqie.</para>
+  <para>
+    The result of some internet or other searches for placenames can contain a latitude and longitude embedded in a text string. For example an openstreetmap.org search can give a URL such as:
+    <para />
+    <code>https://www.openstreetmap.org/search?query=51.5542%2C-0.1816#map=12/51.5542/-0.1818</code>
+  </para>
+  <para>
+    If you paste such a string into the search box, the latitude/longitude can be automatically extracted and used as the origin of the search.
+    <para />
+    You may also drag-and-drop a URL of this type onto the map to cause the map to be re-centered.
+    <para />
+    To enable this feature, create the file
+    <para />
+    <code>~/.config/geeqie/geocode-parameters.awk</code>
+    <para />
+    and copy the following text into it:
+  </para>
+  <para>
+    <programlisting xml:space="preserve">
+      # Store this file in:
+      # ~/.config/geeqie/geocode-parameters.awk
+      #
+      # This file is used to decode the results of internet or other searches
+      # to extract a geo-position from a text string. 
+      # To include other searches, follow the examples below and
+      # ensure the returned value is either in the format:
+      # 89.123 179.123
+      # or
+      # Error: $0
+      #
+      
+      function check_parameters(latitude, longitude)
+      {
+      # Ensure the parameters are numbers    
+      if ((latitude == (latitude+0)) &amp;&amp; (longitude == (longitude+0)))
+      {
+      if (latitude &gt;= -90 &amp;&amp; latitude &lt;= 90 &amp;&amp;
+      longitude &gt;= -180 &amp;&amp; longitude &lt;= 180)
+      {
+      return latitude " " longitude
+      }
+      else
+      {
+      return "Error: " latitude " " longitude
+      }
+      }
+      else
+      {
+      return "Error: " latitude " " longitude
+      }
+      }
+      
+      # This awk file is accessed by an internal function.
+      # The call is of the format:
+      # echo "string_to_be_searched" | awk -f geocode-parameters.awk
+      #
+      # Search the input string for known formats.
+      {
+      if (index($0, "http://www.geonames.org/maps/google_"))
+      {
+      # This is a drag-and-drop or copy-paste from a geonames.org search
+      # in the format e.g.
+      # http://www.geonames.org/maps/google_51.513_-0.092.html
+      
+      gsub(/http:\/\/www.geonames.org\/maps\/google_/, "")
+      gsub(/.html/, "")
+      gsub(/_/, " ")
+      print check_parameters($1, $2)
+      }
+      
+      else if (index($0, "https://www.openstreetmap.org/search?query="))
+      {
+      # This is a copy-paste from an openstreetmap.org search
+      # in the format e.g.
+      # https://www.openstreetmap.org/search?query=51.4878%2C-0.1353#map=11/51.4880/-0.1356
+      
+      gsub(/https:\/\/www.openstreetmap.org\/search\?query=/, "")
+      gsub(/#map=.*/, "")
+      gsub(/%2C/, " ")
+      print check_parameters($1, $2)
+      }
+      
+      else if (index($0, "https://www.openstreetmap.org/#map="))
+      {
+      # This is a copy-paste from an openstreetmap.org search
+      # in the format e.g.
+      # https://www.openstreetmap.org/#map=5/18.271/16.084
+      
+      gsub(/https:\/\/www.openstreetmap.org\/#map=[^\/]*/,"")
+      gsub(/\//," ")
+      print check_parameters($1, $2)
+      }
+      
+      else if (index($0, "https://www.google.com/maps/"))
+      {
+      # This is a copy-paste from a google.com maps search
+      # in the format e.g.
+      # https://www.google.com/maps/place/London,+UK/@51.5283064,-0.3824815,10z/data=....
+      
+      gsub(/https:\/\/www.google.com\/maps.*@/,"")
+      sub(/,/," ")
+      gsub(/,.*/,"")
+      print check_parameters($1, $2)
+      }
+      
+      else if (index($0,".html"))
+      {
+      # This is an unknown html address
+      
+      print "Error: " $0
+      }
+      
+      else if (index($0,"http"))
+      {
+      # This is an unknown html address
+      
+      print "Error: " $0
+      }
+      
+      else if (index($0, ","))
+      {
+      # This is assumed to be a simple lat/long of the format:
+      # 89.123,179.123
+      
+      split($0, latlong, ",")
+      print check_parameters(latlong[1], latlong[2])
+      }
+      
+      else
+      {
+      # This is assumed to be a simple lat/long of the format:
+      # 89.123 179.123
+      
+      split($0, latlong, " ")
+      print check_parameters(latlong[1], latlong[2])
+      }
+      }
+
+    </programlisting>
+  </para>
+</section>
--- a/doc/docbook/GuideReferenceKeyboardShortcuts.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideReferenceKeyboardShortcuts.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -1,911 +1,1490 @@
 <?xml version="1.0" encoding="utf-8"?>
 <section id="GuideReferenceKeyboardShortcuts">
+  <title id="titleGuideReferenceKeyboardShortcuts">Keyboard and Mouse Shortcuts</title>
   <para>
-    The table below shows the defaults for keyboard shortcuts. The current settings for all shortcuts may be found in the
+    The tables below shows the defaults for keyboard shortcuts. The current settings for all shortcuts may be found in the
     <link linkend="GuideOptionsKeyboard" endterm="titleGuideOptionsKeyboard" />
     dialogue.
   </para>
-  <title id="titleGuideReferenceKeyboardShortcuts">Keyboard and Mouse Shortcuts</title>
-  <table frame="all">
-    <title>Default keyboard shortcuts</title>
-    <tgroup cols="3" rowsep="1" colsep="1">
-      <thead>
-        <row>
-          <entry>Shortcut</entry>
-          <entry>Mouse</entry>
-          <entry>Action</entry>
-        </row>
-      </thead>
-      <tbody>
-        <row colsep="0">
-          <entry colsep="0">
-            <emphasis role="strong">Image Navigation</emphasis>
-          </entry>
-          <entry colsep="0" />
-          <entry />
-        </row>
-        <row>
-          <entry>
-            <keycap>PageDown</keycap>
-          </entry>
-          <entry>
-            <code>Left Click</code>
-            ,
-            <para />
-            <code>Mouse Wheel down</code>
-            <footnote id='ref1'>
-              <para>
-                Default Mouse wheel functions can be altered by changing the
-                <link linkend="GuideOptionsBehavior">Mouse wheel scrolls image</link>
-                option.
-              </para>
-            </footnote>
-          </entry>
-          <entry>Change to next image.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>PageUp</keycap>
-          </entry>
-          <entry>
-            <code>Middle Click</code>
-            ,
-            <para />
-            <code>Mouse Wheel up</code>
-            <footnoteref linkend='ref1' />
-          </entry>
-          <entry>Change to previous image.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Home</keycap>
-          </entry>
-          <entry />
-          <entry>Change to first image.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>End</keycap>
-          </entry>
-          <entry />
-          <entry>Change to last image.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Space</keycap>
-          </entry>
-          <entry />
-          <entry>Change to next image.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Backspace</keycap>
-          </entry>
-          <entry />
-          <entry>Change to previous image.</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry colsep="0">
-            <emphasis role="strong">Image viewing</emphasis>
-            (image has keyboard focus)
-          </entry>
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <keycap>Arrow key</keycap>
-          </entry>
-          <entry>
-            <code>Left click and Drag</code>
-            <footnoteref linkend='ref1' />
-          </entry>
-          <entry>Pan image.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Shift + Arrows</code>
-          </entry>
-          <entry />
-          <entry>Pan Image faster.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Ctrl + Arrow key</code>
-          </entry>
-          <entry />
-          <entry>Pan to respective edge of image.</entry>
-        </row>
-        <row>
-          <entry />
-          <entry>
-            <code>Shift + right-click</code>
-          </entry>
-          <entry>Smooth scroll</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>]</keycap>
-          </entry>
-          <entry />
-          <entry>Rotate image clockwise 90 degrees.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>[</keycap>
-          </entry>
-          <entry />
-          <entry>Rotate image counterclockwise 90 degree.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Shift + R</code>
-          </entry>
-          <entry />
-          <entry>Rotate image 180 degrees.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Shift + M</code>
-          </entry>
-          <entry />
-          <entry>Flip image horizontally (mirror).</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Shift + F</code>
-          </entry>
-          <entry />
-          <entry>Flip image vertically.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>+</keycap>
-            ,
-            <keycap>=</keycap>
-          </entry>
-          <entry>
-            <code>Ctrl + Mouse Wheel up</code>
-          </entry>
-          <entry>Zoom image in.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>-</keycap>
-          </entry>
-          <entry>
-            <code>Ctrl + Mouse Wheel down</code>
-          </entry>
-          <entry>Zoom image out.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Z</keycap>
-          </entry>
-          <entry />
-          <entry>Reset zoom to original size (1:1).</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>X</keycap>
-          </entry>
-          <entry />
-          <entry>Fit image to window size.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>W</keycap>
-          </entry>
-          <entry />
-          <entry>Zoom image to fit window width.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>H</keycap>
-          </entry>
-          <entry />
-          <entry>Zoom image to fit window height.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>1</keycap>
-          </entry>
-          <entry />
-          <entry>Set zoom to 1:1</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>2</keycap>
-          </entry>
-          <entry />
-          <entry>Set zoom to 2:1</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>3</keycap>
-          </entry>
-          <entry />
-          <entry>Set zoom to 3:1</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>4</keycap>
-          </entry>
-          <entry />
-          <entry>Set zoom to 4:1</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>7</keycap>
-          </entry>
-          <entry />
-          <entry>Set zoom to 1:4</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>8</keycap>
-          </entry>
-          <entry />
-          <entry>Set zoom to 1:3</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>9</keycap>
-          </entry>
-          <entry />
-          <entry>Set zoom to 1:2</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry colsep="0">
-            <emphasis role="strong">File Menu</emphasis>
-          </entry>
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>N</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>New Window</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>C</keycap>
-          </entry>
-          <entry />
-          <entry>Open a new empty collection window.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>O</keycap>
-          </entry>
-          <entry />
-          <entry>Display open collection dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>F3</keycap>
-          </entry>
-          <entry />
-          <entry>Open new search window.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Shift +
-              <keycap>P</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Open print dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>F</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Create new folder in current path.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
+  <section id="AllWindows">
+    <title>Keyboard shortcuts in all windows</title>
+    <table frame="all">
+      <title>Standard keyboard shortcuts</title>
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>Shortcut</entry>
+            <entry>Mouse</entry>
+            <entry>Action</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <keycap>F1</keycap>
+            </entry>
+            <entry />
+            <entry>Help.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Menu</keycap>
+            </entry>
+            <entry>Right-click</entry>
+            <entry>Context menu.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>F10</keycap>
+            </entry>
+            <entry>Right-click</entry>
+            <entry>Context menu.</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+  <section id="mainKeyboard">
+    <title>Main window keyboard shortcuts</title>
+    <table frame="all">
+      <title>
+        <link linkend="GuideMainWindow">Main window</link>
+        keyboard shortcuts
+      </title>
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>Shortcut</entry>
+            <entry>Mouse</entry>
+            <entry>Action</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row colsep="0">
+            <entry colsep="0">
+              <emphasis role="strong">Image Navigation</emphasis>
+            </entry>
+            <entry colsep="0" />
+            <entry />
+          </row>
+          <row>
+            <entry>
+              <keycap>PageDown</keycap>
+            </entry>
+            <entry>
+              <code>Left Click</code>
+              ,
+              <para />
+              <code>Mouse Wheel down</code>
+              <footnote id='ref1'>
+                <para>
+                  Default Mouse wheel functions can be altered by changing the
+                  <link linkend="GuideOptionsBehavior">Mouse wheel scrolls image</link>
+                  option.
+                </para>
+              </footnote>
+            </entry>
+            <entry>Change to next image.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>PageUp</keycap>
+            </entry>
+            <entry>
+              <code>Middle Click</code>
+              ,
+              <para />
+              <code>Mouse Wheel up</code>
+              <footnoteref linkend='ref1' />
+            </entry>
+            <entry>Change to previous image.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Home</keycap>
+            </entry>
+            <entry />
+            <entry>Change to first image.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>End</keycap>
+            </entry>
+            <entry />
+            <entry>Change to last image.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Space</keycap>
+            </entry>
+            <entry />
+            <entry>Change to next image.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Backspace</keycap>
+            </entry>
+            <entry />
+            <entry>Change to previous image.</entry>
+          </row>
+          <row rowsep="0">
+            <entry colsep="0" />
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry colsep="0">
+              <emphasis role="strong">Image viewing</emphasis>
+              (image has keyboard focus. Refer also to
+              <link linkend="MouseWheelMode">Mouse Wheel Mode</link>
+              )
+            </entry>
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry>
+              <keycap>Arrow key</keycap>
+            </entry>
+            <entry>
+              <code>Left click and Drag</code>
+              <footnoteref linkend='ref1' />
+            </entry>
+            <entry>Pan image.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Shift + Arrows</code>
+            </entry>
+            <entry />
+            <entry>Pan Image faster.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Ctrl + Arrow key</code>
+            </entry>
+            <entry />
+            <entry>Pan to respective edge of image.</entry>
+          </row>
+          <row>
+            <entry />
+            <entry>
+              <code>Shift + right-click</code>
+            </entry>
+            <entry>Smooth scroll</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>]</keycap>
+            </entry>
+            <entry />
+            <entry>Rotate image clockwise 90 degrees.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>[</keycap>
+            </entry>
+            <entry />
+            <entry>Rotate image counterclockwise 90 degree.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Shift + R</code>
+            </entry>
+            <entry />
+            <entry>Rotate image 180 degrees.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Shift + M</code>
+            </entry>
+            <entry />
+            <entry>Flip image horizontally (mirror).</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Shift + F</code>
+            </entry>
+            <entry />
+            <entry>Flip image vertically.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>+</keycap>
+              ,
+              <keycap>=</keycap>
+            </entry>
+            <entry>
+              <code>Ctrl + Mouse Wheel up</code>
+            </entry>
+            <entry>Zoom image in.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>-</keycap>
+            </entry>
+            <entry>
+              <code>Ctrl + Mouse Wheel down</code>
+            </entry>
+            <entry>Zoom image out.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Z</keycap>
+            </entry>
+            <entry />
+            <entry>Reset zoom to original size (1:1).</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>X</keycap>
+            </entry>
+            <entry />
+            <entry>Fit image to window size.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>W</keycap>
+            </entry>
+            <entry />
+            <entry>Zoom image to fit window width.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>H</keycap>
+            </entry>
+            <entry />
+            <entry>Zoom image to fit window height.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>1</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>2</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 2:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>3</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 3:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>4</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 4:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>7</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:4</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>8</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:3</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>9</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:2</entry>
+          </row>
+          <row rowsep="0">
+            <entry colsep="0" />
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry colsep="0">
+              <emphasis role="strong">File Menu</emphasis>
+            </entry>
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>N</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>New Window</entry>
+          </row>
+          <row>
+            <entry>
               <keycap>C</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Copy selected images, opens destination selection dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>M</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Move selected images, opens destination selection dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>R</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Rename selected images, opens rename dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>D</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Delete selected images.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>W</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Close window, Geeqie exits when last window is closed.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>Q</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Quit Geeqie.</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry colsep="0">
-            <emphasis role="strong">Edit Menu</emphasis>
-          </entry>
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
+            </entry>
+            <entry />
+            <entry>Open a new empty collection window.</entry>
+          </row>
+          <row>
+            <entry>
               <keycap>O</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Open Geeqie preferences window.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>S</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Save metadata</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry colsep="0">
-            <emphasis role="strong">Select Menu</emphasis>
-          </entry>
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <keycap>1</keycap>
-            ...
-            <keycap>6</keycap>
-          </entry>
-          <entry />
-          <entry>Toggle mark 1 ... 6</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
+            </entry>
+            <entry />
+            <entry>Display open collection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>F3</keycap>
+            </entry>
+            <entry />
+            <entry>Open new search window.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Shift +
+                <keycap>P</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Open print dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>F</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Create new folder in current path.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>C</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Copy selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>M</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Move selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>R</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Rename selected images, opens rename dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>D</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Delete selected images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>W</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Close window, Geeqie exits when last window is closed.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>Q</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Quit Geeqie.</entry>
+          </row>
+          <row rowsep="0">
+            <entry colsep="0" />
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry colsep="0">
+              <emphasis role="strong">Edit Menu</emphasis>
+            </entry>
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>O</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Open Geeqie preferences window.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>S</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Save metadata</entry>
+          </row>
+          <row rowsep="0">
+            <entry colsep="0" />
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry colsep="0">
+              <emphasis role="strong">Select Menu</emphasis>
+            </entry>
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry>
               <keycap>1</keycap>
-            </code>
-            ...
-            <code>
-              Ctrl +
+              ...
               <keycap>6</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Select mark 1 ... 6</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>A</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Select all images.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl + SHIFT +
-              <keycap>A</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Unselect all images.</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry colsep="0">
-            <emphasis role="strong">View Menu</emphasis>
-          </entry>
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <keycap>T</keycap>
-          </entry>
-          <entry />
-          <entry>Toggle display of thumbnails when in list view.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>L</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Display file list as detailed list view.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>I</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Display file list as icon view.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
+            </entry>
+            <entry />
+            <entry>Toggle mark 1 ... 6</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>1</keycap>
+              </code>
+              ...
+              <code>
+                Ctrl +
+                <keycap>6</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Select mark 1 ... 6</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Select all images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl + SHIFT +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Unselect all images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl + SHIFT +
+                <keycap>I</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Invert selection.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Alt +
+                <keycap>R</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle rectangular selection mode in icon view.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>M</keycap>
+            </entry>
+            <entry />
+            <entry>Show marks.</entry>
+          </row>
+          <row rowsep="0">
+            <entry colsep="0" />
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry colsep="0">
+              <emphasis role="strong">View Menu</emphasis>
+            </entry>
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+          <row>
+            <entry>
               <keycap>T</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Toggle folder display between list and tree views.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>R</keycap>
-          </entry>
-          <entry />
-          <entry>Refresh file list.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>L</keycap>
-          </entry>
-          <entry />
-          <entry>Toggle floating of file display.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>H</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Toggle hiding of file display.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>E</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Toggle EXIF sidebar.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Shift +
+            </entry>
+            <entry />
+            <entry>Toggle display of thumbnails when in list view.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>L</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Display file list as detailed list view.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>I</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Display file list as icon view.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>T</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle folder display between list and tree views.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>R</keycap>
+            </entry>
+            <entry />
+            <entry>Refresh file list.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>L</keycap>
+            </entry>
+            <entry />
+            <entry>Toggle floating of file display.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>H</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle hiding of file display.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>E</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle EXIF sidebar.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Shift +
+                <keycap>S</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle Sort Manager sidebar.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>K</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle Keywords sidebar.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>V</keycap>
+            </entry>
+            <entry />
+            <entry>Toggle full screen.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>I</keycap>
+            </entry>
+            <entry />
+            <entry>Toggle information overlay.</entry>
+          </row>
+          <row>
+            <entry>
               <keycap>S</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Toggle Sort Manager sidebar.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>K</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Toggle Keywords sidebar.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>V</keycap>
-          </entry>
-          <entry />
-          <entry>Toggle full screen.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>I</keycap>
-          </entry>
-          <entry />
-          <entry>Toggle information overlay.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>S</keycap>
-          </entry>
-          <entry />
-          <entry>Toggle slideshow.</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry colsep="0">
-            <emphasis role="strong">Help Menu</emphasis>
-          </entry>
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <keycap>F1</keycap>
-          </entry>
-          <entry />
-          <entry>Open User Manual in browser.</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
+            </entry>
+            <entry />
+            <entry>Toggle slideshow.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>E</keycap>
+            </entry>
+            <entry />
+            <entry>Split panes horizontal.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>U</keycap>
+            </entry>
+            <entry />
+            <entry>Split panes vertical.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Y</keycap>
+            </entry>
+            <entry />
+            <entry>Single pane.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Alt + Right Arrow</code>
+            </entry>
+            <entry />
+            <entry>Next split pane.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Alt + Left Arrow</code>
+            </entry>
+            <entry />
+            <entry>Previous split pane.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Alt + Up Arrow</code>
+            </entry>
+            <entry />
+            <entry>Up or previous split pane.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Alt + Down Arrow</code>
+            </entry>
+            <entry />
+            <entry>Down or next split pane.</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+  <section id="CollectionsKeyboardShortcuts">
+    <title>Collections keyboard shortcuts</title>
+    <table frame="all">
+      <title>
+        <link linkend="GuideCollections">Collections window</link>
+        keyboard shortcuts
+      </title>
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>Shortcut</entry>
+            <entry>Mouse</entry>
+            <entry>Action</entry>
+          </row>
+        </thead>
+        <tbody>
           <entry colsep="0">
             <emphasis role="strong">Collection Window</emphasis>
           </entry>
           <entry colsep="0" />
           <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <keycap>Arrows</keycap>
-          </entry>
-          <entry />
-          <entry>Move selection.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Shift + Arrow key</code>
-          </entry>
-          <entry />
-          <entry>Select multiple images.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Ctrl + Arrow</code>
-          </entry>
-          <entry />
-          <entry>Move focus without changing selection.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Space</keycap>
-          </entry>
-          <entry />
-          <entry>Select only image with focus.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>Ctrl + Space</code>
-          </entry>
-          <entry />
-          <entry>Toggle selection of image with focus.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Home</keycap>
-          </entry>
-          <entry />
-          <entry>Move focus to first image.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>End</keycap>
-          </entry>
-          <entry />
-          <entry>Move focus to last image.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>A</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Select all images.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl + Shift +
+          <row>
+            <entry>
+              <keycap>Arrows</keycap>
+            </entry>
+            <entry />
+            <entry>Move selection.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Shift + Arrow key</code>
+            </entry>
+            <entry />
+            <entry>Select multiple images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Alt +
+                <keycap>R</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle rectangular selection mode.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Space</keycap>
+            </entry>
+            <entry />
+            <entry>Select only image with focus.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Ctrl + Space</code>
+            </entry>
+            <entry />
+            <entry>Toggle selection of image with focus.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Home</keycap>
+            </entry>
+            <entry />
+            <entry>Move focus to first image.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>End</keycap>
+            </entry>
+            <entry />
+            <entry>Move focus to last image.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Select all images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl + Shift +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Unselect all images.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Delete</keycap>
+            </entry>
+            <entry />
+            <entry>Remove selected image from collection, does not delete image from disk.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>L</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Add images from main window's file list.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>T</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle display of icon filenames.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>N</keycap>
+            </entry>
+            <entry />
+            <entry>Sort collection by name.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>D</keycap>
+            </entry>
+            <entry />
+            <entry>Sort collection by file date.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>B</keycap>
+            </entry>
+            <entry />
+            <entry>Sort collection by file size.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>P</keycap>
+            </entry>
+            <entry />
+            <entry>Sort collection by file path.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>I</keycap>
+            </entry>
+            <entry />
+            <entry>Sort collection by natural numerical order.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Enter</keycap>
+            </entry>
+            <entry />
+            <entry>View image with focus in main window.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>V</keycap>
+            </entry>
+            <entry />
+            <entry>View image with focus in new window.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Shift +
+                <keycap>P</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Open print dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>S</keycap>
+            </entry>
+            <entry />
+            <entry>Save collection.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>S</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Save collection as, opens destination dialog.</entry>
+          </row>
+          <row>
+            <entry>
               <keycap>A</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Unselect all images.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Delete</keycap>
-          </entry>
-          <entry />
-          <entry>Remove selected image from collection, does not delete image from disk.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>L</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Add images from main window's file list.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>T</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Toggle display of icon filenames.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>N</keycap>
-          </entry>
-          <entry />
-          <entry>Sort collection by name.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>D</keycap>
-          </entry>
-          <entry />
-          <entry>Sort collection by file date.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>B</keycap>
-          </entry>
-          <entry />
-          <entry>Sort collection by file size.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>P</keycap>
-          </entry>
-          <entry />
-          <entry>Sort collection by file path.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>I</keycap>
-          </entry>
-          <entry />
-          <entry>Sort collection by natural numerical order.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>Enter</keycap>
-          </entry>
-          <entry />
-          <entry>View image with focus in main window.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>V</keycap>
-          </entry>
-          <entry />
-          <entry>View image with focus in new window.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
+            </entry>
+            <entry />
+            <entry>Append to collection, opens append dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>C</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Copy selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>M</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Move selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>R</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Rename selected images, opens rename dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>D</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Delete selected images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>W</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Close collection window.</entry>
+          </row>
+          <row rowsep="0">
+            <entry colsep="0" />
+            <entry colsep="0" />
+            <entry colsep="0" />
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+  <section id="DuplicatesKeyboardShortcuts">
+    <title>Duplicates keyboard shortcuts</title>
+    <table frame="all">
+      <title>
+        <link linkend="GuideImageSearchFindingDuplicates">Duplicates window</link>
+        keyboard shortcuts
+      </title>
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>Shortcut</entry>
+            <entry>Mouse</entry>
+            <entry>Action</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
               <keycap>1</keycap>
-            </code>
-            ...
-            <code>
-              Ctrl +
-              <keycap>0</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Run external edit command on selected images.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>S</keycap>
-          </entry>
-          <entry />
-          <entry>Save collection.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>S</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Save collection as, opens destination dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>A</keycap>
-          </entry>
-          <entry />
-          <entry>Append to collection, opens append dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
+            </entry>
+            <entry />
+            <entry>Select group 1 duplicates.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>2</keycap>
+            </entry>
+            <entry />
+            <entry>Select group 2 duplicates.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>C</keycap>
+            </entry>
+            <entry />
+            <entry>Open new collection window and add selected images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>L</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Add images from main window's list.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>V</keycap>
+            </entry>
+            <entry />
+            <entry>View selected item in new window.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>T</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle thumbnails.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Select all.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl + shift +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Deselect all.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>C</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Copy selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>M</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Move selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>R</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Rename selected images, opens rename dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>D</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Delete selected images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Ctrl + Delete</code>
+            </entry>
+            <entry />
+            <entry>Remove all items from list.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>W</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Close window.</entry>
+          </row>
+          <row>
+            <entry />
+            <entry>
+              <code>Ctrl + shift + right-click</code>
+            </entry>
+            <entry>Show debug info.</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+  <section id="SearchKeyboardShortcuts">
+    <title>Search keyboard shortcuts</title>
+    <table frame="all">
+      <title>
+        <link linkend="GuideImageSearchSearch">Search window</link>
+        keyboard shortcuts
+      </title>
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>Shortcut</entry>
+            <entry>Mouse</entry>
+            <entry>Action</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>C</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Copy selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>M</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Move selected images, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>R</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Rename selected images, opens rename dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>D</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Delete selected images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Select all.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl + shift +
+                <keycap>A</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Deselect all.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Delete</code>
+            </entry>
+            <entry />
+            <entry>Remove selected items from list.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>Ctrl + Delete</code>
+            </entry>
+            <entry />
+            <entry>Remove all items from list.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>V</keycap>
+            </entry>
+            <entry />
+            <entry>View selected item in new window.</entry>
+          </row>
+          <row>
+            <entry>
               <keycap>C</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Copy selected images, opens destination selection dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>M</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Move selected images, opens destination selection dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>R</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Rename selected images, opens rename dialog.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>D</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Delete selected images.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>P</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Open image properties window.</entry>
-        </row>
-        <row>
-          <entry>
-            <code>
-              Ctrl +
-              <keycap>W</keycap>
-            </code>
-          </entry>
-          <entry />
-          <entry>Close collection window.</entry>
-        </row>
-        <row rowsep="0">
-          <entry colsep="0" />
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <anchor id="FindDuplicatesWindow" />
-        <row>
-          <entry colsep="0">
-            <emphasis role="strong">Find Duplicates Window</emphasis>
-            (same as Collection Window above, with the following additions)
-          </entry>
-          <entry colsep="0" />
-          <entry colsep="0" />
-        </row>
-        <row>
-          <entry>
-            <keycap>1</keycap>
-          </entry>
-          <entry />
-          <entry>Select group 1 duplicates.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>2</keycap>
-          </entry>
-          <entry />
-          <entry>Select group 2 duplicates.</entry>
-        </row>
-        <row>
-          <entry>
-            <keycap>C</keycap>
-          </entry>
-          <entry />
-          <entry>Open new collection window and add selected images.</entry>
-        </row>
-      </tbody>
-    </tgroup>
-  </table>
+            </entry>
+            <entry />
+            <entry>Open new collection window and add selected images.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>T</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Toggle thumbnails.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>W</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Close window.</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+  <section id="PanViewKeyboardShortcuts">
+    <title>Pan view keyboard shortcuts</title>
+    <table frame="all">
+      <title>
+        <link linkend="GuideOtherWindowsPanView">Pan View window</link>
+        keyboard shortcuts
+      </title>
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>Shortcut</entry>
+            <entry>Mouse</entry>
+            <entry>Action</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <keycap>Arrow key</keycap>
+            </entry>
+            <entry>
+              <code>Left click and Drag</code>
+              <footnoteref linkend='ref1' />
+            </entry>
+            <entry>Scroll display.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Page Up</keycap>
+            </entry>
+            <entry />
+            <entry>Scroll display half screen up.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Page Down</keycap>
+            </entry>
+            <entry />
+            <entry>Scroll display half screen down.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Home</keycap>
+            </entry>
+            <entry />
+            <entry>Scroll display half screen left.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>End</keycap>
+            </entry>
+            <entry />
+            <entry>Scroll display half screen right.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>F</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Display Find search bar.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>/</keycap>
+            </entry>
+            <entry />
+            <entry>Display Find search bar.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>G</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Start search.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>F11, F, V</keycap>
+            </entry>
+            <entry />
+            <entry>Toggle Fullscreen.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Esc</keycap>
+            </entry>
+            <entry />
+            <entry>Exit fullscreen or clear search bar.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>+</keycap>
+              ,
+              <keycap>=</keycap>
+            </entry>
+            <entry>
+              <code>Ctrl + Mouse Wheel up</code>
+            </entry>
+            <entry>Zoom image in.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>-</keycap>
+            </entry>
+            <entry>
+              <code>Ctrl + Mouse Wheel down</code>
+            </entry>
+            <entry>Zoom image out.</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>Z</keycap>
+            </entry>
+            <entry />
+            <entry>Reset zoom to original size (1:1).</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>1</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>2</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 2:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>3</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 3:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>4</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 4:1</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>7</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:4</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>8</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:3</entry>
+          </row>
+          <row>
+            <entry>
+              <keycap>9</keycap>
+            </entry>
+            <entry />
+            <entry>Set zoom to 1:2</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>C</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Copy selected image, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>M</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Move selected image, opens destination selection dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>R</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Rename selected image, opens rename dialog.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>D</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Delete selected image.</entry>
+          </row>
+          <row>
+            <entry>
+              <code>
+                Ctrl +
+                <keycap>W</keycap>
+              </code>
+            </entry>
+            <entry />
+            <entry>Close window.</entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
 </section>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/docbook/GuideReferenceTags.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,747 @@
+<?xml version="1.0" encoding="utf-8"?>
+<section id="GuideReferenceXmpExif">
+  <title id="titleGuideReferenceXmpExif">XMP, Exif and IPTC</title>
+  <para>The tables below show the XMP, Exif and IPTC tags used by Geeqie.</para>
+  <section id="preformatted">
+    <title>Geeqie pre-formatted tags</title>
+    <table frame="all">
+      <title>Pre-formatted tags</title>
+      <tgroup cols="3" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>
+              <para>Geeqie Tag</para>
+            </entry>
+            <entry>
+              <para>Exif tags used</para>
+            </entry>
+            <entry>
+              <para>Description</para>
+            </entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <para>formatted.Camera</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.Image.Make
+                <para />
+                Exif.Image.Model
+                <para />
+                Exif.Image.Software
+              </para>
+            </entry>
+            <entry>
+              <para>Camera and software name</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.DateTime</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.Photo.DateTimeOriginal
+                <para />
+                Exif.Photo.SubSecTimeOriginal
+                <para />
+                Exif.Image.DateTime
+                <para />
+                Exif.Photo.SubSecTime
+              </para>
+            </entry>
+            <entry>
+              <para>Image Date</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ShutterSpeed</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.Photo.ExposureTime
+                <para />
+                Exif.Photo.ShutterSpeedValue
+
+              </para>
+            </entry>
+            <entry>
+              <para>Shutter speed in seconds (e.g. 1/60s)</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.Aperture</para>
+            </entry>
+            <entry>
+              <para>
+                <para>
+                  Exif.Photo.Fnumber
+                  <para />
+                  Exif.Photo.ApertureValue
+                </para>
+              </para>
+            </entry>
+            <entry>
+              <para>Aperture (e.g. f5.6)</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ExposureBias</para>
+            </entry>
+            <entry>
+              <para>Exif.Photo.ExposureBiasValue</para>
+            </entry>
+            <entry>
+              <para>Exposure bias (e.g. +0.3)</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ISOSpeedRating</para>
+            </entry>
+            <entry>
+              <para>Exif.Photo.ISOSpeedRatings</para>
+            </entry>
+            <entry>
+              <para>ISO sensitivity (e.g. 100)</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.FocalLength</para>
+            </entry>
+            <entry>
+              <para>Exif.Photo.FocalLength</para>
+            </entry>
+            <entry>
+              <para>Focal length</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.FocalLength35mmFilm</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.Photo.FocalLengthIn35mmFilm
+                <para />
+                Exif.Photo.FocalLength
+                <para />
+                Exif.Photo.FocalPlaneXResolution
+                <para />
+                Exif.Photo.FocalPlaneYResolution
+                <para />
+                Exif.Photo.FocalPlaneResolutionUnit
+                <para />
+                Exif.Photo.PixelXDimension
+                <para />
+                Exif.Photo.PixelYDimension
+
+              </para>
+            </entry>
+            <entry>
+              <para>Focal length 35mm</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.SubjectDistance</para>
+            </entry>
+            <entry>
+              <para>Exif.Photo.SubjectDistance</para>
+            </entry>
+            <entry>
+              <para>Subject distance</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.Flash</para>
+            </entry>
+            <entry>
+              <para>Exif.Photo.Flash</para>
+            </entry>
+            <entry>
+              <para>Flash</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.Resolution</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.Image.Xresolution
+                <para />
+                Exif.Image.Yresolution
+                <para />
+                Exif.Image.ResolutionUnit
+              </para>
+            </entry>
+            <entry>
+              <para>Resolution</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ColorProfile</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.Image.InterColorProfile
+                <para />
+                Exif.Photo.ColorSpace
+                <para />
+                Exif.Iop.InteroperabilityIndex
+              </para>
+            </entry>
+            <entry>
+              <para>Color profile</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.GPSAltitude</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.GPSInfo.GPSAltitudeRef
+                <para />
+                Exif.GPSInfo.GPSAltitude
+              </para>
+            </entry>
+            <entry>
+              <para>Altitude above sea level</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.GPSPosition</para>
+            </entry>
+            <entry>
+              <para>
+                Exif.GPSInfo.GPSLatitude
+                <para />
+                Exif.GPSInfo.GPSLatitudeRef
+                <para />
+                Exif.GPSInfo.GPSLongitude
+                <para />
+                Exif.GPSInfo.GPSLongitudeRef
+              </para>
+            </entry>
+            <entry>
+              <para>Latitude, Longitude</para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+  <section id="infosidebar">
+    <title>Info sidebar panes</title>
+    <table frame="all">
+      <title>Fixed panes</title>
+      <tgroup cols="2" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>
+              <para>Tag</para>
+            </entry>
+            <entry>
+              <para>Pane title</para>
+            </entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <para>Xmp.dc.description</para>
+            </entry>
+            <entry>
+              <para>Comment</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.subject</para>
+            </entry>
+            <entry>
+              <para>Keywords</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.title</para>
+            </entry>
+            <entry>
+              <para>Title</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.xmp.Rating</para>
+            </entry>
+            <entry>
+              <para>Rating</para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+    <table frame="all">
+      <title>Location and GPS pane</title>
+      <tgroup cols="2" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>
+              <para>Tag</para>
+            </entry>
+            <entry>
+              <para>Field</para>
+            </entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <para>formatted.GPSPosition</para>
+            </entry>
+            <entry>
+              <para>GPS position</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.GPSAltitude</para>
+            </entry>
+            <entry>
+              <para>GPS altitiude</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Country</para>
+            </entry>
+            <entry>
+              <para>Country</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>
+                <para>Xmp.iptc.CountryCode</para>
+              </para>
+            </entry>
+            <entry>
+              <para>Country Code</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.State</para>
+            </entry>
+            <entry>
+              <para>State</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.City</para>
+            </entry>
+            <entry>
+              <para>City</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.iptc.Location</para>
+            </entry>
+            <entry>
+              <para>Location</para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+    <table frame="all">
+      <title>Copyright pane</title>
+      <tgroup cols="2" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>
+              <para>Tag</para>
+            </entry>
+            <entry>
+              <para>Field</para>
+            </entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <para>Xmp.dc.creator</para>
+            </entry>
+            <entry>
+              <para>Creator</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.contributor</para>
+            </entry>
+            <entry>
+              <para>Contributor</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.rights</para>
+            </entry>
+            <entry>
+              <para>Rights</para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+    <table frame="all">
+      <title>Exif pane</title>
+      <tgroup cols="2" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>
+              <para>Tag</para>
+            </entry>
+            <entry>
+              <para>Field</para>
+            </entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <para>formatted.Camera</para>
+            </entry>
+            <entry>
+              <para>Camera</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.DateTime</para>
+            </entry>
+            <entry>
+              <para>Date</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ShutterSpeed</para>
+            </entry>
+            <entry>
+              <para>Shutter speed</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.Aperture</para>
+            </entry>
+            <entry>
+              <para>Aperture</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ExposureBias</para>
+            </entry>
+            <entry>
+              <para>Exposure bias</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ISOSpeedRating</para>
+            </entry>
+            <entry>
+              <para>ISO sensitivity</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.FocalLength</para>
+            </entry>
+            <entry>
+              <para>Focal length</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.FocalLength35mmFilm</para>
+            </entry>
+            <entry>
+              <para>Focal length 35mm</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.SubjectDistance</para>
+            </entry>
+            <entry>
+              <para>Subject distance</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.Flash</para>
+            </entry>
+            <entry>
+              <para>Flash</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.Resolution</para>
+            </entry>
+            <entry>
+              <para>Resolution</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>formatted.ColorProfile</para>
+            </entry>
+            <entry>
+              <para>Color profile</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Exif.Photo.ExposureProgram</para>
+            </entry>
+            <entry>
+              <para>Exposure Program</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Exif.Photo.MeteringMode</para>
+            </entry>
+            <entry>
+              <para>Metering Mode</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Exif.Photo.LightSource</para>
+            </entry>
+            <entry>
+              <para>Light Source</para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+  <section id="exifiptc">
+    <title>Exif IPTC alternative keys</title>
+    <table frame="all">
+      <title>Conversion table</title>
+      <tgroup cols="2" rowsep="1" colsep="1">
+        <thead>
+          <row>
+            <entry>
+              <para>Tag</para>
+            </entry>
+            <entry>
+              <para>Field</para>
+            </entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <para>Xmp.tiff.Orientation</para>
+            </entry>
+            <entry>
+              <para>Exif.Image.Orientation</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.title</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.ObjectName</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Urgency</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Urgency</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Category</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Category</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.SupplementalCategory</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.SuppCategory</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.subject</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Keywords</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.iptc.Location</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.LocationName</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Instruction</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.SpecialInstructions</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.DateCreated</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.DateCreated</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.creator</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Byline</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.AuthorsPosition</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.BylineTitle</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.City</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.City</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.State</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.ProvinceState</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.iptc.CountryCode</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.CountryCode</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Country</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.CountryName</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.TransmissionReference</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.TransmissionReference</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Headline</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Headline</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Credit</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Credit</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.Source</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Source</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.rights</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Copyright</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.dc.description</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Caption</para>
+            </entry>
+          </row>
+          <row>
+            <entry>
+              <para>Xmp.photoshop.CaptionWriter</para>
+            </entry>
+            <entry>
+              <para>Iptc.Application2.Writer</para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+  </section>
+</section>
--- a/doc/docbook/GuideSidebarsInfo.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideSidebarsInfo.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -128,6 +128,36 @@
       <link linkend="GuideOptionsMetadata" endterm="titleGuideOptionsMetadata" />
       .
     </para>
+    <para>
+      If the right-click menu item
+      <guimenu>Revert</guimenu>
+      is executed at any time after a
+      <guimenu>Show all</guimenu>
+      or
+      <guimenu>Collapse all</guimenu>
+      , the keyword layout will be restored to the state prior to the
+      <guimenu>Show all</guimenu>
+      or
+      <guimenu>Collapse all</guimenu>
+      .
+      <para />
+      If the right-click menu item
+      <guimenu>Revert</guimenu>
+      is executed at any time before a
+      <guimenu>Show all</guimenu>
+      or
+      <guimenu>Collapse all</guimenu>
+      , the keyword layout will be restored to the state existing at start-up.
+    </para>
+    <note>
+      <para>
+        The selections in the sub-menu
+        <guimenu>On any change</guimenu>
+        will affect the operation of the
+        <guimenu>Revert</guimenu>
+        option.
+      </para>
+    </note>
     <para />
   </section>
   <section id="Listpanes-ExifFileinfoCopyrightLocationandGPS">
@@ -306,7 +336,41 @@
       <ulink url="https://www.openstreetmap.org">openstreetmap.org</ulink>
       . To use this facility, Geeqie must have been compiled with the --enable-map option.
     </para>
-    <para>Maps are useful when working with geocoded images. All geocoded images in the currently displayed folder will show as small icons on the map. Clicking the icon will expand the icon to show an image thumbnail, plus other pre-defined image data.</para>
-    <para>Right-click on the map will show other map options.</para>
+    <itemizedlist spacing="compact">
+      <listitem>
+        <para>
+          Image location display
+          <para />
+          All geocoded images in the currently displayed folder will show as small icons on the map. Clicking the icon will expand the icon to show an image thumbnail, plus other pre-defined image data.
+        </para>
+        <para>Right-click on the map will show other map options.</para>
+        <para>Middle-click controls the map-centering function.</para>
+      </listitem>
+      <listitem>
+        <para>
+          Geo-coded search
+          <para />
+          Left-click stores the latitude/longitude under the cursor into the clipboard. This may be used to define the origin of a
+          <link linkend="Searchparameters">geocode search</link>
+          .
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Geo-coding Images
+          <para />
+          If an image is not geocoded, the filename or icon on the file pane can be dragged-and-dropped onto the map. The image latitude and longitude xmp meta-data will be updated to the drop position on the map.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Map Centering
+          <para />
+          If an internet URL containg a valid latitude and longitude is dropped on the map, the map will be re-centered on that location. The zoom level will not change. Refer to
+          <link linkend="GuideReferenceDecodeLatLong">Decoding Latitude and Longitude</link>
+          .
+        </para>
+      </listitem>
+    </itemizedlist>
   </section>
 </section>
--- a/doc/docbook/GuideSidebarsSortManager.xml	Wed Jan 11 22:00:49 2017 +0000
+++ b/doc/docbook/GuideSidebarsSortManager.xml	Sat Jul 08 10:32:34 2017 +0100
@@ -57,8 +57,11 @@
       <para />
     </section>
     <section id="CopyMoveandLink">
-      <title>Copy, Move, and Link</title>
-      <para>These are the available operations to use on the active image, they should be self explanatory.</para>
+      <title>Copy, Move, Link and Desktop actions</title>
+      <para>
+        Copy, Move and Symbolic Link are available operations to use on the active image; they should be self explanatory. In some cases, Desktop files are also listed. This is detailed in
+        <link linkend="Geeqieextensions" endterm="titleGuideEditorsConfig" />
+      </para>
       <para />
     </section>
     <section id="Addbutton">
--- a/geeqie.spec.in	Wed Jan 11 22:00:49 2017 +0000
+++ b/geeqie.spec.in	Sat Jul 08 10:32:34 2017 +0100
@@ -81,7 +81,7 @@
 %suse_update_desktop_file -n geeqie
 %endif
 
-%__install -m 644 AUTHORS COPYING ChangeLog NEWS README README.lirc "%{buildroot}/%{_docdir}/%{docname}/"
+%__install -m 644 AUTHORS COPYING ChangeLog NEWS README.md README.lirc "%{buildroot}/%{_docdir}/%{docname}/"
 
 %clean
 %__rm -rf "%{buildroot}"
--- a/plugins/rotate/geeqie-rotate	Wed Jan 11 22:00:49 2017 +0000
+++ b/plugins/rotate/geeqie-rotate	Sat Jul 08 10:32:34 2017 +0100
@@ -47,12 +47,83 @@
     esac
 }
 
+rotate_image_file()
+{
+	ext=`echo "${3##*.}" |tr "[:upper:]" "[:lower:]"`
+	[ "x$ext" = "x" ] && return 4 #no extension
+
+	case "$ext" in
+	jpg|jpeg)
+		exiftran -i "$1" "$3"
+		return 0
+		;;
+
+	tif|tiff|png)
+		mogrify $2 "$3"
+		return 0
+		;;
+
+	*)	#not supported
+		return 4
+		;;
+	esac
+}
+
 get_sidecars=
 if [ "x$1" = "x-g" ] ; then
     get_sidecars=yes
     shift
 fi
 
+rotate_image_file=
+rotation=
+if [ "x$1" = "x-r" ] ; then
+	rotate_image_file=yes
+	shift
+	rotation="$1"
+	shift
+fi
+
+preserve_mtime=
+if [ "x$1" = "x-t" ] ; then
+	preserve_mtime=yes
+	shift
+fi
+
+if [ -n "$rotation" ] ; then
+	if [ "x$rotation" = "x0" ] ; then
+		exit 0
+	fi
+	if [ "x$rotation" = "x2" ] ; then
+		mogrify_param="-flop"
+		exiftran_param="-F"
+	fi
+	if [ "x$rotation" = "x3" ] ; then
+		mogrify_param="-rotate 180"
+		exiftran_param="-1"
+	fi
+	if [ "x$rotation" = "x4" ] ; then
+		mogrify_param="-flip"
+		exiftran_param="-f"
+	fi
+	if [ "x$rotation" = "x5" ] ; then
+		mogrify_param="-transpose"
+		exiftran_param="-t"
+	fi
+	if [ "x$rotation" = "x6" ] ; then
+		mogrify_param="-rotate 90"
+		exiftran_param="-9"
+	fi
+	if [ "x$rotation" = "x7" ] ; then
+		mogrify_param="-transverse"
+		exiftran_param="-T"
+	fi
+	if [ "x$rotation" = "x8" ] ; then
+		mogrify_param="-rotate -90"
+		exiftran_param="-2"
+	fi
+fi
+
 # iterate over files on commandline
 for file in "$@" ; do
     if [ -n "$get_sidecars" ] ; then
@@ -63,7 +134,25 @@
             rotate "$sidecar"
         done
     else
-        rotate "$file"
+		if [ -n "$rotate_image_file" ] ; then
+			if [ -n "$preserve_mtime" ] ; then
+				mtime=`mktemp /tmp/geeqie-rotate.XXXXXXXXXX` || exit 3
+				touch --reference="$file" "$mtime"
+			fi
+
+			rotate_image_file "$exiftran_param" "$mogrify_param" "$file"
+			ret=$?
+
+			if [ -n "$preserve_mtime" ] ; then
+				touch --reference="$mtime" "$file"
+				rm "$mtime"
+			fi
+			if [ $ret -eq 4 ] ; then
+				exit 4
+			fi
+		else
+			rotate "$file"
+		fi
     fi
 done
 
--- a/po/POTFILES.in	Wed Jan 11 22:00:49 2017 +0000
+++ b/po/POTFILES.in	Sat Jul 08 10:32:34 2017 +0100
@@ -51,6 +51,7 @@
 src/image-overlay.c
 src/img-view.c
 src/jpeg_parser.c
+src/keymap_template.c
 src/layout.c
 src/layout_config.c
 src/layout_image.c
@@ -64,13 +65,13 @@
 src/metadata.c
 src/misc.c
 src/options.c
-src/pan-calendar.c
-src/pan-folder.c
-src/pan-grid.c
-src/pan-item.c
-src/pan-timeline.c
-src/pan-util.c
-src/pan-view.c
+src/pan-view/pan-calendar.c
+src/pan-view/pan-folder.c
+src/pan-view/pan-grid.c
+src/pan-view/pan-item.c
+src/pan-view/pan-timeline.c
+src/pan-view/pan-util.c
+src/pan-view/pan-view.c
 src/pixbuf-renderer.c
 src/pixbuf_util.c
 src/preferences.c
--- a/po/de.po	Wed Jan 11 22:00:49 2017 +0000
+++ b/po/de.po	Sat Jul 08 10:32:34 2017 +0100
@@ -10,8 +10,8 @@
 msgstr ""
 "Project-Id-Version: geeqie-1.3\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 12:53+0100\n"
-"PO-Revision-Date: 2016-05-24 13:58+0100\n"
+"POT-Creation-Date: 2017-02-16 00:09+0100\n"
+"PO-Revision-Date: 2017-02-16 00:19+0100\n"
 "Last-Translator: Klaus Ethgen <Klaus@Ethgen.de>\n"
 "Language-Team: \n"
 "Language: de\n"
@@ -20,7 +20,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.8.7.1\n"
+"X-Generator: Poedit 1.8.11\n"
 
 #: ../geeqie.desktop.in.h:1
 msgid "Geeqie"
@@ -62,170 +62,170 @@
 msgid "UFRaw Batch recursive"
 msgstr "Rekursive UFRaw-Stapelverarbeitung"
 
-#: ../src/advanced_exif.c:328 ../src/cache_maint.c:1111 ../src/preferences.c:94
-#: ../src/preferences.c:1818
+#: ../src/advanced_exif.c:336 ../src/cache_maint.c:1131
+#: ../src/preferences.c:109 ../src/preferences.c:1869
 msgid "Metadata"
 msgstr "Schlüsselworte und Kommentare"
 
-#: ../src/advanced_exif.c:376 ../src/preferences.c:1732
+#: ../src/advanced_exif.c:384 ../src/preferences.c:1783
 msgid "Description"
 msgstr "Beschreibung"
 
-#: ../src/advanced_exif.c:377
+#: ../src/advanced_exif.c:385
 msgid "Value"
 msgstr "Wert"
 
-#: ../src/advanced_exif.c:378 ../src/desktop_file.c:515 ../src/dupe.c:2642
-#: ../src/dupe.c:3129 ../src/print.c:3199 ../src/search.c:2790
-#: ../src/utilops.c:462 ../src/view_file_list.c:1980
+#: ../src/advanced_exif.c:386 ../src/desktop_file.c:535 ../src/dupe.c:2702
+#: ../src/dupe.c:3241 ../src/print.c:3208 ../src/search.c:2819
+#: ../src/utilops.c:505 ../src/view_file_list.c:1989
 msgid "Name"
 msgstr "Name"
 
-#: ../src/advanced_exif.c:379
+#: ../src/advanced_exif.c:387
 msgid "Tag"
 msgstr "Tag"
 
-#: ../src/advanced_exif.c:380
+#: ../src/advanced_exif.c:388
 msgid "Format"
 msgstr "Format"
 
-#: ../src/advanced_exif.c:381
+#: ../src/advanced_exif.c:389
 msgid "Elements"
 msgstr "Elemente"
 
 #. default sidebar
-#: ../src/bar.c:167
+#: ../src/bar.c:175
 msgid "Histogram"
 msgstr "Histogramm"
 
-#: ../src/bar.c:168
+#: ../src/bar.c:176
 msgid "Title"
 msgstr "Titel"
 
-#: ../src/bar.c:169 ../src/search.c:2717
+#: ../src/bar.c:177 ../src/search.c:2746
 msgid "Keywords"
 msgstr "Schlüsselworte"
 
-#: ../src/bar.c:170 ../src/search.c:2729
+#: ../src/bar.c:178 ../src/search.c:2758
 msgid "Comment"
 msgstr "Kommentar"
 
-#: ../src/bar.c:171
+#: ../src/bar.c:179
 msgid "Exif"
 msgstr "Exif"
 
 #. other pre-configured panes
-#: ../src/bar.c:173
+#: ../src/bar.c:181
 msgid "File info"
 msgstr "Dateiinformationen"
 
-#: ../src/bar.c:174
+#: ../src/bar.c:182
 msgid "Location and GPS"
 msgstr "Ortsangaben und GPS"
 
-#: ../src/bar.c:175 ../src/exif.c:348
+#: ../src/bar.c:183 ../src/exif.c:342
 msgid "Copyright"
 msgstr "Urheberangaben"
 
-#: ../src/bar.c:178 ../src/bar_gps.c:756
+#: ../src/bar.c:186 ../src/bar_gps.c:821
 msgid "GPS Map"
 msgstr "GPS-Karte"
 
-#: ../src/bar.c:297
+#: ../src/bar.c:305
 msgid "Move to _top"
 msgstr "Ganz nach oben verschieben"
 
-#: ../src/bar.c:298 ../src/ui_bookmark.c:407
+#: ../src/bar.c:306 ../src/ui_bookmark.c:416
 msgid "Move _up"
 msgstr "Nach _oben verschieben"
 
-#: ../src/bar.c:299 ../src/ui_bookmark.c:409
+#: ../src/bar.c:307 ../src/ui_bookmark.c:418
 msgid "Move _down"
 msgstr "Nach _unten verschieben"
 
-#: ../src/bar.c:300
+#: ../src/bar.c:308
 msgid "Move to _bottom"
 msgstr "Ganz nach unten schieben"
 
-#: ../src/bar.c:302
+#: ../src/bar.c:310
 msgid "Remove"
 msgstr "Entfernen"
 
-#: ../src/bar_comment.c:195
+#: ../src/bar_comment.c:203
 msgid "Add text to selected files"
 msgstr "Text zu den ausgewählen Dateien hinzufügen"
 
-#: ../src/bar_comment.c:196
+#: ../src/bar_comment.c:204
 msgid "Replace existing text in selected files"
 msgstr "Text in ausgewählten Dateien ersetzen"
 
-#: ../src/bar_exif.c:213
+#: ../src/bar_exif.c:221
 msgid "<empty label, fixme>"
 msgstr "<leere Beschreibung, bitte beheben>"
 
-#: ../src/bar_exif.c:541 ../src/bar_exif.c:551
+#: ../src/bar_exif.c:549 ../src/bar_exif.c:559
 msgid "Configure entry"
 msgstr "Eintrag bearbeiten"
 
 #. for the pane
-#: ../src/bar_exif.c:541 ../src/bar_exif.c:551 ../src/bar_exif.c:624
+#: ../src/bar_exif.c:549 ../src/bar_exif.c:559 ../src/bar_exif.c:632
 msgid "Add entry"
 msgstr "Eintrag hinzufügen"
 
-#: ../src/bar_exif.c:557
+#: ../src/bar_exif.c:565
 msgid "Key:"
 msgstr "Schlüssel:"
 
-#: ../src/bar_exif.c:566
+#: ../src/bar_exif.c:574
 msgid "Title:"
 msgstr "Titel:"
 
-#: ../src/bar_exif.c:575
+#: ../src/bar_exif.c:583
 msgid "Show only if set"
 msgstr "Nur anzeigen wenn gesetzt"
 
-#: ../src/bar_exif.c:576
+#: ../src/bar_exif.c:584
 msgid "Editable (supported only for XMP)"
 msgstr "Editierbar (Nur für XMP unterstützt)"
 
 #. for the entry
-#: ../src/bar_exif.c:612
+#: ../src/bar_exif.c:620
 #, c-format
 msgid "Configure \"%s\""
 msgstr "\"%s\" konfigurieren"
 
-#: ../src/bar_exif.c:613 ../src/bar_keywords.c:1189
+#: ../src/bar_exif.c:621 ../src/bar_keywords.c:1198
 #, c-format
 msgid "Remove \"%s\""
 msgstr "Entferne \"%s\""
 
-#: ../src/bar_exif.c:625
+#: ../src/bar_exif.c:633
 msgid "Show hidden entries"
 msgstr "Versteckte Objekte anzeigen"
 
-#: ../src/bar_gps.c:483
+#: ../src/bar_gps.c:544
 #, c-format
 msgid "Zoom %i"
 msgstr "Zoom %i"
 
-#: ../src/bar_gps.c:501
+#: ../src/bar_gps.c:562
 #, c-format
 msgid "Zoom level %i"
 msgstr "Zoom-Einstellung %i"
 
-#: ../src/bar_gps.c:506
+#: ../src/bar_gps.c:567
 msgid "Loading map"
 msgstr "Lade Karte"
 
-#: ../src/bar_gps.c:572
+#: ../src/bar_gps.c:633
 msgid "Enable markers"
 msgstr "Markierungen einschalten"
 
-#: ../src/bar_gps.c:574
+#: ../src/bar_gps.c:635
 msgid "Centre map on marker"
 msgstr "Zentriere Karte an Markierung"
 
-#: ../src/bar_gps.c:596
+#: ../src/bar_gps.c:657
 msgid ""
 "Move map centre to marker\n"
 " is disabled"
@@ -233,7 +233,7 @@
 "Kartenzentrum zur Markierung bewegen\n"
 "ist ausgeschaltet"
 
-#: ../src/bar_gps.c:601
+#: ../src/bar_gps.c:662
 msgid ""
 "Move map centre to marker\n"
 " is enabled"
@@ -241,130 +241,127 @@
 "Kartenzentrum zur Markierung bewegen\n"
 "ist eingeschaltet"
 
-#: ../src/bar_gps.c:610
+#: ../src/bar_gps.c:671
 msgid "Map Centreing"
 msgstr "Kartenzentrierung"
 
 #. use the same strings as in layout_util.c
-#: ../src/bar_histogram.c:249 ../src/layout_util.c:1430
+#: ../src/bar_histogram.c:257 ../src/layout_util.c:1639
 msgid "Histogram on _Red"
 msgstr "Histogramm für _Rot"
 
-#: ../src/bar_histogram.c:250 ../src/layout_util.c:1431
+#: ../src/bar_histogram.c:258 ../src/layout_util.c:1640
 msgid "Histogram on _Green"
 msgstr "Histogramm für _Grün"
 
-#: ../src/bar_histogram.c:251 ../src/layout_util.c:1432
+#: ../src/bar_histogram.c:259 ../src/layout_util.c:1641
 msgid "Histogram on _Blue"
 msgstr "Histogramm für _Blau"
 
-#: ../src/bar_histogram.c:252 ../src/layout_util.c:1433
+#: ../src/bar_histogram.c:260 ../src/layout_util.c:1642
 msgid "_Histogram on RGB"
 msgstr "_Histogramm für RGB"
 
-#: ../src/bar_histogram.c:253 ../src/layout_util.c:1434
+#: ../src/bar_histogram.c:261 ../src/layout_util.c:1643
 msgid "Histogram on _Value"
 msgstr "Histogramm für _Wert"
 
-#: ../src/bar_histogram.c:257 ../src/layout_util.c:1438
+#: ../src/bar_histogram.c:265 ../src/layout_util.c:1647
 msgid "Li_near Histogram"
 msgstr "Li_neares Histogramm"
 
-#: ../src/bar_histogram.c:258
+#: ../src/bar_histogram.c:266
 msgid "L_og Histogram"
 msgstr "L_og. Histogramm"
 
-#: ../src/bar_keywords.c:403
+#: ../src/bar_keywords.c:412
 msgid "Add keywords to selected files"
 msgstr "Schlüsselworte zu den ausgewählen Dateien hinzufügen."
 
-#: ../src/bar_keywords.c:404
+#: ../src/bar_keywords.c:413
 msgid "Replace existing keywords in selected files"
 msgstr "Bestehende Schlüsselworte der ausgewählen Dateien austauschen"
 
-#: ../src/bar_keywords.c:875
+#: ../src/bar_keywords.c:884
 msgid "Edit keyword"
 msgstr "Schlüsselwort bearbeiten"
 
-#: ../src/bar_keywords.c:875
-msgid "Add keywords"
-msgstr "Schlüsselworte hinzufügen"
-
-#: ../src/bar_keywords.c:882
+#: ../src/bar_keywords.c:884 ../src/bar_keywords.c:891
+#: ../src/bar_keywords.c:1152
+msgid "New keyword"
+msgstr "Schlüsselwort hinzufügen"
+
+#: ../src/bar_keywords.c:891
 msgid "Configure keyword"
 msgstr "Einstellungen zu Schlüsselwort bearbeiten"
 
-#: ../src/bar_keywords.c:882 ../src/bar_keywords.c:1143
-msgid "Add keyword"
-msgstr "Schlüsselwort hinzufügen"
-
-#: ../src/bar_keywords.c:888
+#: ../src/bar_keywords.c:897
 msgid "Keyword:"
 msgstr "Schlüsselwort:"
 
-#: ../src/bar_keywords.c:897
+#: ../src/bar_keywords.c:906
 msgid "Keyword type:"
 msgstr "Art des Schlüsselwortes:"
 
-#: ../src/bar_keywords.c:899
+#: ../src/bar_keywords.c:908
 msgid "Active keyword"
 msgstr "Aktives Schlüsselwort"
 
-#: ../src/bar_keywords.c:902
+#: ../src/bar_keywords.c:911
 msgid "Helper"
 msgstr "Hilfseintrag"
 
-#: ../src/bar_keywords.c:1147
+#: ../src/bar_keywords.c:1156
 msgid "Add keyword to all selected images"
 msgstr "Schlüsselworte zu den ausgewählten Dateien hinzufügen."
 
-#: ../src/bar_keywords.c:1167
+#: ../src/bar_keywords.c:1176
 #, c-format
 msgid "Hide \"%s\""
 msgstr "Verberge \"%s\""
 
-#: ../src/bar_keywords.c:1174
+#: ../src/bar_keywords.c:1183
 #, c-format
 msgid "Mark %d"
 msgstr "Markierung %d"
 
-#: ../src/bar_keywords.c:1179
+#: ../src/bar_keywords.c:1188
 #, c-format
 msgid "Connect \"%s\" to mark"
 msgstr "Verbinde \"%s\" mit Markierung"
 
-#: ../src/bar_keywords.c:1186
+#: ../src/bar_keywords.c:1195
 #, c-format
 msgid "Edit \"%s\""
 msgstr "\"%s\" bearbeiten"
 
-#: ../src/bar_keywords.c:1196
+#: ../src/bar_keywords.c:1205
 #, c-format
 msgid "Disconnect \"%s\" from mark %s"
 msgstr "Löse Verbindung von \"%s\" zu Markierung %s"
 
 #. for the pane
-#: ../src/bar_keywords.c:1208 ../src/bar_keywords.c:1217
+#: ../src/bar_keywords.c:1217 ../src/bar_keywords.c:1226
 msgid "Expand checked"
 msgstr "Ausgewählte expandieren"
 
-#: ../src/bar_keywords.c:1209 ../src/bar_keywords.c:1218
+#: ../src/bar_keywords.c:1218 ../src/bar_keywords.c:1227
 msgid "Collapse unchecked"
 msgstr "Nicht ausgewählte schließen"
 
-#: ../src/bar_keywords.c:1210 ../src/bar_keywords.c:1219
+#: ../src/bar_keywords.c:1219 ../src/bar_keywords.c:1228
 msgid "Hide unchecked"
 msgstr "Nicht ausgewählte verbergen"
 
-#: ../src/bar_keywords.c:1211
+#: ../src/bar_keywords.c:1220
 msgid "Show all"
 msgstr "Alle anzeigen"
 
-#: ../src/bar_keywords.c:1214
+#: ../src/bar_keywords.c:1223
 msgid "On any change"
 msgstr "Bei jeder Änderung ..."
 
-#: ../src/bar_sort.c:449
+#: ../src/bar_sort.c:457
 #, c-format
 msgid ""
 "The collection:\n"
@@ -372,11 +369,11 @@
 "already exists."
 msgstr "Die Sammlung '%s' existiert bereits!"
 
-#: ../src/bar_sort.c:450
+#: ../src/bar_sort.c:458
 msgid "Collection exists"
 msgstr "Sammlung existiert"
 
-#: ../src/bar_sort.c:464 ../src/collect.c:1043 ../src/collect-dlg.c:85
+#: ../src/bar_sort.c:472 ../src/collect.c:1060 ../src/collect-dlg.c:93
 #, c-format
 msgid ""
 "Failed to save the collection:\n"
@@ -385,55 +382,56 @@
 "Fehler beim Speichern der Sammlung:\n"
 "%s"
 
-#: ../src/bar_sort.c:465 ../src/collect.c:1044 ../src/collect-dlg.c:86
+#: ../src/bar_sort.c:473 ../src/collect.c:1061 ../src/collect-dlg.c:94
 msgid "Save Failed"
 msgstr "Fehler beim Speichern"
 
-#: ../src/bar_sort.c:500 ../src/bar_sort.c:670
+#: ../src/bar_sort.c:508 ../src/bar_sort.c:678
 msgid "Add Bookmark"
 msgstr "Lesezeichen/Sammlung hinzufügen"
 
-#: ../src/bar_sort.c:504
+#: ../src/bar_sort.c:512
 msgid "Add Collection"
 msgstr "Neue Sammlung"
 
-#: ../src/bar_sort.c:521 ../src/ui_bookmark.c:288
+#: ../src/bar_sort.c:529 ../src/ui_bookmark.c:297
 msgid "Name:"
 msgstr "Name:"
 
-#: ../src/bar_sort.c:597
+#: ../src/bar_sort.c:605
 msgid "Sort Manager"
 msgstr "Sortier-Manager"
 
-#: ../src/bar_sort.c:606 ../src/pan-view.c:2194 ../src/ui_pathsel.c:1097
+#: ../src/bar_sort.c:614 ../src/pan-view/pan-view.c:2213
+#: ../src/ui_pathsel.c:1106
 msgid "Folders"
 msgstr "Verzeichnisse"
 
-#: ../src/bar_sort.c:607 ../src/options.c:160
+#: ../src/bar_sort.c:615 ../src/options.c:174
 msgid "Collections"
 msgstr "Sammlungen"
 
-#: ../src/bar_sort.c:615 ../src/utilops.c:2137
+#: ../src/bar_sort.c:623 ../src/utilops.c:2277
 msgid "Copy"
 msgstr "Kopieren"
 
-#: ../src/bar_sort.c:618 ../src/utilops.c:2088
+#: ../src/bar_sort.c:626 ../src/utilops.c:2227
 msgid "Move"
 msgstr "Verschieben"
 
-#: ../src/bar_sort.c:657
+#: ../src/bar_sort.c:665
 msgid "Add image"
 msgstr "Bild hinzufügen"
 
-#: ../src/bar_sort.c:660
+#: ../src/bar_sort.c:668
 msgid "Add selection"
 msgstr "Auswahl hinzufügen"
 
-#: ../src/bar_sort.c:673
+#: ../src/bar_sort.c:681
 msgid "Undo last image"
 msgstr "Letzten Vorgang rückgängig machen"
 
-#: ../src/cache.c:163
+#: ../src/cache.c:172
 #, c-format
 msgid ""
 "error saving sim cache data: %s\n"
@@ -442,78 +440,78 @@
 "Fehler beim Speichern des Cache für Ähnlichkeitsinformationen: %s\n"
 "Fehler: %s\n"
 
-#: ../src/cache_maint.c:110 ../src/cache_maint.c:549 ../src/cache_maint.c:765
-#: ../src/editors.c:1177
+#: ../src/cache_maint.c:120 ../src/cache_maint.c:559 ../src/cache_maint.c:775
+#: ../src/editors.c:1189
 msgid "done"
 msgstr "fertig"
 
-#: ../src/cache_maint.c:288
+#: ../src/cache_maint.c:298
 msgid "Removing old metadata..."
 msgstr "Entferne alte Metadaten..."
 
-#: ../src/cache_maint.c:292
+#: ../src/cache_maint.c:302
 msgid "Clearing cached thumbnails..."
 msgstr "Lösche gespeicherte Vorschaubilder..."
 
-#: ../src/cache_maint.c:296 ../src/cache_maint.c:923
+#: ../src/cache_maint.c:306 ../src/cache_maint.c:933
 msgid "Removing old thumbnails..."
 msgstr "Entferne alte Vorschaubilder..."
 
-#: ../src/cache_maint.c:299 ../src/cache_maint.c:926
+#: ../src/cache_maint.c:309 ../src/cache_maint.c:936
 msgid "Maintenance"
 msgstr "Bereinigung"
 
-#: ../src/cache_maint.c:660
+#: ../src/cache_maint.c:670
 msgid "Invalid folder"
 msgstr "Ungültiges Verzeichnis"
 
-#: ../src/cache_maint.c:661
+#: ../src/cache_maint.c:671
 msgid "The specified folder can not be found."
 msgstr "Fehler! Das angegebene Verzeichnis konnte nicht gefunden werden."
 
-#: ../src/cache_maint.c:692 ../src/cache_maint.c:706 ../src/cache_maint.c:1102
+#: ../src/cache_maint.c:702 ../src/cache_maint.c:716 ../src/cache_maint.c:1122
 msgid "Create thumbnails"
 msgstr "Vorschaubilder erzeugen"
 
-#: ../src/cache_maint.c:700 ../src/cache_maint.c:933
+#: ../src/cache_maint.c:710 ../src/cache_maint.c:943
 msgid "S_tart"
 msgstr "S_tart"
 
-#: ../src/cache_maint.c:713 ../src/preferences.c:2005
+#: ../src/cache_maint.c:723 ../src/preferences.c:2117
 msgid "Folder:"
 msgstr "Verzeichnis:"
 
-#: ../src/cache_maint.c:716
+#: ../src/cache_maint.c:726
 msgid "Select folder"
 msgstr "Verzeichnisauswahl"
 
-#: ../src/cache_maint.c:720
+#: ../src/cache_maint.c:730
 msgid "Include subfolders"
 msgstr "rekursiv (inkl. Unterverzeichnisse)"
 
-#: ../src/cache_maint.c:721
+#: ../src/cache_maint.c:731
 msgid "Store thumbnails local to source images"
 msgstr ""
 "Vorschaubilder innerhalb des Bilderverzeichnisses speichern (.thumbnails)"
 
-#: ../src/cache_maint.c:730 ../src/cache_maint.c:942
+#: ../src/cache_maint.c:740 ../src/cache_maint.c:952
 msgid "click start to begin"
 msgstr "Klicke den Start-Button, um mit der Bereinigung zu beginnen."
 
-#: ../src/cache_maint.c:869 ../src/editors.c:1103
+#: ../src/cache_maint.c:879 ../src/editors.c:1115
 msgid "running..."
 msgstr "läuft..."
 
-#: ../src/cache_maint.c:918
+#: ../src/cache_maint.c:928
 msgid "Clearing thumbnails..."
 msgstr "Lösche Vorschaubilder..."
 
-#: ../src/cache_maint.c:984 ../src/cache_maint.c:987 ../src/cache_maint.c:1080
-#: ../src/cache_maint.c:1097
+#: ../src/cache_maint.c:997 ../src/cache_maint.c:1000 ../src/cache_maint.c:1100
+#: ../src/cache_maint.c:1117
 msgid "Clear cache"
 msgstr "Löschen"
 
-#: ../src/cache_maint.c:988
+#: ../src/cache_maint.c:1001
 msgid ""
 "This will remove all thumbnails that have\n"
 "been saved to disk, continue?"
@@ -521,75 +519,75 @@
 "Dies wird alle Vorschaubilder löschen!\n"
 "Wirklich löschen?"
 
-#: ../src/cache_maint.c:1030
+#: ../src/cache_maint.c:1048
 #, c-format
 msgid "Location: %s"
 msgstr "Pfad: %s"
 
-#: ../src/cache_maint.c:1055
+#: ../src/cache_maint.c:1073
 msgid "Cache Maintenance"
 msgstr "Cachewartung"
 
-#: ../src/cache_maint.c:1065
+#: ../src/cache_maint.c:1085
 msgid "Cache and Data Maintenance"
 msgstr "Speicher für Vorschaubilder, Schlüsselworte und Kommentare"
 
-#: ../src/cache_maint.c:1069
+#: ../src/cache_maint.c:1089
 msgid "Thumbnail cache"
 msgstr "Cache für Vorschaubilder"
 
-#: ../src/cache_maint.c:1075 ../src/cache_maint.c:1092
-#: ../src/cache_maint.c:1117
+#: ../src/cache_maint.c:1095 ../src/cache_maint.c:1112
+#: ../src/cache_maint.c:1137
 msgid "Clean up"
 msgstr "Bereinigen"
 
-#: ../src/cache_maint.c:1078 ../src/cache_maint.c:1095
+#: ../src/cache_maint.c:1098 ../src/cache_maint.c:1115
 msgid "Remove orphaned or outdated thumbnails."
 msgstr "Entfernt ungültige und veraltete Vorschaubilder aus diesem Speicher."
 
-#: ../src/cache_maint.c:1083 ../src/cache_maint.c:1100
+#: ../src/cache_maint.c:1103 ../src/cache_maint.c:1120
 msgid "Delete all cached thumbnails."
 msgstr "Entfernt alle Vorschaubilder aus diesem Speicher."
 
-#: ../src/cache_maint.c:1086
+#: ../src/cache_maint.c:1106
 msgid "Shared thumbnail cache"
 msgstr "Gemeinsamer Speicher für Vorschaubilder"
 
-#: ../src/cache_maint.c:1106
+#: ../src/cache_maint.c:1126
 msgid "Render"
 msgstr "Erzeugen"
 
-#: ../src/cache_maint.c:1109
+#: ../src/cache_maint.c:1129
 msgid "Render thumbnails for a specific folder."
 msgstr "Erzeugt Vorschaubilder für ein spezielles Verzeichnis."
 
-#: ../src/cache_maint.c:1120
+#: ../src/cache_maint.c:1140
 msgid "Remove orphaned keywords and comments."
 msgstr ""
 "Entfernt ungültige und veraltete Schlüsselworte und Kommenare aus diesem "
 "Speicher."
 
 #. When does this occur ??
-#: ../src/collect.c:331 ../src/image.c:160 ../src/image-overlay.c:532
-#: ../src/image-overlay.c:609
+#: ../src/collect.c:339 ../src/image.c:168 ../src/image-overlay.c:541
+#: ../src/image-overlay.c:618
 msgid "Untitled"
 msgstr "Unbenannt"
 
-#: ../src/collect.c:335
+#: ../src/collect.c:343
 #, c-format
 msgid "Untitled (%d)"
 msgstr "Unbenannt (%d)"
 
-#: ../src/collect.c:968
+#: ../src/collect.c:985
 #, c-format
 msgid "%s - Collection - %s"
 msgstr "%s - Sammlung - %s"
 
-#: ../src/collect.c:1080 ../src/collect.c:1084
+#: ../src/collect.c:1097 ../src/collect.c:1101
 msgid "Close collection"
 msgstr "Sammlung schließen"
 
-#: ../src/collect.c:1085
+#: ../src/collect.c:1102
 msgid ""
 "Collection has been modified.\n"
 "Save first?"
@@ -597,11 +595,11 @@
 "Die Sammlung wurde verändert.\n"
 "Änderungen zuerst speichern?"
 
-#: ../src/collect.c:1088
+#: ../src/collect.c:1105
 msgid "_Discard"
 msgstr "_Verwerfen"
 
-#: ../src/collect-dlg.c:59
+#: ../src/collect-dlg.c:67
 #, c-format
 msgid ""
 "Specified path:\n"
@@ -613,67 +611,67 @@
 "ist ein Verzeichnis.\n"
 "Sammlungen werden als Dateien gespeichert."
 
-#: ../src/collect-dlg.c:60
+#: ../src/collect-dlg.c:68
 msgid "Invalid filename"
 msgstr "Ungültiger Dateiname"
 
-#: ../src/collect-dlg.c:69
+#: ../src/collect-dlg.c:77
 msgid "Overwrite File"
 msgstr "Datei überschreiben"
 
-#: ../src/collect-dlg.c:74
+#: ../src/collect-dlg.c:82
 msgid "Overwrite existing file?"
 msgstr "Vorhandene Datei überschreiben?"
 
-#: ../src/collect-dlg.c:76
+#: ../src/collect-dlg.c:84
 msgid "_Overwrite"
 msgstr "Ü_berschreiben"
 
-#: ../src/collect-dlg.c:127
+#: ../src/collect-dlg.c:135
 #, c-format
 msgid "No such file '%s'."
 msgstr "Datei '%s' existiert nicht."
 
-#: ../src/collect-dlg.c:132
+#: ../src/collect-dlg.c:140
 #, c-format
 msgid "'%s' is a directory, not a collection file."
 msgstr "'%s' ist ein Verzeichnis, keine Sammlung."
 
-#: ../src/collect-dlg.c:137
+#: ../src/collect-dlg.c:145
 #, c-format
 msgid "You do not have read permissions on the file '%s'."
 msgstr "Sie haben keine Leseberechtigung für die Datei '%s'."
 
-#: ../src/collect-dlg.c:143
+#: ../src/collect-dlg.c:151
 msgid "Can not open collection file"
 msgstr "Datei mit Sammlung kann nicht geöffnet werden"
 
-#: ../src/collect-dlg.c:195
+#: ../src/collect-dlg.c:203
 msgid "Save collection"
 msgstr "Sammlung speichern"
 
-#: ../src/collect-dlg.c:202
-msgid "Open collection"
-msgstr "Öffne Sammlung"
-
 #: ../src/collect-dlg.c:210
+msgid "Open collection"
+msgstr "Öffne Sammlung"
+
+#: ../src/collect-dlg.c:218
 msgid "Append collection"
 msgstr "Füge Sammlung hinzu"
 
-#: ../src/collect-dlg.c:211
+#: ../src/collect-dlg.c:219
 msgid "_Append"
 msgstr "_Hinzufügen"
 
-#: ../src/collect-dlg.c:228
+#: ../src/collect-dlg.c:236
 msgid "Collection Files"
 msgstr "Sammlungsdateien"
 
-#: ../src/collect-io.c:348
+#: ../src/collect-io.c:356
 #, c-format
 msgid "failed to open collection (write) \"%s\"\n"
 msgstr "Fehler beim Öffnen der Sammlung \"%s\" zum speichenr\n"
 
-#: ../src/collect-io.c:373
+#: ../src/collect-io.c:381
 #, c-format
 msgid ""
 "error saving collection file: %s\n"
@@ -692,168 +690,174 @@
 msgid "%s, %d images"
 msgstr "%s, %d Bilder"
 
-#: ../src/collect-table.c:223 ../src/layout_util.c:1229
-#: ../src/layout_util.c:2153
+#: ../src/collect-table.c:223 ../src/layout_util.c:1434
+#: ../src/layout_util.c:2369
 msgid "Empty"
 msgstr "Leer"
 
-#: ../src/collect-table.c:237 ../src/dupe.c:1314 ../src/search.c:320
-#: ../src/view_file.c:835 ../src/view_file.c:938
+#: ../src/collect-table.c:237 ../src/dupe.c:1334 ../src/search.c:329
+#: ../src/view_file.c:871 ../src/view_file.c:974
 msgid "Loading thumbs..."
 msgstr "Lade Vorschaubilder..."
 
-#: ../src/collect-table.c:873 ../src/dupe.c:2237 ../src/dupe.c:2550
-#: ../src/layout_util.c:1276 ../src/search.c:996
+#: ../src/collect-table.c:904 ../src/dupe.c:2295 ../src/dupe.c:2608
+#: ../src/layout_util.c:1481 ../src/search.c:1005
 msgid "_View"
 msgstr "_Ansicht"
 
-#: ../src/collect-table.c:875 ../src/dupe.c:2239 ../src/dupe.c:2552
-#: ../src/img-view.c:1268 ../src/layout_image.c:499 ../src/pan-view.c:2617
-#: ../src/search.c:998 ../src/view_file.c:588
+#: ../src/collect-table.c:906 ../src/dupe.c:2297 ../src/dupe.c:2610
+#: ../src/img-view.c:1278 ../src/layout_image.c:675
+#: ../src/pan-view/pan-view.c:2636 ../src/search.c:1007 ../src/view_file.c:618
 msgid "View in _new window"
 msgstr "In _neuem Fenster anzeigen"
 
-#: ../src/collect-table.c:878 ../src/dupe.c:2273 ../src/dupe.c:2560
-#: ../src/search.c:1028
+#: ../src/collect-table.c:909 ../src/dupe.c:2331 ../src/dupe.c:2618
+#: ../src/search.c:1037
 msgid "Rem_ove"
 msgstr "Ent_fernen"
 
-#: ../src/collect-table.c:881
+#: ../src/collect-table.c:912
 msgid "Append from file list"
 msgstr "Dateiliste hinzufügen"
 
-#: ../src/collect-table.c:883
+#: ../src/collect-table.c:914
 msgid "Append from collection..."
 msgstr "Sammlung hinzufügen..."
 
-#: ../src/collect-table.c:887
+#: ../src/collect-table.c:918
 msgid "_Selection"
 msgstr "Auswahl"
 
-#: ../src/collect-table.c:889 ../src/dupe.c:2242 ../src/dupe.c:2555
-#: ../src/layout_util.c:1324 ../src/search.c:1001
+#: ../src/collect-table.c:920 ../src/dupe.c:2300 ../src/dupe.c:2613
+#: ../src/layout_util.c:1529 ../src/search.c:1010
 msgid "Select all"
 msgstr "Alles auswählen"
 
-#: ../src/collect-table.c:891 ../src/dupe.c:2244 ../src/dupe.c:2557
-#: ../src/layout_util.c:1325 ../src/search.c:1003
+#: ../src/collect-table.c:922 ../src/dupe.c:2302 ../src/dupe.c:2615
+#: ../src/layout_util.c:1530 ../src/search.c:1012
 msgid "Select none"
 msgstr "Nichts auswählen"
 
-#: ../src/collect-table.c:893
+#: ../src/collect-table.c:924
 msgid "Invert selection"
 msgstr "Auswahl umkehren"
 
-#: ../src/collect-table.c:905 ../src/dupe.c:2262 ../src/img-view.c:1272
-#: ../src/layout_image.c:507 ../src/layout_util.c:1307 ../src/pan-view.c:2621
-#: ../src/search.c:1017 ../src/view_file.c:592
+#: ../src/collect-table.c:926
+msgid "Rectangular selection"
+msgstr "Rechteckige Auswahl"
+
+#: ../src/collect-table.c:938 ../src/dupe.c:2320 ../src/img-view.c:1282
+#: ../src/layout_image.c:683 ../src/layout_util.c:1512
+#: ../src/pan-view/pan-view.c:2640 ../src/search.c:1026 ../src/view_file.c:622
 msgid "_Copy..."
 msgstr "_Kopieren..."
 
-#: ../src/collect-table.c:907 ../src/dupe.c:2264 ../src/img-view.c:1273
-#: ../src/layout_image.c:509 ../src/layout_util.c:1308 ../src/pan-view.c:2623
-#: ../src/search.c:1019 ../src/view_file.c:594
+#: ../src/collect-table.c:940 ../src/dupe.c:2322 ../src/img-view.c:1283
+#: ../src/layout_image.c:685 ../src/layout_util.c:1513
+#: ../src/pan-view/pan-view.c:2642 ../src/search.c:1028 ../src/view_file.c:624
 msgid "_Move..."
 msgstr "_Verschieben..."
 
-#: ../src/collect-table.c:909 ../src/dupe.c:2266 ../src/img-view.c:1274
-#: ../src/layout_image.c:511 ../src/layout_util.c:1309 ../src/pan-view.c:2625
-#: ../src/search.c:1021 ../src/view_dir.c:665 ../src/view_file.c:596
+#: ../src/collect-table.c:942 ../src/dupe.c:2324 ../src/img-view.c:1284
+#: ../src/layout_image.c:687 ../src/layout_util.c:1514
+#: ../src/pan-view/pan-view.c:2644 ../src/search.c:1030 ../src/view_dir.c:674
+#: ../src/view_file.c:626
 msgid "_Rename..."
 msgstr "_Umbenennen..."
 
-#: ../src/collect-table.c:911 ../src/dupe.c:2268 ../src/img-view.c:1275
-#: ../src/layout_image.c:513 ../src/layout_util.c:1310
-#: ../src/layout_util.c:1311 ../src/layout_util.c:1312 ../src/pan-view.c:2627
-#: ../src/search.c:1023 ../src/view_dir.c:667 ../src/view_file.c:598
+#: ../src/collect-table.c:944 ../src/dupe.c:2326 ../src/img-view.c:1285
+#: ../src/layout_image.c:689 ../src/layout_util.c:1515
+#: ../src/layout_util.c:1516 ../src/layout_util.c:1517
+#: ../src/pan-view/pan-view.c:2646 ../src/search.c:1032 ../src/view_dir.c:676
+#: ../src/view_file.c:628
 msgid "_Delete..."
 msgstr "_Löschen..."
 
-#: ../src/collect-table.c:913 ../src/dupe.c:2270 ../src/img-view.c:1276
-#: ../src/layout_image.c:516 ../src/pan-view.c:2629 ../src/search.c:1025
-#: ../src/view_dir.c:670 ../src/view_file.c:600
+#: ../src/collect-table.c:946 ../src/dupe.c:2328 ../src/img-view.c:1286
+#: ../src/layout_image.c:692 ../src/pan-view/pan-view.c:2648
+#: ../src/search.c:1034 ../src/view_dir.c:679 ../src/view_file.c:630
 msgid "_Copy path"
 msgstr "_Kopiere Pfad"
 
-#: ../src/collect-table.c:919
+#: ../src/collect-table.c:952
 msgid "Randomize"
 msgstr "Mischen"
 
-#: ../src/collect-table.c:921 ../src/view_file.c:616
+#: ../src/collect-table.c:954 ../src/view_file.c:652
 msgid "_Sort"
 msgstr "_Sortieren"
 
-#: ../src/collect-table.c:924 ../src/view_file.c:632
+#: ../src/collect-table.c:957 ../src/view_file.c:668
 msgid "Show filename _text"
 msgstr "_Dateinamen anzeigen"
 
-#: ../src/collect-table.c:927
+#: ../src/collect-table.c:960
 msgid "_Save collection"
 msgstr "Sammlung _speichern"
 
-#: ../src/collect-table.c:929
+#: ../src/collect-table.c:962
 msgid "Save collection _as..."
 msgstr "Sammlung speichern _als..."
 
-#: ../src/collect-table.c:932 ../src/layout_util.c:1303
+#: ../src/collect-table.c:965 ../src/layout_util.c:1508 ../src/view_file.c:639
 msgid "_Find duplicates..."
 msgstr "_Duplikate suchen..."
 
-#: ../src/collect-table.c:934 ../src/dupe.c:2259 ../src/layout_util.c:1305
-#: ../src/search.c:1014
+#: ../src/collect-table.c:967 ../src/dupe.c:2317 ../src/layout_util.c:1510
+#: ../src/search.c:1023
 msgid "Print..."
 msgstr "D_rucken..."
 
-#: ../src/collect-table.c:2099 ../src/dupe.c:3319 ../src/img-view.c:1430
+#: ../src/collect-table.c:2156 ../src/dupe.c:3455 ../src/img-view.c:1440
 msgid "Dropped list includes folders."
 msgstr "Markierung enthält Verzeichnisse"
 
-#: ../src/collect-table.c:2101 ../src/dupe.c:3321 ../src/img-view.c:1432
+#: ../src/collect-table.c:2158 ../src/dupe.c:3457 ../src/img-view.c:1442
 msgid "_Add contents"
 msgstr "Inhalt _hinzufügen"
 
-#: ../src/collect-table.c:2103 ../src/dupe.c:3322 ../src/img-view.c:1433
+#: ../src/collect-table.c:2160 ../src/dupe.c:3458 ../src/img-view.c:1443
 msgid "Add contents _recursive"
 msgstr "Inhalt _rekursiv hinzufügen"
 
-#: ../src/collect-table.c:2105 ../src/dupe.c:3323 ../src/img-view.c:1434
+#: ../src/collect-table.c:2162 ../src/dupe.c:3459 ../src/img-view.c:1444
 msgid "_Skip folders"
 msgstr "Über_springe Verzeichnisse"
 
-#: ../src/collect-table.c:2108 ../src/dupe.c:3325 ../src/img-view.c:1436
-#: ../src/view_dir.c:417
+#: ../src/collect-table.c:2165 ../src/dupe.c:3461 ../src/img-view.c:1446
+#: ../src/view_dir.c:426
 msgid "Cancel"
 msgstr "_Abbrechen"
 
-#: ../src/color-man.c:426 ../src/exif.c:233 ../src/exif-common.c:436
+#: ../src/color-man.c:434 ../src/exif.c:227 ../src/exif-common.c:448
 msgid "sRGB"
 msgstr "sRGB"
 
-#: ../src/color-man.c:428
+#: ../src/color-man.c:436
 msgid "Adobe RGB compatible"
 msgstr "AdobeRGB-kompatibel"
 
-#: ../src/color-man.c:445
+#: ../src/color-man.c:453
 msgid "Custom profile"
 msgstr "Benutzerprofiel"
 
-#: ../src/desktop_file.c:74 ../src/desktop_file.c:86 ../src/desktop_file.c:92
+#: ../src/desktop_file.c:83 ../src/desktop_file.c:95 ../src/desktop_file.c:101
 msgid "Can't save"
 msgstr "Kann nichts speichern"
 
-#: ../src/desktop_file.c:74
+#: ../src/desktop_file.c:83
 msgid "Please specify file name."
 msgstr "Bitte einen anderen Dateiname angeben."
 
-#: ../src/desktop_file.c:86
+#: ../src/desktop_file.c:95
 msgid "Could not create directory"
 msgstr "Verzeichnisses kann nicht erstellt werden"
 
-#: ../src/desktop_file.c:182 ../src/desktop_file.c:534
+#: ../src/desktop_file.c:191 ../src/desktop_file.c:554
 msgid "Desktop file"
 msgstr "Desktop-Datei"
 
-#: ../src/desktop_file.c:291 ../src/ui_pathsel.c:485
+#: ../src/desktop_file.c:300 ../src/ui_pathsel.c:494
 #, c-format
 msgid ""
 "Unable to delete file:\n"
@@ -862,17 +866,17 @@
 "Fehler beim Löschen der Datei:\n"
 "%s"
 
-#: ../src/desktop_file.c:292 ../src/ui_pathsel.c:486 ../src/utilops.c:1975
-#: ../src/utilops.c:2002 ../src/utilops.c:2522
+#: ../src/desktop_file.c:301 ../src/ui_pathsel.c:495 ../src/utilops.c:2113
+#: ../src/utilops.c:2140 ../src/utilops.c:2662
 msgid "File deletion failed"
 msgstr "Fehler beim Löschen der Datei"
 
-#: ../src/desktop_file.c:336 ../src/desktop_file.c:344 ../src/ui_pathsel.c:528
-#: ../src/ui_pathsel.c:536
+#: ../src/desktop_file.c:345 ../src/desktop_file.c:353 ../src/ui_pathsel.c:537
+#: ../src/ui_pathsel.c:545
 msgid "Delete file"
 msgstr "Datei löschen"
 
-#: ../src/desktop_file.c:342 ../src/ui_pathsel.c:534
+#: ../src/desktop_file.c:351 ../src/ui_pathsel.c:543
 #, c-format
 msgid ""
 "About to delete the file:\n"
@@ -881,176 +885,184 @@
 "Werde Datei löschen:\n"
 " %s"
 
-#: ../src/desktop_file.c:374
+#: ../src/desktop_file.c:383
 msgid "new.desktop"
 msgstr "neu.desktop"
 
-#: ../src/desktop_file.c:453
+#: ../src/desktop_file.c:467
 msgid "Editors"
 msgstr "Eigene Befehle"
 
-#: ../src/desktop_file.c:524
+#: ../src/desktop_file.c:544
 msgid "Hidden"
 msgstr "Versteckt"
 
-#: ../src/desktop_file.c:543 ../src/dupe.c:2648 ../src/dupe.c:3133
-#: ../src/print.c:3201 ../src/search.c:2794 ../src/ui_pathsel.c:1109
-#: ../src/utilops.c:458
+#: ../src/desktop_file.c:563 ../src/dupe.c:2708 ../src/dupe.c:3245
+#: ../src/print.c:3210 ../src/search.c:2823 ../src/ui_pathsel.c:1118
+#: ../src/utilops.c:501
 msgid "Path"
 msgstr "Pfad"
 
-#: ../src/dupe.c:100
+#: ../src/dupe.c:108
 msgid "Drop files to compare them."
 msgstr "Dateien herziehen um sie zu vergleichen."
 
-#: ../src/dupe.c:104
+#: ../src/dupe.c:112
 #, c-format
 msgid "%d files"
 msgstr "%d Dateien"
 
-#: ../src/dupe.c:108
+#: ../src/dupe.c:116
 #, c-format
 msgid "%d matches found in %d files"
 msgstr "%d Treffer gefunden in %d Dateien"
 
-#: ../src/dupe.c:113
+#: ../src/dupe.c:121
 msgid "[set 1]"
 msgstr "[menge 1]"
 
-#: ../src/dupe.c:1440
+#: ../src/dupe.c:1460
 msgid "Reading checksums..."
 msgstr "Lese Prüfsummen..."
 
-#: ../src/dupe.c:1473
+#: ../src/dupe.c:1493
 msgid "Reading dimensions..."
 msgstr "Lese Bildauflösungen..."
 
-#: ../src/dupe.c:1507
+#: ../src/dupe.c:1527
 msgid "Reading similarity data..."
 msgstr "Lese Ähnlichkeitsdaten..."
 
-#: ../src/dupe.c:1543 ../src/dupe.c:1574
+#: ../src/dupe.c:1563 ../src/dupe.c:1594
 msgid "Comparing..."
 msgstr "Vergleiche..."
 
-#: ../src/dupe.c:1554 ../src/pan-view.c:996
+#: ../src/dupe.c:1574 ../src/pan-view/pan-view.c:1012
 msgid "Sorting..."
 msgstr "Sortiere..."
 
-#: ../src/dupe.c:2246
+#: ../src/dupe.c:2304
 msgid "Select group _1 duplicates"
 msgstr "Duplikate der Gruppe _1 auswählen"
 
-#: ../src/dupe.c:2248
+#: ../src/dupe.c:2306
 msgid "Select group _2 duplicates"
 msgstr "Duplikate der Gruppe _2 auswählen"
 
-#: ../src/dupe.c:2257 ../src/search.c:1012
+#: ../src/dupe.c:2315 ../src/search.c:1021 ../src/view_file.c:642
 msgid "Add to new collection"
 msgstr "Füge zu neuer Sammlung hinzu"
 
-#: ../src/dupe.c:2275 ../src/dupe.c:2562 ../src/search.c:1030
+#: ../src/dupe.c:2333 ../src/dupe.c:2620 ../src/search.c:1039
 msgid "C_lear"
 msgstr "_Löschen"
 
-#: ../src/dupe.c:2278 ../src/dupe.c:2565
+#: ../src/dupe.c:2336 ../src/dupe.c:2623
 msgid "Close _window"
 msgstr "Fenster s_chließen"
 
-#: ../src/dupe.c:2438
+#: ../src/dupe.c:2496
 #, c-format
 msgid "%d files (set 2)"
 msgstr "%d Dateien (menge 2)"
 
-#: ../src/dupe.c:2643
+#: ../src/dupe.c:2703
 msgid "Name case-insensitive"
 msgstr "Name, ignoriere Groß-/Kleinschreibung"
 
-#: ../src/dupe.c:2644 ../src/dupe.c:3130 ../src/preferences.c:1534
-#: ../src/print.c:3205 ../src/search.c:2791 ../src/view_file_list.c:1984
+#: ../src/dupe.c:2704 ../src/dupe.c:3242 ../src/preferences.c:1583
+#: ../src/print.c:3214 ../src/search.c:2820 ../src/view_file_list.c:1993
 msgid "Size"
 msgstr "Größe"
 
-#: ../src/dupe.c:2645 ../src/dupe.c:3131 ../src/exif.c:342
-#: ../src/exif-common.c:553 ../src/print.c:3203 ../src/search.c:2792
-#: ../src/view_file_list.c:1988
+#: ../src/dupe.c:2705 ../src/dupe.c:3243 ../src/exif.c:336
+#: ../src/exif-common.c:565 ../src/print.c:3212 ../src/search.c:2821
+#: ../src/view_file_list.c:1997
 msgid "Date"
 msgstr "Datum"
 
-#: ../src/dupe.c:2646 ../src/dupe.c:3132 ../src/print.c:3207
-#: ../src/search.c:2793
+#: ../src/dupe.c:2706 ../src/dupe.c:3244 ../src/print.c:3216
+#: ../src/search.c:2822
 msgid "Dimensions"
 msgstr "Bildauflösung"
 
-#: ../src/dupe.c:2647
+#: ../src/dupe.c:2707
 msgid "Checksum"
 msgstr "Prüfsumme"
 
-#: ../src/dupe.c:2649
+#: ../src/dupe.c:2709
 msgid "Similarity (high)"
 msgstr "Ähnlichkeit (hoch)"
 
-#: ../src/dupe.c:2650
+#: ../src/dupe.c:2710
 msgid "Similarity"
 msgstr "Ähnlichkeit"
 
-#: ../src/dupe.c:2651
+#: ../src/dupe.c:2711
 msgid "Similarity (low)"
 msgstr "Ähnlichkeit (niedrig)"
 
-#: ../src/dupe.c:2652
+#: ../src/dupe.c:2712
 msgid "Similarity (custom)"
 msgstr "Ähnlichkeit (benutzerdefiniert)"
 
-#: ../src/dupe.c:3083
+#: ../src/dupe.c:3195
 msgid "Find duplicates"
 msgstr "Duplikate suchen"
 
-#: ../src/dupe.c:3165
+#: ../src/dupe.c:3277
 msgid "Compare to:"
 msgstr "Vergleiche mit:"
 
-#: ../src/dupe.c:3178
+#: ../src/dupe.c:3290
 msgid "Compare by:"
 msgstr "Vergleiche nach:"
 
-#: ../src/dupe.c:3186 ../src/preferences.c:1374 ../src/search.c:2807
+#: ../src/dupe.c:3298 ../src/preferences.c:1421 ../src/search.c:2836
 msgid "Thumbnails"
 msgstr "Vorschaubilder"
 
-#: ../src/dupe.c:3193
+#: ../src/dupe.c:3306
+msgid "Ignore Rotation"
+msgstr "Ausrichtung ignorieren"
+
+#: ../src/dupe.c:3314
 msgid "Compare two file sets"
 msgstr "Vergleiche zwei Dateimengen"
 
-#: ../src/editors.c:281
+#: ../src/dupe.c:3334
+msgid "Custom Threshold"
+msgstr "Eigene Ähnlichkeitsschwelle"
+
+#: ../src/editors.c:289
 #, c-format
 msgid "Desktop file '%s' should not include extension in Icon key: '%s'\n"
 msgstr ""
 "Desktop-Datei '%s' sollte keine Extension im Icon-Schlüssel '%s' enthalten.\n"
 
 #. flash fired (bit 0)
-#: ../src/editors.c:335 ../src/exif.c:226 ../src/exif-common.c:362
+#: ../src/editors.c:343 ../src/exif.c:220 ../src/exif-common.c:374
 msgid "yes"
 msgstr "ja"
 
-#: ../src/editors.c:335 ../src/exif.c:225 ../src/exif-common.c:362
+#: ../src/editors.c:343 ../src/exif.c:219 ../src/exif-common.c:374
 msgid "no"
 msgstr "nein"
 
-#: ../src/editors.c:507
+#: ../src/editors.c:515
 msgid "stopping..."
 msgstr "Halte an..."
 
-#: ../src/editors.c:528
+#: ../src/editors.c:536
 msgid "Edit command results"
 msgstr "Ergebnis der Bearbeitung"
 
-#: ../src/editors.c:531
+#: ../src/editors.c:539
 #, c-format
 msgid "Output of %s"
 msgstr "Ausgabe von %s"
 
-#: ../src/editors.c:1054
+#: ../src/editors.c:1066
 #, c-format
 msgid ""
 "Failed to run command:\n"
@@ -1059,11 +1071,11 @@
 "Fehler beim Ausführen des Befehles:\n"
 "%s\n"
 
-#: ../src/editors.c:1181
+#: ../src/editors.c:1193
 msgid "stopped by user"
 msgstr "Abbruch durch Benutzer"
 
-#: ../src/editors.c:1266
+#: ../src/editors.c:1278
 #, c-format
 msgid ""
 "%s\n"
@@ -1072,2033 +1084,2089 @@
 "%s\n"
 "\"%s\""
 
-#: ../src/editors.c:1268
+#: ../src/editors.c:1280
 msgid "Invalid editor command"
 msgstr "Ungültiges Editorkommando"
 
-#: ../src/editors.c:1355
+#: ../src/editors.c:1367
 msgid "Editor template is empty."
 msgstr "Editorvorlage ist leer."
 
-#: ../src/editors.c:1356
+#: ../src/editors.c:1368
 msgid "Editor template has incorrect syntax."
 msgstr "Editorvorlage hat falschen Syntax."
 
-#: ../src/editors.c:1357
+#: ../src/editors.c:1369
 msgid "Editor template uses incompatible macros."
 msgstr "Editorvorlage benützt inkompatible Makros."
 
-#: ../src/editors.c:1358
+#: ../src/editors.c:1370
 msgid "Can't find matching file type."
 msgstr "Passender Dateitype kann nicht gefunden werden."
 
-#: ../src/editors.c:1359
+#: ../src/editors.c:1371
 msgid "Can't execute external editor."
 msgstr "Externer Editor kann nicht gestartet werden."
 
-#: ../src/editors.c:1360
+#: ../src/editors.c:1372
 msgid "External editor returned error status."
 msgstr "Externer Editor kehrte mit einem Fehlercode zurück."
 
-#: ../src/editors.c:1361
+#: ../src/editors.c:1373
 msgid "File was skipped."
 msgstr "Datei wurde übersprungen."
 
-#: ../src/editors.c:1362
+#: ../src/editors.c:1374
 msgid "Unknown error."
 msgstr "Unbekannter Fehler."
 
-#: ../src/exif.c:148 ../src/exif.c:161 ../src/exif.c:175 ../src/exif.c:200
-#: ../src/exif.c:317 ../src/exif.c:664 ../src/exif-common.c:338
-#: ../src/exif-common.c:341 ../src/exif-common.c:408
+#: ../src/exif.c:142 ../src/exif.c:155 ../src/exif.c:169 ../src/exif.c:194
+#: ../src/exif.c:311 ../src/exif.c:658 ../src/exif-common.c:350
+#: ../src/exif-common.c:353 ../src/exif-common.c:420
 msgid "unknown"
 msgstr "unbekannt"
 
-#: ../src/exif.c:149
+#: ../src/exif.c:143
 msgid "top left"
 msgstr "oben links "
 
-#: ../src/exif.c:150
+#: ../src/exif.c:144
 msgid "top right"
 msgstr "oben rechts "
 
-#: ../src/exif.c:151
+#: ../src/exif.c:145
 msgid "bottom right"
 msgstr "unten rechts "
 
-#: ../src/exif.c:152
+#: ../src/exif.c:146
 msgid "bottom left"
 msgstr "unten links "
 
-#: ../src/exif.c:153
+#: ../src/exif.c:147
 msgid "left top"
 msgstr "links oben"
 
-#: ../src/exif.c:154
+#: ../src/exif.c:148
 msgid "right top"
 msgstr "rechts oben"
 
-#: ../src/exif.c:155
+#: ../src/exif.c:149
 msgid "right bottom"
 msgstr "rechts unten"
 
-#: ../src/exif.c:156
+#: ../src/exif.c:150
 msgid "left bottom"
 msgstr "links unten"
 
-#: ../src/exif.c:163
+#: ../src/exif.c:157
 msgid "inch"
 msgstr "Zoll"
 
-#: ../src/exif.c:164
+#: ../src/exif.c:158
 msgid "centimeter"
 msgstr "cm"
 
-#: ../src/exif.c:176
+#: ../src/exif.c:170
 msgid "average"
 msgstr "Durchschnitt"
 
-#: ../src/exif.c:177
+#: ../src/exif.c:171
 msgid "center weighted"
 msgstr "mittenbetont"
 
-#: ../src/exif.c:178
+#: ../src/exif.c:172
 msgid "spot"
 msgstr "Punkt"
 
-#: ../src/exif.c:179
+#: ../src/exif.c:173
 msgid "multi-spot"
 msgstr "Mehrfach-Punkte"
 
-#: ../src/exif.c:180
+#: ../src/exif.c:174
 msgid "multi-segment"
 msgstr "Mehrfachbereiche"
 
-#: ../src/exif.c:181
+#: ../src/exif.c:175
 msgid "partial"
 msgstr "teilweise"
 
-#: ../src/exif.c:182 ../src/exif.c:220
+#: ../src/exif.c:176 ../src/exif.c:214
 msgid "other"
 msgstr "anderes"
 
-#: ../src/exif.c:187 ../src/exif.c:239
+#: ../src/exif.c:181 ../src/exif.c:233
 msgid "not defined"
 msgstr "nicht definiert"
 
-#: ../src/exif.c:188 ../src/exif.c:267 ../src/exif.c:274
+#: ../src/exif.c:182 ../src/exif.c:261 ../src/exif.c:268
 msgid "manual"
 msgstr "manuell"
 
-#: ../src/exif.c:189 ../src/exif.c:260 ../src/exif.c:296 ../src/exif.c:303
-#: ../src/exif.c:310
+#: ../src/exif.c:183 ../src/exif.c:254 ../src/exif.c:290 ../src/exif.c:297
+#: ../src/exif.c:304
 msgid "normal"
 msgstr "normal"
 
-#: ../src/exif.c:190
+#: ../src/exif.c:184
 msgid "aperture"
 msgstr "Blende"
 
-#: ../src/exif.c:191
+#: ../src/exif.c:185
 msgid "shutter"
 msgstr "Belichtungszeit"
 
-#: ../src/exif.c:192
+#: ../src/exif.c:186
 msgid "creative"
 msgstr "Kreativ"
 
-#: ../src/exif.c:193
+#: ../src/exif.c:187
 msgid "action"
 msgstr "Sport"
 
-#: ../src/exif.c:194 ../src/exif.c:281
+#: ../src/exif.c:188 ../src/exif.c:275
 msgid "portrait"
 msgstr "Portrait"
 
-#: ../src/exif.c:195 ../src/exif.c:280
+#: ../src/exif.c:189 ../src/exif.c:274
 msgid "landscape"
 msgstr "Landschaft"
 
-#: ../src/exif.c:201
+#: ../src/exif.c:195
 msgid "daylight"
 msgstr "Tageslicht"
 
-#: ../src/exif.c:202
+#: ../src/exif.c:196
 msgid "fluorescent"
 msgstr "Leuchtstofflampe"
 
 # Man verzeihe mir die Übersetung mit Glühobst.
-#: ../src/exif.c:203
+#: ../src/exif.c:197
 msgid "tungsten (incandescent)"
 msgstr "Kunstlicht (Glühbirne)"
 
-#: ../src/exif.c:204
+#: ../src/exif.c:198
 msgid "flash"
 msgstr "Blitz"
 
-#: ../src/exif.c:205
+#: ../src/exif.c:199
 msgid "fine weather"
 msgstr "gutes Wetter"
 
-#: ../src/exif.c:206
+#: ../src/exif.c:200
 msgid "cloudy weather"
 msgstr "bewölkt"
 
-#: ../src/exif.c:207
+#: ../src/exif.c:201
 msgid "shade"
 msgstr "schattig"
 
-#: ../src/exif.c:208
+#: ../src/exif.c:202
 msgid "daylight fluorescent"
 msgstr "Tageslicht (Leuchtstofflampe)"
 
-#: ../src/exif.c:209
+#: ../src/exif.c:203
 msgid "day white fluorescent"
 msgstr "Tagesweiß (Leuchtstofflampe)"
 
-#: ../src/exif.c:210
+#: ../src/exif.c:204
 msgid "cool white fluorescent"
 msgstr "Kühles Weiß (Leuchtstofflampe)"
 
-#: ../src/exif.c:211
+#: ../src/exif.c:205
 msgid "white fluorescent"
 msgstr "Weiß (Leuchtstofflampe)"
 
-#: ../src/exif.c:212
+#: ../src/exif.c:206
 msgid "standard light A"
 msgstr "Standardlicht A"
 
-#: ../src/exif.c:213
+#: ../src/exif.c:207
 msgid "standard light B"
 msgstr "Standardlicht B"
 
-#: ../src/exif.c:214
+#: ../src/exif.c:208
 msgid "standard light C"
 msgstr "Standardlicht C"
 
-#: ../src/exif.c:215
+#: ../src/exif.c:209
 msgid "D55"
 msgstr "D55"
 
-#: ../src/exif.c:216
+#: ../src/exif.c:210
 msgid "D65"
 msgstr "D65"
 
-#: ../src/exif.c:217
+#: ../src/exif.c:211
 msgid "D75"
 msgstr "D75"
 
-#: ../src/exif.c:218
+#: ../src/exif.c:212
 msgid "D50"
 msgstr "D50"
 
-#: ../src/exif.c:219
+#: ../src/exif.c:213
 msgid "ISO studio tungsten"
 msgstr ""
 
-#: ../src/exif.c:227
+#: ../src/exif.c:221
 msgid "yes, not detected by strobe"
 msgstr "ja, nicht durch Abtastimpuls erkannt"
 
-#: ../src/exif.c:228
+#: ../src/exif.c:222
 msgid "yes, detected by strobe"
 msgstr "ja, erkannt durch Abtastimpuls"
 
+#: ../src/exif.c:228
+msgid "uncalibrated"
+msgstr "Unkalibriert"
+
 #: ../src/exif.c:234
-msgid "uncalibrated"
-msgstr "Unkalibriert"
-
-#: ../src/exif.c:240
 msgid "1 chip color area"
 msgstr ""
 
-#: ../src/exif.c:241
+#: ../src/exif.c:235
 msgid "2 chip color area"
 msgstr ""
 
-#: ../src/exif.c:242
+#: ../src/exif.c:236
 msgid "3 chip color area"
 msgstr ""
 
-#: ../src/exif.c:243
+#: ../src/exif.c:237
 msgid "color sequential area"
 msgstr ""
 
+#: ../src/exif.c:238
+msgid "trilinear"
+msgstr "Trilinear"
+
+#: ../src/exif.c:239
+msgid "color sequential linear"
+msgstr ""
+
 #: ../src/exif.c:244
-msgid "trilinear"
-msgstr "Trilinear"
-
-#: ../src/exif.c:245
-msgid "color sequential linear"
-msgstr ""
-
-#: ../src/exif.c:250
 msgid "digital still camera"
 msgstr "Photoapparat"
 
-#: ../src/exif.c:255
+#: ../src/exif.c:249
 msgid "direct photo"
 msgstr ""
 
-#: ../src/exif.c:261
+#: ../src/exif.c:255
 msgid "custom"
 msgstr "benutzerdefiniert"
 
-#: ../src/exif.c:266 ../src/exif.c:273 ../src/exif-common.c:376
+#: ../src/exif.c:260 ../src/exif.c:267 ../src/exif-common.c:388
 msgid "auto"
 msgstr "automatisch"
 
-#: ../src/exif.c:268
+#: ../src/exif.c:262
 msgid "auto bracket"
 msgstr ""
 
-#: ../src/exif.c:279
+#: ../src/exif.c:273
 msgid "standard"
 msgstr "Standard"
 
-#: ../src/exif.c:282
+#: ../src/exif.c:276
 msgid "night scene"
 msgstr "Nachtszene"
 
-#: ../src/exif.c:287
+#: ../src/exif.c:281
 msgid "none"
 msgstr "nichts"
 
-#: ../src/exif.c:288
+#: ../src/exif.c:282
 msgid "low gain up"
 msgstr ""
 
-#: ../src/exif.c:289
+#: ../src/exif.c:283
 msgid "high gain up"
 msgstr ""
 
-#: ../src/exif.c:290
+#: ../src/exif.c:284
 msgid "low gain down"
 msgstr ""
 
-#: ../src/exif.c:291
+#: ../src/exif.c:285
 msgid "high gain down"
 msgstr ""
 
-#: ../src/exif.c:297 ../src/exif.c:311
+#: ../src/exif.c:291 ../src/exif.c:305
 msgid "soft"
 msgstr "weich"
 
-#: ../src/exif.c:298 ../src/exif.c:312
+#: ../src/exif.c:292 ../src/exif.c:306
 msgid "hard"
 msgstr "hart"
 
-#: ../src/exif.c:304
+#: ../src/exif.c:298
 msgid "low"
 msgstr "niedrig"
 
-#: ../src/exif.c:305
+#: ../src/exif.c:299
 msgid "high"
 msgstr "hoch"
 
-#: ../src/exif.c:318
+#: ../src/exif.c:312
 msgid "macro"
 msgstr "Makro"
 
-#: ../src/exif.c:319
+#: ../src/exif.c:313
 msgid "close"
 msgstr "nah"
 
-#: ../src/exif.c:320
+#: ../src/exif.c:314
 msgid "distant"
 msgstr "entfernt"
 
-#: ../src/exif.c:330
+#: ../src/exif.c:324
 msgid "Image Width"
 msgstr "Bildbreite"
 
-#: ../src/exif.c:331
+#: ../src/exif.c:325
 msgid "Image Height"
 msgstr "Bildhöhe"
 
-#: ../src/exif.c:332
+#: ../src/exif.c:326
 msgid "Bits per Sample/Pixel"
 msgstr "Bits pro Probe/Pixel"
 
-#: ../src/exif.c:333
+#: ../src/exif.c:327
 msgid "Compression"
 msgstr "Komprimierung"
 
-#: ../src/exif.c:334
+#: ../src/exif.c:328
 msgid "Image description"
 msgstr "Bildbeschreibung"
 
-#: ../src/exif.c:335
+#: ../src/exif.c:329
 msgid "Camera make"
 msgstr "Kamera Hersteller"
 
-#: ../src/exif.c:336
+#: ../src/exif.c:330
 msgid "Camera model"
 msgstr "Kamera-Modell"
 
-#: ../src/exif.c:337
+#: ../src/exif.c:331
 msgid "Orientation"
 msgstr "Ausrichtung"
 
-#: ../src/exif.c:338
+#: ../src/exif.c:332
 msgid "X resolution"
 msgstr "X-Auflösung"
 
-#: ../src/exif.c:339
+#: ../src/exif.c:333
 msgid "Y Resolution"
 msgstr "Y-Auflösung"
 
-#: ../src/exif.c:340
+#: ../src/exif.c:334
 msgid "Resolution units"
 msgstr "Auflösungseinheiten"
 
-#: ../src/exif.c:341
+#: ../src/exif.c:335
 msgid "Firmware"
 msgstr "Firmware"
 
-#: ../src/exif.c:343
+#: ../src/exif.c:337
 msgid "White point"
 msgstr "Weißpunkt"
 
-#: ../src/exif.c:344
+#: ../src/exif.c:338
 msgid "Primary chromaticities"
 msgstr ""
 
-#: ../src/exif.c:345
+#: ../src/exif.c:339
 msgid "YCbCy coefficients"
 msgstr "YCbCy Koeffizienten"
 
-#: ../src/exif.c:346
+#: ../src/exif.c:340
 msgid "YCbCr positioning"
 msgstr "YCbCr Positionierung"
 
-#: ../src/exif.c:347
+#: ../src/exif.c:341
 msgid "Black white reference"
 msgstr "Schwarz-Weiß-Referenz"
 
-#: ../src/exif.c:349
+#: ../src/exif.c:343
 msgid "SubIFD Exif offset"
 msgstr ""
 
 #. subIFD follows
-#: ../src/exif.c:351
+#: ../src/exif.c:345
 msgid "Exposure time (seconds)"
 msgstr "Belichtungszeit (Sekunden)"
 
-#: ../src/exif.c:352
+#: ../src/exif.c:346
 msgid "FNumber"
 msgstr "Blende"
 
-#: ../src/exif.c:353
+#: ../src/exif.c:347
 msgid "Exposure program"
 msgstr "Belichtungsprogramm"
 
-#: ../src/exif.c:354
+#: ../src/exif.c:348
 msgid "Spectral Sensitivity"
 msgstr ""
 
-#: ../src/exif.c:355 ../src/exif.c:391 ../src/exif-common.c:557
+#: ../src/exif.c:349 ../src/exif.c:385 ../src/exif-common.c:569
 msgid "ISO sensitivity"
 msgstr "ISO"
 
-#: ../src/exif.c:356
+#: ../src/exif.c:350
 msgid "Optoelectric conversion factor"
 msgstr ""
 
-#: ../src/exif.c:357
+#: ../src/exif.c:351
 msgid "Exif version"
 msgstr "Exifversion"
 
-#: ../src/exif.c:358
+#: ../src/exif.c:352
 msgid "Date original"
 msgstr "Originaldatum"
 
-#: ../src/exif.c:359
+#: ../src/exif.c:353
 msgid "Date digitized"
 msgstr "Digitalisierungsdatum"
 
-#: ../src/exif.c:360
+#: ../src/exif.c:354
 msgid "Pixel format"
 msgstr "Pixelformat"
 
-#: ../src/exif.c:361
+#: ../src/exif.c:355
 msgid "Compression ratio"
 msgstr "Kompressionsverhältnis"
 
-#: ../src/exif.c:362 ../src/exif-common.c:554
+#: ../src/exif.c:356 ../src/exif-common.c:566
 msgid "Shutter speed"
 msgstr "Belichtungszeit"
 
-#: ../src/exif.c:363 ../src/exif-common.c:555
+#: ../src/exif.c:357 ../src/exif-common.c:567
 msgid "Aperture"
 msgstr "Blendenöffnung"
 
-#: ../src/exif.c:364
+#: ../src/exif.c:358
 msgid "Brightness"
 msgstr "Helligkeit"
 
-#: ../src/exif.c:365 ../src/exif-common.c:556
+#: ../src/exif.c:359 ../src/exif-common.c:568
 msgid "Exposure bias"
 msgstr "Belichtungs-Bias"
 
-#: ../src/exif.c:366
+#: ../src/exif.c:360
 msgid "Maximum aperture"
 msgstr "Maximale Blende"
 
-#: ../src/exif.c:367 ../src/exif-common.c:560
+#: ../src/exif.c:361 ../src/exif-common.c:572
 msgid "Subject distance"
 msgstr "Objektentfernung"
 
-#: ../src/exif.c:368
+#: ../src/exif.c:362
 msgid "Metering mode"
 msgstr "Messmethode"
 
-#: ../src/exif.c:369
+#: ../src/exif.c:363
 msgid "Light source"
 msgstr "Lichtquelle"
 
-#: ../src/exif.c:370 ../src/exif-common.c:561
+#: ../src/exif.c:364 ../src/exif-common.c:573
 msgid "Flash"
 msgstr "Blitz"
 
-#: ../src/exif.c:371 ../src/exif-common.c:558
+#: ../src/exif.c:365 ../src/exif-common.c:570
 msgid "Focal length"
 msgstr "Brennweite"
 
+#: ../src/exif.c:366
+msgid "Subject area"
+msgstr ""
+
+#: ../src/exif.c:367
+msgid "MakerNote"
+msgstr ""
+
+#: ../src/exif.c:368
+msgid "UserComment"
+msgstr "Anwenderkommentar"
+
+#: ../src/exif.c:369
+msgid "Subsecond time"
+msgstr ""
+
+#: ../src/exif.c:370
+msgid "Subsecond time original"
+msgstr ""
+
+#: ../src/exif.c:371
+msgid "Subsecond time digitized"
+msgstr ""
+
 #: ../src/exif.c:372
-msgid "Subject area"
+msgid "FlashPix version"
 msgstr ""
 
 #: ../src/exif.c:373
-msgid "MakerNote"
-msgstr ""
-
-#: ../src/exif.c:374
-msgid "UserComment"
-msgstr "Anwenderkommentar"
-
-#: ../src/exif.c:375
-msgid "Subsecond time"
-msgstr ""
-
-#: ../src/exif.c:376
-msgid "Subsecond time original"
-msgstr ""
-
-#: ../src/exif.c:377
-msgid "Subsecond time digitized"
-msgstr ""
-
-#: ../src/exif.c:378
-msgid "FlashPix version"
-msgstr ""
-
-#: ../src/exif.c:379
 msgid "Colorspace"
 msgstr "Farbraum"
 
 #. ExifImageWidth, ExifImageHeight can also be unsigned short
-#: ../src/exif.c:381 ../src/preferences.c:2235
+#: ../src/exif.c:375 ../src/preferences.c:2344
 msgid "Width"
 msgstr "Breite"
 
-#: ../src/exif.c:382 ../src/preferences.c:2237
+#: ../src/exif.c:376 ../src/preferences.c:2346
 msgid "Height"
 msgstr "Höhe"
 
-#: ../src/exif.c:383
+#: ../src/exif.c:377
 msgid "Audio data"
 msgstr "Audiodaten"
 
+#: ../src/exif.c:378
+msgid "ExifR98 extension"
+msgstr "ExifR98-Erweiterung"
+
+#: ../src/exif.c:379
+msgid "Flash strength"
+msgstr "Blitzstärke"
+
+#: ../src/exif.c:380
+msgid "Spatial frequency response"
+msgstr ""
+
+#: ../src/exif.c:381
+msgid "X Pixel density"
+msgstr ""
+
+#: ../src/exif.c:382
+msgid "Y Pixel density"
+msgstr ""
+
+#: ../src/exif.c:383
+msgid "Pixel density units"
+msgstr ""
+
 #: ../src/exif.c:384
-msgid "ExifR98 extension"
-msgstr "ExifR98-Erweiterung"
-
-#: ../src/exif.c:385
-msgid "Flash strength"
-msgstr "Blitzstärke"
+msgid "Subject location"
+msgstr ""
 
 #: ../src/exif.c:386
-msgid "Spatial frequency response"
-msgstr ""
+msgid "Sensor type"
+msgstr "Sensortyp"
 
 #: ../src/exif.c:387
-msgid "X Pixel density"
+msgid "Source type"
 msgstr ""
 
 #: ../src/exif.c:388
-msgid "Y Pixel density"
-msgstr ""
+msgid "Scene type"
+msgstr "Szenentyp"
 
 #: ../src/exif.c:389
-msgid "Pixel density units"
-msgstr ""
-
-#: ../src/exif.c:390
-msgid "Subject location"
-msgstr ""
-
-#: ../src/exif.c:392
-msgid "Sensor type"
-msgstr "Sensortyp"
-
-#: ../src/exif.c:393
-msgid "Source type"
-msgstr ""
-
-#: ../src/exif.c:394
-msgid "Scene type"
-msgstr "Szenentyp"
-
-#: ../src/exif.c:395
 msgid "Color filter array pattern"
 msgstr ""
 
 #. tags a4xx were added for Exif 2.2 (not just these - some above, as well)
+#: ../src/exif.c:391
+msgid "Render process"
+msgstr ""
+
+#: ../src/exif.c:392
+msgid "Exposure mode"
+msgstr "Belichtungsart"
+
+#: ../src/exif.c:393
+msgid "White balance"
+msgstr "Weißabgleich"
+
+#: ../src/exif.c:394
+msgid "Digital zoom ratio"
+msgstr ""
+
+#: ../src/exif.c:395
+msgid "Focal length (35mm)"
+msgstr "35mm-Brennweite"
+
+#: ../src/exif.c:396
+msgid "Scene capture type"
+msgstr ""
+
 #: ../src/exif.c:397
-msgid "Render process"
+msgid "Gain control"
 msgstr ""
 
 #: ../src/exif.c:398
-msgid "Exposure mode"
-msgstr "Belichtungsart"
-
-#: ../src/exif.c:399
-msgid "White balance"
-msgstr "Weißabgleich"
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: ../src/exif.c:399 ../src/preferences.c:1991
+msgid "Saturation"
+msgstr "Sättigung"
 
 #: ../src/exif.c:400
-msgid "Digital zoom ratio"
-msgstr ""
-
-#: ../src/exif.c:401
-msgid "Focal length (35mm)"
-msgstr "35mm-Brennweite"
-
-#: ../src/exif.c:402
-msgid "Scene capture type"
-msgstr ""
-
-#: ../src/exif.c:403
-msgid "Gain control"
-msgstr ""
-
-#: ../src/exif.c:404
-msgid "Contrast"
-msgstr "Kontrast"
-
-#: ../src/exif.c:405
-msgid "Saturation"
-msgstr "Sättigung"
-
-#: ../src/exif.c:406
 msgid "Sharpness"
 msgstr "Schärfe"
 
-#: ../src/exif.c:407
+#: ../src/exif.c:401
 msgid "Device setting"
 msgstr "Geräteeinstellung"
 
-#: ../src/exif.c:408
+#: ../src/exif.c:402
 msgid "Subject range"
 msgstr "Objectentfernung"
 
-#: ../src/exif.c:409
+#: ../src/exif.c:403
 msgid "Image serial number"
 msgstr "Bild-Seriennummer"
 
-#: ../src/exif-common.c:337
+#: ../src/exif-common.c:349
 msgid "infinity"
 msgstr "unendlich"
 
-#: ../src/exif-common.c:366
+#: ../src/exif-common.c:378
 msgid "mode:"
 msgstr "Modus:"
 
-#: ../src/exif-common.c:370 ../src/trash.c:205
+#: ../src/exif-common.c:382 ../src/trash.c:213
 msgid "on"
 msgstr "ein"
 
-#: ../src/exif-common.c:373 ../src/trash.c:210
+#: ../src/exif-common.c:385 ../src/trash.c:218
 msgid "off"
 msgstr "aus"
 
-#: ../src/exif-common.c:382
+#: ../src/exif-common.c:394
 msgid "not detected by strobe"
 msgstr "ohne Anpassung"
 
-#: ../src/exif-common.c:383
+#: ../src/exif-common.c:395
 msgid "detected by strobe"
 msgstr "mit Anpassung"
 
 #. we ignore flash function (bit 5)
 #. red-eye (bit 6)
-#: ../src/exif-common.c:388
+#: ../src/exif-common.c:400
 msgid "red-eye reduction"
 msgstr "Rote Augen-Effekt vermindern"
 
-#: ../src/exif-common.c:408
+#: ../src/exif-common.c:420
 msgid "dot"
 msgstr "Punkt"
 
-#: ../src/exif-common.c:441
+#: ../src/exif-common.c:453
 msgid "AdobeRGB"
 msgstr "AdobeRGB"
 
-#: ../src/exif-common.c:449
+#: ../src/exif-common.c:461
 msgid "embedded"
 msgstr "enthalten"
 
-#: ../src/exif-common.c:544
+#: ../src/exif-common.c:556
 msgid "Above Sea Level"
 msgstr "Über Normalnull"
 
-#: ../src/exif-common.c:544
+#: ../src/exif-common.c:556
 msgid "Below Sea Level"
 msgstr "Unter Normalnull"
 
-#: ../src/exif-common.c:552
+#: ../src/exif-common.c:564
 msgid "Camera"
 msgstr "Kamera"
 
-#: ../src/exif-common.c:559
+#: ../src/exif-common.c:571
 msgid "Focal length 35mm"
 msgstr "35mm-Brennweite"
 
-#: ../src/exif-common.c:562
+#: ../src/exif-common.c:574
 msgid "Resolution"
 msgstr "Auflösung"
 
-#: ../src/exif-common.c:563
+#: ../src/exif-common.c:575
 msgid "Color profile"
 msgstr "Farbprofil"
 
-#: ../src/exif-common.c:564
+#: ../src/exif-common.c:576
 msgid "GPS position"
 msgstr "GPS-Position"
 
-#: ../src/exif-common.c:565
+#: ../src/exif-common.c:577
 msgid "GPS altitude"
 msgstr "GPS-Höhe"
 
-#: ../src/exif-common.c:566
+#: ../src/exif-common.c:578
 msgid "File size"
 msgstr "Dateigröße"
 
-#: ../src/exif-common.c:567
+#: ../src/exif-common.c:579
 msgid "File date"
 msgstr "Dateidatum"
 
-#: ../src/exif-common.c:568
+#: ../src/exif-common.c:580
 msgid "File mode"
 msgstr "Dateirechte"
 
-#: ../src/filedata.c:101
+#: ../src/filedata.c:109
 #, c-format
 msgid "%d bytes"
 msgstr "%d Byte"
 
-#: ../src/filedata.c:105
+#: ../src/filedata.c:113
 #, c-format
 msgid "%.1f K"
 msgstr "%.1f kB"
 
-#: ../src/filedata.c:109
+#: ../src/filedata.c:117
 #, c-format
 msgid "%.1f MB"
 msgstr "%.1f MB"
 
-#: ../src/filedata.c:114
+#: ../src/filedata.c:122
 #, c-format
 msgid "%.1f GB"
 msgstr "%.1f GB"
 
-#: ../src/filedata.c:2458
+#: ../src/filedata.c:2488
 msgid "file or directory does not exist"
 msgstr "Datei oder Verzeichnis existiert nicht"
 
-#: ../src/filedata.c:2464
+#: ../src/filedata.c:2494
 msgid "destination already exists"
 msgstr "Ziel existiert bereits"
 
-#: ../src/filedata.c:2470
-msgid "destination can't be overwritten"
-msgstr "Ziel kann nicht überschrieben werden"
-
-#: ../src/filedata.c:2476
-msgid "destination directory is not writable"
-msgstr "Zielverzeichnis ist nicht schreibbar"
-
-#: ../src/filedata.c:2482
-msgid "destination directory does not exist"
-msgstr "Zielverzeichnis existiert nicht"
-
-#: ../src/filedata.c:2488
-msgid "source directory is not writable"
-msgstr "Quellverzeichnis ist nicht schreibbar"
-
-#: ../src/filedata.c:2494
-msgid "no read permission"
-msgstr "keine Leserechte"
-
 #: ../src/filedata.c:2500
+msgid "destination can't be overwritten"
+msgstr "Ziel kann nicht überschrieben werden"
+
+#: ../src/filedata.c:2506
+msgid "destination directory is not writable"
+msgstr "Zielverzeichnis ist nicht schreibbar"
+
+#: ../src/filedata.c:2512
+msgid "destination directory does not exist"
+msgstr "Zielverzeichnis existiert nicht"
+
+#: ../src/filedata.c:2518
+msgid "source directory is not writable"
+msgstr "Quellverzeichnis ist nicht schreibbar"
+
+#: ../src/filedata.c:2524
+msgid "no read permission"
+msgstr "keine Leserechte"
+
+#: ../src/filedata.c:2530
 msgid "file is readonly"
 msgstr "Datei ist schreibgeschützt"
 
-#: ../src/filedata.c:2506
+#: ../src/filedata.c:2536
 msgid "destination already exists and will be overwritten"
 msgstr "Ziel existiert bereits und wird überschrieben"
 
-#: ../src/filedata.c:2512
+#: ../src/filedata.c:2542
 msgid "source and destination are the same"
 msgstr "Quelle und Ziel sind gleich"
 
-#: ../src/filedata.c:2518
+#: ../src/filedata.c:2548
 msgid "source and destination have different extension"
 msgstr "Quelle und Ziel haben unterschiedliche Dateierweiterung"
 
-#: ../src/filedata.c:2524
+#: ../src/filedata.c:2554
 msgid "there are unsaved metadata changes for the file"
 msgstr "es gibt ungespeicherte Metadatenänderungen für die Datei"
 
-#: ../src/filedata.c:2530
+#: ../src/filedata.c:2560
 msgid "another destination file has the same filename"
 msgstr "Eine andere Zieldatei hat den selben Dateinamen"
 
-#: ../src/fullscreen.c:234 ../src/layout_util.c:1366 ../src/layout_util.c:1367
-#: ../src/layout_util.c:1368 ../src/preferences.c:1547
+#: ../src/fullscreen.c:242 ../src/layout_util.c:1571 ../src/layout_util.c:1572
+#: ../src/layout_util.c:1573 ../src/preferences.c:1596
 msgid "Full screen"
 msgstr "Vollbildmodus"
 
-#: ../src/fullscreen.c:403
+#: ../src/fullscreen.c:413
 msgid "Full size"
 msgstr "Vollbild"
 
-#: ../src/fullscreen.c:411
+#: ../src/fullscreen.c:421
 msgid "Monitor"
 msgstr "Monitor"
 
-#: ../src/fullscreen.c:417
+#: ../src/fullscreen.c:427
 msgid "Screen"
 msgstr "Bild"
 
-#: ../src/fullscreen.c:651
+#: ../src/fullscreen.c:661
 msgid "Determined by Window Manager"
 msgstr "vom Fenster-Manager festgelegt"
 
-#: ../src/fullscreen.c:652
+#: ../src/fullscreen.c:662
 msgid "Active screen"
 msgstr "Aktives Bild"
 
-#: ../src/fullscreen.c:654
+#: ../src/fullscreen.c:664
 msgid "Active monitor"
 msgstr "Aktiver Monitor"
 
-#: ../src/histogram.c:113
+#: ../src/histogram.c:121
 msgid "Log Histogram on Red"
 msgstr "Log. Histogramm für Rot"
 
-#: ../src/histogram.c:114
+#: ../src/histogram.c:122
 msgid "Log Histogram on Green"
 msgstr "Log. Histogramm für Grün"
 
-#: ../src/histogram.c:115
+#: ../src/histogram.c:123
 msgid "Log Histogram on Blue"
 msgstr "Log. Histogramm für Blau"
 
-#: ../src/histogram.c:116
+#: ../src/histogram.c:124
 msgid "Log Histogram on RGB"
 msgstr "Log. Histogramm für RGB"
 
-#: ../src/histogram.c:117
+#: ../src/histogram.c:125
 msgid "Log Histogram on value"
 msgstr "Log. Histogramm für Wert"
 
-#: ../src/histogram.c:122
+#: ../src/histogram.c:130
 msgid "Linear Histogram on Red"
 msgstr "Lineares Histogramm für Rot"
 
-#: ../src/histogram.c:123
+#: ../src/histogram.c:131
 msgid "Linear Histogram on Green"
 msgstr "Lineares Histogramm für Grün"
 
-#: ../src/histogram.c:124
+#: ../src/histogram.c:132
 msgid "Linear Histogram on Blue"
 msgstr "Lineares Histogramm für Blau"
 
-#: ../src/histogram.c:125
+#: ../src/histogram.c:133
 msgid "Linear Histogram on RGB"
 msgstr "Lineares Histogramm für RGB"
 
-#: ../src/histogram.c:126
+#: ../src/histogram.c:134
 msgid "Linear Histogram on value"
 msgstr "Lineares Histogramm für Wert"
 
-#: ../src/history_list.c:131
+#: ../src/history_list.c:140
 #, c-format
 msgid "Unable to write history lists to: %s\n"
 msgstr ""
 "Fehler beim Schreiben der Chronikliste:\n"
 "%s\n"
 
-#: ../src/image.c:161
+#: ../src/image.c:169
 #, c-format
 msgid " (Collection %s)"
 msgstr " (Sammlung %s)"
 
-#: ../src/image_load_jpeg.c:177
+#: ../src/image_load_jpeg.c:163
 #, c-format
 msgid "Error interpreting JPEG image file (%s)"
 msgstr "Fehler bei der Interpretation der JPEG-Bilddatei (%s)"
 
-#: ../src/img-view.c:1253 ../src/layout_image.c:483 ../src/layout_util.c:1333
-#: ../src/layout_util.c:1334 ../src/layout_util.c:1349
-#: ../src/layout_util.c:1350 ../src/pan-view.c:2602
+#: ../src/img-view.c:1263 ../src/layout_image.c:659 ../src/layout_util.c:1538
+#: ../src/layout_util.c:1539 ../src/layout_util.c:1554
+#: ../src/layout_util.c:1555 ../src/pan-view/pan-view.c:2621
 msgid "Zoom _in"
 msgstr "Ver_größern"
 
-#: ../src/img-view.c:1254 ../src/layout_image.c:484 ../src/layout_util.c:1335
-#: ../src/layout_util.c:1336 ../src/layout_util.c:1351
-#: ../src/layout_util.c:1352 ../src/pan-view.c:2604
+#: ../src/img-view.c:1264 ../src/layout_image.c:660 ../src/layout_util.c:1540
+#: ../src/layout_util.c:1541 ../src/layout_util.c:1556
+#: ../src/layout_util.c:1557 ../src/pan-view/pan-view.c:2623
 msgid "Zoom _out"
 msgstr "Ver_kleinern"
 
-#: ../src/img-view.c:1255 ../src/layout_image.c:485 ../src/layout_util.c:1337
-#: ../src/layout_util.c:1338 ../src/layout_util.c:1353
-#: ../src/layout_util.c:1354 ../src/pan-view.c:2606
+#: ../src/img-view.c:1265 ../src/layout_image.c:661 ../src/layout_util.c:1542
+#: ../src/layout_util.c:1543 ../src/layout_util.c:1558
+#: ../src/layout_util.c:1559 ../src/pan-view/pan-view.c:2625
 msgid "Zoom _1:1"
 msgstr "_Originalgröße"
 
-#: ../src/img-view.c:1256 ../src/layout_image.c:486
+#: ../src/img-view.c:1266 ../src/layout_image.c:662
 msgid "Fit image to _window"
 msgstr "In _Fenster einpassen"
 
-#: ../src/img-view.c:1264 ../src/layout_image.c:495 ../src/layout_util.c:1331
+#: ../src/img-view.c:1274 ../src/layout_image.c:671 ../src/layout_util.c:1536
 msgid "Set as _wallpaper"
 msgstr "Als _Hindergrundbild verwenden"
 
-#: ../src/img-view.c:1269 ../src/layout_image.c:502
+#: ../src/img-view.c:1279 ../src/layout_image.c:678
 msgid "_Go to directory view"
 msgstr "_Gehe zur Verzeichnisansicht"
 
-#: ../src/img-view.c:1282 ../src/layout_image.c:523
+#: ../src/img-view.c:1292 ../src/layout_image.c:699
 msgid "_Stop slideshow"
 msgstr "Diashow be_enden"
 
-#: ../src/img-view.c:1285 ../src/layout_image.c:526
+#: ../src/img-view.c:1295 ../src/layout_image.c:702
 msgid "Continue slides_how"
 msgstr "Diashow _fortsetzen"
 
-#: ../src/img-view.c:1290 ../src/img-view.c:1298 ../src/layout_image.c:531
-#: ../src/layout_image.c:538
+#: ../src/img-view.c:1300 ../src/img-view.c:1308 ../src/layout_image.c:707
+#: ../src/layout_image.c:714
 msgid "Pause slides_how"
 msgstr "Diashow an_halten"
 
-#: ../src/img-view.c:1296 ../src/layout_image.c:537
+#: ../src/img-view.c:1306 ../src/layout_image.c:713
 msgid "_Start slideshow"
 msgstr "Diashow _starten"
 
-#: ../src/img-view.c:1304 ../src/layout_image.c:548 ../src/pan-view.c:2675
+#: ../src/img-view.c:1314 ../src/layout_image.c:724
+#: ../src/pan-view/pan-view.c:2694
 msgid "Exit _full screen"
 msgstr "_Vollbildmodus verlassen"
 
-#: ../src/img-view.c:1308 ../src/layout_image.c:544 ../src/pan-view.c:2679
+#: ../src/img-view.c:1318 ../src/layout_image.c:720
+#: ../src/pan-view/pan-view.c:2698
 msgid "_Full screen"
 msgstr "_Vollbildmodus"
 
-#: ../src/img-view.c:1312 ../src/layout_util.c:1316 ../src/pan-view.c:2683
+#: ../src/img-view.c:1322 ../src/layout_util.c:1521
+#: ../src/pan-view/pan-view.c:2702
 msgid "C_lose window"
 msgstr "Fenster s_chließen"
 
-#: ../src/layout.c:358 ../src/view_file.c:613
+#: ../src/layout.c:372 ../src/view_file.c:649
 msgid "Ascending"
 msgstr "Aufsteigend"
 
-#: ../src/layout.c:428
+#: ../src/layout.c:442
 msgid " Slideshow"
 msgstr " Diashow"
 
-#: ../src/layout.c:432
+#: ../src/layout.c:446
 msgid " Paused"
 msgstr " Pausiert"
 
-#: ../src/layout.c:448
+#: ../src/layout.c:462
 #, c-format
 msgid "%s, %d files (%s, %d)%s"
 msgstr "%s, %d Dateien (%s, %d)%s"
 
-#: ../src/layout.c:455
+#: ../src/layout.c:469
 #, c-format
 msgid "%s, %d files%s"
 msgstr "%s, %d Dateien%s"
 
-#: ../src/layout.c:460
+#: ../src/layout.c:474
 #, c-format
 msgid "%d files%s"
 msgstr "%d Dateien%s"
 
-#: ../src/layout.c:506
+#: ../src/layout.c:520
 #, c-format
 msgid "(no read permission) %s bytes"
 msgstr "(keine Leserechte) %s Byte"
 
-#: ../src/layout.c:510
+#: ../src/layout.c:524
 #, c-format
 msgid "( ? x ? ) %s bytes"
 msgstr "( ? x ? ) %s Byte"
 
-#: ../src/layout.c:518
+#: ../src/layout.c:532
 #, c-format
 msgid "( %d x %d ) %s bytes"
 msgstr "( %d x %d ) %s Byte"
 
-#: ../src/layout.c:1243 ../src/layout_config.c:58
+#: ../src/layout.c:618
+msgid "Select sort order"
+msgstr "Sortierreigenfolge wählen"
+
+#: ../src/layout.c:623
+msgid "Folder contents (files selected)"
+msgstr "Inhalt des Verzeichnis (Selektierte Dateien)"
+
+#: ../src/layout.c:632
+msgid "(Image dimensions) Image size"
+msgstr "(Bild-Dimensionen) Bildgröße"
+
+#: ../src/layout.c:642
+msgid "Image zoom level"
+msgstr "Zoom-Einstellung"
+
+#. expand only in small format
+#: ../src/layout.c:650
+msgid "[Pixel x,y coord]: (Pixel R,G,B value)"
+msgstr ""
+
+#: ../src/layout.c:1266 ../src/layout_config.c:67
 msgid "Tools"
 msgstr "Werkzeuge"
 
-#: ../src/layout.c:1865
+#: ../src/layout.c:1893
 msgid "Window options and layout"
 msgstr "Fensteroptionen und Layout"
 
-#: ../src/layout.c:1924
+#: ../src/layout.c:1958
 msgid "General options"
 msgstr "Allgemeine Optionen"
 
-#: ../src/layout.c:1926
+#: ../src/layout.c:1960
 msgid "Home path (empty to use your home directory)"
 msgstr "Anfangsverzeichnis (leer lassen für $HOME)"
 
-#: ../src/layout.c:1934
+#: ../src/layout.c:1968
 msgid "Use current"
 msgstr "Aktuelles benutzen"
 
-#: ../src/layout.c:1937
+#: ../src/layout.c:1971
 msgid "Show date in directories list view"
 msgstr "Zeige Datum in der Verzeichnis-Listenansicht"
 
-#: ../src/layout.c:1940
+#: ../src/layout.c:1974
 msgid "Exit program when this window is closed"
 msgstr "Verlasse das Programm wenn das Fenster geschlossen wird"
 
-#: ../src/layout.c:1943
+#: ../src/layout.c:1977
 msgid "Start-up directory:"
 msgstr "Startverzeichnis:"
 
-#: ../src/layout.c:1945
+#: ../src/layout.c:1979
 msgid "No change"
 msgstr "Keine Änderung"
 
-#: ../src/layout.c:1948
+#: ../src/layout.c:1982
 msgid "Restore last path"
 msgstr "Letzten Pfad wiederherstellen "
 
-#: ../src/layout.c:1951
+#: ../src/layout.c:1985
 msgid "Home path"
 msgstr "Anfangsverzeichnis"
 
-#: ../src/layout.c:1955 ../src/print.c:3365 ../src/print.c:3372
+#: ../src/layout.c:1989 ../src/print.c:3374 ../src/print.c:3381
 msgid "Layout"
 msgstr "Layout"
 
-#: ../src/layout.c:2198
+#: ../src/layout.c:2232
 msgid "Invalid geometry\n"
 msgstr "Ungültige Geometrie\n"
 
-#: ../src/layout_config.c:58 ../src/preferences.c:1666 ../src/ui_pathsel.c:1173
+#: ../src/layout_config.c:67 ../src/preferences.c:1715 ../src/ui_pathsel.c:1182
 msgid "Files"
 msgstr "Dateien"
 
-#: ../src/layout_config.c:58 ../src/preferences.c:92 ../src/preferences.c:1433
-#: ../src/print.c:123
+#: ../src/layout_config.c:67 ../src/preferences.c:107 ../src/preferences.c:1480
+#: ../src/print.c:132
 msgid "Image"
 msgstr "Bild"
 
-#: ../src/layout_config.c:349
+#: ../src/layout_config.c:358
 msgid "(drag to change order)"
 msgstr "(ziehen zum Ändern der Reihenfolge)"
 
-#: ../src/layout_image.c:553
+#: ../src/layout_image.c:727
+msgid "_Animate"
+msgstr "_Animieren"
+
+#: ../src/layout_image.c:731
 msgid "Hide file _list"
 msgstr "Datei_liste verbergen"
 
-#: ../src/layout_image.c:1616
+#: ../src/layout_image.c:1859
 #, c-format
 msgid "[%*d,%*d]: RGB(%3d,%3d,%3d)"
 msgstr "[%*d,%*d]: RGB(%3d,%3d,%3d)"
 
-#: ../src/layout_image.c:1624
+#: ../src/layout_image.c:1867
 #, c-format
 msgid "[%*s,%*s]: RGB(---,---,---)"
 msgstr "[%*s,%*s]: RGB(---,---,---)"
 
-#: ../src/layout_util.c:1269
+#: ../src/layout_util.c:1474
 msgid "_File"
 msgstr "_Datei"
 
-#: ../src/layout_util.c:1270
+#: ../src/layout_util.c:1475
 msgid "_Go"
 msgstr "_Gehe"
 
-#: ../src/layout_util.c:1271 ../src/menu.c:109
+#: ../src/layout_util.c:1476 ../src/menu.c:117
 msgid "_Edit"
 msgstr "_Bearbeiten"
 
-#: ../src/layout_util.c:1272
+#: ../src/layout_util.c:1477
 msgid "_Select"
 msgstr "_Auswahl"
 
-#: ../src/layout_util.c:1273 ../src/menu.c:284
+#: ../src/layout_util.c:1478 ../src/menu.c:292
 msgid "_Orientation"
 msgstr "_Ausrichtung"
 
-#: ../src/layout_util.c:1274
+#: ../src/layout_util.c:1479
 msgid "E_xternal Editors"
 msgstr "E_xterne Editoren"
 
-#: ../src/layout_util.c:1275
+#: ../src/layout_util.c:1480
 msgid "P_references"
 msgstr "_Einstellungen"
 
-#: ../src/layout_util.c:1277
+#: ../src/layout_util.c:1482
 msgid "_Files and Folders"
 msgstr "_Dateien und Verzeichnisse"
 
-#: ../src/layout_util.c:1278
+#: ../src/layout_util.c:1483
 msgid "_Zoom"
 msgstr "_Zoom"
 
-#: ../src/layout_util.c:1279
+#: ../src/layout_util.c:1484
 msgid "_Color Management"
 msgstr "_Farbverwaltung"
 
-#: ../src/layout_util.c:1280
+#: ../src/layout_util.c:1485
 msgid "_Connected Zoom"
 msgstr "_Verbundenes zoomen"
 
-#: ../src/layout_util.c:1281
+#: ../src/layout_util.c:1486
 msgid "Spli_t"
 msgstr "Auf_teilen"
 
-#: ../src/layout_util.c:1282
+#: ../src/layout_util.c:1487
 msgid "Stere_o"
 msgstr "Stere_o"
 
-#: ../src/layout_util.c:1283 ../src/layout_util.c:1399
+#: ../src/layout_util.c:1488 ../src/layout_util.c:1605
 msgid "Image _Overlay"
 msgstr "_Anzeige im Bild"
 
-#: ../src/layout_util.c:1284
+#: ../src/layout_util.c:1489
 msgid "_Help"
 msgstr "_Hilfe"
 
-#: ../src/layout_util.c:1286
+#: ../src/layout_util.c:1491
 msgid "_First Image"
 msgstr "_Erstes Bild"
 
-#: ../src/layout_util.c:1286
+#: ../src/layout_util.c:1491
 msgid "First Image"
 msgstr "Erstes Bild"
 
-#: ../src/layout_util.c:1287 ../src/layout_util.c:1288
-#: ../src/layout_util.c:1289
+#: ../src/layout_util.c:1492 ../src/layout_util.c:1493
+#: ../src/layout_util.c:1494
 msgid "_Previous Image"
 msgstr "_Vorheriges Bild"
 
-#: ../src/layout_util.c:1287 ../src/layout_util.c:1288
-#: ../src/layout_util.c:1289
+#: ../src/layout_util.c:1492 ../src/layout_util.c:1493
+#: ../src/layout_util.c:1494
 msgid "Previous Image"
 msgstr "Vorheriges Bild"
 
-#: ../src/layout_util.c:1290 ../src/layout_util.c:1291
-#: ../src/layout_util.c:1292
+#: ../src/layout_util.c:1495 ../src/layout_util.c:1496
+#: ../src/layout_util.c:1497
 msgid "_Next Image"
 msgstr "_Nächstes Bild"
 
-#: ../src/layout_util.c:1290 ../src/layout_util.c:1291
-#: ../src/layout_util.c:1292
+#: ../src/layout_util.c:1495 ../src/layout_util.c:1496
+#: ../src/layout_util.c:1497
 msgid "Next Image"
 msgstr "Nächstes Bild"
 
-#: ../src/layout_util.c:1293
+#: ../src/layout_util.c:1498
 msgid "_Last Image"
 msgstr "_Letztes Bild"
 
-#: ../src/layout_util.c:1293
+#: ../src/layout_util.c:1498
 msgid "Last Image"
 msgstr "Letztes Bild"
 
-#: ../src/layout_util.c:1294
+#: ../src/layout_util.c:1499
 msgid "_Back"
 msgstr "_Zurück"
 
-#: ../src/layout_util.c:1294
+#: ../src/layout_util.c:1499
 msgid "Back"
 msgstr "Zurück"
 
-#: ../src/layout_util.c:1295
+#: ../src/layout_util.c:1500
 msgid "_Home"
 msgstr "_Anfang"
 
-#: ../src/layout_util.c:1295 ../src/options.c:156 ../src/ui_bookmark.c:549
-#: ../src/ui_pathsel.c:1045
+#: ../src/layout_util.c:1500 ../src/options.c:170 ../src/ui_bookmark.c:566
+#: ../src/ui_pathsel.c:1054
 msgid "Home"
 msgstr "Anfang"
 
-#: ../src/layout_util.c:1296
+#: ../src/layout_util.c:1501
 msgid "_Up"
 msgstr "Hoch"
 
-#: ../src/layout_util.c:1296
+#: ../src/layout_util.c:1501
 msgid "Up"
 msgstr "Hoch"
 
-#: ../src/layout_util.c:1298
+#: ../src/layout_util.c:1503
 msgid "New _window"
 msgstr "_Neues Fenster"
 
-#: ../src/layout_util.c:1298
+#: ../src/layout_util.c:1503
 msgid "New window"
 msgstr "Neues Fenster"
 
-#: ../src/layout_util.c:1299
+#: ../src/layout_util.c:1504
 msgid "_New collection"
 msgstr "Neue Sa_mmlung"
 
-#: ../src/layout_util.c:1299
+#: ../src/layout_util.c:1504
 msgid "New collection"
 msgstr "Neue Sammlung"
 
-#: ../src/layout_util.c:1300
+#: ../src/layout_util.c:1505
 msgid "_Open collection..."
 msgstr "S_ammlung öffnen"
 
-#: ../src/layout_util.c:1300
+#: ../src/layout_util.c:1505
 msgid "Open collection..."
 msgstr "Sammlung öffnen ..."
 
-#: ../src/layout_util.c:1301
+#: ../src/layout_util.c:1506
 msgid "Open recen_t"
 msgstr "_Letzte Sammlung öffnen"
 
-#: ../src/layout_util.c:1301
+#: ../src/layout_util.c:1506
 msgid "Open recent"
 msgstr "Letzte Sammlung öffnen"
 
-#: ../src/layout_util.c:1302
+#: ../src/layout_util.c:1507
 msgid "_Search..."
 msgstr "_Suchen..."
 
-#: ../src/layout_util.c:1302
+#: ../src/layout_util.c:1507
 msgid "Search..."
 msgstr "Suchen ..."
 
-#: ../src/layout_util.c:1303
+#: ../src/layout_util.c:1508
 msgid "Find duplicates..."
 msgstr "Duplikate suchen ..."
 
-#: ../src/layout_util.c:1304
+#: ../src/layout_util.c:1509
 msgid "Pa_n view"
 msgstr "Ansicht als _Panel"
 
-#: ../src/layout_util.c:1304
+#: ../src/layout_util.c:1509
 msgid "Pan view"
 msgstr "Ansicht als Panel"
 
-#: ../src/layout_util.c:1305
+#: ../src/layout_util.c:1510
 msgid "_Print..."
 msgstr "D_rucken..."
 
-#: ../src/layout_util.c:1306
+#: ../src/layout_util.c:1511
 msgid "N_ew folder..."
 msgstr "Neues _Verzeichnis..."
 
-#: ../src/layout_util.c:1306
+#: ../src/layout_util.c:1511
 msgid "New folder..."
 msgstr "Neues Verzeichnis ..."
 
-#: ../src/layout_util.c:1307
+#: ../src/layout_util.c:1512
 msgid "Copy..."
 msgstr "Kopieren ..."
 
-#: ../src/layout_util.c:1308
+#: ../src/layout_util.c:1513
 msgid "Move..."
 msgstr "Verschieben ..."
 
-#: ../src/layout_util.c:1309
+#: ../src/layout_util.c:1514
 msgid "Rename..."
 msgstr "Umbenennen ..."
 
-#: ../src/layout_util.c:1310 ../src/layout_util.c:1311
-#: ../src/layout_util.c:1312
+#: ../src/layout_util.c:1515 ../src/layout_util.c:1516
+#: ../src/layout_util.c:1517
 msgid "Delete..."
 msgstr "Löschen ..."
 
-#: ../src/layout_util.c:1313 ../src/view_file.c:603
+#: ../src/layout_util.c:1518 ../src/view_file.c:633
 msgid "Enable file _grouping"
 msgstr "Gruppierung von Dateien _einschalten"
 
-#: ../src/layout_util.c:1313
+#: ../src/layout_util.c:1518
 msgid "Enable file grouping"
 msgstr "Gruppierung von Dateien einschalten"
 
-#: ../src/layout_util.c:1314 ../src/view_file.c:605
+#: ../src/layout_util.c:1519 ../src/view_file.c:635
 msgid "Disable file groupi_ng"
 msgstr "Gruppierung von Dateien _ausschalten"
 
-#: ../src/layout_util.c:1314
+#: ../src/layout_util.c:1519
 msgid "Disable file grouping"
 msgstr "Gruppierung von Dateien ausschalten"
 
-#: ../src/layout_util.c:1315
+#: ../src/layout_util.c:1520
 msgid "_Copy path to clipboard"
 msgstr "Pfad in die Zwischenablage _kopieren"
 
-#: ../src/layout_util.c:1315
+#: ../src/layout_util.c:1520
 msgid "Copy path to clipboard"
 msgstr "Pfad in die Zwischenablage kopieren"
 
-#: ../src/layout_util.c:1316
+#: ../src/layout_util.c:1521
 msgid "Close window"
 msgstr "Fenster schließen"
 
-#: ../src/layout_util.c:1317
+#: ../src/layout_util.c:1522
 msgid "_Quit"
 msgstr "_Beenden"
 
-#: ../src/layout_util.c:1317
+#: ../src/layout_util.c:1522
 msgid "Quit"
 msgstr "Beenden"
 
-#: ../src/layout_util.c:1318 ../src/menu.c:226
+#: ../src/layout_util.c:1523 ../src/menu.c:234
 msgid "_Rotate clockwise"
 msgstr "Um 90° nach _rechts drehen"
 
-#: ../src/layout_util.c:1318
+#: ../src/layout_util.c:1523
 msgid "Rotate clockwise"
 msgstr "Um 90° nach rechts drehen"
 
-#: ../src/layout_util.c:1319 ../src/menu.c:229
+#: ../src/layout_util.c:1524 ../src/menu.c:237
 msgid "Rotate _counterclockwise"
 msgstr "Um 90° nach _links drehen"
 
-#: ../src/layout_util.c:1319
+#: ../src/layout_util.c:1524
 msgid "Rotate counterclockwise"
 msgstr "Um 90° nach links drehen"
 
-#: ../src/layout_util.c:1320
+#: ../src/layout_util.c:1525
 msgid "Rotate 1_80"
 msgstr "Drehen um _180°"
 
-#: ../src/layout_util.c:1320
+#: ../src/layout_util.c:1525
 msgid "Rotate 180"
 msgstr "Um 180° drehen"
 
-#: ../src/layout_util.c:1321 ../src/menu.c:235
+#: ../src/layout_util.c:1526 ../src/menu.c:243
 msgid "_Mirror"
 msgstr "S_piegeln"
 
-#: ../src/layout_util.c:1321
+#: ../src/layout_util.c:1526
 msgid "Mirror"
 msgstr "Spiegeln"
 
-#: ../src/layout_util.c:1322 ../src/menu.c:238
+#: ../src/layout_util.c:1527 ../src/menu.c:246
 msgid "_Flip"
 msgstr "_Wenden"
 
-#: ../src/layout_util.c:1322
+#: ../src/layout_util.c:1527
 msgid "Flip"
 msgstr "Wenden"
 
-#: ../src/layout_util.c:1323 ../src/menu.c:241
+#: ../src/layout_util.c:1528 ../src/menu.c:249
 msgid "_Original state"
 msgstr "_Originalzustand"
 
-#: ../src/layout_util.c:1323
+#: ../src/layout_util.c:1528
 msgid "Original state"
 msgstr "Originalversion"
 
-#: ../src/layout_util.c:1324
+#: ../src/layout_util.c:1529
 msgid "Select _all"
 msgstr "_Alles auswählen"
 
-#: ../src/layout_util.c:1325
+#: ../src/layout_util.c:1530
 msgid "Select _none"
 msgstr "_Nichts auswählen"
 
-#: ../src/layout_util.c:1326
+#: ../src/layout_util.c:1531
 msgid "_Invert Selection"
 msgstr "Auswahl umkehren"
 
-#: ../src/layout_util.c:1326
+#: ../src/layout_util.c:1531
 msgid "Invert Selection"
 msgstr "Auswahl umkehren"
 
-#: ../src/layout_util.c:1327
+#: ../src/layout_util.c:1532
 msgid "P_references..."
 msgstr "_Einstellungen..."
 
-#: ../src/layout_util.c:1327
+#: ../src/layout_util.c:1532
 msgid "Preferences..."
 msgstr "Einstellungen ..."
 
-#: ../src/layout_util.c:1328
+#: ../src/layout_util.c:1533
 msgid "Configure _Editors..."
 msgstr "Editoren einrichten"
 
-#: ../src/layout_util.c:1328
+#: ../src/layout_util.c:1533
 msgid "Configure Editors..."
 msgstr "Bearbeitungsprogramme einrichten ..."
 
-#: ../src/layout_util.c:1329
+#: ../src/layout_util.c:1534
 msgid "_Configure this window..."
 msgstr "Dieses Fenster einrichten"
 
-#: ../src/layout_util.c:1329
+#: ../src/layout_util.c:1534
 msgid "Configure this window..."
 msgstr "Dieses Fenster einrichten ..."
 
-#: ../src/layout_util.c:1330
+#: ../src/layout_util.c:1535
 msgid "_Thumbnail maintenance..."
 msgstr "_Vorschaubilder+Metadaten"
 
-#: ../src/layout_util.c:1330
+#: ../src/layout_util.c:1535
 msgid "Thumbnail maintenance..."
 msgstr "Vorschaubilder verwalten ..."
 
-#: ../src/layout_util.c:1331
+#: ../src/layout_util.c:1536
 msgid "Set as wallpaper"
 msgstr "Als Hindergrundbild verwenden"
 
-#: ../src/layout_util.c:1332
+#: ../src/layout_util.c:1537
 msgid "_Save metadata"
 msgstr "Metadaten _speichern"
 
-#: ../src/layout_util.c:1332
+#: ../src/layout_util.c:1537
 msgid "Save metadata"
 msgstr "Metadaten speichern"
 
-#: ../src/layout_util.c:1333 ../src/layout_util.c:1334
+#: ../src/layout_util.c:1538 ../src/layout_util.c:1539
 msgid "Zoom in"
 msgstr "Vergrößern"
 
-#: ../src/layout_util.c:1335 ../src/layout_util.c:1336
+#: ../src/layout_util.c:1540 ../src/layout_util.c:1541
 msgid "Zoom out"
 msgstr "Verkleinern"
 
-#: ../src/layout_util.c:1337 ../src/layout_util.c:1338
+#: ../src/layout_util.c:1542 ../src/layout_util.c:1543
 msgid "Zoom 1:1"
 msgstr "Originalgröße"
 
-#: ../src/layout_util.c:1339 ../src/layout_util.c:1340
-#: ../src/layout_util.c:1355 ../src/layout_util.c:1356
+#: ../src/layout_util.c:1544 ../src/layout_util.c:1545
+#: ../src/layout_util.c:1560 ../src/layout_util.c:1561
 msgid "_Zoom to fit"
 msgstr "In _Fenster einpassen"
 
-#: ../src/layout_util.c:1339 ../src/layout_util.c:1340
+#: ../src/layout_util.c:1544 ../src/layout_util.c:1545
 msgid "Zoom to fit"
 msgstr "Zoomen zum einpassen"
 
-#: ../src/layout_util.c:1341 ../src/layout_util.c:1357
+#: ../src/layout_util.c:1546 ../src/layout_util.c:1562
 msgid "Fit _Horizontally"
 msgstr "_Horizontal einpassen"
 
-#: ../src/layout_util.c:1341
+#: ../src/layout_util.c:1546
 msgid "Fit Horizontally"
 msgstr "Horizontal einpassen"
 
-#: ../src/layout_util.c:1342 ../src/layout_util.c:1358
+#: ../src/layout_util.c:1547 ../src/layout_util.c:1563
 msgid "Fit _Vertically"
 msgstr "_Vertikal einpassen"
 
-#: ../src/layout_util.c:1342
+#: ../src/layout_util.c:1547
 msgid "Fit Vertically"
 msgstr "Vertikal einpassen"
 
-#: ../src/layout_util.c:1343 ../src/layout_util.c:1359
+#: ../src/layout_util.c:1548 ../src/layout_util.c:1564
 msgid "Zoom _2:1"
 msgstr "Zoom _2:1"
 
-#: ../src/layout_util.c:1343
+#: ../src/layout_util.c:1548
 msgid "Zoom 2:1"
 msgstr "Zoom 2:1"
 
-#: ../src/layout_util.c:1344 ../src/layout_util.c:1360
+#: ../src/layout_util.c:1549 ../src/layout_util.c:1565
 msgid "Zoom _3:1"
 msgstr "Zoom _3:1"
 
-#: ../src/layout_util.c:1344
+#: ../src/layout_util.c:1549
 msgid "Zoom 3:1"
 msgstr "Zoom 3:1"
 
-#: ../src/layout_util.c:1345 ../src/layout_util.c:1361
+#: ../src/layout_util.c:1550 ../src/layout_util.c:1566
 msgid "Zoom _4:1"
 msgstr "Zoom _4:1"
 
-#: ../src/layout_util.c:1345
+#: ../src/layout_util.c:1550
 msgid "Zoom 4:1"
 msgstr "Zoom 4:1"
 
-#: ../src/layout_util.c:1346 ../src/layout_util.c:1362
+#: ../src/layout_util.c:1551 ../src/layout_util.c:1567
 msgid "Zoom 1:2"
 msgstr "Zoom 1:2"
 
-#: ../src/layout_util.c:1347 ../src/layout_util.c:1363
+#: ../src/layout_util.c:1552 ../src/layout_util.c:1568
 msgid "Zoom 1:3"
 msgstr "Zoom 1:3"
 
-#: ../src/layout_util.c:1348 ../src/layout_util.c:1364
+#: ../src/layout_util.c:1553 ../src/layout_util.c:1569
 msgid "Zoom 1:4"
 msgstr "Zoom 1:4"
 
-#: ../src/layout_util.c:1349 ../src/layout_util.c:1350
+#: ../src/layout_util.c:1554 ../src/layout_util.c:1555
 msgid "Connected Zoom in"
 msgstr "Alle vergrößern"
 
-#: ../src/layout_util.c:1351 ../src/layout_util.c:1352
+#: ../src/layout_util.c:1556 ../src/layout_util.c:1557
 msgid "Connected Zoom out"
 msgstr "Alle verkleinern"
 
-#: ../src/layout_util.c:1353 ../src/layout_util.c:1354
+#: ../src/layout_util.c:1558 ../src/layout_util.c:1559
 msgid "Connected Zoom 1:1"
 msgstr "Alle auf Originalgröße zoomen"
 
-#: ../src/layout_util.c:1355 ../src/layout_util.c:1356
+#: ../src/layout_util.c:1560 ../src/layout_util.c:1561
 msgid "Connected Zoom to fit"
 msgstr "Alle einpassen"
 
-#: ../src/layout_util.c:1357
+#: ../src/layout_util.c:1562
 msgid "Connected Fit Horizontally"
 msgstr "Alle horizontal einpassen"
 
-#: ../src/layout_util.c:1358
+#: ../src/layout_util.c:1563
 msgid "Connected Fit Vertically"
 msgstr "Alle vertikal einpassen"
 
-#: ../src/layout_util.c:1359
+#: ../src/layout_util.c:1564
 msgid "Connected Zoom 2:1"
 msgstr "Alle auf 2:1 zoomen"
 
-#: ../src/layout_util.c:1360
+#: ../src/layout_util.c:1565
 msgid "Connected Zoom 3:1"
 msgstr "Alle auf 3:1 zoomen"
 
-#: ../src/layout_util.c:1361
+#: ../src/layout_util.c:1566
 msgid "Connected Zoom 4:1"
 msgstr "Alle auf 4:1 zoomen"
 
-#: ../src/layout_util.c:1362
+#: ../src/layout_util.c:1567
 msgid "Connected Zoom 1:2"
 msgstr "Alle auf 1:2 zoomen"
 
-#: ../src/layout_util.c:1363
+#: ../src/layout_util.c:1568
 msgid "Connected Zoom 1:3"
 msgstr "Alle auf 1:3 zoomen"
 
-#: ../src/layout_util.c:1364
+#: ../src/layout_util.c:1569
 msgid "Connected Zoom 1:4"
 msgstr "Alle auf 1:4 zoomen"
 
-#: ../src/layout_util.c:1365
+#: ../src/layout_util.c:1570
 msgid "_View in new window"
 msgstr "In _neuem Fenster anzeigen"
 
-#: ../src/layout_util.c:1365
+#: ../src/layout_util.c:1570
 msgid "View in new window"
 msgstr "In neuem Fenster anzeigen"
 
-#: ../src/layout_util.c:1366 ../src/layout_util.c:1367
-#: ../src/layout_util.c:1368
+#: ../src/layout_util.c:1571 ../src/layout_util.c:1572
+#: ../src/layout_util.c:1573
 msgid "F_ull screen"
 msgstr "_Vollbildmodus"
 
-#: ../src/layout_util.c:1369 ../src/layout_util.c:1370
+#: ../src/layout_util.c:1574 ../src/layout_util.c:1575
 msgid "_Leave full screen"
 msgstr "Vollbild _verlassen"
 
-#: ../src/layout_util.c:1369 ../src/layout_util.c:1370
+#: ../src/layout_util.c:1574 ../src/layout_util.c:1575
 msgid "Leave full screen"
 msgstr "Vollbild verlassen"
 
-#: ../src/layout_util.c:1371
+#: ../src/layout_util.c:1576
 msgid "_Cycle through overlay modes"
 msgstr "Verschiedene Ü_berlagerungsanzeigen umschalten"
 
-#: ../src/layout_util.c:1371
+#: ../src/layout_util.c:1576
 msgid "Cycle through Overlay modes"
 msgstr "Verschiedene Überlagerungsanzeigen umschalten"
 
-#: ../src/layout_util.c:1372
+#: ../src/layout_util.c:1577
 msgid "Cycle through histogram ch_annels"
 msgstr "Verschiedene Histogramm_kanäle umschalten"
 
-#: ../src/layout_util.c:1372
+#: ../src/layout_util.c:1577
 msgid "Cycle through histogram channels"
 msgstr "Verschiedene Histogrammkanäle umschalten"
 
-#: ../src/layout_util.c:1373
+#: ../src/layout_util.c:1578
 msgid "Cycle through histogram mo_des"
 msgstr "Verschiedene Histogram_modi umschalten"
 
-#: ../src/layout_util.c:1373
+#: ../src/layout_util.c:1578
 msgid "Cycle through histogram modes"
 msgstr "Verschiedene Histogrammodi umschalten"
 
-#: ../src/layout_util.c:1374
+#: ../src/layout_util.c:1579
 msgid "_Hide file list"
 msgstr "Datei_liste verbergen"
 
-#: ../src/layout_util.c:1374
+#: ../src/layout_util.c:1579
 msgid "Hide file list"
 msgstr "Dateiliste verbergen"
 
-#: ../src/layout_util.c:1375
+#: ../src/layout_util.c:1580
 msgid "_Pause slideshow"
 msgstr "Diashow unterbrechen"
 
-#: ../src/layout_util.c:1375
+#: ../src/layout_util.c:1580
 msgid "Pause slideshow"
 msgstr "Diashow anhalten"
 
-#: ../src/layout_util.c:1376
+#: ../src/layout_util.c:1581
 msgid "_Refresh"
 msgstr "Dateiliste a_ktualisieren"
 
-#: ../src/layout_util.c:1376
+#: ../src/layout_util.c:1581
 msgid "Refresh"
 msgstr "Aktualisieren"
 
-#: ../src/layout_util.c:1377
+#: ../src/layout_util.c:1582
 msgid "_Contents"
 msgstr "_Inhalt"
 
-#: ../src/layout_util.c:1377
+#: ../src/layout_util.c:1582
 msgid "Contents"
 msgstr "Inhalt"
 
-#: ../src/layout_util.c:1378
+#: ../src/layout_util.c:1583
 msgid "_Keyboard shortcuts"
 msgstr "_Tastenkürzel"
 
-#: ../src/layout_util.c:1378
+#: ../src/layout_util.c:1583
 msgid "Keyboard shortcuts"
 msgstr "Tastenkürzel"
 
-#: ../src/layout_util.c:1379
+#: ../src/layout_util.c:1584
+msgid "_Keyboard map"
+msgstr ""
+
+#: ../src/layout_util.c:1584
+msgid "Keyboard map"
+msgstr ""
+
+#: ../src/layout_util.c:1585
 msgid "_Release notes"
 msgstr "_Versionsinformationen"
 
-#: ../src/layout_util.c:1379
+#: ../src/layout_util.c:1585
 msgid "Release notes"
 msgstr "Versionsinformationen"
 
-#: ../src/layout_util.c:1380
+#: ../src/layout_util.c:1586
 msgid "_About"
 msgstr "_Über Geeqie"
 
-#: ../src/layout_util.c:1380 ../src/preferences.c:2392
+#: ../src/layout_util.c:1586 ../src/preferences.c:2507
 msgid "About"
 msgstr "Über Geeqie"
 
-#: ../src/layout_util.c:1381
+#: ../src/layout_util.c:1587
 msgid "_Log Window"
 msgstr "Protokollfenster"
 
-#: ../src/layout_util.c:1381
+#: ../src/layout_util.c:1587
 msgid "Log Window"
 msgstr "Protokollfenster"
 
-#: ../src/layout_util.c:1382
+#: ../src/layout_util.c:1588
 msgid "_Exif window"
 msgstr "_EXIF-Fenster"
 
-#: ../src/layout_util.c:1382
+#: ../src/layout_util.c:1588
 msgid "Exif window"
 msgstr "EXIF-Fenster"
 
-#: ../src/layout_util.c:1383
+#: ../src/layout_util.c:1589
 msgid "_Cycle through stereo modes"
 msgstr "Verschiedene _Stereomodi umschalten"
 
-#: ../src/layout_util.c:1383
+#: ../src/layout_util.c:1589
 msgid "Cycle through stereo modes"
 msgstr "Verschiedene Stereomodi umschalten"
 
-#: ../src/layout_util.c:1388
+#: ../src/layout_util.c:1594
 msgid "Show _Thumbnails"
 msgstr "Vorschaubilder anzeigen"
 
-#: ../src/layout_util.c:1388
+#: ../src/layout_util.c:1594
 msgid "Show Thumbnails"
 msgstr "Vorschaubilder anzeigen"
 
-#: ../src/layout_util.c:1389
+#: ../src/layout_util.c:1595
 msgid "Show _Marks"
 msgstr "Zeige Markierungen"
 
-#: ../src/layout_util.c:1389
+#: ../src/layout_util.c:1595
 msgid "Show Marks"
 msgstr "Zeige Markierungen"
 
-#: ../src/layout_util.c:1390
+#: ../src/layout_util.c:1596
 msgid "Pi_xel Info"
 msgstr "Pi_xelinformationen"
 
-#: ../src/layout_util.c:1390
+#: ../src/layout_util.c:1596
 msgid "Show Pixel Info"
 msgstr "Zeige Pixelinformationen"
 
-#: ../src/layout_util.c:1391
+#: ../src/layout_util.c:1597
 msgid "_Float file list"
 msgstr "_Dateiliste als eigenständiges Fenster"
 
-#: ../src/layout_util.c:1391
+#: ../src/layout_util.c:1597
 msgid "Float file list"
 msgstr "Dateiliste als eigenständiges Fenster"
 
-#: ../src/layout_util.c:1392
+#: ../src/layout_util.c:1598
 msgid "Hide tool_bar"
 msgstr "Werk_zeugleiste verbergen"
 
-#: ../src/layout_util.c:1392
+#: ../src/layout_util.c:1598
 msgid "Hide toolbar"
 msgstr "Werkzeugleiste verbergen"
 
-#: ../src/layout_util.c:1393
+#: ../src/layout_util.c:1599
 msgid "_Info sidebar"
 msgstr "_Informationsseitenleiste"
 
-#: ../src/layout_util.c:1393
+#: ../src/layout_util.c:1599
 msgid "Info sidebar"
 msgstr "Informationsseitenleiste"
 
-#: ../src/layout_util.c:1394
+#: ../src/layout_util.c:1600
 msgid "Sort _manager"
 msgstr "Sortier_manager"
 
-#: ../src/layout_util.c:1394
+#: ../src/layout_util.c:1600
 msgid "Sort manager"
 msgstr "Sortiermanager"
 
-#: ../src/layout_util.c:1395
+#: ../src/layout_util.c:1601
 msgid "Toggle _slideshow"
 msgstr "Dia_show ein-/ausschalten"
 
-#: ../src/layout_util.c:1395
+#: ../src/layout_util.c:1601
 msgid "Toggle slideshow"
 msgstr "Diashow ein-/ausschalten"
 
-#: ../src/layout_util.c:1396
+#: ../src/layout_util.c:1602
 msgid "Use _color profiles"
 msgstr "_Farbverwaltung verwenden"
 
-#: ../src/layout_util.c:1396
+#: ../src/layout_util.c:1602
 msgid "Use color profiles"
 msgstr "Farbverwaltung verwenden"
 
-#: ../src/layout_util.c:1397
+#: ../src/layout_util.c:1603
 msgid "Use profile from _image"
 msgstr "Farbprofil des Bildes verwenden"
 
-#: ../src/layout_util.c:1397
+#: ../src/layout_util.c:1603
 msgid "Use profile from image"
 msgstr "Farbprofil des Bildes verwenden"
 
-#: ../src/layout_util.c:1398
+#: ../src/layout_util.c:1604
 msgid "Toggle _grayscale"
 msgstr "_Graustufen ein-/ausschalten"
 
-#: ../src/layout_util.c:1398
+#: ../src/layout_util.c:1604
 msgid "Toggle grayscale"
 msgstr "Graustufen ein-/ausschalten"
 
-#: ../src/layout_util.c:1399
+#: ../src/layout_util.c:1605
 msgid "Image Overlay"
 msgstr "Anzeige im Bild"
 
-#: ../src/layout_util.c:1400
+#: ../src/layout_util.c:1606
 msgid "_Show Histogram"
 msgstr "_Zeige Histogramm"
 
-#: ../src/layout_util.c:1400
+#: ../src/layout_util.c:1606
 msgid "Show Histogram"
 msgstr "Zeige Histogramm"
 
-#: ../src/layout_util.c:1404
+#: ../src/layout_util.c:1607
+msgid "Rectangular Selection"
+msgstr "Rechteckige Auswahl"
+
+#: ../src/layout_util.c:1608
+msgid "GIF _animation"
+msgstr ""
+
+#: ../src/layout_util.c:1608
+msgid "Toggle GIF animation"
+msgstr ""
+
+#: ../src/layout_util.c:1609
+msgid "_Exif rotate"
+msgstr ""
+
+#: ../src/layout_util.c:1609
+msgid "Exif rotate"
+msgstr "Drehen nach Exif"
+
+#: ../src/layout_util.c:1613
 msgid "Image _List"
 msgstr "Bild_liste"
 
-#: ../src/layout_util.c:1404
+#: ../src/layout_util.c:1613
 msgid "View Images as List"
 msgstr "Zeige Bilder als Liste"
 
-#: ../src/layout_util.c:1405
+#: ../src/layout_util.c:1614
 msgid "I_cons"
 msgstr "I_cons"
 
-#: ../src/layout_util.c:1405
+#: ../src/layout_util.c:1614
 msgid "View Images as Icons"
 msgstr "Zeige Bilder als Vorschaubilder"
 
-#: ../src/layout_util.c:1409
+#: ../src/layout_util.c:1618
 msgid "Folder Li_st"
 msgstr "Verzeichnis_liste"
 
-#: ../src/layout_util.c:1409
+#: ../src/layout_util.c:1618
 msgid "View Folders as List"
 msgstr "Zeige Verzeichnis als Liste"
 
-#: ../src/layout_util.c:1410
+#: ../src/layout_util.c:1619
 msgid "Folder T_ree"
 msgstr "Verzeichnis_baum"
 
-#: ../src/layout_util.c:1410
+#: ../src/layout_util.c:1619
 msgid "View Folders as Tree"
 msgstr "Verzeichnis als Baum anzeigen"
 
-#: ../src/layout_util.c:1414
+#: ../src/layout_util.c:1623
 msgid "_Horizontal"
 msgstr "_Übereinander"
 
-#: ../src/layout_util.c:1414
+#: ../src/layout_util.c:1623
 msgid "Split Horizontal"
 msgstr "Zwei Ansichten übereinander"
 
-#: ../src/layout_util.c:1415
+#: ../src/layout_util.c:1624
 msgid "_Vertical"
 msgstr "_Nebeneinander"
 
-#: ../src/layout_util.c:1415
+#: ../src/layout_util.c:1624
 msgid "Split Vertical"
 msgstr "Zwei Ansichten nebeneinander"
 
-#: ../src/layout_util.c:1416
+#: ../src/layout_util.c:1625
 msgid "_Quad"
 msgstr "Vierfach"
 
-#: ../src/layout_util.c:1416
+#: ../src/layout_util.c:1625
 msgid "Split Quad"
 msgstr "Vier Ansichten"
 
-#: ../src/layout_util.c:1417
+#: ../src/layout_util.c:1626
 msgid "_Single"
 msgstr "_Einzeln"
 
-#: ../src/layout_util.c:1417
+#: ../src/layout_util.c:1626
 msgid "Split Single"
 msgstr "Einzelne Ansicht"
 
-#: ../src/layout_util.c:1421
+#: ../src/layout_util.c:1630
 msgid "Input _0: sRGB"
 msgstr "Profil _0: sRGB"
 
-#: ../src/layout_util.c:1421
+#: ../src/layout_util.c:1630
 msgid "Input 0: sRGB"
 msgstr "Profil 0: sRGB"
 
-#: ../src/layout_util.c:1422
+#: ../src/layout_util.c:1631
 msgid "Input _1: AdobeRGB compatible"
 msgstr "Profil _1: AdobeRGB-kompatibel"
 
-#: ../src/layout_util.c:1422
+#: ../src/layout_util.c:1631
 msgid "Input 1: AdobeRGB compatible"
 msgstr "Profil 1: AdobeRGB kompatibel"
 
-#: ../src/layout_util.c:1423
+#: ../src/layout_util.c:1632
 msgid "Input _2"
 msgstr "Profil _2"
 
-#: ../src/layout_util.c:1423
+#: ../src/layout_util.c:1632
 msgid "Input 2"
 msgstr "Profil 2"
 
-#: ../src/layout_util.c:1424
+#: ../src/layout_util.c:1633
 msgid "Input _3"
 msgstr "Profil _3"
 
-#: ../src/layout_util.c:1424
+#: ../src/layout_util.c:1633
 msgid "Input 3"
 msgstr "Profil 3"
 
-#: ../src/layout_util.c:1425
+#: ../src/layout_util.c:1634
 msgid "Input _4"
 msgstr "Profil _4"
 
-#: ../src/layout_util.c:1425
+#: ../src/layout_util.c:1634
 msgid "Input 4"
 msgstr "Profil 4"
 
-#: ../src/layout_util.c:1426
+#: ../src/layout_util.c:1635
 msgid "Input _5"
 msgstr "Profil _5"
 
-#: ../src/layout_util.c:1426
+#: ../src/layout_util.c:1635
 msgid "Input 5"
 msgstr "Profil 5"
 
-#: ../src/layout_util.c:1430
+#: ../src/layout_util.c:1639
 msgid "Histogram on Red"
 msgstr "Histogramm für Rot"
 
-#: ../src/layout_util.c:1431
+#: ../src/layout_util.c:1640
 msgid "Histogram on Green"
 msgstr "Histogramm für Grün"
 
-#: ../src/layout_util.c:1432
+#: ../src/layout_util.c:1641
 msgid "Histogram on Blue"
 msgstr "Histogramm für Blau"
 
-#: ../src/layout_util.c:1433
+#: ../src/layout_util.c:1642
 msgid "Histogram on RGB"
 msgstr "Histogramm für RGB"
 
-#: ../src/layout_util.c:1434
+#: ../src/layout_util.c:1643
 msgid "Histogram on Value"
 msgstr "Histogramm für Wert"
 
-#: ../src/layout_util.c:1438
+#: ../src/layout_util.c:1647
 msgid "Linear Histogram"
 msgstr "Lineares Histogramm"
 
-#: ../src/layout_util.c:1439
+#: ../src/layout_util.c:1648
 msgid "_Log Histogram"
 msgstr "_Log. Histogramm"
 
-#: ../src/layout_util.c:1439
+#: ../src/layout_util.c:1648
 msgid "Log Histogram"
 msgstr "Log. Histogramm"
 
-#: ../src/layout_util.c:1443
+#: ../src/layout_util.c:1652
 msgid "_Auto"
 msgstr "_Auto"
 
-#: ../src/layout_util.c:1443
+#: ../src/layout_util.c:1652
 msgid "Stereo Auto"
 msgstr "Automatisches Stereo"
 
-#: ../src/layout_util.c:1444
+#: ../src/layout_util.c:1653
 msgid "_Side by Side"
 msgstr "_Nebeneinander"
 
-#: ../src/layout_util.c:1444
+#: ../src/layout_util.c:1653
 msgid "Stereo Side by Side"
 msgstr "Stereo nebeneinander"
 
-#: ../src/layout_util.c:1445
+#: ../src/layout_util.c:1654
 msgid "_Cross"
 msgstr ""
 
-#: ../src/layout_util.c:1445
+#: ../src/layout_util.c:1654
 msgid "Stereo Cross"
 msgstr ""
 
-#: ../src/layout_util.c:1446
+#: ../src/layout_util.c:1655
 msgid "_Off"
 msgstr "Aus"
 
-#: ../src/layout_util.c:1446
+#: ../src/layout_util.c:1655
 msgid "Stereo Off"
 msgstr "Stereo aus"
 
-#: ../src/layout_util.c:1735
+#: ../src/layout_util.c:1951
 #, c-format
 msgid "Mark _%d"
 msgstr "Markierung _%d"
 
-#: ../src/layout_util.c:1736 ../src/view_file.c:540
+#: ../src/layout_util.c:1952 ../src/view_file.c:570
 #, c-format
 msgid "_Set mark %d"
 msgstr "_Setze Markierung %d"
 
-#: ../src/layout_util.c:1736
+#: ../src/layout_util.c:1952
 #, c-format
 msgid "Set mark %d"
 msgstr "Setze Markierung %d"
 
-#: ../src/layout_util.c:1737 ../src/view_file.c:541
+#: ../src/layout_util.c:1953 ../src/view_file.c:571
 #, c-format
 msgid "_Reset mark %d"
 msgstr "Entfe_rne Markierung %d"
 
-#: ../src/layout_util.c:1737
+#: ../src/layout_util.c:1953
 #, c-format
 msgid "Reset mark %d"
 msgstr "Markierung %d zurücksetzen"
 
-#: ../src/layout_util.c:1738 ../src/layout_util.c:1739 ../src/view_file.c:542
+#: ../src/layout_util.c:1954 ../src/layout_util.c:1955 ../src/view_file.c:572
 #, c-format
 msgid "_Toggle mark %d"
 msgstr "Markierung %d umschal_ten"
 
-#: ../src/layout_util.c:1738 ../src/layout_util.c:1739
+#: ../src/layout_util.c:1954 ../src/layout_util.c:1955
 #, c-format
 msgid "Toggle mark %d"
 msgstr "Selektierung für Markierung %d umschalten"
 
-#: ../src/layout_util.c:1740
+#: ../src/layout_util.c:1956
 #, c-format
 msgid "Se_lect mark %d"
 msgstr "Markierung %d auswählen"
 
-#: ../src/layout_util.c:1740 ../src/layout_util.c:1741
+#: ../src/layout_util.c:1956 ../src/layout_util.c:1957
 #, c-format
 msgid "Select mark %d"
 msgstr "Markierung %d selektieren"
 
-#: ../src/layout_util.c:1741 ../src/view_file.c:543
+#: ../src/layout_util.c:1957 ../src/view_file.c:573
 #, c-format
 msgid "_Select mark %d"
 msgstr "Wähle Bilder mit Markierung %d aus"
 
-#: ../src/layout_util.c:1742 ../src/view_file.c:544
+#: ../src/layout_util.c:1958 ../src/view_file.c:574
 #, c-format
 msgid "_Add mark %d"
 msgstr "Füge Bilder mit Markierung %d zur Auswahl hinzu"
 
-#: ../src/layout_util.c:1742
+#: ../src/layout_util.c:1958
 #, c-format
 msgid "Add mark %d"
 msgstr "Markierung %d hinzufügen"
 
-#: ../src/layout_util.c:1743 ../src/view_file.c:545
+#: ../src/layout_util.c:1959 ../src/view_file.c:575
 #, c-format
 msgid "_Intersection with mark %d"
 msgstr "Schnittmenge mit Markierung %d wählen"
 
-#: ../src/layout_util.c:1743
+#: ../src/layout_util.c:1959
 #, c-format
 msgid "Intersection with mark %d"
 msgstr "Schnittmenge mit Markierung %d bilden"
 
-#: ../src/layout_util.c:1744 ../src/view_file.c:546
+#: ../src/layout_util.c:1960 ../src/view_file.c:576
 #, c-format
 msgid "_Unselect mark %d"
 msgstr "Bilder mit Markierung %d abwählen"
 
-#: ../src/layout_util.c:1744
+#: ../src/layout_util.c:1960
 #, c-format
 msgid "Unselect mark %d"
 msgstr "Markierung %d abwählen"
 
-#: ../src/layout_util.c:1745
+#: ../src/layout_util.c:1961
 #, c-format
 msgid "_Filter mark %d"
 msgstr "Nach Markierung %d _filtern"
 
-#: ../src/layout_util.c:1745
+#: ../src/layout_util.c:1961
 #, c-format
 msgid "Filter mark %d"
 msgstr "Nach Markierung %d filtern"
 
-#: ../src/layout_util.c:2127
+#: ../src/layout_util.c:2343
 #, c-format
 msgid "Number of files with unsaved metadata: %d"
 msgstr "Anzahl Dateien mit ungesicherten Metadaten: %d"
 
-#: ../src/layout_util.c:2133
+#: ../src/layout_util.c:2349
 msgid "No unsaved metadata"
 msgstr "Keine ungespeicherten Metadaten"
 
-#: ../src/layout_util.c:2180
+#: ../src/layout_util.c:2396
 #, c-format
 msgid ""
 "Image profile: %s\n"
@@ -3107,26 +3175,26 @@
 "Bildprofil: %s\n"
 "Bildschirmprofil: %s"
 
-#: ../src/layout_util.c:2188
+#: ../src/layout_util.c:2404
 msgid "Click to enable color management"
 msgstr "Klicken um Farbverwaltung einzuschalten"
 
-#: ../src/layout_util.c:2193
+#: ../src/layout_util.c:2409
 msgid "Color profiles not supported"
 msgstr "Farbprofil nicht unterstützt"
 
-#: ../src/layout_util.c:2215
+#: ../src/layout_util.c:2431
 #, c-format
 msgid "Input _%d: %s"
 msgstr "Input _%d: %s"
 
 #. something went badly wrong
-#: ../src/lirc.c:197
+#: ../src/lirc.c:209
 #, c-format
 msgid "disconnected from LIRC\n"
 msgstr "Von LIRC getrennt\n"
 
-#: ../src/lirc.c:222
+#: ../src/lirc.c:234
 #, c-format
 msgid ""
 "could not read LIRC config file\n"
@@ -3137,11 +3205,11 @@
 "bitte lies in der Dokumentation von LIRC wie\n"
 "eine Konfiguration erzeugt werden kann\n"
 
-#: ../src/logwindow.c:76
+#: ../src/logwindow.c:84
 msgid "Log"
 msgstr "Protokoll"
 
-#: ../src/main.c:321
+#: ../src/main.c:330
 #, c-format
 msgid ""
 "Usage: %s [options] [path]\n"
@@ -3150,65 +3218,65 @@
 "Aufruf: %s [Optionen] [Pfad]\n"
 "\n"
 
-#: ../src/main.c:322
+#: ../src/main.c:331
 msgid "valid options are:\n"
 msgstr "Gültige Optionen sind:\n"
 
-#: ../src/main.c:323
+#: ../src/main.c:332
 msgid "  +t, --with-tools                 force show of tools\n"
 msgstr "  +t, --with-tools                 Anzeige der Werkzeuge erzwingen\n"
 
-#: ../src/main.c:324
+#: ../src/main.c:333
 msgid "  -t, --without-tools              force hide of tools\n"
 msgstr "  -t, --without-tools              Verbergen der Werkzeuge erzwingen\n"
 
-#: ../src/main.c:325
+#: ../src/main.c:334
 msgid "  -f, --fullscreen                 start in full screen mode\n"
 msgstr "  -f, -fullscreen                 Starte im Vollbildmodus\n"
 
-#: ../src/main.c:326
+#: ../src/main.c:335
 msgid "  -s, --slideshow                  start in slideshow mode\n"
 msgstr "  -s, --slideshow                  Starte im Diashowmodus\n"
 
-#: ../src/main.c:327
+#: ../src/main.c:336
 msgid ""
 "  -l, --list [files] [collections] open collection window for command line\n"
 msgstr ""
 "  -l, --list [dateien] [Sammlung] Neue Sammlung mit angegebenen Bildern "
 "erstellen\n"
 
-#: ../src/main.c:328
+#: ../src/main.c:337
 msgid "      --blank                      start with blank file list\n"
 msgstr "      --blank                      mit leerer Dateiliste starten\n"
 
-#: ../src/main.c:329
+#: ../src/main.c:338
 msgid "      --geometry=XxY+XOFF+YOFF     set main window location\n"
 msgstr ""
 "      --geometry=XxY+XOFF+YOFF     Setze die Hauptfenstergröße und -"
 "position\n"
 
-#: ../src/main.c:330
+#: ../src/main.c:339
 msgid ""
 "  -r, --remote                     send following commands to open window\n"
 msgstr ""
 "  -r, --remote                     Sende angegebene Befehle an offenes "
 "Fenster\n"
 
-#: ../src/main.c:331
+#: ../src/main.c:340
 msgid "  -rh,--remote-help                print remote command list\n"
 msgstr ""
 "  -rh,--remote-help                Anzeige der Befehle zur externen "
 "Steuerung\n"
 
-#: ../src/main.c:333
+#: ../src/main.c:342
 msgid "      --debug[=level]              turn on debug output\n"
 msgstr "      --debug[=Stufe]              Diagnoseausgabe einschalten\n"
 
-#: ../src/main.c:335
+#: ../src/main.c:344
 msgid "  -v, --version                    print version info\n"
 msgstr "  -v, --version                    Zeige Versionsnummer\n"
 
-#: ../src/main.c:336
+#: ../src/main.c:345
 msgid ""
 "  -h, --help                       show this message\n"
 "\n"
@@ -3216,7 +3284,7 @@
 "  -h, --help                       Diese Meldung\n"
 "\n"
 
-#: ../src/main.c:349
+#: ../src/main.c:358
 #, c-format
 msgid ""
 "invalid or ignored: %s\n"
@@ -3225,11 +3293,11 @@
 "Ungültig oder ignoriert: %s\n"
 "Benutzen Sie --help für Optionen\n"
 
-#: ../src/main.c:378
+#: ../src/main.c:387
 msgid "Invalid or ignored remote options: "
 msgstr "Ungültige oder ignorierte Fernsteueroption:"
 
-#: ../src/main.c:387
+#: ../src/main.c:396
 msgid ""
 "\n"
 "Use --remote-help for valid remote options.\n"
@@ -3237,24 +3305,24 @@
 "\n"
 "Benutze --remote-help für die gültigen Fernsteueroptionen.\n"
 
-#: ../src/main.c:489
+#: ../src/main.c:498
 #, c-format
 msgid "Creating %s dir:%s\n"
 msgstr "Erstelle %s Verzeichnis: %s\n"
 
-#: ../src/main.c:493
+#: ../src/main.c:502
 #, c-format
 msgid "Could not create dir:%s\n"
 msgstr ""
 "Fehler beim Anlegen des Verzeichnisses:\n"
 "%s\n"
 
-#: ../src/main.c:545
+#: ../src/main.c:554
 #, c-format
 msgid "error saving file: %s\n"
 msgstr "Fehler beim Speichern der Datei: %s\n"
 
-#: ../src/main.c:564
+#: ../src/main.c:573
 #, c-format
 msgid ""
 "error saving file: %s\n"
@@ -3263,441 +3331,442 @@
 "Fehler beim Speichern der Datei: %s\n"
 "Fehler: %s\n"
 
-#: ../src/main.c:672
+#: ../src/main.c:681
 msgid "exit"
 msgstr "beenden"
 
-#: ../src/main.c:677
+#: ../src/main.c:686
 #, c-format
 msgid "Quit %s"
 msgstr "Beende %s"
 
-#: ../src/main.c:679
+#: ../src/main.c:688
 msgid "Collections have been modified. Quit anyway?"
 msgstr ""
 "Sammlungen wurden verändert.\n"
 "Trotzdem beenden?"
 
-#: ../src/main.c:885 ../src/remote.c:601
+#: ../src/main.c:894 ../src/remote.c:620
 msgid "Command line"
 msgstr "Befehlszeile"
 
-#: ../src/menu.c:133
+#: ../src/menu.c:141
 msgid "Sort by size"
 msgstr "Sortieren nach Größe"
 
-#: ../src/menu.c:136
+#: ../src/menu.c:144
 msgid "Sort by date"
 msgstr "Sortieren nach Datum"
 
-#: ../src/menu.c:139
+#: ../src/menu.c:147
 msgid "Sort by file creation date"
 msgstr "Sortieren nach Dateierstellungszeitpunkt"
 
-#: ../src/menu.c:142
+#: ../src/menu.c:150
 msgid "Sort by Exif-date"
 msgstr "Sortieren nach E_xif-Datum"
 
-#: ../src/menu.c:145
+#: ../src/menu.c:153
 msgid "Unsorted"
 msgstr "Unsortiert"
 
-#: ../src/menu.c:148
+#: ../src/menu.c:156
 msgid "Sort by path"
 msgstr "Sortieren nach Pfad"
 
-#: ../src/menu.c:151
+#: ../src/menu.c:159
 msgid "Sort by number"
 msgstr "Sortieren nach Zahl"
 
-#: ../src/menu.c:155
+#: ../src/menu.c:163
 msgid "Sort by name"
 msgstr "Sortieren nach Name"
 
-#: ../src/menu.c:207
+#: ../src/menu.c:215
 msgid "Sort"
 msgstr "Sortieren"
 
-#: ../src/menu.c:232
+#: ../src/menu.c:240
 msgid "Rotate _180"
 msgstr "Drehen um _180°"
 
-#: ../src/metadata.c:1599
+#: ../src/metadata.c:1638
 msgid "People"
 msgstr "Menschen"
 
-#: ../src/metadata.c:1600
+#: ../src/metadata.c:1639
 msgid "Family"
 msgstr "Familie"
 
-#: ../src/metadata.c:1601
+#: ../src/metadata.c:1640
 msgid "Free time"
 msgstr "Freizeit"
 
-#: ../src/metadata.c:1602
+#: ../src/metadata.c:1641
 msgid "Children"
 msgstr "Kinder"
 
-#: ../src/metadata.c:1603
+#: ../src/metadata.c:1642
 msgid "Sport"
 msgstr "Sport"
 
-#: ../src/metadata.c:1604
+#: ../src/metadata.c:1643
 msgid "Culture"
 msgstr "Kultur"
 
-#: ../src/metadata.c:1605
+#: ../src/metadata.c:1644
 msgid "Festival"
 msgstr "Fest"
 
-#: ../src/metadata.c:1606
+#: ../src/metadata.c:1645
 msgid "Nature"
 msgstr "Natur"
 
-#: ../src/metadata.c:1607
+#: ../src/metadata.c:1646
 msgid "Animal"
 msgstr "Tier"
 
-#: ../src/metadata.c:1608
+#: ../src/metadata.c:1647
 msgid "Bird"
 msgstr "Vogel"
 
-#: ../src/metadata.c:1609
+#: ../src/metadata.c:1648
 msgid "Insect"
 msgstr "Insekt"
 
-#: ../src/metadata.c:1610
+#: ../src/metadata.c:1649
 msgid "Pets"
 msgstr "Haustier"
 
-#: ../src/metadata.c:1611
+#: ../src/metadata.c:1650
 msgid "Wildlife"
 msgstr "Wildtier"
 
-#: ../src/metadata.c:1612
+#: ../src/metadata.c:1651
 msgid "Zoo"
 msgstr "Zoo"
 
-#: ../src/metadata.c:1613
+#: ../src/metadata.c:1652
 msgid "Plant"
 msgstr "Pflanze"
 
-#: ../src/metadata.c:1614
+#: ../src/metadata.c:1653
 msgid "Tree"
 msgstr "Baum"
 
-#: ../src/metadata.c:1615
+#: ../src/metadata.c:1654
 msgid "Flower"
 msgstr "Blume"
 
-#: ../src/metadata.c:1616
+#: ../src/metadata.c:1655
 msgid "Water"
 msgstr "Wasser"
 
-#: ../src/metadata.c:1617
+#: ../src/metadata.c:1656
 msgid "River"
 msgstr "Fluß"
 
-#: ../src/metadata.c:1618
+#: ../src/metadata.c:1657
 msgid "Lake"
 msgstr "See"
 
-#: ../src/metadata.c:1619
+#: ../src/metadata.c:1658
 msgid "Sea"
 msgstr "Meer"
 
-#: ../src/metadata.c:1620 ../src/print.c:375
+#: ../src/metadata.c:1659 ../src/print.c:384
 msgid "Landscape"
 msgstr "Querformat"
 
-#: ../src/metadata.c:1621
+#: ../src/metadata.c:1660
 msgid "Art"
 msgstr "Kunst"
 
-#: ../src/metadata.c:1622
+#: ../src/metadata.c:1661
 msgid "Statue"
 msgstr "Statue"
 
-#: ../src/metadata.c:1623
+#: ../src/metadata.c:1662
 msgid "Painting"
 msgstr "Gemälde"
 
-#: ../src/metadata.c:1624 ../src/metadata.c:1638
+#: ../src/metadata.c:1663 ../src/metadata.c:1677
 msgid "Historic"
 msgstr "Historisch"
 
-#: ../src/metadata.c:1625 ../src/metadata.c:1639
+#: ../src/metadata.c:1664 ../src/metadata.c:1678
 msgid "Modern"
 msgstr "Modern"
 
-#: ../src/metadata.c:1626
+#: ../src/metadata.c:1665
 msgid "City"
 msgstr "Stadt"
 
-#: ../src/metadata.c:1627
+#: ../src/metadata.c:1666
 msgid "Park"
 msgstr "Park"
 
-#: ../src/metadata.c:1628
+#: ../src/metadata.c:1667
 msgid "Street"
 msgstr "Straße"
 
-#: ../src/metadata.c:1629
+#: ../src/metadata.c:1668
 msgid "Square"
 msgstr "Platz"
 
-#: ../src/metadata.c:1630
+#: ../src/metadata.c:1669
 msgid "Architecture"
 msgstr "Architektur"
 
-#: ../src/metadata.c:1631
+#: ../src/metadata.c:1670
 msgid "Buildings"
 msgstr "Bauwerk"
 
-#: ../src/metadata.c:1632
+#: ../src/metadata.c:1671
 msgid "House"
 msgstr "Haus"
 
-#: ../src/metadata.c:1633
+#: ../src/metadata.c:1672
 msgid "Cathedral"
 msgstr "Kathedrale"
 
-#: ../src/metadata.c:1634
+#: ../src/metadata.c:1673
 msgid "Palace"
 msgstr "Palast"
 
-#: ../src/metadata.c:1635
+#: ../src/metadata.c:1674
 msgid "Castle"
 msgstr "Schloß"
 
-#: ../src/metadata.c:1636
+#: ../src/metadata.c:1675
 msgid "Bridge"
 msgstr "Brücke"
 
-#: ../src/metadata.c:1637
+#: ../src/metadata.c:1676
 msgid "Interior"
 msgstr "Einrichtung"
 
-#: ../src/metadata.c:1640
+#: ../src/metadata.c:1679
 msgid "Places"
 msgstr "Plätze"
 
-#: ../src/metadata.c:1641
+#: ../src/metadata.c:1680
 msgid "Conditions"
 msgstr "Bedingungen"
 
-#: ../src/metadata.c:1642
+#: ../src/metadata.c:1681
 msgid "Night"
 msgstr "Nacht"
 
-#: ../src/metadata.c:1643
+#: ../src/metadata.c:1682
 msgid "Lights"
 msgstr "Lichter"
 
-#: ../src/metadata.c:1644
+#: ../src/metadata.c:1683
 msgid "Reflections"
 msgstr "Reflektionen"
 
-#: ../src/metadata.c:1645
+#: ../src/metadata.c:1684
 msgid "Sun"
 msgstr "Sonne"
 
-#: ../src/metadata.c:1646
+#: ../src/metadata.c:1685
 msgid "Weather"
 msgstr "Wetter"
 
-#: ../src/metadata.c:1647
+#: ../src/metadata.c:1686
 msgid "Fog"
 msgstr "Nebel"
 
-#: ../src/metadata.c:1648
+#: ../src/metadata.c:1687
 msgid "Rain"
 msgstr "Regen"
 
-#: ../src/metadata.c:1649
+#: ../src/metadata.c:1688
 msgid "Clouds"
 msgstr "Wolken"
 
-#: ../src/metadata.c:1650
+#: ../src/metadata.c:1689
 msgid "Snow"
 msgstr "Schnee"
 
-#: ../src/metadata.c:1651
+#: ../src/metadata.c:1690
 msgid "Sunny weather"
 msgstr "Sonniges Wetter"
 
-#: ../src/metadata.c:1652
+#: ../src/metadata.c:1691
 msgid "Photo"
 msgstr "Photo"
 
-#: ../src/metadata.c:1653
+#: ../src/metadata.c:1692
 msgid "Edited"
 msgstr "Bearbeitet"
 
-#: ../src/metadata.c:1654
+#: ../src/metadata.c:1693
 msgid "Detail"
 msgstr "Ausschnitt"
 
-#: ../src/metadata.c:1655
+#: ../src/metadata.c:1694
 msgid "Macro"
 msgstr "Großaufnahme"
 
-#: ../src/metadata.c:1656 ../src/print.c:374
+#: ../src/metadata.c:1695 ../src/print.c:383
 msgid "Portrait"
 msgstr "Hochformat"
 
-#: ../src/metadata.c:1657
+#: ../src/metadata.c:1696
 msgid "Black and White"
 msgstr "Schwarzweiß"
 
-#: ../src/metadata.c:1658
+#: ../src/metadata.c:1697
 msgid "Perspective"
 msgstr "Perspektive"
 
-#: ../src/options.c:158 ../src/ui_bookmark.c:560
+#: ../src/options.c:172 ../src/ui_bookmark.c:577
 msgid "Desktop"
 msgstr "Desktop"
 
-#: ../src/pan-view.c:423
+#: ../src/pan-view/pan-view.c:439
 #, c-format
 msgid "%d images, %s"
 msgstr "%d Bilder, %s"
 
-#: ../src/pan-view.c:433
+#: ../src/pan-view/pan-view.c:449
 #, c-format
 msgid "The pan view does not support the folder \"%s\"."
 msgstr "Der Pan-View unterstützt das Verzeichnis \"%s\"."
 
-#: ../src/pan-view.c:434
+#: ../src/pan-view/pan-view.c:450
 msgid "Folder not supported"
 msgstr "Verzeichnis nicht unterstützt"
 
-#: ../src/pan-view.c:986 ../src/pan-view.c:1002
+#: ../src/pan-view/pan-view.c:1002 ../src/pan-view/pan-view.c:1018
 msgid "Reading image data..."
 msgstr "Lese Bilddaten ..."
 
-#: ../src/pan-view.c:1061
+#: ../src/pan-view/pan-view.c:1077
 msgid "Sorting images..."
 msgstr "Sortiere Bilder ..."
 
-#: ../src/pan-view.c:1365 ../src/print.c:2599
+#: ../src/pan-view/pan-view.c:1384 ../src/print.c:2608
 msgid "Filename:"
 msgstr "Dateiname:"
 
-#: ../src/pan-view.c:1367 ../src/pan-view.c:2183 ../src/preferences.c:1551
+#: ../src/pan-view/pan-view.c:1386 ../src/pan-view/pan-view.c:2202
+#: ../src/preferences.c:1600
 msgid "Location:"
 msgstr "Position:"
 
-#: ../src/pan-view.c:1369 ../src/pan-view.c:1735
+#: ../src/pan-view/pan-view.c:1388 ../src/pan-view/pan-view.c:1754
 msgid "Date:"
 msgstr "Datum:"
 
-#: ../src/pan-view.c:1371 ../src/preferences.c:1377 ../src/print.c:3212
-#: ../src/print.c:3417
+#: ../src/pan-view/pan-view.c:1390 ../src/preferences.c:1424
+#: ../src/print.c:3221 ../src/print.c:3426
 msgid "Size:"
 msgstr "Größe:"
 
-#: ../src/pan-view.c:1473
+#: ../src/pan-view/pan-view.c:1492
 msgid "path found"
 msgstr "Pfad gefunden"
 
-#: ../src/pan-view.c:1473
+#: ../src/pan-view/pan-view.c:1492
 msgid "filename found"
 msgstr "Dateiname gefunden"
 
-#: ../src/pan-view.c:1521
+#: ../src/pan-view/pan-view.c:1540
 msgid "partial match"
 msgstr "teilweise Übereinstimmung"
 
-#: ../src/pan-view.c:1732 ../src/pan-view.c:1765
+#: ../src/pan-view/pan-view.c:1751 ../src/pan-view/pan-view.c:1784
 msgid "no match"
 msgstr "keine Übereinstimmung"
 
-#: ../src/pan-view.c:2071 ../src/search.c:2169
+#: ../src/pan-view/pan-view.c:2090 ../src/search.c:2196
 msgid "Folder not found"
 msgstr "Verzeichnis nicht vorhanden"
 
-#: ../src/pan-view.c:2072
+#: ../src/pan-view/pan-view.c:2091
 msgid "The entered path is not a folder"
 msgstr "Der eingegebene Pfad ist kein Verzeichnis"
 
-#: ../src/pan-view.c:2167
+#: ../src/pan-view/pan-view.c:2186
 msgid "Pan View"
 msgstr "Ansicht als Panel"
 
-#: ../src/pan-view.c:2192
+#: ../src/pan-view/pan-view.c:2211
 msgid "Timeline"
 msgstr "Zeitlinie"
 
-#: ../src/pan-view.c:2193
+#: ../src/pan-view/pan-view.c:2212
 msgid "Calendar"
 msgstr "Kalender"
 
-#: ../src/pan-view.c:2195
+#: ../src/pan-view/pan-view.c:2214
 msgid "Folders (flower)"
 msgstr "Verzeichnisse (Blume)"
 
-#: ../src/pan-view.c:2196
+#: ../src/pan-view/pan-view.c:2215
 msgid "Grid"
 msgstr "Gitter"
 
-#: ../src/pan-view.c:2205
+#: ../src/pan-view/pan-view.c:2224
 msgid "Dots"
 msgstr "Punkte"
 
-#: ../src/pan-view.c:2206
+#: ../src/pan-view/pan-view.c:2225
 msgid "No Images"
 msgstr "Keine Bilder"
 
-#: ../src/pan-view.c:2207
+#: ../src/pan-view/pan-view.c:2226
 msgid "Small Thumbnails"
 msgstr "Kleine Vorschaubilder"
 
-#: ../src/pan-view.c:2208
+#: ../src/pan-view/pan-view.c:2227
 msgid "Normal Thumbnails"
 msgstr "Normale Vorschaubilder"
 
-#: ../src/pan-view.c:2209
+#: ../src/pan-view/pan-view.c:2228
 msgid "Large Thumbnails"
 msgstr "Große Vorschaubilder"
 
-#: ../src/pan-view.c:2210 ../src/pan-view.c:2665
+#: ../src/pan-view/pan-view.c:2229 ../src/pan-view/pan-view.c:2684
 msgid "1:10 (10%)"
 msgstr "1:10 (10%)"
 
-#: ../src/pan-view.c:2211 ../src/pan-view.c:2661
+#: ../src/pan-view/pan-view.c:2230 ../src/pan-view/pan-view.c:2680
 msgid "1:4 (25%)"
 msgstr "1:4 (25%)"
 
-#: ../src/pan-view.c:2212 ../src/pan-view.c:2657
+#: ../src/pan-view/pan-view.c:2231 ../src/pan-view/pan-view.c:2676
 msgid "1:3 (33%)"
 msgstr "1:3 (33%)"
 
-#: ../src/pan-view.c:2213 ../src/pan-view.c:2653
+#: ../src/pan-view/pan-view.c:2232 ../src/pan-view/pan-view.c:2672
 msgid "1:2 (50%)"
 msgstr "1:2 (50%)"
 
-#: ../src/pan-view.c:2214
+#: ../src/pan-view/pan-view.c:2233
 msgid "1:1 (100%)"
 msgstr "1:1 (100%)"
 
-#: ../src/pan-view.c:2262
+#: ../src/pan-view/pan-view.c:2281
 msgid "Find:"
 msgstr "Suchen:"
 
-#: ../src/pan-view.c:2313
+#: ../src/pan-view/pan-view.c:2332
 msgid "Find"
 msgstr "Suchen"
 
-#: ../src/pan-view.c:2380
+#: ../src/pan-view/pan-view.c:2399
 msgid "Pan View Performance"
 msgstr "Optimierung der Panel-Ansicht"
 
-#: ../src/pan-view.c:2387
+#: ../src/pan-view/pan-view.c:2406
 msgid "Pan view performance may be poor."
 msgstr "Die Ansicht als Panel kann langsam sein."
 
-#: ../src/pan-view.c:2388
+#: ../src/pan-view/pan-view.c:2407
 msgid ""
 "To improve performance of thumbnails in the pan view the following options "
 "can be enabled. Note that both options must be enabled to notice a change in "
@@ -3708,131 +3777,131 @@
 "Optionen eingeschaltet sein müssen um eine Geschwindigkeitsveränderung zu "
 "erreichen."
 
-#: ../src/pan-view.c:2396 ../src/preferences.c:1380
+#: ../src/pan-view/pan-view.c:2415 ../src/preferences.c:1427
 msgid "Cache thumbnails"
 msgstr "Vorschaubilder speichern"
 
-#: ../src/pan-view.c:2398
+#: ../src/pan-view/pan-view.c:2417
 msgid "Use shared thumbnail cache"
 msgstr "gemeinsamen Speicher für Vorschaubilder verwenden"
 
-#: ../src/pan-view.c:2404
+#: ../src/pan-view/pan-view.c:2423
 msgid "Do not show this dialog again"
 msgstr "Diesen Dialog nicht mehr zeigen"
 
-#: ../src/pan-view.c:2633
+#: ../src/pan-view/pan-view.c:2652
 msgid "Sort by E_xif date"
 msgstr "Sortieren nach E_xif-Datum"
 
-#: ../src/pan-view.c:2639
+#: ../src/pan-view/pan-view.c:2658
 msgid "_Show Exif information"
 msgstr "_Zeige Exifinformationen"
 
-#: ../src/pan-view.c:2641
+#: ../src/pan-view/pan-view.c:2660
 msgid "Show im_age"
 msgstr "Zeige Bild"
 
-#: ../src/pan-view.c:2645
+#: ../src/pan-view/pan-view.c:2664
 msgid "_None"
 msgstr "Nichts"
 
-#: ../src/pan-view.c:2649
+#: ../src/pan-view/pan-view.c:2668
 msgid "_Full size"
 msgstr "_Volle Größe"
 
-#: ../src/preferences.c:91
+#: ../src/preferences.c:106
 msgid "Unknown"
 msgstr "Unbekannt"
 
-#: ../src/preferences.c:93
+#: ../src/preferences.c:108
 msgid "RAW Image"
 msgstr "Rohbild"
 
-#: ../src/preferences.c:446
+#: ../src/preferences.c:493
 msgid "Nearest (worst, but fastest)"
 msgstr "Sparsam (schlecht, aber schnell)"
 
-#: ../src/preferences.c:448
+#: ../src/preferences.c:495
 msgid "Tiles"
 msgstr "Kacheln"
 
-#: ../src/preferences.c:450
+#: ../src/preferences.c:497
 msgid "Bilinear"
 msgstr "Bilinear"
 
-#: ../src/preferences.c:452
+#: ../src/preferences.c:499
 msgid "Hyper (best, but slowest)"
 msgstr "Hyper (sehr gut, aber langsam)"
 
-#: ../src/preferences.c:517 ../src/print.c:380
+#: ../src/preferences.c:564 ../src/print.c:389
 msgid "Custom"
 msgstr "Eigenes"
 
-#: ../src/preferences.c:600
+#: ../src/preferences.c:647
 msgid "Single image"
 msgstr "Einzelnes Bild"
 
-#: ../src/preferences.c:602
+#: ../src/preferences.c:649
 msgid "Anaglyph Red-Cyan"
 msgstr ""
 
-#: ../src/preferences.c:604
+#: ../src/preferences.c:651
 msgid "Anaglyph Green-Magenta"
 msgstr ""
 
-#: ../src/preferences.c:606
+#: ../src/preferences.c:653
 msgid "Anaglyph Yellow-Blue"
 msgstr ""
 
-#: ../src/preferences.c:608
+#: ../src/preferences.c:655
 msgid "Anaglyph Gray Red-Cyan"
 msgstr ""
 
-#: ../src/preferences.c:610
+#: ../src/preferences.c:657
 msgid "Anaglyph Gray Green-Magenta"
 msgstr ""
 
-#: ../src/preferences.c:612
+#: ../src/preferences.c:659
 msgid "Anaglyph Gray Yellow-Blue"
 msgstr ""
 
-#: ../src/preferences.c:614
+#: ../src/preferences.c:661
 msgid "Anaglyph Dubois Red-Cyan"
 msgstr ""
 
-#: ../src/preferences.c:616
+#: ../src/preferences.c:663
 msgid "Anaglyph Dubois Green-Magenta"
 msgstr ""
 
-#: ../src/preferences.c:618
+#: ../src/preferences.c:665
 msgid "Anaglyph Dubois Yellow-Blue"
 msgstr ""
 
-#: ../src/preferences.c:621
+#: ../src/preferences.c:668
 msgid "Side by Side"
 msgstr "Nebeneinander"
 
-#: ../src/preferences.c:622
+#: ../src/preferences.c:669
 msgid "Side by Side Half size"
 msgstr "Nebeneinander, halbiert"
 
-#: ../src/preferences.c:629
+#: ../src/preferences.c:676
 msgid "Top - Bottom"
 msgstr "Oben - Unten"
 
-#: ../src/preferences.c:630
+#: ../src/preferences.c:677
 msgid "Top - Bottom Half size"
 msgstr "Oben- Unten, halbiert"
 
-#: ../src/preferences.c:639 ../src/preferences.c:2233
+#: ../src/preferences.c:686 ../src/preferences.c:2342
 msgid "Fixed position"
 msgstr "Feste Position"
 
-#: ../src/preferences.c:936 ../src/preferences.c:939
+#: ../src/preferences.c:983 ../src/preferences.c:986
 msgid "Reset filters"
 msgstr "Filter entfernen"
 
-#: ../src/preferences.c:940
+#: ../src/preferences.c:987
 msgid ""
 "This will reset the file filters to the defaults.\n"
 "Continue?"
@@ -3840,21 +3909,21 @@
 "Die Filter werden auf die Standardeinstellungen zurückgesetzt.\n"
 "Fortfahren?"
 
-#: ../src/preferences.c:967 ../src/preferences.c:970
+#: ../src/preferences.c:1014 ../src/preferences.c:1017
 msgid "Clear trash"
 msgstr "Papierkorb leeren"
 
-#: ../src/preferences.c:971
+#: ../src/preferences.c:1018
 msgid "This will remove the trash contents."
 msgstr ""
 "Der gesamte Inhalt des Papierkorbes im folgenden\n"
 "Verzeichnis wird gelöscht."
 
-#: ../src/preferences.c:1015 ../src/preferences.c:1018
+#: ../src/preferences.c:1062 ../src/preferences.c:1065
 msgid "Reset image overlay template string"
 msgstr "Zurücksetzen der Anzeige im Bild"
 
-#: ../src/preferences.c:1019
+#: ../src/preferences.c:1066
 msgid ""
 "This will reset the image overlay template string to the default.\n"
 "Continue?"
@@ -3863,21 +3932,21 @@
 "zurückgesetzt.\n"
 "Fortfahren?"
 
-#: ../src/preferences.c:1372
+#: ../src/preferences.c:1419
 msgid "General"
 msgstr "Allgemein"
 
-#: ../src/preferences.c:1378 ../src/preferences.c:1438
+#: ../src/preferences.c:1425 ../src/preferences.c:1485
 msgid "Quality:"
 msgstr "Qualität:"
 
-#: ../src/preferences.c:1386
+#: ../src/preferences.c:1433
 msgid "Use standard thumbnail cache, shared with other applications"
 msgstr ""
 "Benutzen des Standard-Zwischenspeicher für Vorschaubilder, der mit anderen "
 "Anwendungen geteilt wird"
 
-#: ../src/preferences.c:1392
+#: ../src/preferences.c:1439
 msgid ""
 "Store thumbnails in '.thumbnails' folder, local to image folder (non-"
 "standard)"
@@ -3885,173 +3954,173 @@
 "Vorschaubilder im '.thumbnails'-Verzeichnis innerhalb des Bildverzeichnis "
 "speichern (kein Standard)"
 
-#: ../src/preferences.c:1395
+#: ../src/preferences.c:1442
 msgid "Use EXIF thumbnails when available (EXIF thumbnails may be outdated)"
 msgstr ""
 "Benutze EXIF-Vorschaubilder wenn vorhanden (EXIF-Vorschaubilder könnten "
 "veraltet sein)"
 
-#: ../src/preferences.c:1398
+#: ../src/preferences.c:1445
 msgid "Slide show"
 msgstr "Diashow"
 
-#: ../src/preferences.c:1401
+#: ../src/preferences.c:1448
 msgid "Delay between image change:"
 msgstr "Pause zwischen dem Bildwechsel:"
 
-#: ../src/preferences.c:1401
+#: ../src/preferences.c:1448
 msgid "seconds"
 msgstr "Sekunden"
 
-#: ../src/preferences.c:1407
+#: ../src/preferences.c:1454
 msgid "Random"
 msgstr "Zufall"
 
-#: ../src/preferences.c:1408
+#: ../src/preferences.c:1455
 msgid "Repeat"
 msgstr "Wiederholung"
 
-#: ../src/preferences.c:1410
+#: ../src/preferences.c:1457
 msgid "Image loading and caching"
 msgstr "Laden der Bilder und Zwischenspeicher"
 
-#: ../src/preferences.c:1412
+#: ../src/preferences.c:1459
 msgid "Decoded image cache size (Mb):"
 msgstr "Zwischenspeichergröße für dekodierte Bilder (MB):"
 
-#: ../src/preferences.c:1414
+#: ../src/preferences.c:1461
 msgid "Preload next image"
 msgstr "Lade nächstes Bild im Hintergrund"
 
-#: ../src/preferences.c:1417
+#: ../src/preferences.c:1464
 msgid "Refresh on file change"
 msgstr "Dateiliste bei Änderung aktualisieren"
 
-#: ../src/preferences.c:1435
+#: ../src/preferences.c:1482
 msgid "Zoom"
 msgstr "Zoom"
 
-#: ../src/preferences.c:1441
+#: ../src/preferences.c:1488
 msgid "Use GPU acceleration via Clutter library"
 msgstr "GPU-Beschleunigung via Clutter-Library benutzen"
 
-#: ../src/preferences.c:1445
+#: ../src/preferences.c:1492
 msgid "Two pass rendering (apply HQ zoom and color correction in second pass)"
 msgstr ""
 "Bildberechnung in zwei Durchgängen (Hohe Qualität und Farbkorrektur im "
 "zweiten Durchgang)"
 
-#: ../src/preferences.c:1448
+#: ../src/preferences.c:1495
 msgid "Allow enlargement of image for zoom to fit"
 msgstr "Bild wenn nötig auch vergrößern, damit Zoomstufe erreicht werden kann"
 
-#: ../src/preferences.c:1452
+#: ../src/preferences.c:1499
 msgid "Limit image size when autofitting (%):"
 msgstr "Größe begrenzen bei automatischer Anpassung (%):"
 
-#: ../src/preferences.c:1460
+#: ../src/preferences.c:1507
 msgid "Zoom increment:"
 msgstr "Zoomstufen:"
 
-#: ../src/preferences.c:1465
+#: ../src/preferences.c:1512
 msgid "When new image is selected:"
 msgstr "Wenn neues Bild ausgewählt wird:"
 
-#: ../src/preferences.c:1469
+#: ../src/preferences.c:1516
 msgid "Zoom to original size"
 msgstr "Zu Ausgangsgröße zoomen"
 
-#: ../src/preferences.c:1472
+#: ../src/preferences.c:1519
 msgid "Fit image to window"
 msgstr "In Fenster einpassen"
 
-#: ../src/preferences.c:1475
+#: ../src/preferences.c:1522
 msgid "Leave Zoom at previous setting"
 msgstr "Zoom bei vorheriger Einstellung belassen"
 
-#: ../src/preferences.c:1481
+#: ../src/preferences.c:1528
 msgid "Scroll to top left corner"
 msgstr "Zur linken, oberen Ecke des Bildes bewegen"
 
-#: ../src/preferences.c:1484
+#: ../src/preferences.c:1531
 msgid "Scroll to image center"
 msgstr "Zur Bildmitte bewegen"
 
-#: ../src/preferences.c:1487
+#: ../src/preferences.c:1534
 msgid "Keep the region from previous image"
 msgstr "Ausschnitt des vorherigen Bildes beibehalten"
 
-#: ../src/preferences.c:1492
+#: ../src/preferences.c:1539
 msgid "Appearance"
 msgstr "Bildansicht"
 
-#: ../src/preferences.c:1494
+#: ../src/preferences.c:1541
 msgid "Use custom border color in window mode"
 msgstr "Angepaßte Rahmenfarbe im Fenstermodus verwenden"
 
-#: ../src/preferences.c:1497
+#: ../src/preferences.c:1544
 msgid "Use custom border color in fullscreen mode"
 msgstr "Angepaßte Rahmenfarbe im Vollbildmodus verwenden"
 
-#: ../src/preferences.c:1500
+#: ../src/preferences.c:1547
 msgid "Border color"
 msgstr "Rahmenfarbe"
 
-#: ../src/preferences.c:1503
+#: ../src/preferences.c:1550
 msgid "Convenience"
 msgstr "Nützliches"
 
-#: ../src/preferences.c:1505
-msgid "Auto rotate image using Exif information"
-msgstr "Automatisch gemäß Exif-Daten drehen"
-
-#: ../src/preferences.c:1508
+#: ../src/preferences.c:1552
 msgid "Auto rotate proofs using Exif information"
 msgstr "Vorschau automatisch gemäß Exif-Daten drehen"
 
-#: ../src/preferences.c:1525
+#: ../src/preferences.c:1569
 msgid "Windows"
 msgstr "Fenster"
 
-#: ../src/preferences.c:1527
+#: ../src/preferences.c:1571
 msgid "State"
 msgstr "Status"
 
-#: ../src/preferences.c:1529
+#: ../src/preferences.c:1573
 msgid "Remember window positions"
 msgstr "Fensterpositionen merken"
 
-#: ../src/preferences.c:1531
+#: ../src/preferences.c:1576
+msgid "Use saved window positions also for new windows"
+msgstr ""
+
+#: ../src/preferences.c:1580
 msgid "Remember tool state (float/hidden)"
 msgstr "Werkzeugstatus merken (schwebend/verborgen)"
 
-#: ../src/preferences.c:1536
+#: ../src/preferences.c:1585
 msgid "Fit window to image when tools are hidden/floating"
 msgstr "Bild in Fenster einpassen, wenn Werkzeuge verborgen/schwebend sind"
 
-#: ../src/preferences.c:1540
+#: ../src/preferences.c:1589
 msgid "Limit size when auto-sizing window (%):"
 msgstr "Größe begrenzen bei automat. Anpassung (%):"
 
-#: ../src/preferences.c:1555
+#: ../src/preferences.c:1604
 msgid "Smooth image flip"
 msgstr ""
 "Glatter Bildwechsel (nächstes Bild erst anzeigen, wenn es komplett geladen "
 "ist)"
 
-#: ../src/preferences.c:1557
+#: ../src/preferences.c:1606
 msgid "Disable screen saver"
 msgstr "Bildschirmschoner deaktivieren"
 
-#: ../src/preferences.c:1561
+#: ../src/preferences.c:1610
 msgid "Overlay Screen Display"
 msgstr "Anzeige im Bild"
 
-#: ../src/preferences.c:1563
+#: ../src/preferences.c:1612
 msgid "Image overlay template"
 msgstr "Schablone für die Anzeige im Bild"
 
-#: ../src/preferences.c:1576
+#: ../src/preferences.c:1625
 msgid ""
 "<i>%name%</i> results in the filename of the picture.\n"
 "Also available: <i>%collection%</i>, <i>%number%</i>, <i>%total%</i>, <i>"
@@ -4090,79 +4159,83 @@
 "Eine leere Zeile wird entfernt. Das erlaubt es, Zeilen hinzuzufügen, die "
 "komplett verschwinden, wenn keine Daten verfügbar sind.\n"
 
-#: ../src/preferences.c:1593 ../src/print.c:3210
+#: ../src/preferences.c:1642 ../src/print.c:3219
 msgid "Font"
 msgstr "Schrift"
 
 # Nicht klar, warum das übersetzt werden soll...
-#: ../src/preferences.c:1605 ../src/print.c:3400
+#: ../src/preferences.c:1654 ../src/print.c:3409
 msgid "Text"
 msgstr "Text"
 
-#: ../src/preferences.c:1610
+#: ../src/preferences.c:1659
 msgid "Background"
 msgstr "Hintergrund"
 
-#: ../src/preferences.c:1616 ../src/preferences.c:1792
-#: ../src/preferences.c:2162
+#: ../src/preferences.c:1665 ../src/preferences.c:1843
+#: ../src/preferences.c:2271
 msgid "Defaults"
 msgstr "Standardeinstellungen"
 
-#: ../src/preferences.c:1670
+#: ../src/preferences.c:1719
 msgid "Show hidden files or folders"
 msgstr "Zeige versteckte Dateien und Verzeichnisse"
 
-#: ../src/preferences.c:1672
+#: ../src/preferences.c:1721
 msgid "Show parent folder (..)"
 msgstr "Zeige übergeordnetes Verzeichnis (..)"
 
-#: ../src/preferences.c:1674
+#: ../src/preferences.c:1723
 msgid "Case sensitive sort"
 msgstr "Groß- und Kleinschreibung beim Sortieren beachten"
 
-#: ../src/preferences.c:1676
+#: ../src/preferences.c:1725
+msgid "Natural sort order"
+msgstr ""
+
+#: ../src/preferences.c:1727
 msgid "Disable file extension checks"
 msgstr "Prüfung der Dateiendung abschalten"
 
-#: ../src/preferences.c:1679
+#: ../src/preferences.c:1730
 msgid "Disable File Filtering"
 msgstr "Dateifilter abschalten"
 
-#: ../src/preferences.c:1683
+#: ../src/preferences.c:1734
 msgid "Grouping sidecar extensions"
 msgstr "Gruppiere \"Sidecar\"-Erweiterungen"
 
-#: ../src/preferences.c:1690
+#: ../src/preferences.c:1741
 msgid "File types"
 msgstr "Dateitypen"
 
-#: ../src/preferences.c:1712
+#: ../src/preferences.c:1763
 msgid "Filter"
 msgstr "Filter"
 
-#: ../src/preferences.c:1747
+#: ../src/preferences.c:1798
 msgid "Class"
 msgstr "Klasse"
 
-#: ../src/preferences.c:1764
+#: ../src/preferences.c:1815
 msgid "Writable"
 msgstr "Schreibbar"
 
-#: ../src/preferences.c:1775
+#: ../src/preferences.c:1826
 msgid "Sidecar is allowed"
 msgstr "\"Sidecars\" erlaubt"
 
-#: ../src/preferences.c:1821
+#: ../src/preferences.c:1872
 msgid "Metadata writing process"
 msgstr "Vorgehen zum Speichern der Metadaten"
 
-#: ../src/preferences.c:1823
+#: ../src/preferences.c:1874
 msgid "Warning: Geeqie is built without Exiv2. Some options are disabled."
 msgstr ""
 "Warnung: Geeqie wurde ohne Exiv2 übersetzt. Manche Einstellungsmöglichkeiten "
 "sind abgeschaltet."
 
-#: ../src/preferences.c:1825
+#: ../src/preferences.c:1876
 msgid ""
 "Metadata are written in the following order. The process ends after first "
 "success."
@@ -4170,7 +4243,7 @@
 "Metadaten werden in der folgenden Reihenfolge geschrieben. Der erste "
 "erfolgreiche Vorgang beendet das Schreiben."
 
-#: ../src/preferences.c:1828
+#: ../src/preferences.c:1879
 msgid ""
 "1) Save metadata in image files, resp. sidecar files, according to the XMP "
 "standard"
@@ -4178,23 +4251,23 @@
 "1) Speichere Metadaten im Bild resp. in \"Sidecar\"-Dateien nach dem XMP-"
 "Standard"
 
-#: ../src/preferences.c:1834
+#: ../src/preferences.c:1885
 msgid ""
 "2) Save metadata in '.metadata' folder, local to image folder (non-standard)"
 msgstr ""
 "2) Speichere Metadaten im '.metadata'-Verzeichnis innerhalb des "
 "Bilderverzeichnis (kein Standard)"
 
-#: ../src/preferences.c:1837
+#: ../src/preferences.c:1888
 #, c-format
 msgid "3) Save metadata in Geeqie private directory '%s'"
 msgstr "3) Speichere Metadaten in Geeqies eigenem Verzeichnis '%s'"
 
-#: ../src/preferences.c:1843
+#: ../src/preferences.c:1894
 msgid "Step 1: Write to image files"
 msgstr "Schritt 1: Speichern im Bild"
 
-#: ../src/preferences.c:1851
+#: ../src/preferences.c:1902
 msgid ""
 "Store metadata also in legacy IPTC tags (converted according to IPTC4XMP "
 "standard)"
@@ -4202,19 +4275,19 @@
 "Speichere Metadaten zusätzlich in passenden IPTC-Tags (Nach IPTC4XMP-"
 "Standard umgewandelt)"
 
-#: ../src/preferences.c:1854
+#: ../src/preferences.c:1905
 msgid "Warn if the image files are unwritable"
 msgstr "Warne wenn die Bilddatei unbeschreibbar ist"
 
-#: ../src/preferences.c:1857
+#: ../src/preferences.c:1908
 msgid "Ask before writing to image files"
 msgstr "Frage nach bevor in eine Bilddatei geschrieben wird"
 
-#: ../src/preferences.c:1860
+#: ../src/preferences.c:1911
 msgid "Step 2 and 3: write to Geeqie private files"
 msgstr "Schritt 2 und 3: Speichern in Geeqies eigenen Dateien"
 
-#: ../src/preferences.c:1865
+#: ../src/preferences.c:1916
 msgid ""
 "Use GQview legacy metadata format (supports only keywords and comments) "
 "instead of XMP"
@@ -4222,12 +4295,12 @@
 "Benutze zu GQview kompatibles Metadatenformat (unterstützt nur "
 "Schlüsselwörter und Kommentare) anstelle XMP"
 
-#: ../src/preferences.c:1869
+#: ../src/preferences.c:1920
 msgid "Miscellaneous"
 msgstr "Verschiedenes"
 
 # Gefällt mir noch nicht
-#: ../src/preferences.c:1870
+#: ../src/preferences.c:1921
 msgid ""
 "Write the same description tags (keywords, comment, etc.) to all grouped "
 "sidecars"
@@ -4235,250 +4308,262 @@
 "Speichere die selben Tags (Schlüsselwörter, Kommentare, ...) in alle "
 "gruppierten Dateien"
 
-#: ../src/preferences.c:1873
+#: ../src/preferences.c:1924
 msgid "Allow keywords to differ only in case"
 msgstr ""
 "Erlaube, daß Schlüsselworte sich nur in Groß-/Kleinschreibung unterscheiden"
 
-#: ../src/preferences.c:1876
+#: ../src/preferences.c:1927
 msgid "Write altered image orientation to the metadata"
 msgstr "Schreibe geänderte Bildausrichtung in die Metadaten"
 
-#: ../src/preferences.c:1882
+#: ../src/preferences.c:1933
 msgid "Auto-save options"
 msgstr "Optionen zum automatischen Speichern"
 
-#: ../src/preferences.c:1884
+#: ../src/preferences.c:1935
 msgid "Write metadata after timeout"
 msgstr "Schreibe Metadaten nach einer Zeitüberschreitung"
 
-#: ../src/preferences.c:1890
+#: ../src/preferences.c:1941
 msgid "Timeout (seconds):"
 msgstr "Zeitüberschreitung (in Sekunden):"
 
-#: ../src/preferences.c:1893
+#: ../src/preferences.c:1944
 msgid "Write metadata on image change"
 msgstr "Schreibe Metadaten beim Wechseln des Bildes"
 
-#: ../src/preferences.c:1896
+#: ../src/preferences.c:1947
 msgid "Write metadata on directory change"
 msgstr "Schreibe Metadaten beim Wechseln des Verzeichnisses"
 
-#: ../src/preferences.c:1910
+#: ../src/preferences.c:1987
+msgid "Perceptual"
+msgstr ""
+
+#: ../src/preferences.c:1989
+msgid "Relative Colorimetric"
+msgstr ""
+
+#: ../src/preferences.c:1993
+msgid "Absolute Colorimetric"
+msgstr ""
+
+#: ../src/preferences.c:2018
 msgid "Color management"
 msgstr "Farbverwaltung"
 
-#: ../src/preferences.c:1912
+#: ../src/preferences.c:2020
 msgid "Input profiles"
 msgstr "Quellprofil"
 
-#: ../src/preferences.c:1920
+#: ../src/preferences.c:2028
 msgid "Type"
 msgstr "Type"
 
-#: ../src/preferences.c:1923
+#: ../src/preferences.c:2031
 msgid "Menu name"
 msgstr "Menüname"
 
-#: ../src/preferences.c:1926
+#: ../src/preferences.c:2034
 msgid "File"
 msgstr "Datei"
 
-#: ../src/preferences.c:1934
+#: ../src/preferences.c:2042
 #, c-format
 msgid "Input %d:"
 msgstr "Profil %d:"
 
-#: ../src/preferences.c:1950 ../src/preferences.c:1970
+#: ../src/preferences.c:2058 ../src/preferences.c:2078
 msgid "Select color profile"
 msgstr "Farbprofil wählen"
 
-#: ../src/preferences.c:1958
+#: ../src/preferences.c:2066
 msgid "Screen profile"
 msgstr "Bildschirmprofil "
 
-#: ../src/preferences.c:1962
+#: ../src/preferences.c:2070
 msgid "Use system screen profile if available"
 msgstr "Benutze Bildschirmprofil des Systems wenn verfügbar"
 
-#: ../src/preferences.c:1967
+#: ../src/preferences.c:2075
 msgid "Screen:"
 msgstr "Bildschirmprofil:"
 
-#: ../src/preferences.c:1989 ../src/preferences.c:2030
+#: ../src/preferences.c:2081
+msgid "Render Intent:"
+msgstr ""
+
+#: ../src/preferences.c:2101 ../src/preferences.c:2142
 msgid "Behavior"
 msgstr "Verhalten"
 
-#: ../src/preferences.c:1991 ../src/utilops.c:1998
+#: ../src/preferences.c:2103 ../src/utilops.c:2136
 msgid "Delete"
 msgstr "Löschen"
 
-#: ../src/preferences.c:1993
+#: ../src/preferences.c:2105
 msgid "Confirm file delete"
 msgstr "Dateilöschung bestätigen"
 
-#: ../src/preferences.c:1995
+#: ../src/preferences.c:2107
 msgid "Enable Delete key"
 msgstr "Entfernen-Taste zum Löschen verwenden"
 
-#: ../src/preferences.c:1998
+#: ../src/preferences.c:2110
 msgid "Safe delete"
 msgstr "Papierkorb verwenden"
 
-#: ../src/preferences.c:2016
+#: ../src/preferences.c:2128
 msgid "Maximum size:"
 msgstr "maximale Größe:"
 
-#: ../src/preferences.c:2016
+#: ../src/preferences.c:2128
 msgid "MB"
 msgstr "MB"
 
-#: ../src/preferences.c:2018
+#: ../src/preferences.c:2130
 msgid "Set to 0 for unlimited size"
 msgstr "Auf 0 setzen für unbeschränkte Größe"
 
-#: ../src/preferences.c:2019
+#: ../src/preferences.c:2131
 msgid "View"
 msgstr "Ansicht"
 
-#: ../src/preferences.c:2032
-msgid "Rectangular selection in icon view"
-msgstr "rechteckige Auswahl in der Icon-Ansicht (bei Verwendung der Tastatur)"
-
-#: ../src/preferences.c:2035
+#: ../src/preferences.c:2144
 msgid "Descend folders in tree view"
 msgstr "Verzeichnisstruktur beim Start lesen"
 
-#: ../src/preferences.c:2038
+#: ../src/preferences.c:2147
 msgid "In place renaming"
 msgstr "schnelles Umbenennen (ohne Dialogfenster)"
 
-#: ../src/preferences.c:2041
-msgid "Open recent list maximum size"
-msgstr "Maximale Anzahl der kürzlich geöffneten Files"
-
-#: ../src/preferences.c:2044
+#: ../src/preferences.c:2150
+msgid "List directory view uses single click to enter"
+msgstr ""
+
+#: ../src/preferences.c:2153
+msgid "Recent folder list maximum size"
+msgstr ""
+
+#: ../src/preferences.c:2156
 msgid "Drag'n drop icon size"
 msgstr "Größe der Vorschau beim Klicken und Ziehen"
 
-#: ../src/preferences.c:2047
+#: ../src/preferences.c:2159
 msgid "Navigation"
 msgstr "Steuerung"
 
-#: ../src/preferences.c:2049
+#: ../src/preferences.c:2161
 msgid "Progressive keyboard scrolling"
 msgstr "beschleunigtes Scrollen bei Verwendung der Pfeiltasten"
 
-#: ../src/preferences.c:2051
+#: ../src/preferences.c:2163
+msgid "Keyboard scrolling step multiplier:"
+msgstr ""
+
+#: ../src/preferences.c:2165
 msgid "Mouse wheel scrolls image"
 msgstr ""
 "Mausrad scrollt Bild vertikal statt Bildwechsel (Bildwechsel mit Shift)"
 
-#: ../src/preferences.c:2054
-msgid "Similarities"
-msgstr "Ähnlichkeiten"
-
-#: ../src/preferences.c:2056
-msgid "Custom similarity threshold:"
-msgstr "Eigene Ähnlichkeitsschwelle für die Suche nach gleichen Bildern:"
-
-#: ../src/preferences.c:2058
-msgid "Rotation invariant duplicate check"
-msgstr "Dreh-invarianter Duplikat-Check"
-
-#: ../src/preferences.c:2062
+#: ../src/preferences.c:2167
+msgid "Navigation by left or middle click on image"
+msgstr ""
+
+#: ../src/preferences.c:2171
 msgid "Debugging"
 msgstr "Debugging"
 
-#: ../src/preferences.c:2064
+#: ../src/preferences.c:2173
 msgid "Debug level:"
 msgstr "Debuglevel:"
 
-#: ../src/preferences.c:2082
+#: ../src/preferences.c:2191
 msgid "Keyboard"
 msgstr "Tastatur"
 
-#: ../src/preferences.c:2084
+#: ../src/preferences.c:2193
 msgid "Accelerators"
 msgstr "Tastaturkürzel"
 
-#: ../src/preferences.c:2103
+#: ../src/preferences.c:2212
 msgid "Action"
 msgstr "Aktion"
 
-#: ../src/preferences.c:2125
+#: ../src/preferences.c:2234
 msgid "KEY"
 msgstr "SCHLÜSSEL"
 
-#: ../src/preferences.c:2136
+#: ../src/preferences.c:2245
 msgid "Tooltip"
 msgstr ""
 
-#: ../src/preferences.c:2167
+#: ../src/preferences.c:2276
 msgid "Reset selected"
 msgstr "Auswahl zurücksetzen"
 
-#: ../src/preferences.c:2183
+#: ../src/preferences.c:2292
 msgid "Stereo"
 msgstr "Stereo"
 
-#: ../src/preferences.c:2185 ../src/preferences.c:2188
+#: ../src/preferences.c:2294 ../src/preferences.c:2297
 msgid "Windowed stereo mode"
 msgstr "Fenster-Stereo-Modi"
 
-#: ../src/preferences.c:2192 ../src/preferences.c:2217
+#: ../src/preferences.c:2301 ../src/preferences.c:2326
 msgid "Mirror left image"
 msgstr "Linkes Bild spiegeln"
 
-#: ../src/preferences.c:2195 ../src/preferences.c:2220
+#: ../src/preferences.c:2304 ../src/preferences.c:2329
 msgid "Flip left image"
 msgstr "Linkes Bild wenden"
 
-#: ../src/preferences.c:2198 ../src/preferences.c:2223
+#: ../src/preferences.c:2307 ../src/preferences.c:2332
 msgid "Mirror right image"
 msgstr "Rechtes Bild spiegeln"
 
-#: ../src/preferences.c:2201 ../src/preferences.c:2226
+#: ../src/preferences.c:2310 ../src/preferences.c:2335
 msgid "Flip right image"
 msgstr "Rechtes Bild wenden"
 
-#: ../src/preferences.c:2203 ../src/preferences.c:2228
+#: ../src/preferences.c:2312 ../src/preferences.c:2337
 msgid "Swap left and right images"
 msgstr "Linkes und rechtes Bild vertauschen"
 
-#: ../src/preferences.c:2205 ../src/preferences.c:2230
+#: ../src/preferences.c:2314 ../src/preferences.c:2339
 msgid "Disable stereo mode on single image source"
 msgstr "Stereo-Modi bei einzelner Bilddatei abschalten"
 
-#: ../src/preferences.c:2208 ../src/preferences.c:2214
+#: ../src/preferences.c:2317 ../src/preferences.c:2323
 msgid "Fullscreen stereo mode"
 msgstr "Stereo-Vollbildmodus"
 
-#: ../src/preferences.c:2209
+#: ../src/preferences.c:2318
 msgid "Use different settings for fullscreen"
 msgstr "Unterschiedliche Einstellungen für Vollbild verwenden"
 
-#: ../src/preferences.c:2239
+#: ../src/preferences.c:2348
 msgid "Left X"
 msgstr "Links X"
 
-#: ../src/preferences.c:2241
+#: ../src/preferences.c:2350
 msgid "Left Y"
 msgstr "Links Y"
 
-#: ../src/preferences.c:2243
+#: ../src/preferences.c:2352
 msgid "Right X"
 msgstr "Rechts X"
 
-#: ../src/preferences.c:2245
+#: ../src/preferences.c:2354
 msgid "Right Y"
 msgstr "Rechts Y"
 
-#: ../src/preferences.c:2261
+#: ../src/preferences.c:2370
 msgid "Preferences"
 msgstr "Einstellungen"
 
-#: ../src/preferences.c:2409
+#: ../src/preferences.c:2524
 #, c-format
 msgid ""
 "%s %s\n"
@@ -4499,85 +4584,85 @@
 "\n"
 "Freigegeben unter der GNU General Public License"
 
-#: ../src/preferences.c:2428
+#: ../src/preferences.c:2543
 msgid "Credits..."
 msgstr "Mitwirkende..."
 
-#: ../src/print.c:124
+#: ../src/print.c:133
 msgid "Selection"
 msgstr "Auswahl"
 
-#: ../src/print.c:125
+#: ../src/print.c:134
 msgid "All"
 msgstr "alles"
 
-#: ../src/print.c:136
+#: ../src/print.c:145
 msgid "One image per page"
 msgstr "ein Bild je Seite"
 
-#: ../src/print.c:137
+#: ../src/print.c:146
 msgid "Proof sheet"
 msgstr "Prüfausdruck"
 
-#: ../src/print.c:150
+#: ../src/print.c:159
 msgid "Default printer"
 msgstr "Standarddrucker"
 
-#: ../src/print.c:151
+#: ../src/print.c:160
 msgid "Custom printer"
 msgstr "Spezieller Drucker"
 
-#: ../src/print.c:152
+#: ../src/print.c:161
 msgid "PostScript file"
 msgstr "PostScript-Datei"
 
-#: ../src/print.c:153
+#: ../src/print.c:162
 msgid "Image file"
 msgstr "Bild-Datei"
 
-#: ../src/print.c:167
+#: ../src/print.c:176
 msgid "jpeg, low quality"
 msgstr "jpeg, niedrige Qualität"
 
-#: ../src/print.c:168
+#: ../src/print.c:177
 msgid "jpeg, normal quality"
 msgstr "jpeg, mittlere Qualität"
 
-#: ../src/print.c:169
+#: ../src/print.c:178
 msgid "jpeg, high quality"
 msgstr "jpeg, hohe Qualität"
 
-#: ../src/print.c:365 ../src/print.c:3212
+#: ../src/print.c:374 ../src/print.c:3221
 msgid "points"
 msgstr "Punkte"
 
-#: ../src/print.c:366
+#: ../src/print.c:375
 msgid "millimeters"
 msgstr "mm"
 
-#: ../src/print.c:367
+#: ../src/print.c:376
 msgid "centimeters"
 msgstr "cm"
 
-#: ../src/print.c:368
+#: ../src/print.c:377
 msgid "inches"
 msgstr "Zoll"
 
-#: ../src/print.c:369
+#: ../src/print.c:378
 msgid "picas"
 msgstr "Pica"
 
-#: ../src/print.c:381
+#: ../src/print.c:390
 msgid "Letter"
 msgstr "Letter"
 
 #. in 8.5 x 11
-#: ../src/print.c:382
+#: ../src/print.c:391
 msgid "Legal"
 msgstr "Legal"
 
 #. in 8.5 x 14
-#: ../src/print.c:383
+#: ../src/print.c:392
 msgid "Executive"
 msgstr "Executive"
 
@@ -4593,60 +4678,60 @@
 #. mm 250 x 353
 #. mm 176 x 250
 #. mm 125 x 176
-#: ../src/print.c:395
+#: ../src/print.c:404
 msgid "Envelope #10"
 msgstr "Umschlag #10"
 
 #. in 4.125 x 9.5
-#: ../src/print.c:396
+#: ../src/print.c:405
 msgid "Envelope #9"
 msgstr "Umschlag #9"
 
 #. in 3.875 x 8.875
-#: ../src/print.c:397
+#: ../src/print.c:406
 msgid "Envelope C4"
 msgstr "Umschlag C4"
 
 #. mm 229 x 324
-#: ../src/print.c:398
+#: ../src/print.c:407
 msgid "Envelope C5"
 msgstr "Umschlag C5"
 
 #. mm 162 x 229
-#: ../src/print.c:399
+#: ../src/print.c:408
 msgid "Envelope C6"
 msgstr "Umschlag C6"
 
 #. mm 114 x 162
-#: ../src/print.c:400
+#: ../src/print.c:409
 msgid "Photo 6x4"
 msgstr "Foto 6x4 (Zoll)"
 
 #. in 6   x 4
-#: ../src/print.c:401
+#: ../src/print.c:410
 msgid "Photo 8x10"
 msgstr "Foto 8x10 (Zoll)"
 
 #. in 8   x 10
-#: ../src/print.c:402
+#: ../src/print.c:411
 msgid "Postcard"
 msgstr "Postcard"
 
 #. mm 100 x 148
-#: ../src/print.c:403
+#: ../src/print.c:412
 msgid "Tabloid"
 msgstr "Tabloid"
 
-#: ../src/print.c:559
+#: ../src/print.c:568
 #, c-format
 msgid "page %d of %d"
 msgstr "Seite %d von %d"
 
-#: ../src/print.c:751
+#: ../src/print.c:760
 msgid "Preview"
 msgstr "Vorschau"
 
-#: ../src/print.c:1059
+#: ../src/print.c:1068
 #, c-format
 msgid ""
 "Unable to open pipe for writing.\n"
@@ -4655,147 +4740,147 @@
 "Fehler beim Öffnen der Pipe zum Schreiben.\n"
 "%s"
 
-#: ../src/print.c:1074 ../src/print.c:1466 ../src/ui_pathsel.c:423
+#: ../src/print.c:1083 ../src/print.c:1475 ../src/ui_pathsel.c:432
 #, c-format
 msgid "A file with name %s already exists."
 msgstr "Datei %s existiert bereits."
 
-#: ../src/print.c:1089 ../src/print.c:1521
+#: ../src/print.c:1098 ../src/print.c:1530
 #, c-format
 msgid "Failure writing to file %s"
 msgstr "Fehler beim Schreiben der Datei %s"
 
-#: ../src/print.c:1144 ../src/print.c:1181 ../src/print.c:1217
-#: ../src/print.c:1334 ../src/print.c:1407
+#: ../src/print.c:1153 ../src/print.c:1190 ../src/print.c:1226
+#: ../src/print.c:1343 ../src/print.c:1416
 msgid "SIGPIPE error writing to printer."
 msgstr "SIGPIPE-Fehler beim Drucken."
 
-#: ../src/print.c:1942
+#: ../src/print.c:1951
 #, c-format
 msgid "Page %d"
 msgstr "Seite %d"
 
-#: ../src/print.c:1964 ../src/print.c:1969
+#: ../src/print.c:1973 ../src/print.c:1978
 msgid "Printing error"
 msgstr "Druckerfehler"
 
-#: ../src/print.c:1968
+#: ../src/print.c:1977
 #, c-format
 msgid "An error occured printing to %s."
 msgstr "Fehler beim Drucken zu %s"
 
-#: ../src/print.c:1972
+#: ../src/print.c:1981
 msgid "Details"
 msgstr "Details"
 
-#: ../src/print.c:2587 ../src/print.c:3341
+#: ../src/print.c:2596 ../src/print.c:3350
 msgid "Print"
 msgstr "Drucken"
 
-#: ../src/print.c:2591
+#: ../src/print.c:2600
 #, c-format
 msgid "Printing %d pages to %s."
 msgstr "Drucke %d Seiten zu %s"
 
-#: ../src/print.c:2691
+#: ../src/print.c:2700
 msgid "Format:"
 msgstr "Format:"
 
-#: ../src/print.c:2766
+#: ../src/print.c:2775
 msgid "Units:"
 msgstr "Einheit:"
 
-#: ../src/print.c:2810
+#: ../src/print.c:2819
 msgid "Orientation:"
 msgstr "Orientierung:"
 
-#: ../src/print.c:2942
+#: ../src/print.c:2951
 msgid "Destination:"
 msgstr "Ziel:"
 
-#: ../src/print.c:2990
+#: ../src/print.c:2999
 msgid "<printer name>"
 msgstr "<Druckername>"
 
-#: ../src/print.c:3079
+#: ../src/print.c:3088
 msgid "Unlimited"
 msgstr "unbegrenzt"
 
-#: ../src/print.c:3197
+#: ../src/print.c:3206
 msgid "Show"
 msgstr "Zusätzliche Drucktexte"
 
-#: ../src/print.c:3368
+#: ../src/print.c:3377
 msgid "Source"
 msgstr "Quelle"
 
-#: ../src/print.c:3380
+#: ../src/print.c:3389
 msgid "Image size:"
 msgstr "Bildgröße:"
 
-#: ../src/print.c:3384
+#: ../src/print.c:3393
 msgid "Proof size:"
 msgstr "Bildgröße:"
 
-#: ../src/print.c:3410
+#: ../src/print.c:3419
 msgid "Paper"
 msgstr "Papier"
 
-#: ../src/print.c:3433
+#: ../src/print.c:3442
 msgid "Margins"
 msgstr "Ränder"
 
-#: ../src/print.c:3435
+#: ../src/print.c:3444
 msgid "Left:"
 msgstr "links:"
 
-#: ../src/print.c:3438
+#: ../src/print.c:3447
 msgid "Right:"
 msgstr "rechts:"
 
-#: ../src/print.c:3441
+#: ../src/print.c:3450
 msgid "Top:"
 msgstr "oben:"
 
-#: ../src/print.c:3444
+#: ../src/print.c:3453
 msgid "Bottom:"
 msgstr "unten:"
 
-#: ../src/print.c:3453
+#: ../src/print.c:3462
 msgid "Printer"
 msgstr "Drucker"
 
-#: ../src/print.c:3459
+#: ../src/print.c:3468
 msgid "Custom printer:"
 msgstr "Spezieller Drucker:"
 
-#: ../src/print.c:3468
+#: ../src/print.c:3477
 msgid "File:"
 msgstr "Datei:"
 
-#: ../src/print.c:3477
+#: ../src/print.c:3486
 msgid "File format:"
 msgstr "Dateityp:"
 
-#: ../src/print.c:3482
+#: ../src/print.c:3491
 msgid "DPI:"
 msgstr "DPI:"
 
-#: ../src/print.c:3490
+#: ../src/print.c:3499
 msgid "Remember print settings"
 msgstr "Druckeinstellungen merken"
 
-#: ../src/rcfile.c:81
+#: ../src/rcfile.c:91
 #, c-format
 msgid "Option %s ignored: %s\n"
 msgstr "Option %s ignoriert: %s\n"
 
-#: ../src/rcfile.c:468
+#: ../src/rcfile.c:512
 #, c-format
 msgid "error saving config file: %s\n"
 msgstr "Fehler beim Speichern der Konfigurationsdatei: %s\n"
 
-#: ../src/rcfile.c:526
+#: ../src/rcfile.c:570
 #, c-format
 msgid ""
 "error saving config file: %s\n"
@@ -4805,116 +4890,120 @@
 "Fehler: %s\n"
 
 #. short, long                  callback,               extra, prefer, parameter, description
-#: ../src/remote.c:640
+#: ../src/remote.c:659
 msgid "next image"
 msgstr "nächstes Bild"
 
-#: ../src/remote.c:641
+#: ../src/remote.c:660
 msgid "previous image"
 msgstr "vorheriges Bild"
 
-#: ../src/remote.c:642
+#: ../src/remote.c:661
 msgid "first image"
 msgstr "erstes Bild"
 
-#: ../src/remote.c:643
+#: ../src/remote.c:662
 msgid "last image"
 msgstr "letztes Bild"
 
-#: ../src/remote.c:644
+#: ../src/remote.c:663
 msgid "toggle full screen"
 msgstr "Vollbildmodus umschalten"
 
-#: ../src/remote.c:645
+#: ../src/remote.c:664
 msgid "start full screen"
 msgstr "Vollbild ein"
 
-#: ../src/remote.c:646
+#: ../src/remote.c:665
 msgid "stop full screen"
 msgstr "Vollbild aus"
 
-#: ../src/remote.c:647
+#: ../src/remote.c:666
 msgid "toggle slide show"
 msgstr "Diashowmodus umschalten"
 
-#: ../src/remote.c:648
+#: ../src/remote.c:667
 msgid "start slide show"
 msgstr "Diashow ein"
 
-#: ../src/remote.c:649
+#: ../src/remote.c:668
 msgid "stop slide show"
 msgstr "Diashow aus"
 
-#: ../src/remote.c:650
+#: ../src/remote.c:669
 msgid "<FOLDER>"
 msgstr "<VERZEICHNIS>"
 
-#: ../src/remote.c:650
+#: ../src/remote.c:669
 msgid "start recursive slide show in FOLDER"
 msgstr "starte rekursive Diashow in VERZEICHNIS"
 
-#: ../src/remote.c:651
+#: ../src/remote.c:670
 msgid "<[N][.M]>"
 msgstr "<[N][.M]>"
 
-#: ../src/remote.c:651
+#: ../src/remote.c:670
 msgid "set slide show delay to N.M seconds"
 msgstr "Diashowverzögerung auf N.M Sekunden setzen"
 
-#: ../src/remote.c:652
+#: ../src/remote.c:671
 msgid "show tools"
 msgstr "Werkzeuge anzeigen"
 
-#: ../src/remote.c:653
+#: ../src/remote.c:672
 msgid "hide tools"
 msgstr "Werkzeuge verbergen"
 
-#: ../src/remote.c:654
+#: ../src/remote.c:673
 msgid "quit"
 msgstr "beenden"
 
-#: ../src/remote.c:655 ../src/remote.c:656 ../src/remote.c:657
-#: ../src/remote.c:658 ../src/remote.c:659 ../src/remote.c:661
+#: ../src/remote.c:674 ../src/remote.c:675 ../src/remote.c:676
+#: ../src/remote.c:677 ../src/remote.c:679 ../src/remote.c:681
 msgid "<FILE>"
 msgstr "<DATEI>"
 
-#: ../src/remote.c:655
+#: ../src/remote.c:674
 msgid "load configuration from FILE"
 msgstr "Lade Konfiguration aus FILE"
 
-#: ../src/remote.c:656
+#: ../src/remote.c:675
 msgid "get list of sidecars of FILE"
 msgstr "Liste der \"Sidecars\" der DATEI zurückgeben"
 
-#: ../src/remote.c:657
+#: ../src/remote.c:676
 msgid "get destination path of FILE"
 msgstr "Zielpfad der DATEI zurückgeben"
 
-#: ../src/remote.c:658
+#: ../src/remote.c:677
 msgid "open FILE"
 msgstr "öffne DATEI"
 
-#: ../src/remote.c:659
+#: ../src/remote.c:678
+msgid "print filename of current image"
+msgstr ""
+
+#: ../src/remote.c:679
 msgid "open FILE in new window"
 msgstr "DATEI in neuem Fenster öffnen"
 
-#: ../src/remote.c:660
+#: ../src/remote.c:680
 msgid "clear command line collection list"
 msgstr "Kommandozeilensammlungen löschen"
 
-#: ../src/remote.c:661
+#: ../src/remote.c:681
 msgid "add FILE to command line collection list"
 msgstr "Füge Datei zu Kommandozeilensammlung hinzu"
 
-#: ../src/remote.c:662
+#: ../src/remote.c:682
 msgid "bring the Geeqie window to the top"
 msgstr "Geeqie-Fenster nach oben bringen"
 
-#: ../src/remote.c:727
+#: ../src/remote.c:747
 msgid "Remote command list:\n"
 msgstr "Fernsteuerbefehle:\n"
 
-#: ../src/remote.c:746
+#: ../src/remote.c:766
 msgid ""
 "\n"
 "  All other command line parameters are used as plain files if they exists.\n"
@@ -4923,209 +5012,213 @@
 "  Alle weiteren Kommandozeilenparameter werden als Dateien angesehen wenn "
 "sie existieren.\n"
 
-#: ../src/remote.c:796
+#: ../src/remote.c:816
 #, c-format
 msgid "Remote %s not running, starting..."
 msgstr "Entfernter %s läuft nicht. Starte ihn ..."
 
-#: ../src/remote.c:932
+#: ../src/remote.c:952
 msgid "Remote not available\n"
 msgstr "Fernbedienung nicht möglich\n"
 
-#: ../src/search.c:212
+#: ../src/search.c:221
 msgid "folder"
 msgstr "im Verzeichnis"
 
-#: ../src/search.c:213
+#: ../src/search.c:222
 msgid "comments"
 msgstr "Kommentare"
 
-#: ../src/search.c:214
+#: ../src/search.c:223
 msgid "results"
 msgstr "in den letzten Suchergebnissen"
 
-#: ../src/search.c:218 ../src/search.c:243
+#: ../src/search.c:227 ../src/search.c:252
 msgid "contains"
 msgstr "beinhaltet"
 
-#: ../src/search.c:219
+#: ../src/search.c:228
 msgid "is"
 msgstr "ist"
 
-#: ../src/search.c:223 ../src/search.c:230
+#: ../src/search.c:232 ../src/search.c:239
 msgid "equal to"
 msgstr "gleich"
 
-#: ../src/search.c:224
+#: ../src/search.c:233
 msgid "less than"
 msgstr "kleiner als"
 
-#: ../src/search.c:225
+#: ../src/search.c:234
 msgid "greater than"
 msgstr "größer als"
 
-#: ../src/search.c:226 ../src/search.c:233
+#: ../src/search.c:235 ../src/search.c:242
 msgid "between"
 msgstr "zwischen"
 
-#: ../src/search.c:231
+#: ../src/search.c:240
 msgid "before"
 msgstr "vor"
 
-#: ../src/search.c:232
+#: ../src/search.c:241
 msgid "after"
 msgstr "nach"
 
-#: ../src/search.c:237
+#: ../src/search.c:246
 msgid "match all"
 msgstr "wovon alle vorkommen müssen"
 
-#: ../src/search.c:238
+#: ../src/search.c:247
 msgid "match any"
 msgstr "wovon mind. 1 davon vorkommt"
 
-#: ../src/search.c:239
+#: ../src/search.c:248
 msgid "exclude"
 msgstr "welche nicht vorkommen dürfen"
 
-#: ../src/search.c:244
+#: ../src/search.c:253
 msgid "miss"
 msgstr "enthält nicht"
 
-#: ../src/search.c:295
+#: ../src/search.c:304
 #, c-format
 msgid "%s, %d files (%s, %d)"
 msgstr "%s, %d Dateien (%s, %d)"
 
-#: ../src/search.c:300
+#: ../src/search.c:309
 #, c-format
 msgid "%s, %d files"
 msgstr "%s, %d Dateien"
 
-#: ../src/search.c:318
+#: ../src/search.c:327
 msgid "Searching..."
 msgstr "Suche..."
 
-#: ../src/search.c:2120
+#: ../src/search.c:2147
 msgid "File not found"
 msgstr "Datei nicht vorhanden"
 
-#: ../src/search.c:2121
+#: ../src/search.c:2148
 msgid "Please enter an existing file for image content."
 msgstr "Bitte wählen Sie eine vorhandene Datei für die Ähnlichkeitssuche"
 
-#: ../src/search.c:2170
+#: ../src/search.c:2197
 msgid "Please enter an existing folder to search."
 msgstr "Bitte wählen Sie ein vorhandenes Verzeichnis für die Suche."
 
-#: ../src/search.c:2588
+#: ../src/search.c:2615
 msgid "Image search"
 msgstr "Bilder suchen"
 
-#: ../src/search.c:2618
+#: ../src/search.c:2645
 msgid "Search:"
 msgstr "Suche:"
 
-#: ../src/search.c:2632
+#: ../src/search.c:2659
 msgid "Recurse"
 msgstr "rekursiv"
 
-#: ../src/search.c:2637
+#: ../src/search.c:2664
 msgid "File name"
 msgstr "Dateiname"
 
-#: ../src/search.c:2643 ../src/search.c:2738
+#: ../src/search.c:2670 ../src/search.c:2767
 msgid "Match case"
 msgstr "Groß-/Kleinschreibung beachten"
 
-#: ../src/search.c:2648
+#: ../src/search.c:2675
 msgid "File size is"
 msgstr "Dateigröße ist"
 
-#: ../src/search.c:2655 ../src/search.c:2671 ../src/search.c:2690
+#: ../src/search.c:2682 ../src/search.c:2698 ../src/search.c:2719
 msgid "and"
 msgstr "und"
 
-#: ../src/search.c:2661
+#: ../src/search.c:2688
 msgid "File date is"
 msgstr "Dateidatum ist"
 
-#: ../src/search.c:2679
+#: ../src/search.c:2703
+msgid "Exif date"
+msgstr "Exif-Datum"
+
+#: ../src/search.c:2708
 msgid "Image dimensions are"
 msgstr "Bildgröße ist"
 
-#: ../src/search.c:2700
+#: ../src/search.c:2729
 msgid "Image content is"
 msgstr "Bildinhalt ist"
 
-#: ../src/search.c:2706
+#: ../src/search.c:2735
 #, no-c-format
 msgid "% similar to"
 msgstr "% ähnlich zu"
 
-#: ../src/search.c:2788
+#: ../src/search.c:2817
 msgid "Rank"
 msgstr "Nr."
 
-#: ../src/secure_save.c:397
+#: ../src/secure_save.c:406
 msgid "Cannot read the file"
 msgstr "Datei kann nicht gelesen werden"
 
-#: ../src/secure_save.c:399
+#: ../src/secure_save.c:408
 msgid "Cannot get file status"
 msgstr "Dateistatus kann nicht gelesen werden"
 
-#: ../src/secure_save.c:401
+#: ../src/secure_save.c:410
 msgid "Cannot access the file"
 msgstr "Auf Datei kann nicht zugegriffen werden"
 
-#: ../src/secure_save.c:403
+#: ../src/secure_save.c:412
 msgid "Cannot create temp file"
 msgstr "Temporäre Datei kann nicht erzeugt werden"
 
-#: ../src/secure_save.c:405
+#: ../src/secure_save.c:414
 msgid "Cannot rename the file"
 msgstr "Datei kann nicht umbenannt werden"
 
-#: ../src/secure_save.c:407
+#: ../src/secure_save.c:416
 msgid "File saving disabled by option"
 msgstr "Speichern der Datei durch Option abgeschaltet"
 
-#: ../src/secure_save.c:409
+#: ../src/secure_save.c:418
 msgid "Out of memory"
 msgstr "Kein Hauptspeicher mehr verfügbar"
 
-#: ../src/secure_save.c:411
+#: ../src/secure_save.c:420
 msgid "Cannot write the file"
 msgstr "Die Datei kann nicht geschrieben werden"
 
-#: ../src/secure_save.c:415
+#: ../src/secure_save.c:424
 msgid "Secure file saving error"
 msgstr "Sichers Speichern der Datei fehlgeschlagen"
 
-#: ../src/thumb.c:392
+#: ../src/thumb.c:400
 msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
 msgstr ""
 "Laden des Vorschaubildes ist fehlgeschlagen, versuche es neu zu erstellen.\n"
 
-#: ../src/trash.c:80 ../src/utilops.c:2461 ../src/utilops.c:2472
-#: ../src/utilops.c:2529
+#: ../src/trash.c:88 ../src/utilops.c:2601 ../src/utilops.c:2612
+#: ../src/utilops.c:2669
 msgid "Delete failed"
 msgstr "Fehler beim Löschen"
 
-#: ../src/trash.c:81
+#: ../src/trash.c:89
 msgid "Unable to remove old file from trash folder"
 msgstr "Fehler beim Löschen einer alter Dateien aus dem Papierkorb."
 
-#: ../src/trash.c:138
+#: ../src/trash.c:146
 msgid "Could not create folder"
 msgstr "Fehler beim Erstellen des Verzeichnisses"
 
-#: ../src/trash.c:160
+#: ../src/trash.c:168
 msgid "Permission denied"
 msgstr "Zugriff verweigert"
 
-#: ../src/trash.c:170
+#: ../src/trash.c:178
 #, c-format
 msgid ""
 "Unable to access or create the trash folder.\n"
@@ -5134,20 +5227,20 @@
 "Fehler beim Erstellen oder Zugreifen auf  das Papierkorb-Verzeichnis:\n"
 "%s"
 
-#: ../src/trash.c:174
+#: ../src/trash.c:182
 msgid "Turn off safe delete"
 msgstr "Verwendung des Papierkorbes abschalten"
 
-#: ../src/trash.c:193
+#: ../src/trash.c:201
 msgid "Deletion by external command"
 msgstr "Löschen mit externem Kommando"
 
-#: ../src/trash.c:201
+#: ../src/trash.c:209
 #, c-format
 msgid " (max. %d MB)"
 msgstr " (max. %d MB)"
 
-#: ../src/trash.c:205
+#: ../src/trash.c:213
 #, c-format
 msgid ""
 "Safe delete: %s%s\n"
@@ -5156,40 +5249,40 @@
 "Sichers Löschen: %s%s\n"
 "Müll: %s"
 
-#: ../src/trash.c:210
+#: ../src/trash.c:218
 #, c-format
 msgid "Safe delete: %s"
 msgstr "Papierkorb verwenden: %s"
 
-#: ../src/ui_bookmark.c:130 ../src/ui_bookmark.c:193
+#: ../src/ui_bookmark.c:139 ../src/ui_bookmark.c:202
 msgid "New Bookmark"
 msgstr "Neues Lesezeichen"
 
-#: ../src/ui_bookmark.c:276 ../src/ui_bookmark.c:282
+#: ../src/ui_bookmark.c:285 ../src/ui_bookmark.c:291
 msgid "Edit Bookmark"
 msgstr "Lesezeichen bearbeiten"
 
-#: ../src/ui_bookmark.c:297
+#: ../src/ui_bookmark.c:306
 msgid "Path:"
 msgstr "Pfad:"
 
-#: ../src/ui_bookmark.c:306
+#: ../src/ui_bookmark.c:315
 msgid "Icon:"
 msgstr "Icon:"
 
-#: ../src/ui_bookmark.c:312
+#: ../src/ui_bookmark.c:321
 msgid "Select icon"
 msgstr "Icon-Auswahl"
 
-#: ../src/ui_bookmark.c:405
+#: ../src/ui_bookmark.c:414
 msgid "_Properties..."
 msgstr "_Eigenschaften..."
 
-#: ../src/ui_bookmark.c:411
+#: ../src/ui_bookmark.c:420
 msgid "_Remove"
 msgstr "Ent_fernen"
 
-#: ../src/ui_fileops.c:67
+#: ../src/ui_fileops.c:76
 msgid ""
 "One or more filenames are not encoded with the preferred locale character "
 "set.\n"
@@ -5197,12 +5290,12 @@
 "Ein oder mehrere Dateinamen sind nicht mit der bevorzugten Zeichenkodierung "
 "kodiert.\n"
 
-#: ../src/ui_fileops.c:68
+#: ../src/ui_fileops.c:77
 #, c-format
 msgid "Operations on, and display of these files with %s may not succeed.\n"
 msgstr "Bearbeiten und Anzeigen der Dateien mit %s könnte fehlschlagen.\n"
 
-#: ../src/ui_fileops.c:70
+#: ../src/ui_fileops.c:79
 msgid ""
 "If your filenames are not encoded in utf-8, try setting the environment "
 "variable G_BROKEN_FILENAMES=1\n"
@@ -5210,16 +5303,16 @@
 "Wenn Deine Dateinamen nicht UTF-8-kodiert sind, versuche die "
 "Umgebungsvariable G_BROKEN_FILENAMES auf 1 zu setzen\n"
 
-#: ../src/ui_fileops.c:72
+#: ../src/ui_fileops.c:81
 #, c-format
 msgid "It appears G_BROKEN_FILENAMES is set to %s\n"
 msgstr "G_BROKEN_FILENAMES scheint auf %s gesetzt zu sein\n"
 
-#: ../src/ui_fileops.c:74
+#: ../src/ui_fileops.c:83
 msgid "It appears G_BROKEN_FILENAMES is not set\n"
 msgstr "G_BROKEN_FILENAMES scheint nicht gesetzt zu sein\n"
 
-#: ../src/ui_fileops.c:76
+#: ../src/ui_fileops.c:85
 #, c-format
 msgid ""
 "The locale appears to be set to \"%s\"\n"
@@ -5228,7 +5321,7 @@
 "Die Lokalisierung scheint auf \"%s\" gesetzt zu sein\n"
 "(Durch LANG-Umgebungsvariable gesetzt)\n"
 
-#: ../src/ui_fileops.c:81
+#: ../src/ui_fileops.c:90
 msgid ""
 "\n"
 "Preferred encoding appears to be UTF-8, however the file:\n"
@@ -5236,25 +5329,25 @@
 "\n"
 "Vorgezogene Kodierung scheint UTF-8 zu sein aber die Datei\n"
 
-#: ../src/ui_fileops.c:82 ../src/ui_fileops.c:85 ../src/ui_fileops.c:87
+#: ../src/ui_fileops.c:91 ../src/ui_fileops.c:94 ../src/ui_fileops.c:96
 msgid "[name not displayable]"
 msgstr "[Name nicht anzeigbar]"
 
-#: ../src/ui_fileops.c:85
+#: ../src/ui_fileops.c:94
 #, c-format
 msgid "\"%s\" is encoded in valid UTF-8."
 msgstr "\"%s\" ist UTF-8-kodiert."
 
-#: ../src/ui_fileops.c:87
+#: ../src/ui_fileops.c:96
 #, c-format
 msgid "\"%s\" is not encoded in valid UTF-8."
 msgstr "\"%s\" ist nicht UTF-8-kodiert."
 
-#: ../src/ui_fileops.c:92 ../src/ui_fileops.c:97
+#: ../src/ui_fileops.c:101 ../src/ui_fileops.c:106
 msgid "Filename encoding locale mismatch"
 msgstr "Dateinamenkodierung stimmt nicht mit den Locale-Einstellungen überein"
 
-#: ../src/ui_help.c:110
+#: ../src/ui_help.c:119
 #, c-format
 msgid ""
 "Unable to load:\n"
@@ -5263,33 +5356,33 @@
 "Fehler beim Laden der Datei:\n"
 "%s"
 
-#: ../src/ui_pathsel.c:424 ../src/ui_pathsel.c:430 ../src/utilops.c:2160
-#: ../src/utilops.c:2187 ../src/utilops.c:2653
+#: ../src/ui_pathsel.c:433 ../src/ui_pathsel.c:439 ../src/utilops.c:2300
+#: ../src/utilops.c:2327 ../src/utilops.c:2793
 msgid "Rename failed"
 msgstr "Umbenennen fehlgeschlagen"
 
-#: ../src/ui_pathsel.c:429
+#: ../src/ui_pathsel.c:438
 #, c-format
 msgid "Failed to rename %s to %s."
 msgstr "Fehler beim Umbenennen der Datei %s nach %s"
 
-#: ../src/ui_pathsel.c:625 ../src/ui_pathsel.c:633
+#: ../src/ui_pathsel.c:634 ../src/ui_pathsel.c:642
 msgid "_Rename"
 msgstr "_Umbenennen"
 
-#: ../src/ui_pathsel.c:627 ../src/ui_pathsel.c:637
+#: ../src/ui_pathsel.c:636 ../src/ui_pathsel.c:646
 msgid "Add _Bookmark"
 msgstr "Lesezeichen hin_zufügen"
 
-#: ../src/ui_pathsel.c:635
+#: ../src/ui_pathsel.c:644
 msgid "_Delete"
 msgstr "_Löschen"
 
-#: ../src/ui_pathsel.c:742 ../src/ui_pathsel.c:1047 ../src/utilops.c:2687
+#: ../src/ui_pathsel.c:751 ../src/ui_pathsel.c:1056 ../src/utilops.c:2827
 msgid "New folder"
 msgstr "Neues Verzeichnis"
 
-#: ../src/ui_pathsel.c:752
+#: ../src/ui_pathsel.c:761
 #, c-format
 msgid ""
 "Unable to create folder:\n"
@@ -5298,35 +5391,35 @@
 "Fehler beim Anlegen des Verzeichnisses:\n"
 "%s"
 
-#: ../src/ui_pathsel.c:753
+#: ../src/ui_pathsel.c:762
 msgid "Error creating folder"
 msgstr "Fehler beim Anlegen des Verzeichnisses"
 
-#: ../src/ui_pathsel.c:978
+#: ../src/ui_pathsel.c:987
 msgid "All Files"
 msgstr "Alle Dateien"
 
-#: ../src/ui_pathsel.c:1050
+#: ../src/ui_pathsel.c:1059
 msgid "Show hidden"
 msgstr "versteckte Objekte anzeigen"
 
-#: ../src/ui_pathsel.c:1134
+#: ../src/ui_pathsel.c:1143
 msgid "Filter:"
 msgstr "Filter:"
 
-#: ../src/ui_tabcomp.c:924
+#: ../src/ui_tabcomp.c:933
 msgid "Select path"
 msgstr "Verzeichnis-/Dateiauswahl"
 
-#: ../src/ui_tabcomp.c:940
+#: ../src/ui_tabcomp.c:949
 msgid "All files"
 msgstr "Alle Dateien"
 
-#: ../src/uri_utils.c:35
+#: ../src/uri_utils.c:43
 msgid "Drag and Drop failed"
 msgstr "Drag&Drop fehlgeschlagen"
 
-#: ../src/utilops.c:547
+#: ../src/utilops.c:590
 msgid ""
 "\n"
 " Continue multiple file operation?"
@@ -5334,11 +5427,11 @@
 "\n"
 " Mit mehreren Dateioperationen fortfahren?"
 
-#: ../src/utilops.c:554 ../src/utilops.c:987
+#: ../src/utilops.c:597 ../src/utilops.c:1030
 msgid "Co_ntinue"
 msgstr "_Fortsetzen"
 
-#: ../src/utilops.c:731
+#: ../src/utilops.c:774
 #, c-format
 msgid ""
 "Removal of folder contents failed at this file:\n"
@@ -5349,7 +5442,7 @@
 "\n"
 "%s"
 
-#: ../src/utilops.c:875
+#: ../src/utilops.c:918
 #, c-format
 msgid ""
 "%s\n"
@@ -5358,103 +5451,107 @@
 "%s\n"
 "Externes Kommando kann nicht gestartet werden.\n"
 
-#: ../src/utilops.c:955
+#. During copy/move operations it is necessary to ensure that the
+#. * target directory exists before continuing with the next step.
+#. * If not revert to the select directory dialog
+#.
+#: ../src/utilops.c:998 ../src/utilops.c:1150
 #, c-format
 msgid "%s is not a directory"
 msgstr "%s ist kein Verzeichnis"
 
-#: ../src/utilops.c:985
+#: ../src/utilops.c:1028
 msgid "Really continue?"
 msgstr "Wirklich fortfahren?"
 
-#: ../src/utilops.c:999
+#: ../src/utilops.c:1042 ../src/utilops.c:1155
 msgid "This operation can't continue:"
 msgstr "Die Operation kann nicht weitergeführt werden:"
 
-#: ../src/utilops.c:1377 ../src/utilops.c:1490 ../src/utilops.c:1874
+#: ../src/utilops.c:1492 ../src/utilops.c:1605 ../src/utilops.c:2012
 msgid "Discard changes"
 msgstr "Änderungen verwerfen"
 
-#: ../src/utilops.c:1378 ../src/utilops.c:1491 ../src/utilops.c:1824
-#: ../src/utilops.c:1840
+#: ../src/utilops.c:1493 ../src/utilops.c:1606 ../src/utilops.c:1962
+#: ../src/utilops.c:1978
 msgid "File details"
 msgstr "Details der Datei"
 
-#: ../src/utilops.c:1400 ../src/utilops.c:1498
+#: ../src/utilops.c:1515 ../src/utilops.c:1613
 msgid "Sidecars"
 msgstr "\"Sidecars\""
 
-#: ../src/utilops.c:1402
+#: ../src/utilops.c:1517
 msgid "Write to file"
 msgstr "In Datei schreiben"
 
-#: ../src/utilops.c:1442
+#: ../src/utilops.c:1557
 msgid "Choose the destination folder."
 msgstr "Bitte das Zielverzeichnis auswählen:"
 
-#: ../src/utilops.c:1500
+#: ../src/utilops.c:1615
 msgid "New name"
 msgstr "Neuer Name"
 
-#: ../src/utilops.c:1530
+#: ../src/utilops.c:1652
 msgid "Manual rename"
 msgstr "Von Hand umbenennen"
 
-#: ../src/utilops.c:1535
+#: ../src/utilops.c:1657
 msgid "Original name:"
 msgstr "Originalname:"
 
-#: ../src/utilops.c:1538
+#: ../src/utilops.c:1660
 msgid "New name:"
 msgstr "Neuer Name:"
 
-#: ../src/utilops.c:1551
+#: ../src/utilops.c:1673
 msgid "Auto rename"
 msgstr "automatisches Umbenennen"
 
-#: ../src/utilops.c:1557
+#: ../src/utilops.c:1679
 msgid "Begin text"
 msgstr "Textanfang"
 
-#: ../src/utilops.c:1565 ../src/utilops.c:1597
+#: ../src/utilops.c:1687 ../src/utilops.c:1719
 msgid "Start #"
 msgstr "Anfangsnr. "
 
-#: ../src/utilops.c:1571
+#: ../src/utilops.c:1693
 msgid "End text"
 msgstr "Textende"
 
-#: ../src/utilops.c:1579
+#: ../src/utilops.c:1701
 msgid "Padding:"
 msgstr "Auffüllen:"
 
-#: ../src/utilops.c:1584
+#: ../src/utilops.c:1706
 msgid "Formatted rename"
 msgstr "Formatiertes Umbenennen"
 
-#: ../src/utilops.c:1589
+#: ../src/utilops.c:1711
 msgid "Format (* = original name, ## = numbers)"
 msgstr "Format (* = originaler Name, ## = Nummern)"
 
-#: ../src/utilops.c:1727
+#: ../src/utilops.c:1865
 msgid "Another operation in progress.\n"
 msgstr "Eine andere Operation wird zur Zeit ausgeführt.\n"
 
-#: ../src/utilops.c:1783
+#: ../src/utilops.c:1921
 #, c-format
 msgid "File: '%s'\n"
 msgstr "Datei: '%s'\n"
 
-#: ../src/utilops.c:1788
+#: ../src/utilops.c:1926
 msgid "with sidecar files:\n"
 msgstr "mit \"Sidecar\"-Dateien:\n"
 
-#: ../src/utilops.c:1794
+#: ../src/utilops.c:1932
 #, c-format
 msgid " '%s'\n"
 msgstr "'%s'\n"
 
-#: ../src/utilops.c:1798
+#: ../src/utilops.c:1936
 msgid ""
 "\n"
 "Status: "
@@ -5462,119 +5559,119 @@
 "\n"
 "Status:"
 
-#: ../src/utilops.c:1810
+#: ../src/utilops.c:1948
 msgid "no problem detected"
 msgstr "kein Problem aufgetreten"
 
-#: ../src/utilops.c:1826 ../src/utilops.c:1873
+#: ../src/utilops.c:1964 ../src/utilops.c:2011
 msgid "Exclude file"
 msgstr "Datei ausschließen"
 
-#: ../src/utilops.c:1871 ../src/utilops.c:1896
+#: ../src/utilops.c:2009 ../src/utilops.c:2034
 msgid "Overview of changed metadata"
 msgstr "Übersicht der geänderten Metadaten"
 
-#: ../src/utilops.c:1889
+#: ../src/utilops.c:2027
 #, c-format
 msgid ""
 "The following metadata tags will be written to\n"
 "'%s'."
 msgstr "Die folgenden Metadaten werden nach '%s' gespeichert."
 
-#: ../src/utilops.c:1893
+#: ../src/utilops.c:2031
 #, c-format
 msgid "The following metadata tags will be written to the image file itself."
 msgstr "Die folgenden Metadaten werden ins Bild selbst gespeichert."
 
-#: ../src/utilops.c:1999
+#: ../src/utilops.c:2137
 msgid "Delete files?"
 msgstr "Dateien löschen?"
 
-#: ../src/utilops.c:2000
-msgid "This will delete the following files"
-msgstr "Das wird die folgenden Dateien löschen"
-
-#: ../src/utilops.c:2019
-msgid "Can't write metadata"
-msgstr "Metadaten konnten nicht gespeichert werden"
-
-#: ../src/utilops.c:2042
-msgid "Write metadata"
-msgstr "Metadaten schreiben"
-
-#: ../src/utilops.c:2043
-msgid "Write metadata?"
-msgstr "Metadaten schreiben?"
-
-#: ../src/utilops.c:2044
-msgid "This will write the changed metadata into the following files"
-msgstr "Das wird die geänderten Metadaten in folgende Dateien schreiben"
-
-#: ../src/utilops.c:2046
-msgid "Metadata writing failed"
-msgstr "Speichern der Metadaten fehlgeschlagen"
-
-#: ../src/utilops.c:2065 ../src/utilops.c:2092
-msgid "Move failed"
-msgstr "Verschieben fehlgeschlagen"
-
-#: ../src/utilops.c:2089
-msgid "Move files?"
-msgstr "Dateien verschieben?"
-
-#: ../src/utilops.c:2090
-msgid "This will move the following files"
-msgstr "Das wird folgende Dateien verschieben"
-
-#: ../src/utilops.c:2114 ../src/utilops.c:2141
-msgid "Copy failed"
-msgstr "Kopieren fehlgeschlagen"
-
 #: ../src/utilops.c:2138
+msgid "This will delete the following files"
+msgstr "Das wird die folgenden Dateien löschen"
+
+#: ../src/utilops.c:2157
+msgid "Can't write metadata"
+msgstr "Metadaten konnten nicht gespeichert werden"
+
+#: ../src/utilops.c:2180
+msgid "Write metadata"
+msgstr "Metadaten schreiben"
+
+#: ../src/utilops.c:2181
+msgid "Write metadata?"
+msgstr "Metadaten schreiben?"
+
+#: ../src/utilops.c:2182
+msgid "This will write the changed metadata into the following files"
+msgstr "Das wird die geänderten Metadaten in folgende Dateien schreiben"
+
+#: ../src/utilops.c:2184
+msgid "Metadata writing failed"
+msgstr "Speichern der Metadaten fehlgeschlagen"
+
+#: ../src/utilops.c:2203 ../src/utilops.c:2231
+msgid "Move failed"
+msgstr "Verschieben fehlgeschlagen"
+
+#: ../src/utilops.c:2228
+msgid "Move files?"
+msgstr "Dateien verschieben?"
+
+#: ../src/utilops.c:2229
+msgid "This will move the following files"
+msgstr "Das wird folgende Dateien verschieben"
+
+#: ../src/utilops.c:2253 ../src/utilops.c:2281
+msgid "Copy failed"
+msgstr "Kopieren fehlgeschlagen"
+
+#: ../src/utilops.c:2278
 msgid "Copy files?"
 msgstr "Dateien kopieren?"
 
-#: ../src/utilops.c:2139 ../src/utilops.c:2273
+#: ../src/utilops.c:2279 ../src/utilops.c:2413
 msgid "This will copy the following files"
 msgstr "Das kopiert die folgenden Dateien"
 
-#: ../src/utilops.c:2183 ../src/utilops.c:2649
+#: ../src/utilops.c:2323 ../src/utilops.c:2789
 msgid "Rename"
 msgstr "Umbenennen"
 
-#: ../src/utilops.c:2184
+#: ../src/utilops.c:2324
 msgid "Rename files?"
 msgstr "Dateien umbenennen?"
 
-#: ../src/utilops.c:2185
+#: ../src/utilops.c:2325
 msgid "This will rename the following files"
 msgstr "Das wird folgende Dateien umbenennen"
 
-#: ../src/utilops.c:2237
+#: ../src/utilops.c:2377
 msgid "Can't run external editor"
 msgstr "Externer Editor kann nicht gestartet werden"
 
-#: ../src/utilops.c:2271
+#: ../src/utilops.c:2411
 msgid "Editor"
 msgstr "Editor"
 
-#: ../src/utilops.c:2272
+#: ../src/utilops.c:2412
 msgid "Run editor?"
 msgstr "Editor starten?"
 
-#: ../src/utilops.c:2275
+#: ../src/utilops.c:2415
 msgid "External command failed"
 msgstr "Ausführung des externen Programms fehlgeschlagen"
 
-#: ../src/utilops.c:2444 ../src/utilops.c:2517
+#: ../src/utilops.c:2584 ../src/utilops.c:2657
 msgid "Delete folder"
 msgstr "Verzeichnis löschen"
 
-#: ../src/utilops.c:2445
+#: ../src/utilops.c:2585
 msgid "Delete symbolic link?"
 msgstr "Symbolische Verknüpfung löschen?"
 
-#: ../src/utilops.c:2447
+#: ../src/utilops.c:2587
 msgid ""
 "This will delete the symbolic link.\n"
 "The folder this link points to will not be deleted."
@@ -5582,11 +5679,11 @@
 "Das löscht den symbolischen Link.\n"
 "Das Verzeichnis, auf das der Link zeigt, wird nicht gelöscht werden."
 
-#: ../src/utilops.c:2449
+#: ../src/utilops.c:2589
 msgid "Link deletion failed"
 msgstr "Löschen der Verknüpfung fehlgeschlagen"
 
-#: ../src/utilops.c:2459
+#: ../src/utilops.c:2599
 #, c-format
 msgid ""
 "Unable to remove folder %s\n"
@@ -5595,16 +5692,16 @@
 "Verzeichnis %s kann nicht gelöscht werden da\n"
 "die Berechtigungen nicht erlauben, in das Verzeichnis zu schreiben."
 
-#: ../src/utilops.c:2471 ../src/utilops.c:2528
+#: ../src/utilops.c:2611 ../src/utilops.c:2668
 #, c-format
 msgid "Unable to list contents of folder %s"
 msgstr "Der Inhalt des Verzeichnis %s kann nicht angezeigt werden"
 
-#: ../src/utilops.c:2485 ../src/utilops.c:2493
+#: ../src/utilops.c:2625 ../src/utilops.c:2633
 msgid "Folder contains subfolders"
 msgstr "Das Verzeichnis enthält Unterverzeichnisse"
 
-#: ../src/utilops.c:2489
+#: ../src/utilops.c:2629
 #, c-format
 msgid ""
 "Unable to delete the folder:\n"
@@ -5620,19 +5717,19 @@
 "Das Verzeichnis enthält Unterverzeichnisse, die zuerst verschoben werden "
 "müssen bevor es gelöscht werden kann."
 
-#: ../src/utilops.c:2497
+#: ../src/utilops.c:2637
 msgid "Subfolders:"
 msgstr "Unterverzeichnisse:"
 
-#: ../src/utilops.c:2518
+#: ../src/utilops.c:2658
 msgid "Delete folder?"
 msgstr "Verzeichnis löschen?"
 
-#: ../src/utilops.c:2519
+#: ../src/utilops.c:2659
 msgid "The folder contains these files:"
 msgstr "Das Verzeichnis enthält diese Dateien:"
 
-#: ../src/utilops.c:2520
+#: ../src/utilops.c:2660
 msgid ""
 "This will delete the folder.\n"
 "The contents of this folder will also be deleted."
@@ -5640,87 +5737,87 @@
 "Das löscht das Verzeichnis.\n"
 "Der Inhalt des Verzeichnis wird auch gelöscht."
 
-#: ../src/utilops.c:2650
+#: ../src/utilops.c:2790
 msgid "Rename folder?"
 msgstr "Verzeichnis umbenennen?"
 
-#: ../src/utilops.c:2651
+#: ../src/utilops.c:2791
 msgid "The folder contains the following files"
 msgstr "Das Verzeichnis enthält die folgenden Dateien"
 
-#: ../src/utilops.c:2697
+#: ../src/utilops.c:2837
 msgid "Create Folder"
 msgstr "Verzeichnis erstellen"
 
-#: ../src/utilops.c:2698
+#: ../src/utilops.c:2838
 msgid "Create folder?"
 msgstr "Verzeichnis löschen?"
 
-#: ../src/utilops.c:2701
+#: ../src/utilops.c:2841
 msgid "Can't create folder"
 msgstr "Verzeichnis konnte nicht erstellt werden"
 
-#: ../src/view_dir.c:397
+#: ../src/view_dir.c:406
 msgid "_Copy"
 msgstr "_Kopieren"
 
-#: ../src/view_dir.c:399
+#: ../src/view_dir.c:408
 msgid "_Move"
 msgstr "_Verschieben"
 
-#: ../src/view_dir.c:644
+#: ../src/view_dir.c:653
 msgid "_Up to parent"
 msgstr "Ein Verzeichnis _höher"
 
-#: ../src/view_dir.c:649
+#: ../src/view_dir.c:658
 msgid "_Slideshow"
 msgstr "_Diashow"
 
-#: ../src/view_dir.c:651
+#: ../src/view_dir.c:660
 msgid "Slideshow recursive"
 msgstr "Dia_show (rekursiv)"
 
-#: ../src/view_dir.c:655
+#: ../src/view_dir.c:664
 msgid "Find _duplicates..."
 msgstr "Du_plikate suchen..."
 
-#: ../src/view_dir.c:657
+#: ../src/view_dir.c:666
 msgid "Find duplicates recursive..."
 msgstr "Du_plikate rekursiv suchen..."
 
-#: ../src/view_dir.c:662
+#: ../src/view_dir.c:671
 msgid "_New folder..."
 msgstr "Neues _Verzeichnis..."
 
-#: ../src/view_dir.c:676 ../src/view_file.c:619
+#: ../src/view_dir.c:685 ../src/view_file.c:655
 msgid "View as _List"
 msgstr "Als _Liste anzeigen"
 
-#: ../src/view_dir.c:679
+#: ../src/view_dir.c:688
 msgid "View as _Tree"
 msgstr "Als _Baum anzeigen"
 
-#: ../src/view_dir.c:684
+#: ../src/view_dir.c:693
 msgid "Show _hidden files"
 msgstr "Versteckte Dateien anzeigen"
 
-#: ../src/view_dir.c:687 ../src/view_file.c:637
+#: ../src/view_dir.c:696 ../src/view_file.c:673
 msgid "Re_fresh"
 msgstr "A_ktualisieren"
 
-#: ../src/view_file.c:622
+#: ../src/view_file.c:658
 msgid "View as _Icons"
 msgstr "_Iconansicht"
 
-#: ../src/view_file.c:628
+#: ../src/view_file.c:664
 msgid "Show _thumbnails"
 msgstr "_Vorschaubilder anzeigen"
 
-#: ../src/view_file_icon.c:2098 ../src/view_file_list.c:825
+#: ../src/view_file_icon.c:2123 ../src/view_file_list.c:834
 msgid " [NO GROUPING]"
 msgstr "[KEINE GRUPPIERUNG]"
 
-#: ../src/view_file_list.c:451
+#: ../src/view_file_list.c:460
 #, c-format
 msgid ""
 "Invalid file name:\n"
@@ -5729,10 +5826,22 @@
 "Ungültiger Dateiname:\n"
 "%s"
 
-#: ../src/view_file_list.c:452
+#: ../src/view_file_list.c:461
 msgid "Error renaming file"
 msgstr "Fehler beim Umbenennen der Datei"
 
-#: ../src/window.c:252
+#: ../src/window.c:261
 msgid "Help"
 msgstr "Hilfe"
+
+#~ msgid "Add keywords"
+#~ msgstr "Schlüsselworte hinzufügen"
+
+#~ msgid "Auto rotate image using Exif information"
+#~ msgstr "Automatisch gemäß Exif-Daten drehen"
+
+#~ msgid "Similarities"
+#~ msgstr "Ähnlichkeiten"
+
+#~ msgid "Rotation invariant duplicate check"
+#~ msgstr "Dreh-invarianter Duplikat-Check"
--- a/po/pl.po	Wed Jan 11 22:00:49 2017 +0000
+++ b/po/pl.po	Sat Jul 08 10:32:34 2017 +0100
@@ -2,8 +2,8 @@
 msgstr ""
 "Project-Id-Version: geeqie-1.3\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-19 17:35+0100\n"
-"PO-Revision-Date: 2016-05-25 23:55+0200\n"
+"POT-Creation-Date: 2017-01-08 16:31+0100\n"
+"PO-Revision-Date: 2017-01-08 17:41+0100\n"
 "Last-Translator: Tomasz Golinski <tomaszg@math.uwb.edu.pl>\n"
 "Language-Team: \n"
 "Language: pl\n"
@@ -55,170 +55,170 @@
 msgid "UFRaw Batch recursive"
 msgstr "ufraw-batch rekurencyjnie"
 
-#: ../src/advanced_exif.c:328 ../src/cache_maint.c:1111
-#: ../src/preferences.c:94 ../src/preferences.c:1754
+#: ../src/advanced_exif.c:336 ../src/cache_maint.c:1128
+#: ../src/preferences.c:109 ../src/preferences.c:1875
 msgid "Metadata"
 msgstr "Metadane"
 
-#: ../src/advanced_exif.c:376 ../src/preferences.c:1668
+#: ../src/advanced_exif.c:384 ../src/preferences.c:1789
 msgid "Description"
 msgstr "Opis"
 
-#: ../src/advanced_exif.c:377
+#: ../src/advanced_exif.c:385
 msgid "Value"
 msgstr "Wartość"
 
-#: ../src/advanced_exif.c:378 ../src/desktop_file.c:515 ../src/dupe.c:2642
-#: ../src/dupe.c:3129 ../src/print.c:3199 ../src/search.c:2790
-#: ../src/utilops.c:462 ../src/view_file_list.c:1980
+#: ../src/advanced_exif.c:386 ../src/desktop_file.c:535 ../src/dupe.c:2650
+#: ../src/dupe.c:3137 ../src/print.c:3208 ../src/search.c:2798
+#: ../src/utilops.c:505 ../src/view_file_list.c:1989
 msgid "Name"
 msgstr "Nazwa"
 
-#: ../src/advanced_exif.c:379
+#: ../src/advanced_exif.c:387
 msgid "Tag"
 msgstr "Znacznik"
 
-#: ../src/advanced_exif.c:380
+#: ../src/advanced_exif.c:388
 msgid "Format"
 msgstr "Format"
 
-#: ../src/advanced_exif.c:381
+#: ../src/advanced_exif.c:389
 msgid "Elements"
 msgstr "Elementy"
 
 #. default sidebar
-#: ../src/bar.c:167
+#: ../src/bar.c:175
 msgid "Histogram"
 msgstr "Histogram"
 
-#: ../src/bar.c:168
+#: ../src/bar.c:176
 msgid "Title"
 msgstr "Tytuł"
 
-#: ../src/bar.c:169 ../src/search.c:2717
+#: ../src/bar.c:177 ../src/search.c:2725
 msgid "Keywords"
 msgstr "Słowa kluczowe"
 
-#: ../src/bar.c:170 ../src/search.c:2729
+#: ../src/bar.c:178 ../src/search.c:2737
 msgid "Comment"
 msgstr "Komentarz"
 
-#: ../src/bar.c:171
+#: ../src/bar.c:179
 msgid "Exif"
 msgstr "Exif"
 
 #. other pre-configured panes
-#: ../src/bar.c:173
+#: ../src/bar.c:181
 msgid "File info"
 msgstr "Informacje o pliku"
 
-#: ../src/bar.c:174
+#: ../src/bar.c:182
 msgid "Location and GPS"
 msgstr "Położenie i GPS"
 
-#: ../src/bar.c:175 ../src/exif.c:348
+#: ../src/bar.c:183 ../src/exif.c:342
 msgid "Copyright"
 msgstr "Prawa autorskie"
 
-#: ../src/bar.c:178 ../src/bar_gps.c:756
+#: ../src/bar.c:186 ../src/bar_gps.c:817
 msgid "GPS Map"
 msgstr "Mapa GPS"
 
-#: ../src/bar.c:297
+#: ../src/bar.c:305
 msgid "Move to _top"
 msgstr "Przesuń na _szczyt"
 
-#: ../src/bar.c:298 ../src/ui_bookmark.c:407
+#: ../src/bar.c:306 ../src/ui_bookmark.c:416
 msgid "Move _up"
 msgstr "Przesuń w _górę"
 
-#: ../src/bar.c:299 ../src/ui_bookmark.c:409
+#: ../src/bar.c:307 ../src/ui_bookmark.c:418
 msgid "Move _down"
 msgstr "Przesuń w _dół"
 
-#: ../src/bar.c:300
+#: ../src/bar.c:308
 msgid "Move to _bottom"
 msgstr "Przesuń na s_pód"
 
-#: ../src/bar.c:302
+#: ../src/bar.c:310
 msgid "Remove"
 msgstr "Usuń"
 
-#: ../src/bar_comment.c:195
+#: ../src/bar_comment.c:203
 msgid "Add text to selected files"
 msgstr "Dodaj tekst do wybranych plików"
 
-#: ../src/bar_comment.c:196
+#: ../src/bar_comment.c:204
 msgid "Replace existing text in selected files"
 msgstr "Zastąp istniejący tekst w zaznaczonych plikach"
 
-#: ../src/bar_exif.c:213
+#: ../src/bar_exif.c:221
 msgid "<empty label, fixme>"
 msgstr ""
 
-#: ../src/bar_exif.c:541 ../src/bar_exif.c:551
+#: ../src/bar_exif.c:549 ../src/bar_exif.c:559
 msgid "Configure entry"
 msgstr "Skonfiguruj pole"
 
 #. for the pane
-#: ../src/bar_exif.c:541 ../src/bar_exif.c:551 ../src/bar_exif.c:624
+#: ../src/bar_exif.c:549 ../src/bar_exif.c:559 ../src/bar_exif.c:632
 msgid "Add entry"
 msgstr "Dodaj pole"
 
-#: ../src/bar_exif.c:557
+#: ../src/bar_exif.c:565
 msgid "Key:"
 msgstr "Klucz:"
 
-#: ../src/bar_exif.c:566
+#: ../src/bar_exif.c:574
 msgid "Title:"
 msgstr "Tytuł:"
 
-#: ../src/bar_exif.c:575
+#: ../src/bar_exif.c:583
 msgid "Show only if set"
 msgstr "Pokazuj tylko jeśli dostępne"
 
-#: ../src/bar_exif.c:576
+#: ../src/bar_exif.c:584
 msgid "Editable (supported only for XMP)"
 msgstr "Edytowalny (obsługiwane tylko dla XMP)"
 
 #. for the entry
-#: ../src/bar_exif.c:612
+#: ../src/bar_exif.c:620
 #, c-format
 msgid "Configure \"%s\""
 msgstr "Skonfiguruj \"%s\""
 
-#: ../src/bar_exif.c:613 ../src/bar_keywords.c:1189
+#: ../src/bar_exif.c:621 ../src/bar_keywords.c:1198
 #, c-format
 msgid "Remove \"%s\""
 msgstr "Usuń \"%s\""
 
-#: ../src/bar_exif.c:625
+#: ../src/bar_exif.c:633
 msgid "Show hidden entries"
 msgstr "Pokaż ukryte pola"
 
-#: ../src/bar_gps.c:483
+#: ../src/bar_gps.c:544
 #, c-format
 msgid "Zoom %i"
 msgstr "Powiększenie %i"
 
-#: ../src/bar_gps.c:501
+#: ../src/bar_gps.c:562
 #, c-format
 msgid "Zoom level %i"
 msgstr "Skala powiększenia %i"
 
-#: ../src/bar_gps.c:506
+#: ../src/bar_gps.c:567
 msgid "Loading map"
 msgstr "Wczytywanie mapy"
 
-#: ../src/bar_gps.c:572
+#: ../src/bar_gps.c:633
 msgid "Enable markers"
 msgstr "Wyświetl znaczniki"
 
-#: ../src/bar_gps.c:574
+#: ../src/bar_gps.c:635
 msgid "Centre map on marker"
 msgstr "Wyśrodkuj mapę na znaczniku"
 
-#: ../src/bar_gps.c:596
+#: ../src/bar_gps.c:657
 msgid ""
 "Move map centre to marker\n"
 " is disabled"
@@ -226,7 +226,7 @@
 "Przesuwanie środka mapy do znacznika\n"
 "jest wyłączone"
 
-#: ../src/bar_gps.c:601
+#: ../src/bar_gps.c:662
 msgid ""
 "Move map centre to marker\n"
 " is enabled"
@@ -234,130 +234,127 @@
 "Przesuwanie środka mapy do znacznika\n"
 "jest włączone"
 
-#: ../src/bar_gps.c:610
+#: ../src/bar_gps.c:671
 msgid "Map Centreing"
 msgstr "Środkowanie mapy"
 
 #. use the same strings as in layout_util.c
-#: ../src/bar_histogram.c:249 ../src/layout_util.c:1430
+#: ../src/bar_histogram.c:257 ../src/layout_util.c:1603
 msgid "Histogram on _Red"
 msgstr "Histogram cze_rwonego"
 
-#: ../src/bar_histogram.c:250 ../src/layout_util.c:1431
+#: ../src/bar_histogram.c:258 ../src/layout_util.c:1604
 msgid "Histogram on _Green"
 msgstr "Histogram zielone_go"
 
-#: ../src/bar_histogram.c:251 ../src/layout_util.c:1432
+#: ../src/bar_histogram.c:259 ../src/layout_util.c:1605
 msgid "Histogram on _Blue"
 msgstr "Histogram nie_bieskiego"
 
-#: ../src/bar_histogram.c:252 ../src/layout_util.c:1433
+#: ../src/bar_histogram.c:260 ../src/layout_util.c:1606
 msgid "_Histogram on RGB"
 msgstr "_Histogram RGB"
 
-#: ../src/bar_histogram.c:253 ../src/layout_util.c:1434
+#: ../src/bar_histogram.c:261 ../src/layout_util.c:1607
 msgid "Histogram on _Value"
 msgstr "Histogram jasności (HS_V)"
 
-#: ../src/bar_histogram.c:257 ../src/layout_util.c:1438
+#: ../src/bar_histogram.c:265 ../src/layout_util.c:1611
 msgid "Li_near Histogram"
 msgstr "Histogram l_iniowy"
 
-#: ../src/bar_histogram.c:258
+#: ../src/bar_histogram.c:266
 msgid "L_og Histogram"
 msgstr "Histogram _logarytmiczny"
 
-#: ../src/bar_keywords.c:403
+#: ../src/bar_keywords.c:412
 msgid "Add keywords to selected files"
 msgstr "Dodaj słowo kluczowe do zaznaczonych plików"
 
-#: ../src/bar_keywords.c:404
+#: ../src/bar_keywords.c:413
 msgid "Replace existing keywords in selected files"
 msgstr "Zastąp istniejące słowa kluczowa w zaznaczonych plikach"
 
-#: ../src/bar_keywords.c:875
+#: ../src/bar_keywords.c:884
 msgid "Edit keyword"
 msgstr "Edytuj słowo kluczowe"
 
-#: ../src/bar_keywords.c:875
-msgid "Add keywords"
-msgstr "Dodaj słowa kluczowe"
-
-#: ../src/bar_keywords.c:882
+#: ../src/bar_keywords.c:884 ../src/bar_keywords.c:891
+#: ../src/bar_keywords.c:1152
+msgid "New keyword"
+msgstr "Nowe słowo kluczowe"
+
+#: ../src/bar_keywords.c:891
 msgid "Configure keyword"
 msgstr "Skonfiguruj słowo kluczowe"
 
-#: ../src/bar_keywords.c:882 ../src/bar_keywords.c:1143
-msgid "Add keyword"
-msgstr "Dodaj słowo kluczowe"
-
-#: ../src/bar_keywords.c:888
+#: ../src/bar_keywords.c:897
 msgid "Keyword:"
 msgstr "Słowo kluczowe:"
 
-#: ../src/bar_keywords.c:897
+#: ../src/bar_keywords.c:906
 msgid "Keyword type:"
 msgstr "Typ słowa kluczowego:"
 
-#: ../src/bar_keywords.c:899
+#: ../src/bar_keywords.c:908
 msgid "Active keyword"
 msgstr "Aktywne"
 
-#: ../src/bar_keywords.c:902
+#: ../src/bar_keywords.c:911
 msgid "Helper"
 msgstr "Pomocnicze"
 
-#: ../src/bar_keywords.c:1147
+#: ../src/bar_keywords.c:1156
 msgid "Add keyword to all selected images"
 msgstr "Dodaj słowo kluczowe do wszystkich zaznaczonych obrazów"
 
-#: ../src/bar_keywords.c:1167
+#: ../src/bar_keywords.c:1176
 #, c-format
 msgid "Hide \"%s\""
 msgstr "Ukryj \"%s\""
 
-#: ../src/bar_keywords.c:1174
+#: ../src/bar_keywords.c:1183
 #, c-format
 msgid "Mark %d"
 msgstr "Znacznik %d"
 
-#: ../src/bar_keywords.c:1179
+#: ../src/bar_keywords.c:1188
 #, c-format
 msgid "Connect \"%s\" to mark"
 msgstr "Powiąż \"%s\" z znacznikiem"
 
-#: ../src/bar_keywords.c:1186
+#: ../src/bar_keywords.c:1195
 #, c-format
 msgid "Edit \"%s\""
 msgstr "Edytuj \"%s\""
 
-#: ../src/bar_keywords.c:1196
+#: ../src/bar_keywords.c:1205
 #, c-format
 msgid "Disconnect \"%s\" from mark %s"
 msgstr "Usuń powiązanie \"%s\" z znacznikiem %s"
 
 #. for the pane
-#: ../src/bar_keywords.c:1208 ../src/bar_keywords.c:1217
+#: ../src/bar_keywords.c:1217 ../src/bar_keywords.c:1226
 msgid "Expand checked"
 msgstr "Rozwiń zaznaczone"
 
-#: ../src/bar_keywords.c:1209 ../src/bar_keywords.c:1218
+#: ../src/bar_keywords.c:1218 ../src/bar_keywords.c:1227
 msgid "Collapse unchecked"
 msgstr "Zwiń niezaznaczone"
 
-#: ../src/bar_keywords.c:1210 ../src/bar_keywords.c:1219
+#: ../src/bar_keywords.c:1219 ../src/bar_keywords.c:1228
 msgid "Hide unchecked"
 msgstr "Ukryj niezaznaczone"
 
-#: ../src/bar_keywords.c:1211
+#: ../src/bar_keywords.c:1220
 msgid "Show all"
 msgstr "Pokaż wszystko"
 
-#: ../src/bar_keywords.c:1214
+#: ../src/bar_keywords.c:1223
 msgid "On any change"
 msgstr "Przy każdej zmianie"
 
-#: ../src/bar_sort.c:449
+#: ../src/bar_sort.c:457
 #, c-format
 msgid ""
 "The collection:\n"
@@ -368,11 +365,11 @@
 "%s\n"
 "już istnieje."
 
-#: ../src/bar_sort.c:450
+#: ../src/bar_sort.c:458
 msgid "Collection exists"
 msgstr "Kolekcja istnieje"
 
-#: ../src/bar_sort.c:464 ../src/collect.c:1043 ../src/collect-dlg.c:85
+#: ../src/bar_sort.c:472 ../src/collect.c:1051 ../src/collect-dlg.c:93
 #, c-format
 msgid ""
 "Failed to save the collection:\n"
@@ -381,55 +378,56 @@
 "Zapisanie kolekcji nie powiodło się:\n"
 "%s"
 
-#: ../src/bar_sort.c:465 ../src/collect.c:1044 ../src/collect-dlg.c:86
+#: ../src/bar_sort.c:473 ../src/collect.c:1052 ../src/collect-dlg.c:94
 msgid "Save Failed"
 msgstr "Zapis nie powiódł się"
 
-#: ../src/bar_sort.c:500 ../src/bar_sort.c:670
+#: ../src/bar_sort.c:508 ../src/bar_sort.c:678
 msgid "Add Bookmark"
 msgstr "Dodanie zakładki"
 
-#: ../src/bar_sort.c:504
+#: ../src/bar_sort.c:512
 msgid "Add Collection"
 msgstr "Dodaj kolekcję"
 
-#: ../src/bar_sort.c:521 ../src/ui_bookmark.c:288
+#: ../src/bar_sort.c:529 ../src/ui_bookmark.c:297
 msgid "Name:"
 msgstr "Nazwa:"
 
-#: ../src/bar_sort.c:597
+#: ../src/bar_sort.c:605
 msgid "Sort Manager"
 msgstr "Menedżer Sortowania"
 
-#: ../src/bar_sort.c:606 ../src/pan-view.c:2194 ../src/ui_pathsel.c:1097
+#: ../src/bar_sort.c:614 ../src/pan-view/pan-view.c:2210
+#: ../src/ui_pathsel.c:1106
 msgid "Folders"
 msgstr "Katalogi"
 
-#: ../src/bar_sort.c:607 ../src/options.c:160
+#: ../src/bar_sort.c:615 ../src/options.c:174
 msgid "Collections"
 msgstr "Kolekcje"
 
-#: ../src/bar_sort.c:615 ../src/utilops.c:2137
+#: ../src/bar_sort.c:623 ../src/utilops.c:2277
 msgid "Copy"
 msgstr "Skopiuj"
 
-#: ../src/bar_sort.c:618 ../src/utilops.c:2088
+#: ../src/bar_sort.c:626 ../src/utilops.c:2227
 msgid "Move"
 msgstr "Przenieś"
 
-#: ../src/bar_sort.c:657
+#: ../src/bar_sort.c:665
 msgid "Add image"
 msgstr "Dodaj obraz"
 
-#: ../src/bar_sort.c:660
+#: ../src/bar_sort.c:668
 msgid "Add selection"
 msgstr "Dodaj zaznaczone"
 
-#: ../src/bar_sort.c:673
+#: ../src/bar_sort.c:681
 msgid "Undo last image"
 msgstr "Cofnij ostatni obraz"
 
-#: ../src/cache.c:163
+#: ../src/cache.c:172
 #, c-format
 msgid ""
 "error saving sim cache data: %s\n"
@@ -438,77 +436,77 @@
 "błąd przy zapisie cache danych podobieństwa: %s\n"
 "błąd: %s\n"
 
-#: ../src/cache_maint.c:110 ../src/cache_maint.c:549 ../src/cache_maint.c:765
-#: ../src/editors.c:1177
+#: ../src/cache_maint.c:120 ../src/cache_maint.c:559 ../src/cache_maint.c:775
+#: ../src/editors.c:1185
 msgid "done"
 msgstr "ukończono"
 
-#: ../src/cache_maint.c:288
+#: ../src/cache_maint.c:298
 msgid "Removing old metadata..."
 msgstr "Usuwanie starych metadanych..."
 
-#: ../src/cache_maint.c:292
+#: ../src/cache_maint.c:302
 msgid "Clearing cached thumbnails..."
 msgstr "Czyszczenie cache miniatur..."
 
-#: ../src/cache_maint.c:296 ../src/cache_maint.c:923
+#: ../src/cache_maint.c:306 ../src/cache_maint.c:933
 msgid "Removing old thumbnails..."
 msgstr "Usuwanie starych miniatur..."
 
-#: ../src/cache_maint.c:299 ../src/cache_maint.c:926
+#: ../src/cache_maint.c:309 ../src/cache_maint.c:936
 msgid "Maintenance"
 msgstr "Zarządzanie"
 
-#: ../src/cache_maint.c:660
+#: ../src/cache_maint.c:670
 msgid "Invalid folder"
 msgstr "Nieprawidłowy folder"
 
-#: ../src/cache_maint.c:661
+#: ../src/cache_maint.c:671
 msgid "The specified folder can not be found."
 msgstr "Wybrany folder nie został znaleziony."
 
-#: ../src/cache_maint.c:692 ../src/cache_maint.c:706 ../src/cache_maint.c:1102
+#: ../src/cache_maint.c:702 ../src/cache_maint.c:716 ../src/cache_maint.c:1119
 msgid "Create thumbnails"
 msgstr "Utwórz miniaturki"
 
-#: ../src/cache_maint.c:700 ../src/cache_maint.c:933
+#: ../src/cache_maint.c:710 ../src/cache_maint.c:943
 msgid "S_tart"
 msgstr "S_tart"
 
-#: ../src/cache_maint.c:713 ../src/preferences.c:1941
+#: ../src/cache_maint.c:723 ../src/preferences.c:2123
 msgid "Folder:"
 msgstr "Katalog:"
 
-#: ../src/cache_maint.c:716
+#: ../src/cache_maint.c:726
 msgid "Select folder"
 msgstr "Wybierz katalog"
 
-#: ../src/cache_maint.c:720
+#: ../src/cache_maint.c:730
 msgid "Include subfolders"
 msgstr "Dołącz podkatalogi"
 
-#: ../src/cache_maint.c:721
+#: ../src/cache_maint.c:731
 msgid "Store thumbnails local to source images"
 msgstr "Zapisuj miniaturki lokalnie"
 
-#: ../src/cache_maint.c:730 ../src/cache_maint.c:942
+#: ../src/cache_maint.c:740 ../src/cache_maint.c:952
 msgid "click start to begin"
 msgstr "kliknij start, aby rozpocząć"
 
-#: ../src/cache_maint.c:869 ../src/editors.c:1103
+#: ../src/cache_maint.c:879 ../src/editors.c:1111
 msgid "running..."
 msgstr "przetwarzanie..."
 
-#: ../src/cache_maint.c:918
+#: ../src/cache_maint.c:928
 msgid "Clearing thumbnails..."
 msgstr "Czyszczenie miniatur..."
 
-#: ../src/cache_maint.c:984 ../src/cache_maint.c:987 ../src/cache_maint.c:1080
-#: ../src/cache_maint.c:1097
+#: ../src/cache_maint.c:994 ../src/cache_maint.c:997 ../src/cache_maint.c:1097
+#: ../src/cache_maint.c:1114
 msgid "Clear cache"
 msgstr "Wyczyść cache"
 
-#: ../src/cache_maint.c:988
+#: ../src/cache_maint.c:998
 msgid ""
 "This will remove all thumbnails that have\n"
 "been saved to disk, continue?"
@@ -516,73 +514,73 @@
 "Zostaną usunięte wszystkie miniaturki\n"
 "zapisane na dysku, kontynuować?"
 
-#: ../src/cache_maint.c:1030
+#: ../src/cache_maint.c:1045
 #, c-format
 msgid "Location: %s"
 msgstr "Położenie: %s"
 
-#: ../src/cache_maint.c:1055
+#: ../src/cache_maint.c:1070
 msgid "Cache Maintenance"
 msgstr "Zarządzanie cache miniaturek"
 
-#: ../src/cache_maint.c:1065
+#: ../src/cache_maint.c:1082
 msgid "Cache and Data Maintenance"
 msgstr "Zarządzanie cache i danymi"
 
-#: ../src/cache_maint.c:1069
+#: ../src/cache_maint.c:1086
 msgid "Thumbnail cache"
 msgstr "Cache miniaturek"
 
-#: ../src/cache_maint.c:1075 ../src/cache_maint.c:1092
-#: ../src/cache_maint.c:1117
+#: ../src/cache_maint.c:1092 ../src/cache_maint.c:1109
+#: ../src/cache_maint.c:1134
 msgid "Clean up"
 msgstr "Uporządkuj"
 
-#: ../src/cache_maint.c:1078 ../src/cache_maint.c:1095
+#: ../src/cache_maint.c:1095 ../src/cache_maint.c:1112
 msgid "Remove orphaned or outdated thumbnails."
 msgstr "Usuń porzucone lub nieaktualne miniaturki."
 
-#: ../src/cache_maint.c:1083 ../src/cache_maint.c:1100
+#: ../src/cache_maint.c:1100 ../src/cache_maint.c:1117
 msgid "Delete all cached thumbnails."
 msgstr "Skasuj wszystkie miniaturki z cache."
 
-#: ../src/cache_maint.c:1086
+#: ../src/cache_maint.c:1103
 msgid "Shared thumbnail cache"
 msgstr "Wspołdzielone cache miniaturek"
 
-#: ../src/cache_maint.c:1106
+#: ../src/cache_maint.c:1123
 msgid "Render"
 msgstr "Utwórz"
 
-#: ../src/cache_maint.c:1109
+#: ../src/cache_maint.c:1126
 msgid "Render thumbnails for a specific folder."
 msgstr "Utwórz miniaturki dla wybranego katalogu."
 
-#: ../src/cache_maint.c:1120
+#: ../src/cache_maint.c:1137
 msgid "Remove orphaned keywords and comments."
 msgstr "Usuń porzucone/przestarzałe słowa kluczowe i komentarze."
 
 #. When does this occur ??
-#: ../src/collect.c:331 ../src/image.c:160 ../src/image-overlay.c:532
-#: ../src/image-overlay.c:609
+#: ../src/collect.c:339 ../src/image.c:168 ../src/image-overlay.c:541
+#: ../src/image-overlay.c:618
 msgid "Untitled"
 msgstr "BezNazwy"
 
-#: ../src/collect.c:335
+#: ../src/collect.c:343
 #, c-format
 msgid "Untitled (%d)"
 msgstr "BezNazwy (%d)"
 
-#: ../src/collect.c:968
+#: ../src/collect.c:976
 #, c-format
 msgid "%s - Collection - %s"
 msgstr "%s - Kolekcja - %s"
 
-#: ../src/collect.c:1080 ../src/collect.c:1084
+#: ../src/collect.c:1088 ../src/collect.c:1092
 msgid "Close collection"
 msgstr "Zamknij kolekcję"
 
-#: ../src/collect.c:1085
+#: ../src/collect.c:1093
 msgid ""
 "Collection has been modified.\n"
 "Save first?"
@@ -590,11 +588,11 @@
 "Kolekcja została zmodyfikowana.\n"
 "Czy najpierw zapisać?"
 
-#: ../src/collect.c:1088
+#: ../src/collect.c:1096
 msgid "_Discard"
 msgstr "Pomiń"
 
-#: ../src/collect-dlg.c:59
+#: ../src/collect-dlg.c:67
 #, c-format
 msgid ""
 "Specified path:\n"
@@ -605,67 +603,67 @@
 "%s\n"
 "jest folderem, kolekcje są plikami"
 
-#: ../src/collect-dlg.c:60
+#: ../src/collect-dlg.c:68
 msgid "Invalid filename"
 msgstr "Niepoprawna nazwa pliku"
 
-#: ../src/collect-dlg.c:69
+#: ../src/collect-dlg.c:77
 msgid "Overwrite File"
 msgstr "Nadpisanie Pliku"
 
-#: ../src/collect-dlg.c:74
+#: ../src/collect-dlg.c:82
 msgid "Overwrite existing file?"
 msgstr "Nadpisać instniejący plik?"
 
-#: ../src/collect-dlg.c:76
+#: ../src/collect-dlg.c:84
 msgid "_Overwrite"
 msgstr "Nadpisz"
 
-#: ../src/collect-dlg.c:127
+#: ../src/collect-dlg.c:135
 #, c-format
 msgid "No such file '%s'."
 msgstr "Plik '%s' nie istnieje."
 
-#: ../src/collect-dlg.c:132
+#: ../src/collect-dlg.c:140
 #, c-format
 msgid "'%s' is a directory, not a collection file."
 msgstr "'%s' jest katalogiem, nie plikiem kolekcji."
 
-#: ../src/collect-dlg.c:137
+#: ../src/collect-dlg.c:145
 #, c-format
 msgid "You do not have read permissions on the file '%s'."
 msgstr "Nie masz uprawnień by zapisywać do pliku '%s'."
 
-#: ../src/collect-dlg.c:143
+#: ../src/collect-dlg.c:151
 msgid "Can not open collection file"
 msgstr "Nie mogę utworzyć kolekcji"
 
-#: ../src/collect-dlg.c:195
+#: ../src/collect-dlg.c:203
 msgid "Save collection"
 msgstr "Zapisz kolekcję"
 
-#: ../src/collect-dlg.c:202
-msgid "Open collection"
-msgstr "Otwarcie kolekcji"
-
 #: ../src/collect-dlg.c:210
+msgid "Open collection"
+msgstr "Otwarcie kolekcji"
+
+#: ../src/collect-dlg.c:218
 msgid "Append collection"
 msgstr "Dołącz kolekcji"
 
-#: ../src/collect-dlg.c:211
+#: ../src/collect-dlg.c:219
 msgid "_Append"
 msgstr "Dołącz"
 
-#: ../src/collect-dlg.c:228
+#: ../src/collect-dlg.c:236
 msgid "Collection Files"
 msgstr "Pliki kolekcji"
 
-#: ../src/collect-io.c:348
+#: ../src/collect-io.c:356
 #, c-format
 msgid "failed to open collection (write) \"%s\"\n"
 msgstr "Otworzenie (zapisanie) kolekcji nie powiodło się \"%s\"\n"
 
-#: ../src/collect-io.c:373
+#: ../src/collect-io.c:381
 #, c-format
 msgid ""
 "error saving collection file: %s\n"
@@ -674,178 +672,180 @@
 "błąd przy zapisie pliku kolekcji: %s\n"
 "błąd: %s\n"
 
-#: ../src/collect-table.c:211
+#: ../src/collect-table.c:219
 #, c-format
 msgid "%s, %d images (%s, %d)"
 msgstr "%s, %d plików (%s, %d)"
 
-#: ../src/collect-table.c:218
+#: ../src/collect-table.c:226
 #, c-format
 msgid "%s, %d images"
 msgstr "%s, %d obrazów"
 
-#: ../src/collect-table.c:223 ../src/layout_util.c:1229
-#: ../src/layout_util.c:2153
+#: ../src/collect-table.c:231 ../src/layout_util.c:1401
+#: ../src/layout_util.c:2327
 msgid "Empty"
 msgstr "Pusta"
 
-#: ../src/collect-table.c:237 ../src/dupe.c:1314 ../src/search.c:320
-#: ../src/view_file.c:835 ../src/view_file.c:938
+#: ../src/collect-table.c:245 ../src/dupe.c:1322 ../src/search.c:328
+#: ../src/view_file.c:871 ../src/view_file.c:974
 msgid "Loading thumbs..."
 msgstr "Wczytywanie miniatur..."
 
-#: ../src/collect-table.c:868 ../src/dupe.c:2237 ../src/dupe.c:2550
-#: ../src/layout_util.c:1276 ../src/search.c:996
+#: ../src/collect-table.c:905 ../src/dupe.c:2245 ../src/dupe.c:2558
+#: ../src/layout_util.c:1448 ../src/search.c:1004
 msgid "_View"
 msgstr "_Widok"
 
-#: ../src/collect-table.c:870 ../src/dupe.c:2239 ../src/dupe.c:2552
-#: ../src/img-view.c:1268 ../src/layout_image.c:499 ../src/pan-view.c:2617
-#: ../src/search.c:998 ../src/view_file.c:588
+#: ../src/collect-table.c:907 ../src/dupe.c:2247 ../src/dupe.c:2560
+#: ../src/img-view.c:1278 ../src/layout_image.c:666
+#: ../src/pan-view/pan-view.c:2633 ../src/search.c:1006 ../src/view_file.c:618
 msgid "View in _new window"
 msgstr "Podgląd w _nowym oknie"
 
-#: ../src/collect-table.c:873 ../src/dupe.c:2273 ../src/dupe.c:2560
-#: ../src/search.c:1028
+#: ../src/collect-table.c:910 ../src/dupe.c:2281 ../src/dupe.c:2568
+#: ../src/search.c:1036
 msgid "Rem_ove"
 msgstr "_Usuń"
 
-#: ../src/collect-table.c:876
+#: ../src/collect-table.c:913
 msgid "Append from file list"
 msgstr "Dołącz z listy plików"
 
-#: ../src/collect-table.c:878
+#: ../src/collect-table.c:915
 msgid "Append from collection..."
 msgstr "Dołącz z kolekcji..."
 
-#: ../src/collect-table.c:882
+#: ../src/collect-table.c:919
 msgid "_Selection"
 msgstr "Zaznacz"
 
-#: ../src/collect-table.c:884 ../src/dupe.c:2242 ../src/dupe.c:2555
-#: ../src/layout_util.c:1324 ../src/search.c:1001
+#: ../src/collect-table.c:921 ../src/dupe.c:2250 ../src/dupe.c:2563
+#: ../src/layout_util.c:1496 ../src/search.c:1009
 msgid "Select all"
 msgstr "Zaznacz wszystko"
 
-#: ../src/collect-table.c:886 ../src/dupe.c:2244 ../src/dupe.c:2557
-#: ../src/layout_util.c:1325 ../src/search.c:1003
+#: ../src/collect-table.c:923 ../src/dupe.c:2252 ../src/dupe.c:2565
+#: ../src/layout_util.c:1497 ../src/search.c:1011
 msgid "Select none"
 msgstr "Wyczyść zaznaczenie"
 
-#: ../src/collect-table.c:888
+#: ../src/collect-table.c:925
 msgid "Invert selection"
 msgstr "Odwróć zaznaczenie"
 
-#: ../src/collect-table.c:900 ../src/dupe.c:2262 ../src/img-view.c:1272
-#: ../src/layout_image.c:507 ../src/layout_util.c:1307 ../src/pan-view.c:2621
-#: ../src/search.c:1017 ../src/view_file.c:592
+#: ../src/collect-table.c:937 ../src/dupe.c:2270 ../src/img-view.c:1282
+#: ../src/layout_image.c:674 ../src/layout_util.c:1479
+#: ../src/pan-view/pan-view.c:2637 ../src/search.c:1025 ../src/view_file.c:622
 msgid "_Copy..."
 msgstr "_Kopiuj..."
 
-#: ../src/collect-table.c:902 ../src/dupe.c:2264 ../src/img-view.c:1273
-#: ../src/layout_image.c:509 ../src/layout_util.c:1308 ../src/pan-view.c:2623
-#: ../src/search.c:1019 ../src/view_file.c:594
+#: ../src/collect-table.c:939 ../src/dupe.c:2272 ../src/img-view.c:1283
+#: ../src/layout_image.c:676 ../src/layout_util.c:1480
+#: ../src/pan-view/pan-view.c:2639 ../src/search.c:1027 ../src/view_file.c:624
 msgid "_Move..."
 msgstr "P_rzenieś..."
 
-#: ../src/collect-table.c:904 ../src/dupe.c:2266 ../src/img-view.c:1274
-#: ../src/layout_image.c:511 ../src/layout_util.c:1309 ../src/pan-view.c:2625
-#: ../src/search.c:1021 ../src/view_dir.c:665 ../src/view_file.c:596
+#: ../src/collect-table.c:941 ../src/dupe.c:2274 ../src/img-view.c:1284
+#: ../src/layout_image.c:678 ../src/layout_util.c:1481
+#: ../src/pan-view/pan-view.c:2641 ../src/search.c:1029 ../src/view_dir.c:674
+#: ../src/view_file.c:626
 msgid "_Rename..."
 msgstr "Zm_ień nazwę..."
 
-#: ../src/collect-table.c:906 ../src/dupe.c:2268 ../src/img-view.c:1275
-#: ../src/layout_image.c:513 ../src/layout_util.c:1310
-#: ../src/layout_util.c:1311 ../src/layout_util.c:1312 ../src/pan-view.c:2627
-#: ../src/search.c:1023 ../src/view_dir.c:667 ../src/view_file.c:598
+#: ../src/collect-table.c:943 ../src/dupe.c:2276 ../src/img-view.c:1285
+#: ../src/layout_image.c:680 ../src/layout_util.c:1482
+#: ../src/layout_util.c:1483 ../src/layout_util.c:1484
+#: ../src/pan-view/pan-view.c:2643 ../src/search.c:1031 ../src/view_dir.c:676
+#: ../src/view_file.c:628
 msgid "_Delete..."
 msgstr "_Usuń..."
 
-#: ../src/collect-table.c:908 ../src/dupe.c:2270 ../src/img-view.c:1276
-#: ../src/layout_image.c:516 ../src/pan-view.c:2629 ../src/search.c:1025
-#: ../src/view_dir.c:670 ../src/view_file.c:600
+#: ../src/collect-table.c:945 ../src/dupe.c:2278 ../src/img-view.c:1286
+#: ../src/layout_image.c:683 ../src/pan-view/pan-view.c:2645
+#: ../src/search.c:1033 ../src/view_dir.c:679 ../src/view_file.c:630
 msgid "_Copy path"
 msgstr "S_kopiuj ścieżkę"
 
-#: ../src/collect-table.c:914
+#: ../src/collect-table.c:951
 msgid "Randomize"
 msgstr "Losowo"
 
-#: ../src/collect-table.c:916 ../src/view_file.c:616
+#: ../src/collect-table.c:953 ../src/view_file.c:652
 msgid "_Sort"
 msgstr "_Uporządkuj"
 
-#: ../src/collect-table.c:919 ../src/view_file.c:632
+#: ../src/collect-table.c:956 ../src/view_file.c:668
 msgid "Show filename _text"
 msgstr "Pokaż nazwę pliku"
 
-#: ../src/collect-table.c:922
+#: ../src/collect-table.c:959
 msgid "_Save collection"
 msgstr "_Zapisz kolekcję"
 
-#: ../src/collect-table.c:924
+#: ../src/collect-table.c:961
 msgid "Save collection _as..."
 msgstr "Zapisz kolekcję jako..."
 
-#: ../src/collect-table.c:927 ../src/layout_util.c:1303
+#: ../src/collect-table.c:964 ../src/layout_util.c:1475 ../src/view_file.c:639
 msgid "_Find duplicates..."
 msgstr "Wyszukaj duplikaty..."
 
-#: ../src/collect-table.c:929 ../src/dupe.c:2259 ../src/layout_util.c:1305
-#: ../src/search.c:1014
+#: ../src/collect-table.c:966 ../src/dupe.c:2267 ../src/layout_util.c:1477
+#: ../src/search.c:1022
 msgid "Print..."
 msgstr "Drukuj..."
 
-#: ../src/collect-table.c:2094 ../src/dupe.c:3319 ../src/img-view.c:1430
+#: ../src/collect-table.c:2155 ../src/dupe.c:3331 ../src/img-view.c:1440
 msgid "Dropped list includes folders."
 msgstr "Upuszczona lista zawiera foldery."
 
-#: ../src/collect-table.c:2096 ../src/dupe.c:3321 ../src/img-view.c:1432
+#: ../src/collect-table.c:2157 ../src/dupe.c:3333 ../src/img-view.c:1442
 msgid "_Add contents"
 msgstr "_Dodaj zawartość"
 
-#: ../src/collect-table.c:2098 ../src/dupe.c:3322 ../src/img-view.c:1433
+#: ../src/collect-table.c:2159 ../src/dupe.c:3334 ../src/img-view.c:1443
 msgid "Add contents _recursive"
 msgstr "Dodaj zawartość _rekurencyjnie"
 
-#: ../src/collect-table.c:2100 ../src/dupe.c:3323 ../src/img-view.c:1434
+#: ../src/collect-table.c:2161 ../src/dupe.c:3335 ../src/img-view.c:1444
 msgid "_Skip folders"
 msgstr "Pomiń katalogi"
 
-#: ../src/collect-table.c:2103 ../src/dupe.c:3325 ../src/img-view.c:1436
-#: ../src/view_dir.c:417
+#: ../src/collect-table.c:2164 ../src/dupe.c:3337 ../src/img-view.c:1446
+#: ../src/view_dir.c:426
 msgid "Cancel"
 msgstr "Anuluj"
 
-#: ../src/color-man.c:426 ../src/exif.c:233 ../src/exif-common.c:436
+#: ../src/color-man.c:434 ../src/exif.c:227 ../src/exif-common.c:448
 msgid "sRGB"
 msgstr "sRGB"
 
-#: ../src/color-man.c:428
+#: ../src/color-man.c:436
 msgid "Adobe RGB compatible"
 msgstr "Zgodny z Adobe RGB"
 
-#: ../src/color-man.c:445
+#: ../src/color-man.c:453
 msgid "Custom profile"
 msgstr "Własne profile"
 
-#: ../src/desktop_file.c:74 ../src/desktop_file.c:86 ../src/desktop_file.c:92
+#: ../src/desktop_file.c:83 ../src/desktop_file.c:95 ../src/desktop_file.c:101
 msgid "Can't save"
 msgstr "Nie można zapisać"
 
-#: ../src/desktop_file.c:74
+#: ../src/desktop_file.c:83
 msgid "Please specify file name."
 msgstr "Proszę określić nazwę pliku."
 
-#: ../src/desktop_file.c:86
+#: ../src/desktop_file.c:95
 msgid "Could not create directory"
 msgstr "Nie można utworzyć katalogu"
 
-#: ../src/desktop_file.c:182 ../src/desktop_file.c:534
+#: ../src/desktop_file.c:191 ../src/desktop_file.c:554
 msgid "Desktop file"
 msgstr "Plik desktop"
 
-#: ../src/desktop_file.c:291 ../src/ui_pathsel.c:485
+#: ../src/desktop_file.c:300 ../src/ui_pathsel.c:494
 #, c-format
 msgid ""
 "Unable to delete file:\n"
@@ -854,17 +854,17 @@
 "Nie można usunąć pliku:\n"
 "%s"
 
-#: ../src/desktop_file.c:292 ../src/ui_pathsel.c:486 ../src/utilops.c:1975
-#: ../src/utilops.c:2002 ../src/utilops.c:2522
+#: ../src/desktop_file.c:301 ../src/ui_pathsel.c:495 ../src/utilops.c:2113
+#: ../src/utilops.c:2140 ../src/utilops.c:2662
 msgid "File deletion failed"
 msgstr "Usunięcie pliku nie powiodło się"
 
-#: ../src/desktop_file.c:336 ../src/desktop_file.c:344 ../src/ui_pathsel.c:528
-#: ../src/ui_pathsel.c:536
+#: ../src/desktop_file.c:345 ../src/desktop_file.c:353 ../src/ui_pathsel.c:537
+#: ../src/ui_pathsel.c:545
 msgid "Delete file"
 msgstr "Usuń plik"
 
-#: ../src/desktop_file.c:342 ../src/ui_pathsel.c:534
+#: ../src/desktop_file.c:351 ../src/ui_pathsel.c:543
 #, c-format
 msgid ""
 "About to delete the file:\n"
@@ -873,176 +873,176 @@
 "Usunięcie pliku:\n"
 " %s"
 
-#: ../src/desktop_file.c:374
+#: ../src/desktop_file.c:383
 msgid "new.desktop"
-msgstr ""
-
-#: ../src/desktop_file.c:453
+msgstr "nowy.desktop"
+
+#: ../src/desktop_file.c:467
 msgid "Editors"
 msgstr "Edytory"
 
-#: ../src/desktop_file.c:524
+#: ../src/desktop_file.c:544
 msgid "Hidden"
 msgstr "Ukryty"
 
-#: ../src/desktop_file.c:543 ../src/dupe.c:2648 ../src/dupe.c:3133
-#: ../src/print.c:3201 ../src/search.c:2794 ../src/ui_pathsel.c:1109
-#: ../src/utilops.c:458
+#: ../src/desktop_file.c:563 ../src/dupe.c:2656 ../src/dupe.c:3141
+#: ../src/print.c:3210 ../src/search.c:2802 ../src/ui_pathsel.c:1118
+#: ../src/utilops.c:501
 msgid "Path"
 msgstr "Ścieżka"
 
-#: ../src/dupe.c:100
+#: ../src/dupe.c:108
 msgid "Drop files to compare them."
 msgstr "Upuść pliki, aby je porównać."
 
-#: ../src/dupe.c:104
+#: ../src/dupe.c:112
 #, c-format
 msgid "%d files"
 msgstr "%d plików"
 
-#: ../src/dupe.c:108
+#: ../src/dupe.c:116
 #, c-format
 msgid "%d matches found in %d files"
 msgstr "%d wystąpień w %d plikach"
 
-#: ../src/dupe.c:113
+#: ../src/dupe.c:121
 msgid "[set 1]"
 msgstr "[zbiór 1]"
 
-#: ../src/dupe.c:1440
+#: ../src/dupe.c:1448
 msgid "Reading checksums..."
 msgstr "Odczytywanie sum kontrolnych..."
 
-#: ../src/dupe.c:1473
+#: ../src/dupe.c:1481
 msgid "Reading dimensions..."
 msgstr "Odczytywanie wymiarów..."
 
-#: ../src/dupe.c:1507
+#: ../src/dupe.c:1515
 msgid "Reading similarity data..."
 msgstr "Wczytywanie danych opisujących podobieństwo..."
 
-#: ../src/dupe.c:1543 ../src/dupe.c:1574
+#: ../src/dupe.c:1551 ../src/dupe.c:1582
 msgid "Comparing..."
 msgstr "Porównywanie..."
 
-#: ../src/dupe.c:1554 ../src/pan-view.c:996
+#: ../src/dupe.c:1562 ../src/pan-view/pan-view.c:1012
 msgid "Sorting..."
 msgstr "Sortowanie..."
 
-#: ../src/dupe.c:2246
+#: ../src/dupe.c:2254
 msgid "Select group _1 duplicates"
 msgstr "Wybierz _pierwszą grupę duplikatów"
 
-#: ../src/dupe.c:2248
+#: ../src/dupe.c:2256
 msgid "Select group _2 duplicates"
 msgstr "Wybierz _drugą grupę duplikatów"
 
-#: ../src/dupe.c:2257 ../src/search.c:1012
+#: ../src/dupe.c:2265 ../src/search.c:1020 ../src/view_file.c:642
 msgid "Add to new collection"
 msgstr "Dodaj do nowej kolekcji"
 
-#: ../src/dupe.c:2275 ../src/dupe.c:2562 ../src/search.c:1030
+#: ../src/dupe.c:2283 ../src/dupe.c:2570 ../src/search.c:1038
 msgid "C_lear"
 msgstr "Wyczyść"
 
-#: ../src/dupe.c:2278 ../src/dupe.c:2565
+#: ../src/dupe.c:2286 ../src/dupe.c:2573
 msgid "Close _window"
 msgstr "Zamknij okno"
 
-#: ../src/dupe.c:2438
+#: ../src/dupe.c:2446
 #, c-format
 msgid "%d files (set 2)"
 msgstr "%d plików (zbiór 2)"
 
-#: ../src/dupe.c:2643
+#: ../src/dupe.c:2651
 msgid "Name case-insensitive"
 msgstr "Nazwy z uwzględnianiem wielkości liter"
 
-#: ../src/dupe.c:2644 ../src/dupe.c:3130 ../src/preferences.c:1476
-#: ../src/print.c:3205 ../src/search.c:2791 ../src/view_file_list.c:1984
+#: ../src/dupe.c:2652 ../src/dupe.c:3138 ../src/preferences.c:1589
+#: ../src/print.c:3214 ../src/search.c:2799 ../src/view_file_list.c:1993
 msgid "Size"
 msgstr "Rozmiar"
 
-#: ../src/dupe.c:2645 ../src/dupe.c:3131 ../src/exif.c:342
-#: ../src/exif-common.c:553 ../src/print.c:3203 ../src/search.c:2792
-#: ../src/view_file_list.c:1988
+#: ../src/dupe.c:2653 ../src/dupe.c:3139 ../src/exif.c:336
+#: ../src/exif-common.c:565 ../src/print.c:3212 ../src/search.c:2800
+#: ../src/view_file_list.c:1997
 msgid "Date"
 msgstr "Data"
 
-#: ../src/dupe.c:2646 ../src/dupe.c:3132 ../src/print.c:3207
-#: ../src/search.c:2793
+#: ../src/dupe.c:2654 ../src/dupe.c:3140 ../src/print.c:3216
+#: ../src/search.c:2801
 msgid "Dimensions"
 msgstr "Wymiary"
 
-#: ../src/dupe.c:2647
+#: ../src/dupe.c:2655
 msgid "Checksum"
 msgstr "Suma kontrolna"
 
-#: ../src/dupe.c:2649
+#: ../src/dupe.c:2657
 msgid "Similarity (high)"
 msgstr "Podobieństwo (wysokie)"
 
-#: ../src/dupe.c:2650
+#: ../src/dupe.c:2658
 msgid "Similarity"
 msgstr "Podobieństwo"
 
-#: ../src/dupe.c:2651
+#: ../src/dupe.c:2659
 msgid "Similarity (low)"
 msgstr "Podobieństwo (niskie)"
 
-#: ../src/dupe.c:2652
+#: ../src/dupe.c:2660
 msgid "Similarity (custom)"
 msgstr "Podobieństwo (dowolne)"
 
-#: ../src/dupe.c:3083
+#: ../src/dupe.c:3091
 msgid "Find duplicates"
 msgstr "Wyszukaj duplikaty"
 
-#: ../src/dupe.c:3165
+#: ../src/dupe.c:3173
 msgid "Compare to:"
 msgstr "Porównaj z:"
 
-#: ../src/dupe.c:3178
+#: ../src/dupe.c:3186
 msgid "Compare by:"
 msgstr "Kryterium porównywania:"
 
-#: ../src/dupe.c:3186 ../src/preferences.c:1316 ../src/search.c:2807
+#: ../src/dupe.c:3194 ../src/preferences.c:1424 ../src/search.c:2815
 msgid "Thumbnails"
 msgstr "Miniaturki"
 
-#: ../src/dupe.c:3193
+#: ../src/dupe.c:3201
 msgid "Compare two file sets"
 msgstr "Porównanie dwóch zbiorów plików"
 
-#: ../src/editors.c:281
+#: ../src/editors.c:289
 #, c-format
 msgid "Desktop file '%s' should not include extension in Icon key: '%s'\n"
 msgstr ""
 "Plik desktop '%s' nie powinien zawierać rozszerzenia w kluczu Icon: '%s'\n"
 
 #. flash fired (bit 0)
-#: ../src/editors.c:335 ../src/exif.c:226 ../src/exif-common.c:362
+#: ../src/editors.c:343 ../src/exif.c:220 ../src/exif-common.c:374
 msgid "yes"
 msgstr "tak"
 
-#: ../src/editors.c:335 ../src/exif.c:225 ../src/exif-common.c:362
+#: ../src/editors.c:343 ../src/exif.c:219 ../src/exif-common.c:374
 msgid "no"
 msgstr "nie"
 
-#: ../src/editors.c:507
+#: ../src/editors.c:515
 msgid "stopping..."
 msgstr "zatrzymywanie..."
 
-#: ../src/editors.c:528
+#: ../src/editors.c:536
 msgid "Edit command results"
 msgstr "Edycja wyniku działania polecenia"
 
-#: ../src/editors.c:531
+#: ../src/editors.c:539
 #, c-format
 msgid "Output of %s"
 msgstr "Wyjście %s"
 
-#: ../src/editors.c:1054
+#: ../src/editors.c:1062
 #, c-format
 msgid ""
 "Failed to run command:\n"
@@ -1051,11 +1051,11 @@
 "Nie można uruchomić:\n"
 "%s\n"
 
-#: ../src/editors.c:1181
+#: ../src/editors.c:1189
 msgid "stopped by user"
 msgstr "zatrzymane przez użytkownika"
 
-#: ../src/editors.c:1266
+#: ../src/editors.c:1274
 #, c-format
 msgid ""
 "%s\n"
@@ -1064,2031 +1064,2045 @@
 "%s\n"
 "\"%s\""
 
-#: ../src/editors.c:1268
+#: ../src/editors.c:1276
 msgid "Invalid editor command"
 msgstr "Niepoprawne polecenie edytora"
 
-#: ../src/editors.c:1355
+#: ../src/editors.c:1363
 msgid "Editor template is empty."
 msgstr "Szablon edytora jest pusty."
 
-#: ../src/editors.c:1356
+#: ../src/editors.c:1364
 msgid "Editor template has incorrect syntax."
 msgstr "Szablon edytora ma niepoprawną składnię."
 
-#: ../src/editors.c:1357
+#: ../src/editors.c:1365
 msgid "Editor template uses incompatible macros."
 msgstr "Szablon edytora używa niekompatybilnych makr."
 
-#: ../src/editors.c:1358
+#: ../src/editors.c:1366
 msgid "Can't find matching file type."
 msgstr "Nie mogę znaleźć pasujących typów plików."
 
-#: ../src/editors.c:1359
+#: ../src/editors.c:1367
 msgid "Can't execute external editor."
 msgstr "Nie mogę uruchomić zewnętrznego edytora."
 
-#: ../src/editors.c:1360
+#: ../src/editors.c:1368
 msgid "External editor returned error status."
 msgstr "Zewnętrzny edytor zwrócił błąd."
 
-#: ../src/editors.c:1361
+#: ../src/editors.c:1369
 msgid "File was skipped."
 msgstr "Plik został pominięty."
 
-#: ../src/editors.c:1362
+#: ../src/editors.c:1370
 msgid "Unknown error."
 msgstr "Nieznany błąd."
 
-#: ../src/exif.c:148 ../src/exif.c:161 ../src/exif.c:175 ../src/exif.c:200
-#: ../src/exif.c:317 ../src/exif.c:664 ../src/exif-common.c:338
-#: ../src/exif-common.c:341 ../src/exif-common.c:408
+#: ../src/exif.c:142 ../src/exif.c:155 ../src/exif.c:169 ../src/exif.c:194
+#: ../src/exif.c:311 ../src/exif.c:658 ../src/exif-common.c:350
+#: ../src/exif-common.c:353 ../src/exif-common.c:420
 msgid "unknown"
 msgstr "nieznany"
 
-#: ../src/exif.c:149
+#: ../src/exif.c:143
 msgid "top left"
 msgstr "górny lewy"
 
-#: ../src/exif.c:150
+#: ../src/exif.c:144
 msgid "top right"
 msgstr "górny prawy"
 
-#: ../src/exif.c:151
+#: ../src/exif.c:145
 msgid "bottom right"
 msgstr "dolny lewy"
 
-#: ../src/exif.c:152
+#: ../src/exif.c:146
 msgid "bottom left"
 msgstr "dolny lewy"
 
-#: ../src/exif.c:153
+#: ../src/exif.c:147
 msgid "left top"
 msgstr "lewy górny"
 
-#: ../src/exif.c:154
+#: ../src/exif.c:148
 msgid "right top"
 msgstr "prawy górny"
 
-#: ../src/exif.c:155
+#: ../src/exif.c:149
 msgid "right bottom"
 msgstr "prawy dolny"
 
-#: ../src/exif.c:156
+#: ../src/exif.c:150
 msgid "left bottom"
 msgstr "lewy dolny"
 
-#: ../src/exif.c:163
+#: ../src/exif.c:157
 msgid "inch"
 msgstr "cal"
 
-#: ../src/exif.c:164
+#: ../src/exif.c:158
 msgid "centimeter"
 msgstr "centymetr"
 
-#: ../src/exif.c:176
+#: ../src/exif.c:170
 msgid "average"
 msgstr "uśredniony"
 
-#: ../src/exif.c:177
+#: ../src/exif.c:171
 msgid "center weighted"
 msgstr "centralnie ważony"
 
-#: ../src/exif.c:178
+#: ../src/exif.c:172
 msgid "spot"
 msgstr "punktowy"
 
-#: ../src/exif.c:179
+#: ../src/exif.c:173
 msgid "multi-spot"
 msgstr "wielopunktowy"
 
-#: ../src/exif.c:180
+#: ../src/exif.c:174
 msgid "multi-segment"
 msgstr "wielosegmentowy"
 
-#: ../src/exif.c:181
+#: ../src/exif.c:175
 msgid "partial"
 msgstr "częściowy"
 
-#: ../src/exif.c:182 ../src/exif.c:220
+#: ../src/exif.c:176 ../src/exif.c:214
 msgid "other"
 msgstr "inny"
 
-#: ../src/exif.c:187 ../src/exif.c:239
+#: ../src/exif.c:181 ../src/exif.c:233
 msgid "not defined"
 msgstr "niezdefiniowany"
 
-#: ../src/exif.c:188 ../src/exif.c:267 ../src/exif.c:274
+#: ../src/exif.c:182 ../src/exif.c:261 ../src/exif.c:268
 msgid "manual"
 msgstr "ręczny"
 
-#: ../src/exif.c:189 ../src/exif.c:260 ../src/exif.c:296 ../src/exif.c:303
-#: ../src/exif.c:310
+#: ../src/exif.c:183 ../src/exif.c:254 ../src/exif.c:290 ../src/exif.c:297
+#: ../src/exif.c:304
 msgid "normal"
 msgstr "zwykły"
 
-#: ../src/exif.c:190
+#: ../src/exif.c:184
 msgid "aperture"
 msgstr "przysłona"
 
-#: ../src/exif.c:191
+#: ../src/exif.c:185
 msgid "shutter"
 msgstr "migawka"
 
-#: ../src/exif.c:192
+#: ../src/exif.c:186
 msgid "creative"
 msgstr "kreatywny"
 
-#: ../src/exif.c:193
+#: ../src/exif.c:187
 msgid "action"
 msgstr "akcja"
 
-#: ../src/exif.c:194 ../src/exif.c:281
+#: ../src/exif.c:188 ../src/exif.c:275
 msgid "portrait"
 msgstr "portret"
 
-#: ../src/exif.c:195 ../src/exif.c:280
+#: ../src/exif.c:189 ../src/exif.c:274
 msgid "landscape"
 msgstr "krajobraz"
 
-#: ../src/exif.c:201
+#: ../src/exif.c:195
 msgid "daylight"
 msgstr "światło dzienne"
 
-#: ../src/exif.c:202
+#: ../src/exif.c:196
 msgid "fluorescent"
 msgstr "fluorescencyjne"
 
-#: ../src/exif.c:203
+#: ../src/exif.c:197
 msgid "tungsten (incandescent)"
 msgstr "żarówka"
 
-#: ../src/exif.c:204
+#: ../src/exif.c:198
 msgid "flash"
 msgstr "lampa błyskowa"
 
-#: ../src/exif.c:205
+#: ../src/exif.c:199
 msgid "fine weather"
 msgstr "dobra pogoda"
 
-#: ../src/exif.c:206
+#: ../src/exif.c:200
 msgid "cloudy weather"
 msgstr "pochmurna pogoda"
 
-#: ../src/exif.c:207
+#: ../src/exif.c:201
 msgid "shade"
 msgstr "cień"
 
-#: ../src/exif.c:208
+#: ../src/exif.c:202
 msgid "daylight fluorescent"
 msgstr "fluorescencyjne o widmie światła dziennego"
 
-#: ../src/exif.c:209
+#: ../src/exif.c:203
 msgid "day white fluorescent"
 msgstr "fluorescencyjne białe o widmie światła dziennego"
 
-#: ../src/exif.c:210
+#: ../src/exif.c:204
 msgid "cool white fluorescent"
 msgstr "fluorescencyjne białe zimne"
 
-#: ../src/exif.c:211
+#: ../src/exif.c:205
 msgid "white fluorescent"
 msgstr "fluorescencyjne białe"
 
-#: ../src/exif.c:212
+#: ../src/exif.c:206
 msgid "standard light A"
 msgstr "standardowe oświetlenie A"
 
-#: ../src/exif.c:213
+#: ../src/exif.c:207
 msgid "standard light B"
 msgstr "standardowe oświetlenie B"
 
-#: ../src/exif.c:214
+#: ../src/exif.c:208
 msgid "standard light C"
 msgstr "standardowe oświetlenie C"
 
-#: ../src/exif.c:215
+#: ../src/exif.c:209
 msgid "D55"
 msgstr "D55"
 
-#: ../src/exif.c:216
+#: ../src/exif.c:210
 msgid "D65"
 msgstr "D65"
 
-#: ../src/exif.c:217
+#: ../src/exif.c:211
 msgid "D75"
 msgstr "D75"
 
-#: ../src/exif.c:218
+#: ../src/exif.c:212
 msgid "D50"
 msgstr "D50"
 
-#: ../src/exif.c:219
+#: ../src/exif.c:213
 msgid "ISO studio tungsten"
 msgstr "żarówki studyjne ISO"
 
-#: ../src/exif.c:227
+#: ../src/exif.c:221
 msgid "yes, not detected by strobe"
 msgstr ""
 
+#: ../src/exif.c:222
+msgid "yes, detected by strobe"
+msgstr ""
+
 #: ../src/exif.c:228
-msgid "yes, detected by strobe"
-msgstr ""
+msgid "uncalibrated"
+msgstr "nieskalibrowaniy"
 
 #: ../src/exif.c:234
-msgid "uncalibrated"
-msgstr "nieskalibrowaniy"
-
-#: ../src/exif.c:240
 msgid "1 chip color area"
 msgstr ""
 
-#: ../src/exif.c:241
+#: ../src/exif.c:235
 msgid "2 chip color area"
 msgstr ""
 
-#: ../src/exif.c:242
+#: ../src/exif.c:236
 msgid "3 chip color area"
 msgstr ""
 
-#: ../src/exif.c:243
+#: ../src/exif.c:237
 msgid "color sequential area"
 msgstr ""
 
+#: ../src/exif.c:238
+msgid "trilinear"
+msgstr "trzyliniowe"
+
+#: ../src/exif.c:239
+msgid "color sequential linear"
+msgstr ""
+
 #: ../src/exif.c:244
-msgid "trilinear"
-msgstr "trzyliniowe"
-
-#: ../src/exif.c:245
-msgid "color sequential linear"
+msgid "digital still camera"
 msgstr ""
 
-#: ../src/exif.c:250
-msgid "digital still camera"
+#: ../src/exif.c:249
+msgid "direct photo"
 msgstr ""
 
 #: ../src/exif.c:255
-msgid "direct photo"
-msgstr ""
-
-#: ../src/exif.c:261
 msgid "custom"
 msgstr "własne"
 
-#: ../src/exif.c:266 ../src/exif.c:273 ../src/exif-common.c:376
+#: ../src/exif.c:260 ../src/exif.c:267 ../src/exif-common.c:388
 msgid "auto"
 msgstr "automatyczne"
 
-#: ../src/exif.c:268
+#: ../src/exif.c:262
 msgid "auto bracket"
 msgstr "Automatyczny bracketing"
 
-#: ../src/exif.c:279
+#: ../src/exif.c:273
 msgid "standard"
 msgstr "standard"
 
-#: ../src/exif.c:282
+#: ../src/exif.c:276
 msgid "night scene"
 msgstr "scena nocna"
 
-#: ../src/exif.c:287
+#: ../src/exif.c:281
 msgid "none"
 msgstr "brak"
 
-#: ../src/exif.c:288
+#: ../src/exif.c:282
 msgid "low gain up"
 msgstr ""
 
-#: ../src/exif.c:289
+#: ../src/exif.c:283
 msgid "high gain up"
 msgstr ""
 
-#: ../src/exif.c:290
+#: ../src/exif.c:284
 msgid "low gain down"
 msgstr ""
 
-#: ../src/exif.c:291
+#: ../src/exif.c:285
 msgid "high gain down"
 msgstr ""
 
-#: ../src/exif.c:297 ../src/exif.c:311
+#: ../src/exif.c:291 ../src/exif.c:305
 msgid "soft"
 msgstr "miękka"
 
-#: ../src/exif.c:298 ../src/exif.c:312
+#: ../src/exif.c:292 ../src/exif.c:306
 msgid "hard"
 msgstr "mocna"
 
-#: ../src/exif.c:304
+#: ../src/exif.c:298
 msgid "low"
 msgstr "niska"
 
-#: ../src/exif.c:305
+#: ../src/exif.c:299
 msgid "high"
 msgstr "wysokie"
 
-#: ../src/exif.c:318
+#: ../src/exif.c:312
 msgid "macro"
 msgstr "makro"
 
-#: ../src/exif.c:319
+#: ../src/exif.c:313
 msgid "close"
 msgstr "blisko"
 
-#: ../src/exif.c:320
+#: ../src/exif.c:314
 msgid "distant"
 msgstr "daleko"
 
-#: ../src/exif.c:330
+#: ../src/exif.c:324
 msgid "Image Width"
 msgstr "Szerokość obrazu"
 
-#: ../src/exif.c:331
+#: ../src/exif.c:325
 msgid "Image Height"
 msgstr "Wysokość obrazu"
 
-#: ../src/exif.c:332
+#: ../src/exif.c:326
 msgid "Bits per Sample/Pixel"
 msgstr "Bity na próbkę/piksel"
 
-#: ../src/exif.c:333
+#: ../src/exif.c:327
 msgid "Compression"
 msgstr "Kompresja"
 
-#: ../src/exif.c:334
+#: ../src/exif.c:328
 msgid "Image description"
 msgstr "Opis obrazu"
 
-#: ../src/exif.c:335
+#: ../src/exif.c:329
 msgid "Camera make"
 msgstr "Model aparatu"
 
-#: ../src/exif.c:336
+#: ../src/exif.c:330
 msgid "Camera model"
 msgstr "Model aparatu fotograficznego"
 
-#: ../src/exif.c:337
+#: ../src/exif.c:331
 msgid "Orientation"
 msgstr "Orientacja"
 
-#: ../src/exif.c:338
+#: ../src/exif.c:332
 msgid "X resolution"
 msgstr "Rozdzielczość X"
 
-#: ../src/exif.c:339
+#: ../src/exif.c:333
 msgid "Y Resolution"
 msgstr "Rozdzielczość Y"
 
-#: ../src/exif.c:340
+#: ../src/exif.c:334
 msgid "Resolution units"
 msgstr "Jednkostka rozdzielczości"
 
-#: ../src/exif.c:341
+#: ../src/exif.c:335
 msgid "Firmware"
 msgstr "Firmware"
 
-#: ../src/exif.c:343
+#: ../src/exif.c:337
 msgid "White point"
 msgstr "Punkt bieli"
 
-#: ../src/exif.c:344
+#: ../src/exif.c:338
 msgid "Primary chromaticities"
 msgstr ""
 
-#: ../src/exif.c:345
+#: ../src/exif.c:339
 msgid "YCbCy coefficients"
 msgstr ""
 
-#: ../src/exif.c:346
+#: ../src/exif.c:340
 msgid "YCbCr positioning"
 msgstr ""
 
-#: ../src/exif.c:347
+#: ../src/exif.c:341
 msgid "Black white reference"
 msgstr ""
 
-#: ../src/exif.c:349
+#: ../src/exif.c:343
 msgid "SubIFD Exif offset"
 msgstr ""
 
 #. subIFD follows
-#: ../src/exif.c:351
+#: ../src/exif.c:345
 msgid "Exposure time (seconds)"
 msgstr "Czas ekspozycji (sekundy)"
 
-#: ../src/exif.c:352
+#: ../src/exif.c:346
 msgid "FNumber"
 msgstr "Przysłona"
 
-#: ../src/exif.c:353
+#: ../src/exif.c:347
 msgid "Exposure program"
 msgstr "Program ekspozycji"
 
-#: ../src/exif.c:354
+#: ../src/exif.c:348
 msgid "Spectral Sensitivity"
 msgstr ""
 
-#: ../src/exif.c:355 ../src/exif.c:391 ../src/exif-common.c:557
+#: ../src/exif.c:349 ../src/exif.c:385 ../src/exif-common.c:569
 msgid "ISO sensitivity"
 msgstr "Czułość ISO"
 
-#: ../src/exif.c:356
+#: ../src/exif.c:350
 msgid "Optoelectric conversion factor"
 msgstr ""
 
-#: ../src/exif.c:357
+#: ../src/exif.c:351
 msgid "Exif version"
 msgstr "Wersja Exif"
 
-#: ../src/exif.c:358
+#: ../src/exif.c:352
 msgid "Date original"
 msgstr "Data oryginału"
 
-#: ../src/exif.c:359
+#: ../src/exif.c:353
 msgid "Date digitized"
 msgstr "Data digitalizacji"
 
-#: ../src/exif.c:360
+#: ../src/exif.c:354
 msgid "Pixel format"
 msgstr "Format piksela"
 
-#: ../src/exif.c:361
+#: ../src/exif.c:355
 msgid "Compression ratio"
 msgstr "Poziom kompresji"
 
-#: ../src/exif.c:362 ../src/exif-common.c:554
+#: ../src/exif.c:356 ../src/exif-common.c:566
 msgid "Shutter speed"
 msgstr "Szybkość migawki"
 
-#: ../src/exif.c:363 ../src/exif-common.c:555
+#: ../src/exif.c:357 ../src/exif-common.c:567
 msgid "Aperture"
 msgstr "Przysłona"
 
-#: ../src/exif.c:364
+#: ../src/exif.c:358
 msgid "Brightness"
 msgstr "Jasność"
 
-#: ../src/exif.c:365 ../src/exif-common.c:556
+#: ../src/exif.c:359 ../src/exif-common.c:568
 msgid "Exposure bias"
 msgstr "Korekta ekspozycji"
 
+#: ../src/exif.c:360
+msgid "Maximum aperture"
+msgstr "Maksymalna otwór przysłony"
+
+#: ../src/exif.c:361 ../src/exif-common.c:572
+msgid "Subject distance"
+msgstr "Odległość przedmiotu"
+
+#: ../src/exif.c:362
+msgid "Metering mode"
+msgstr "Metoda pomiaru"
+
+#: ../src/exif.c:363
+msgid "Light source"
+msgstr "Źródło światła"
+
+#: ../src/exif.c:364 ../src/exif-common.c:573
+msgid "Flash"
+msgstr "Lampa błyskowa"
+
+#: ../src/exif.c:365 ../src/exif-common.c:570
+msgid "Focal length"
+msgstr "Ogniskowa"
+
 #: ../src/exif.c:366
-msgid "Maximum aperture"
-msgstr "Maksymalna otwór przysłony"
-
-#: ../src/exif.c:367 ../src/exif-common.c:560
-msgid "Subject distance"
-msgstr "Odległość przedmiotu"
+msgid "Subject area"
+msgstr "Powierzchnia przedmiotu"
+
+#: ../src/exif.c:367
+msgid "MakerNote"
+msgstr ""
 
 #: ../src/exif.c:368
-msgid "Metering mode"
-msgstr "Metoda pomiaru"
+msgid "UserComment"
+msgstr "Komentarz użytkownika"
 
 #: ../src/exif.c:369
-msgid "Light source"
-msgstr "Źródło światła"
-
-#: ../src/exif.c:370 ../src/exif-common.c:561
-msgid "Flash"
-msgstr "Lampa błyskowa"
-
-#: ../src/exif.c:371 ../src/exif-common.c:558
-msgid "Focal length"
-msgstr "Ogniskowa"
+msgid "Subsecond time"
+msgstr ""
+
+#: ../src/exif.c:370
+msgid "Subsecond time original"
+msgstr ""
+
+#: ../src/exif.c:371
+msgid "Subsecond time digitized"
+msgstr ""
 
 #: ../src/exif.c:372
-msgid "Subject area"
-msgstr "Powierzchnia przedmiotu"
+msgid "FlashPix version"
+msgstr ""
 
 #: ../src/exif.c:373
-msgid "MakerNote"
-msgstr ""
-
-#: ../src/exif.c:374
-msgid "UserComment"
-msgstr "Komentarz użytkownika"
-
-#: ../src/exif.c:375
-msgid "Subsecond time"
-msgstr ""
-
-#: ../src/exif.c:376
-msgid "Subsecond time original"
-msgstr ""
-
-#: ../src/exif.c:377
-msgid "Subsecond time digitized"
-msgstr ""
-
-#: ../src/exif.c:378
-msgid "FlashPix version"
-msgstr ""
-
-#: ../src/exif.c:379
 msgid "Colorspace"
 msgstr "Przestrzeń kolorów"
 
 #. ExifImageWidth, ExifImageHeight can also be unsigned short
-#: ../src/exif.c:381 ../src/preferences.c:2171
+#: ../src/exif.c:375 ../src/preferences.c:2360
 msgid "Width"
 msgstr "Szerokość"
 
-#: ../src/exif.c:382 ../src/preferences.c:2173
+#: ../src/exif.c:376 ../src/preferences.c:2362
 msgid "Height"
 msgstr "Wysokość"
 
-#: ../src/exif.c:383
+#: ../src/exif.c:377
 msgid "Audio data"
 msgstr "Dane audio"
 
-#: ../src/exif.c:384
+#: ../src/exif.c:378
 msgid "ExifR98 extension"
 msgstr ""
 
-#: ../src/exif.c:385
+#: ../src/exif.c:379
 msgid "Flash strength"
 msgstr "Siła lampy błyskowej"
 
-#: ../src/exif.c:386
+#: ../src/exif.c:380
 msgid "Spatial frequency response"
 msgstr ""
 
-#: ../src/exif.c:387
+#: ../src/exif.c:381
 msgid "X Pixel density"
 msgstr ""
 
-#: ../src/exif.c:388
+#: ../src/exif.c:382
 msgid "Y Pixel density"
 msgstr ""
 
-#: ../src/exif.c:389
+#: ../src/exif.c:383
 msgid "Pixel density units"
 msgstr ""
 
-#: ../src/exif.c:390
+#: ../src/exif.c:384
 msgid "Subject location"
 msgstr ""
 
-#: ../src/exif.c:392
+#: ../src/exif.c:386
 msgid "Sensor type"
 msgstr "Typ sensora"
 
-#: ../src/exif.c:393
+#: ../src/exif.c:387
 msgid "Source type"
 msgstr "Źródło"
 
-#: ../src/exif.c:394
+#: ../src/exif.c:388
 msgid "Scene type"
 msgstr "Typ sceny"
 
-#: ../src/exif.c:395
+#: ../src/exif.c:389
 msgid "Color filter array pattern"
 msgstr "Wzór siatki kolorów filtra"
 
 #. tags a4xx were added for Exif 2.2 (not just these - some above, as well)
+#: ../src/exif.c:391
+msgid "Render process"
+msgstr ""
+
+#: ../src/exif.c:392
+msgid "Exposure mode"
+msgstr "Tryb ekspozycji"
+
+#: ../src/exif.c:393
+msgid "White balance"
+msgstr "Balans bieli"
+
+#: ../src/exif.c:394
+msgid "Digital zoom ratio"
+msgstr "Zoom cyfrowy"
+
+#: ../src/exif.c:395
+msgid "Focal length (35mm)"
+msgstr "Ogniskowa (35mm)"
+
+#: ../src/exif.c:396
+msgid "Scene capture type"
+msgstr "Typ fotografowanej sceny"
+
 #: ../src/exif.c:397
-msgid "Render process"
+msgid "Gain control"
 msgstr ""
 
 #: ../src/exif.c:398
-msgid "Exposure mode"
-msgstr "Tryb ekspozycji"
-
-#: ../src/exif.c:399
-msgid "White balance"
-msgstr "Balans bieli"
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: ../src/exif.c:399 ../src/preferences.c:1997
+msgid "Saturation"
+msgstr "Saturacja"
 
 #: ../src/exif.c:400
-msgid "Digital zoom ratio"
-msgstr "Zoom cyfrowy"
-
-#: ../src/exif.c:401
-msgid "Focal length (35mm)"
-msgstr "Ogniskowa (35mm)"
-
-#: ../src/exif.c:402
-msgid "Scene capture type"
-msgstr "Typ fotografowanej sceny"
-
-#: ../src/exif.c:403
-msgid "Gain control"
-msgstr ""
-
-#: ../src/exif.c:404
-msgid "Contrast"
-msgstr "Kontrast"
-
-#: ../src/exif.c:405
-msgid "Saturation"
-msgstr "Saturacja"
-
-#: ../src/exif.c:406
 msgid "Sharpness"
 msgstr "Ostrość"
 
-#: ../src/exif.c:407
+#: ../src/exif.c:401
 msgid "Device setting"
 msgstr "Ustawienia urządzenia"
 
-#: ../src/exif.c:408
+#: ../src/exif.c:402
 msgid "Subject range"
 msgstr ""
 
-#: ../src/exif.c:409
+#: ../src/exif.c:403
 msgid "Image serial number"
 msgstr "Numer seryjny obrazu"
 
-#: ../src/exif-common.c:337
+#: ../src/exif-common.c:349
 msgid "infinity"
 msgstr "nieskończoność"
 
-#: ../src/exif-common.c:366
+#: ../src/exif-common.c:378
 msgid "mode:"
 msgstr "tryb:"
 
-#: ../src/exif-common.c:370 ../src/trash.c:205
+#: ../src/exif-common.c:382 ../src/trash.c:213
 msgid "on"
 msgstr "włączony"
 
-#: ../src/exif-common.c:373 ../src/trash.c:210
+#: ../src/exif-common.c:385 ../src/trash.c:218
 msgid "off"
 msgstr "wyłączony"
 
-#: ../src/exif-common.c:382
+#: ../src/exif-common.c:394
 msgid "not detected by strobe"
 msgstr ""
 
-#: ../src/exif-common.c:383
+#: ../src/exif-common.c:395
 msgid "detected by strobe"
 msgstr ""
 
 #. we ignore flash function (bit 5)
 #. red-eye (bit 6)
-#: ../src/exif-common.c:388
+#: ../src/exif-common.c:400
 msgid "red-eye reduction"
 msgstr "redukcja efektu czerwonych oczu"
 
-#: ../src/exif-common.c:408
+#: ../src/exif-common.c:420
 msgid "dot"
 msgstr "punktów"
 
-#: ../src/exif-common.c:441
+#: ../src/exif-common.c:453
 msgid "AdobeRGB"
 msgstr "AdobeRGB"
 
-#: ../src/exif-common.c:449
+#: ../src/exif-common.c:461
 msgid "embedded"
 msgstr "osadzony"
 
-#: ../src/exif-common.c:544
+#: ../src/exif-common.c:556
 msgid "Above Sea Level"
 msgstr "Powyżej poziomu morza"
 
-#: ../src/exif-common.c:544
+#: ../src/exif-common.c:556
 msgid "Below Sea Level"
 msgstr "Poniżej poziomu morza"
 
-#: ../src/exif-common.c:552
+#: ../src/exif-common.c:564
 msgid "Camera"
 msgstr "Aparat fotograficzny"
 
-#: ../src/exif-common.c:559
+#: ../src/exif-common.c:571
 msgid "Focal length 35mm"
 msgstr "Ogniskowa 35mm"
 
-#: ../src/exif-common.c:562
+#: ../src/exif-common.c:574
 msgid "Resolution"
 msgstr "Rozdzielczość"
 
-#: ../src/exif-common.c:563
+#: ../src/exif-common.c:575
 msgid "Color profile"
 msgstr "Profil koloru"
 
-#: ../src/exif-common.c:564
+#: ../src/exif-common.c:576
 msgid "GPS position"
 msgstr "Pozycja wg GPS"
 
-#: ../src/exif-common.c:565
+#: ../src/exif-common.c:577
 msgid "GPS altitude"
 msgstr "Wysokość wg GPS"
 
-#: ../src/exif-common.c:566
+#: ../src/exif-common.c:578
 msgid "File size"
 msgstr "Rozmiar pliku"
 
-#: ../src/exif-common.c:567
+#: ../src/exif-common.c:579
 msgid "File date"
 msgstr "Czas utworzenia pliku"
 
-#: ../src/exif-common.c:568
+#: ../src/exif-common.c:580
 msgid "File mode"
 msgstr "Tryb pliku"
 
-#: ../src/filedata.c:101
+#: ../src/filedata.c:109
 #, c-format
 msgid "%d bytes"
 msgstr "%d bajtów"
 
-#: ../src/filedata.c:105
+#: ../src/filedata.c:113
 #, c-format
 msgid "%.1f K"
 msgstr "%.1f K"
 
-#: ../src/filedata.c:109
+#: ../src/filedata.c:117
 #, c-format
 msgid "%.1f MB"
 msgstr "%.1f MB"
 
-#: ../src/filedata.c:114
+#: ../src/filedata.c:122
 #, c-format
 msgid "%.1f GB"
 msgstr "%.1f GB"
 
-#: ../src/filedata.c:2458
+#: ../src/filedata.c:2488
 msgid "file or directory does not exist"
 msgstr "plik lub katalog nie istnieją"
 
-#: ../src/filedata.c:2464
+#: ../src/filedata.c:2494
 msgid "destination already exists"
 msgstr "cel już istnieje"
 
-#: ../src/filedata.c:2470
-msgid "destination can't be overwritten"
-msgstr "cel nie może być nadpisany"
-
-#: ../src/filedata.c:2476
-msgid "destination directory is not writable"
-msgstr "docelowy katalog nie jest zapisywalny"
-
-#: ../src/filedata.c:2482
-msgid "destination directory does not exist"
-msgstr "docelowy katalog nie istnieje"
-
-#: ../src/filedata.c:2488
-msgid "source directory is not writable"
-msgstr "katalog źródłowy nie istnieje"
-
-#: ../src/filedata.c:2494
-msgid "no read permission"
-msgstr "brak uprawnień do odczytu"
-
 #: ../src/filedata.c:2500
+msgid "destination can't be overwritten"
+msgstr "cel nie może być nadpisany"
+
+#: ../src/filedata.c:2506
+msgid "destination directory is not writable"
+msgstr "docelowy katalog nie jest zapisywalny"
+
+#: ../src/filedata.c:2512
+msgid "destination directory does not exist"
+msgstr "docelowy katalog nie istnieje"
+
+#: ../src/filedata.c:2518
+msgid "source directory is not writable"
+msgstr "katalog źródłowy nie istnieje"
+
+#: ../src/filedata.c:2524
+msgid "no read permission"
+msgstr "brak uprawnień do odczytu"
+
+#: ../src/filedata.c:2530
 msgid "file is readonly"
 msgstr "plik jest tylko do odczytu"
 
-#: ../src/filedata.c:2506
+#: ../src/filedata.c:2536
 msgid "destination already exists and will be overwritten"
 msgstr "cel już istnieje i zostanie nadpisany"
 
-#: ../src/filedata.c:2512
+#: ../src/filedata.c:2542
 msgid "source and destination are the same"
 msgstr "źródło i cel są takie same"
 
-#: ../src/filedata.c:2518
+#: ../src/filedata.c:2548
 msgid "source and destination have different extension"
 msgstr "źródło i cel mają różne rozszerzenia"
 
-#: ../src/filedata.c:2524
+#: ../src/filedata.c:2554
 msgid "there are unsaved metadata changes for the file"
 msgstr "istnieją nie zapisane metadane dla tego pliku"
 
-#: ../src/filedata.c:2530
+#: ../src/filedata.c:2560
 msgid "another destination file has the same filename"
 msgstr "inny plik docelowy ma taką samą nazwę"
 
-#: ../src/fullscreen.c:234 ../src/layout_util.c:1366 ../src/layout_util.c:1367
-#: ../src/layout_util.c:1368 ../src/preferences.c:1489
+#: ../src/fullscreen.c:242 ../src/layout_util.c:1538 ../src/layout_util.c:1539
+#: ../src/layout_util.c:1540 ../src/preferences.c:1602
 msgid "Full screen"
 msgstr "Pełny ekran"
 
-#: ../src/fullscreen.c:403
+#: ../src/fullscreen.c:413
 msgid "Full size"
 msgstr "Pełny rozmiar"
 
-#: ../src/fullscreen.c:411
+#: ../src/fullscreen.c:421
 msgid "Monitor"
 msgstr "Monitor"
 
-#: ../src/fullscreen.c:417
+#: ../src/fullscreen.c:427
 msgid "Screen"
 msgstr "Ekran"
 
-#: ../src/fullscreen.c:651
+#: ../src/fullscreen.c:661
 msgid "Determined by Window Manager"
 msgstr "Ustalone przez menedżer okien"
 
-#: ../src/fullscreen.c:652
+#: ../src/fullscreen.c:662
 msgid "Active screen"
 msgstr "Aktywny ekran"
 
-#: ../src/fullscreen.c:654
+#: ../src/fullscreen.c:664
 msgid "Active monitor"
 msgstr "Aktywny monitor"
 
-#: ../src/histogram.c:113
+#: ../src/histogram.c:121
 msgid "Log Histogram on Red"
 msgstr "Logarytmiczny histogram czerwonego"
 
-#: ../src/histogram.c:114
+#: ../src/histogram.c:122
 msgid "Log Histogram on Green"
 msgstr "Logarytmiczny histogram zielonego"
 
-#: ../src/histogram.c:115
+#: ../src/histogram.c:123
 msgid "Log Histogram on Blue"
 msgstr "Logarytmiczny histogram niebieskiego"
 
-#: ../src/histogram.c:116
+#: ../src/histogram.c:124
 msgid "Log Histogram on RGB"
 msgstr "Logarytmiczny histogram RGB"
 
-#: ../src/histogram.c:117
+#: ../src/histogram.c:125
 msgid "Log Histogram on value"
 msgstr "Logarytmiczny histogram jasności (HSV)"
 
-#: ../src/histogram.c:122
+#: ../src/histogram.c:130
 msgid "Linear Histogram on Red"
 msgstr "Liniowy histogram czerwonego"
 
-#: ../src/histogram.c:123
+#: ../src/histogram.c:131
 msgid "Linear Histogram on Green"
 msgstr "Liniowy histogram zielonego"
 
-#: ../src/histogram.c:124
+#: ../src/histogram.c:132
 msgid "Linear Histogram on Blue"
 msgstr "Liniowy histogram niebieskiego"
 
-#: ../src/histogram.c:125
+#: ../src/histogram.c:133
 msgid "Linear Histogram on RGB"
 msgstr "Liniowy histogram RGB"
 
-#: ../src/histogram.c:126
+#: ../src/histogram.c:134
 msgid "Linear Histogram on value"
 msgstr "Liniowy histogram jasności (HSV)"
 
-#: ../src/history_list.c:131
+#: ../src/history_list.c:139
 #, c-format
 msgid "Unable to write history lists to: %s\n"
 msgstr "Nie można zapisać list historii w: %s\n"
 
-#: ../src/image.c:161
+#: ../src/image.c:169
 #, c-format
 msgid " (Collection %s)"
 msgstr "(Kolekcja %s)"
 
-#: ../src/image_load_jpeg.c:177
+#: ../src/image_load_jpeg.c:163
 #, c-format
 msgid "Error interpreting JPEG image file (%s)"
 msgstr "Bład interpretacji pliku JPEG (%s)"
 
-#: ../src/img-view.c:1253 ../src/layout_image.c:483 ../src/layout_util.c:1333
-#: ../src/layout_util.c:1334 ../src/layout_util.c:1349
-#: ../src/layout_util.c:1350 ../src/pan-view.c:2602
+#: ../src/img-view.c:1263 ../src/layout_image.c:650 ../src/layout_util.c:1505
+#: ../src/layout_util.c:1506 ../src/layout_util.c:1521
+#: ../src/layout_util.c:1522 ../src/pan-view/pan-view.c:2618
 msgid "Zoom _in"
 msgstr "Pow_iększ"
 
-#: ../src/img-view.c:1254 ../src/layout_image.c:484 ../src/layout_util.c:1335
-#: ../src/layout_util.c:1336 ../src/layout_util.c:1351
-#: ../src/layout_util.c:1352 ../src/pan-view.c:2604
+#: ../src/img-view.c:1264 ../src/layout_image.c:651 ../src/layout_util.c:1507
+#: ../src/layout_util.c:1508 ../src/layout_util.c:1523
+#: ../src/layout_util.c:1524 ../src/pan-view/pan-view.c:2620
 msgid "Zoom _out"
 msgstr "Po_mniejsz"
 
-#: ../src/img-view.c:1255 ../src/layout_image.c:485 ../src/layout_util.c:1337
-#: ../src/layout_util.c:1338 ../src/layout_util.c:1353
-#: ../src/layout_util.c:1354 ../src/pan-view.c:2606
+#: ../src/img-view.c:1265 ../src/layout_image.c:652 ../src/layout_util.c:1509
+#: ../src/layout_util.c:1510 ../src/layout_util.c:1525
+#: ../src/layout_util.c:1526 ../src/pan-view/pan-view.c:2622
 msgid "Zoom _1:1"
 msgstr "Skala _1:1"
 
-#: ../src/img-view.c:1256 ../src/layout_image.c:486
+#: ../src/img-view.c:1266 ../src/layout_image.c:653
 msgid "Fit image to _window"
 msgstr "Dopasowanie obrazu do _okna"
 
-#: ../src/img-view.c:1264 ../src/layout_image.c:495 ../src/layout_util.c:1331
+#: ../src/img-view.c:1274 ../src/layout_image.c:662 ../src/layout_util.c:1503
 msgid "Set as _wallpaper"
 msgstr "Usta_w jako tapetę"
 
-#: ../src/img-view.c:1269 ../src/layout_image.c:502
+#: ../src/img-view.c:1279 ../src/layout_image.c:669
 msgid "_Go to directory view"
 msgstr "Przejdź do widoku katalogu"
 
-#: ../src/img-view.c:1282 ../src/layout_image.c:523
+#: ../src/img-view.c:1292 ../src/layout_image.c:690
 msgid "_Stop slideshow"
 msgstr "_Zatrzymaj pokaz slajdów"
 
-#: ../src/img-view.c:1285 ../src/layout_image.c:526
+#: ../src/img-view.c:1295 ../src/layout_image.c:693
 msgid "Continue slides_how"
 msgstr "Kontyn_uuj pokaz slajdów"
 
-#: ../src/img-view.c:1290 ../src/img-view.c:1298 ../src/layout_image.c:531
-#: ../src/layout_image.c:538
+#: ../src/img-view.c:1300 ../src/img-view.c:1308 ../src/layout_image.c:698
+#: ../src/layout_image.c:705
 msgid "Pause slides_how"
 msgstr "W_strzymaj pokaz slajdów"
 
-#: ../src/img-view.c:1296 ../src/layout_image.c:537
+#: ../src/img-view.c:1306 ../src/layout_image.c:704
 msgid "_Start slideshow"
 msgstr "Rozpo_cznij pokaz slajdów"
 
-#: ../src/img-view.c:1304 ../src/layout_image.c:548 ../src/pan-view.c:2675
+#: ../src/img-view.c:1314 ../src/layout_image.c:715
+#: ../src/pan-view/pan-view.c:2691
 msgid "Exit _full screen"
 msgstr "Opuść tryb pełnoekranowy"
 
-#: ../src/img-view.c:1308 ../src/layout_image.c:544 ../src/pan-view.c:2679
+#: ../src/img-view.c:1318 ../src/layout_image.c:711
+#: ../src/pan-view/pan-view.c:2695
 msgid "_Full screen"
 msgstr "Pełny ekran"
 
-#: ../src/img-view.c:1312 ../src/layout_util.c:1316 ../src/pan-view.c:2683
+#: ../src/img-view.c:1322 ../src/layout_util.c:1488
+#: ../src/pan-view/pan-view.c:2699
 msgid "C_lose window"
 msgstr "Zamknij okno"
 
-#: ../src/layout.c:358 ../src/view_file.c:613
+#: ../src/layout.c:367 ../src/view_file.c:649
 msgid "Ascending"
 msgstr "Rosnąco"
 
-#: ../src/layout.c:428
+#: ../src/layout.c:437
 msgid " Slideshow"
 msgstr " Slajdy"
 
-#: ../src/layout.c:432
+#: ../src/layout.c:441
 msgid " Paused"
 msgstr " Zatrzymane"
 
-#: ../src/layout.c:448
+#: ../src/layout.c:457
 #, c-format
 msgid "%s, %d files (%s, %d)%s"
 msgstr "%s, %d plików (%s, %d)%s"
 
-#: ../src/layout.c:455
+#: ../src/layout.c:464
 #, c-format
 msgid "%s, %d files%s"
 msgstr "%s, %d plików%s"
 
-#: ../src/layout.c:460
+#: ../src/layout.c:469
 #, c-format
 msgid "%d files%s"
 msgstr "%d plików%s"
 
-#: ../src/layout.c:506
+#: ../src/layout.c:515
 #, c-format
 msgid "(no read permission) %s bytes"
 msgstr "(brak uprawnień do odczytu) %s bajtów"
 
-#: ../src/layout.c:510
+#: ../src/layout.c:519
 #, c-format
 msgid "( ? x ? ) %s bytes"
 msgstr "( ? x ? ) %s bajtów"
 
-#: ../src/layout.c:518
+#: ../src/layout.c:527
 #, c-format
 msgid "( %d x %d ) %s bytes"
 msgstr "( %d x %d ) %s bajtów"
 
-#: ../src/layout.c:1243 ../src/layout_config.c:58
+#: ../src/layout.c:1252 ../src/layout_config.c:67
 msgid "Tools"
 msgstr "Narzędzia"
 
-#: ../src/layout.c:1865
+#: ../src/layout.c:1879
 msgid "Window options and layout"
 msgstr "Ustawienia okna i jego ułożenia"
 
-#: ../src/layout.c:1924
+#: ../src/layout.c:1944
 msgid "General options"
 msgstr "Ogólne"
 
-#: ../src/layout.c:1926
+#: ../src/layout.c:1946
 msgid "Home path (empty to use your home directory)"
 msgstr "Katalog startowy (zostaw puste by ustawić twój katalog domowy)"
 
-#: ../src/layout.c:1934
+#: ../src/layout.c:1954
 msgid "Use current"
 msgstr "Wykorzystaj bieżący"
 
-#: ../src/layout.c:1937
+#: ../src/layout.c:1957
 msgid "Show date in directories list view"
 msgstr "Pokaż datę przy widoku katalogu jako listy "
 
-#: ../src/layout.c:1940
+#: ../src/layout.c:1960
 msgid "Exit program when this window is closed"
 msgstr "Zamknij program po zamknięciu tego okna"
 
-#: ../src/layout.c:1943
+#: ../src/layout.c:1963
 msgid "Start-up directory:"
 msgstr "Katalog startowy:"
 
-#: ../src/layout.c:1945
+#: ../src/layout.c:1965
 msgid "No change"
 msgstr "Bez zmian"
 
-#: ../src/layout.c:1948
+#: ../src/layout.c:1968
 msgid "Restore last path"
 msgstr "Użyj ostatniej ścieżki"
 
-#: ../src/layout.c:1951
+#: ../src/layout.c:1971
 msgid "Home path"
 msgstr "Katalog domowy"
 
-#: ../src/layout.c:1955 ../src/print.c:3365 ../src/print.c:3372
+#: ../src/layout.c:1975 ../src/print.c:3374 ../src/print.c:3381
 msgid "Layout"
 msgstr "Ułożenie"
 
-#: ../src/layout.c:2198
+#: ../src/layout.c:2218
 msgid "Invalid geometry\n"
 msgstr "Nieprawidłowa geometria\n"
 
-#: ../src/layout_config.c:58 ../src/preferences.c:1602
-#: ../src/ui_pathsel.c:1173
+#: ../src/layout_config.c:67 ../src/preferences.c:1721 ../src/ui_pathsel.c:1182
 msgid "Files"
 msgstr "Pliki"
 
-#: ../src/layout_config.c:58 ../src/preferences.c:92 ../src/preferences.c:1375
-#: ../src/print.c:123
+#: ../src/layout_config.c:67 ../src/preferences.c:107 ../src/preferences.c:1483
+#: ../src/print.c:132
 msgid "Image"
 msgstr "Obraz"
 
-#: ../src/layout_config.c:349
+#: ../src/layout_config.c:358
 msgid "(drag to change order)"
-msgstr "(przeciągnij aby zmienić kolejność)"
-
-#: ../src/layout_image.c:553
+msgstr "(przeciągnij, aby zmienić kolejność)"
+
+#: ../src/layout_image.c:718
+msgid "_Animate"
+msgstr "_Animacja"
+
+#: ../src/layout_image.c:722
 msgid "Hide file _list"
 msgstr "Ukrycie _listy plików"
 
-#: ../src/layout_image.c:1616
+#: ../src/layout_image.c:1786
 #, c-format
 msgid "[%*d,%*d]: RGB(%3d,%3d,%3d)"
 msgstr "[%*d,%*d]: RGB(%3d,%3d,%3d)"
 
-#: ../src/layout_image.c:1624
+#: ../src/layout_image.c:1794
 #, c-format
 msgid "[%*s,%*s]: RGB(---,---,---)"
 msgstr "[%*s,%*s]: RGB(---,---,---)"
 
-#: ../src/layout_util.c:1269
+#: ../src/layout_util.c:1441
 msgid "_File"
 msgstr "_Plik"
 
-#: ../src/layout_util.c:1270
+#: ../src/layout_util.c:1442
 msgid "_Go"
 msgstr "Idź do"
 
-#: ../src/layout_util.c:1271 ../src/menu.c:109
+#: ../src/layout_util.c:1443 ../src/menu.c:117
 msgid "_Edit"
 msgstr "_Edycja"
 
-#: ../src/layout_util.c:1272
+#: ../src/layout_util.c:1444
 msgid "_Select"
 msgstr "Zaznaczenie"
 
-#: ../src/layout_util.c:1273 ../src/menu.c:284
+#: ../src/layout_util.c:1445 ../src/menu.c:292
 msgid "_Orientation"
 msgstr "Orientacja"
 
-#: ../src/layout_util.c:1274
+#: ../src/layout_util.c:1446
 msgid "E_xternal Editors"
 msgstr "Zewnętrzne edytory"
 
-#: ../src/layout_util.c:1275
+#: ../src/layout_util.c:1447
 msgid "P_references"
 msgstr "P_referencje..."
 
-#: ../src/layout_util.c:1277
+#: ../src/layout_util.c:1449
 msgid "_Files and Folders"
 msgstr "Pliki i katalogi"
 
-#: ../src/layout_util.c:1278
+#: ../src/layout_util.c:1450
 msgid "_Zoom"
 msgstr "Skalowanie"
 
-#: ../src/layout_util.c:1279
+#: ../src/layout_util.c:1451
 msgid "_Color Management"
 msgstr "Zarządzanie kolorami"
 
-#: ../src/layout_util.c:1280
+#: ../src/layout_util.c:1452
 msgid "_Connected Zoom"
 msgstr "Powiązana zmiana skali"
 
-#: ../src/layout_util.c:1281
+#: ../src/layout_util.c:1453
 msgid "Spli_t"
 msgstr "Podziel"
 
-#: ../src/layout_util.c:1282
+#: ../src/layout_util.c:1454
 msgid "Stere_o"
 msgstr "Stere_o"
 
-#: ../src/layout_util.c:1283 ../src/layout_util.c:1399
+#: ../src/layout_util.c:1455 ../src/layout_util.c:1572
 msgid "Image _Overlay"
-msgstr ""
-
-#: ../src/layout_util.c:1284
+msgstr "_Nakładka"
+
+#: ../src/layout_util.c:1456
 msgid "_Help"
 msgstr "Pomo_c"
 
-#: ../src/layout_util.c:1286
+#: ../src/layout_util.c:1458
 msgid "_First Image"
 msgstr "Pierwszy obraz"
 
-#: ../src/layout_util.c:1286
+#: ../src/layout_util.c:1458
 msgid "First Image"
 msgstr "Pierwszy obraz"
 
-#: ../src/layout_util.c:1287 ../src/layout_util.c:1288
-#: ../src/layout_util.c:1289
+#: ../src/layout_util.c:1459 ../src/layout_util.c:1460
+#: ../src/layout_util.c:1461
 msgid "_Previous Image"
 msgstr "_Poprzedni obraz"
 
-#: ../src/layout_util.c:1287 ../src/layout_util.c:1288
-#: ../src/layout_util.c:1289
+#: ../src/layout_util.c:1459 ../src/layout_util.c:1460
+#: ../src/layout_util.c:1461
 msgid "Previous Image"
 msgstr "_Poprzedni obraz"
 
-#: ../src/layout_util.c:1290 ../src/layout_util.c:1291
-#: ../src/layout_util.c:1292
+#: ../src/layout_util.c:1462 ../src/layout_util.c:1463
+#: ../src/layout_util.c:1464
 msgid "_Next Image"
 msgstr "_Następny obraz"
 
-#: ../src/layout_util.c:1290 ../src/layout_util.c:1291
-#: ../src/layout_util.c:1292
+#: ../src/layout_util.c:1462 ../src/layout_util.c:1463
+#: ../src/layout_util.c:1464
 msgid "Next Image"
 msgstr "_Następny obraz"
 
-#: ../src/layout_util.c:1293
+#: ../src/layout_util.c:1465
 msgid "_Last Image"
 msgstr "_Ostatni obraz"
 
-#: ../src/layout_util.c:1293
+#: ../src/layout_util.c:1465
 msgid "Last Image"
 msgstr "_Ostatni obraz"
 
-#: ../src/layout_util.c:1294
+#: ../src/layout_util.c:1466
 msgid "_Back"
 msgstr "_Powrót"
 
-#: ../src/layout_util.c:1294
+#: ../src/layout_util.c:1466
 msgid "Back"
 msgstr "Powrót"
 
-#: ../src/layout_util.c:1295
+#: ../src/layout_util.c:1467
 msgid "_Home"
 msgstr "Położenie początkowe"
 
-#: ../src/layout_util.c:1295 ../src/options.c:156 ../src/ui_bookmark.c:549
-#: ../src/ui_pathsel.c:1045
+#: ../src/layout_util.c:1467 ../src/options.c:170 ../src/ui_bookmark.c:566
+#: ../src/ui_pathsel.c:1054
 msgid "Home"
 msgstr "Położenie początkowe"
 
-#: ../src/layout_util.c:1296
+#: ../src/layout_util.c:1468
 msgid "_Up"
-msgstr ""
-
-#: ../src/layout_util.c:1296
+msgstr "W _górę"
+
+#: ../src/layout_util.c:1468
 msgid "Up"
-msgstr ""
-
-#: ../src/layout_util.c:1298
+msgstr "W górę"
+
+#: ../src/layout_util.c:1470
 msgid "New _window"
 msgstr "No_we okno"
 
-#: ../src/layout_util.c:1298
+#: ../src/layout_util.c:1470
 msgid "New window"
 msgstr "No_we okno"
 
-#: ../src/layout_util.c:1299
+#: ../src/layout_util.c:1471
 msgid "_New collection"
 msgstr "_Nowa kolekcja"
 
-#: ../src/layout_util.c:1299
+#: ../src/layout_util.c:1471
 msgid "New collection"
 msgstr "_Nowa kolekcja"
 
-#: ../src/layout_util.c:1300
+#: ../src/layout_util.c:1472
 msgid "_Open collection..."
 msgstr "Otwórz kolekcję..."
 
-#: ../src/layout_util.c:1300
+#: ../src/layout_util.c:1472
 msgid "Open collection..."
 msgstr "Otwórz kolekcję..."
 
-#: ../src/layout_util.c:1301
+#: ../src/layout_util.c:1473
 msgid "Open recen_t"
 msgstr "Otwó_rz ostatni"
 
-#: ../src/layout_util.c:1301
+#: ../src/layout_util.c:1473
 msgid "Open recent"
 msgstr "Otwó_rz ostatni"
 
-#: ../src/layout_util.c:1302
+#: ../src/layout_util.c:1474
 msgid "_Search..."
 msgstr "Szukaj..."
 
-#: ../src/layout_util.c:1302
+#: ../src/layout_util.c:1474
 msgid "Search..."
 msgstr "Szukaj..."
 
-#: ../src/layout_util.c:1303
+#: ../src/layout_util.c:1475
 msgid "Find duplicates..."
 msgstr "Wyszukaj duplikaty..."
 
-#: ../src/layout_util.c:1304
+#: ../src/layout_util.c:1476
 msgid "Pa_n view"
 msgstr ""
 
-#: ../src/layout_util.c:1304
+#: ../src/layout_util.c:1476
 msgid "Pan view"
 msgstr ""
 
-#: ../src/layout_util.c:1305
+#: ../src/layout_util.c:1477
 msgid "_Print..."
 msgstr "Drukuj..."
 
-#: ../src/layout_util.c:1306
+#: ../src/layout_util.c:1478
 msgid "N_ew folder..."
 msgstr "Nowy katalog..."
 
-#: ../src/layout_util.c:1306
+#: ../src/layout_util.c:1478
 msgid "New folder..."
 msgstr "Nowy katalog..."
 
-#: ../src/layout_util.c:1307
+#: ../src/layout_util.c:1479
 msgid "Copy..."
 msgstr "_Kopiuj..."
 
-#: ../src/layout_util.c:1308
+#: ../src/layout_util.c:1480
 msgid "Move..."
 msgstr "P_rzenieś..."
 
-#: ../src/layout_util.c:1309
+#: ../src/layout_util.c:1481
 msgid "Rename..."
 msgstr "Zm_ień nazwę..."
 
-#: ../src/layout_util.c:1310 ../src/layout_util.c:1311
-#: ../src/layout_util.c:1312
+#: ../src/layout_util.c:1482 ../src/layout_util.c:1483
+#: ../src/layout_util.c:1484
 msgid "Delete..."
 msgstr "_Usuń..."
 
-#: ../src/layout_util.c:1313 ../src/view_file.c:603
+#: ../src/layout_util.c:1485 ../src/view_file.c:633
 msgid "Enable file _grouping"
 msgstr "Włącz _grupowanie plików"
 
-#: ../src/layout_util.c:1313
+#: ../src/layout_util.c:1485
 msgid "Enable file grouping"
 msgstr "Włącz grupowanie plików"
 
-#: ../src/layout_util.c:1314 ../src/view_file.c:605
+#: ../src/layout_util.c:1486 ../src/view_file.c:635
 msgid "Disable file groupi_ng"
 msgstr "Wyłącz grupowanie plików"
 
-#: ../src/layout_util.c:1314
+#: ../src/layout_util.c:1486
 msgid "Disable file grouping"
 msgstr "Wyłącz grupowanie plików"
 
-#: ../src/layout_util.c:1315
+#: ../src/layout_util.c:1487
 msgid "_Copy path to clipboard"
 msgstr "S_kopiuj ścieżkę do schowka"
 
-#: ../src/layout_util.c:1315
+#: ../src/layout_util.c:1487
 msgid "Copy path to clipboard"
 msgstr "Kopiuj ścieżkę do schowka"
 
-#: ../src/layout_util.c:1316
+#: ../src/layout_util.c:1488
 msgid "Close window"
 msgstr "Zamknij okno"
 
-#: ../src/layout_util.c:1317
+#: ../src/layout_util.c:1489
 msgid "_Quit"
 msgstr "Zakończ"
 
-#: ../src/layout_util.c:1317
+#: ../src/layout_util.c:1489
 msgid "Quit"
 msgstr "Zakończ"
 
-#: ../src/layout_util.c:1318 ../src/menu.c:226
+#: ../src/layout_util.c:1490 ../src/menu.c:234
 msgid "_Rotate clockwise"
 msgstr "Obróć _zgodnie z zegarem"
 
-#: ../src/layout_util.c:1318
+#: ../src/layout_util.c:1490
 msgid "Rotate clockwise"
 msgstr "Obróć zgodnie ze wskazówkami zegara"
 
-#: ../src/layout_util.c:1319 ../src/menu.c:229
+#: ../src/layout_util.c:1491 ../src/menu.c:237
 msgid "Rotate _counterclockwise"
 msgstr "Obróć _przeciwnie do zegara"
 
-#: ../src/layout_util.c:1319
+#: ../src/layout_util.c:1491
 msgid "Rotate counterclockwise"
 msgstr "Obróć przeciwnie do wskazówek zegara"
 
-#: ../src/layout_util.c:1320
+#: ../src/layout_util.c:1492
 msgid "Rotate 1_80"
 msgstr "Obróć o 1_80"
 
-#: ../src/layout_util.c:1320
+#: ../src/layout_util.c:1492
 msgid "Rotate 180"
 msgstr "Obróć o 180"
 
-#: ../src/layout_util.c:1321 ../src/menu.c:235
+#: ../src/layout_util.c:1493 ../src/menu.c:243
 msgid "_Mirror"
 msgstr "Odbicie _lustrzane"
 
-#: ../src/layout_util.c:1321
+#: ../src/layout_util.c:1493
 msgid "Mirror"
 msgstr "Odbicie lustrzane"
 
-#: ../src/layout_util.c:1322 ../src/menu.c:238
+#: ../src/layout_util.c:1494 ../src/menu.c:246
 msgid "_Flip"
 msgstr "O_dbij w pionie"
 
-#: ../src/layout_util.c:1322
+#: ../src/layout_util.c:1494
 msgid "Flip"
 msgstr "Odbij w pionie"
 
-#: ../src/layout_util.c:1323 ../src/menu.c:241
+#: ../src/layout_util.c:1495 ../src/menu.c:249
 msgid "_Original state"
 msgstr "_Oryginalna orientacja"
 
-#: ../src/layout_util.c:1323
+#: ../src/layout_util.c:1495
 msgid "Original state"
 msgstr "Oryginalna orientacja"
 
-#: ../src/layout_util.c:1324
+#: ../src/layout_util.c:1496
 msgid "Select _all"
 msgstr "Zazn_acz wszystko"
 
-#: ../src/layout_util.c:1325
+#: ../src/layout_util.c:1497
 msgid "Select _none"
 msgstr "Odz_nacz"
 
-#: ../src/layout_util.c:1326
+#: ../src/layout_util.c:1498
 msgid "_Invert Selection"
 msgstr "Odwróć zaznaczenie"
 
-#: ../src/layout_util.c:1326
+#: ../src/layout_util.c:1498
 msgid "Invert Selection"
 msgstr "Odwróć zaznaczenie"
 
-#: ../src/layout_util.c:1327
+#: ../src/layout_util.c:1499
 msgid "P_references..."
 msgstr "P_referencje..."
 
-#: ../src/layout_util.c:1327
+#: ../src/layout_util.c:1499
 msgid "Preferences..."
 msgstr "Preferencje..."
 
-#: ../src/layout_util.c:1328
+#: ../src/layout_util.c:1500
 msgid "Configure _Editors..."
 msgstr "Konfiguruj _Edytory..."
 
-#: ../src/layout_util.c:1328
+#: ../src/layout_util.c:1500
 msgid "Configure Editors..."
 msgstr "Konfiguruj Edytory..."
 
-#: ../src/layout_util.c:1329
+#: ../src/layout_util.c:1501
 msgid "_Configure this window..."
 msgstr "Konfiguruj to okno..."
 
-#: ../src/layout_util.c:1329
+#: ../src/layout_util.c:1501
 msgid "Configure this window..."
 msgstr "Konfiguruj to okno..."
 
-#: ../src/layout_util.c:1330
+#: ../src/layout_util.c:1502
 msgid "_Thumbnail maintenance..."
 msgstr "Zarządzanie minia_turkami..."
 
-#: ../src/layout_util.c:1330
+#: ../src/layout_util.c:1502
 msgid "Thumbnail maintenance..."
 msgstr "Zarządzanie miniaturkami..."
 
-#: ../src/layout_util.c:1331
+#: ../src/layout_util.c:1503
 msgid "Set as wallpaper"
 msgstr "Ustaw jako tapetę"
 
-#: ../src/layout_util.c:1332
+#: ../src/layout_util.c:1504
 msgid "_Save metadata"
 msgstr "Zapi_sz metadane"
 
-#: ../src/layout_util.c:1332
+#: ../src/layout_util.c:1504
 msgid "Save metadata"
 msgstr "Zapisz metadane"
 
-#: ../src/layout_util.c:1333 ../src/layout_util.c:1334
+#: ../src/layout_util.c:1505 ../src/layout_util.c:1506
 msgid "Zoom in"
 msgstr "Powiększ"
 
-#: ../src/layout_util.c:1335 ../src/layout_util.c:1336
+#: ../src/layout_util.c:1507 ../src/layout_util.c:1508
 msgid "Zoom out"
 msgstr "Pomniejsz"
 
-#: ../src/layout_util.c:1337 ../src/layout_util.c:1338
+#: ../src/layout_util.c:1509 ../src/layout_util.c:1510
 msgid "Zoom 1:1"
 msgstr "Skala 1:1"
 
-#: ../src/layout_util.c:1339 ../src/layout_util.c:1340
-#: ../src/layout_util.c:1355 ../src/layout_util.c:1356
+#: ../src/layout_util.c:1511 ../src/layout_util.c:1512
+#: ../src/layout_util.c:1527 ../src/layout_util.c:1528
 msgid "_Zoom to fit"
 msgstr "Dopasuj do okna"
 
-#: ../src/layout_util.c:1339 ../src/layout_util.c:1340
+#: ../src/layout_util.c:1511 ../src/layout_util.c:1512
 msgid "Zoom to fit"
 msgstr "Dopasuj do okna"
 
-#: ../src/layout_util.c:1341 ../src/layout_util.c:1357
+#: ../src/layout_util.c:1513 ../src/layout_util.c:1529
 msgid "Fit _Horizontally"
 msgstr "Dopasuj w poziomie"
 
-#: ../src/layout_util.c:1341
+#: ../src/layout_util.c:1513
 msgid "Fit Horizontally"
 msgstr "Dopasuj w poziomie"
 
-#: ../src/layout_util.c:1342 ../src/layout_util.c:1358
+#: ../src/layout_util.c:1514 ../src/layout_util.c:1530
 msgid "Fit _Vertically"
 msgstr "Dopasuj w pionie"
 
-#: ../src/layout_util.c:1342
+#: ../src/layout_util.c:1514
 msgid "Fit Vertically"
 msgstr "Dopasuj w pionie"
 
-#: ../src/layout_util.c:1343 ../src/layout_util.c:1359
+#: ../src/layout_util.c:1515 ../src/layout_util.c:1531
 msgid "Zoom _2:1"
 msgstr "Skala _2:1"
 
-#: ../src/layout_util.c:1343
+#: ../src/layout_util.c:1515
 msgid "Zoom 2:1"
 msgstr "Skala 2:1"
 
-#: ../src/layout_util.c:1344 ../src/layout_util.c:1360
+#: ../src/layout_util.c:1516 ../src/layout_util.c:1532
 msgid "Zoom _3:1"
 msgstr "Skala _3:1"
 
-#: ../src/layout_util.c:1344
+#: ../src/layout_util.c:1516
 msgid "Zoom 3:1"
 msgstr "Skala 3:1"
 
-#: ../src/layout_util.c:1345 ../src/layout_util.c:1361
+#: ../src/layout_util.c:1517 ../src/layout_util.c:1533
 msgid "Zoom _4:1"
 msgstr "Skala _4:1"
 
-#: ../src/layout_util.c:1345
+#: ../src/layout_util.c:1517
 msgid "Zoom 4:1"
 msgstr "Skala 4:1"
 
-#: ../src/layout_util.c:1346 ../src/layout_util.c:1362
+#: ../src/layout_util.c:1518 ../src/layout_util.c:1534
 msgid "Zoom 1:2"
 msgstr "Skala _1:2"
 
-#: ../src/layout_util.c:1347 ../src/layout_util.c:1363
+#: ../src/layout_util.c:1519 ../src/layout_util.c:1535
 msgid "Zoom 1:3"
 msgstr "Skala _1:3"
 
-#: ../src/layout_util.c:1348 ../src/layout_util.c:1364
+#: ../src/layout_util.c:1520 ../src/layout_util.c:1536
 msgid "Zoom 1:4"
 msgstr "Skala _1:4"
 
-#: ../src/layout_util.c:1349 ../src/layout_util.c:1350
+#: ../src/layout_util.c:1521 ../src/layout_util.c:1522
 msgid "Connected Zoom in"
 msgstr "Powiązane powiększenie"
 
-#: ../src/layout_util.c:1351 ../src/layout_util.c:1352
+#: ../src/layout_util.c:1523 ../src/layout_util.c:1524
 msgid "Connected Zoom out"
 msgstr "Powiązane zmniejszenie"
 
-#: ../src/layout_util.c:1353 ../src/layout_util.c:1354
+#: ../src/layout_util.c:1525 ../src/layout_util.c:1526
 msgid "Connected Zoom 1:1"
 msgstr "Ustaw powiązane powiększenie 1:1"
 
-#: ../src/layout_util.c:1355 ../src/layout_util.c:1356
+#: ../src/layout_util.c:1527 ../src/layout_util.c:1528
 msgid "Connected Zoom to fit"
 msgstr "Powiązane dopasowanie do okna"
 
-#: ../src/layout_util.c:1357
+#: ../src/layout_util.c:1529
 msgid "Connected Fit Horizontally"
 msgstr "Powiązane dopasowanie w poziomie"
 
-#: ../src/layout_util.c:1358
+#: ../src/layout_util.c:1530
 msgid "Connected Fit Vertically"
 msgstr "Powiązane dopasowanie w pionie"
 
-#: ../src/layout_util.c:1359
+#: ../src/layout_util.c:1531
 msgid "Connected Zoom 2:1"
 msgstr "Ustaw powiązane powiększenie 2:1"
 
-#: ../src/layout_util.c:1360
+#: ../src/layout_util.c:1532
 msgid "Connected Zoom 3:1"
 msgstr "Ustaw powiązane powiększenie 3:1"
 
-#: ../src/layout_util.c:1361
+#: ../src/layout_util.c:1533
 msgid "Connected Zoom 4:1"
 msgstr "Ustaw powiązane powiększenie 4:1"
 
-#: ../src/layout_util.c:1362
+#: ../src/layout_util.c:1534
 msgid "Connected Zoom 1:2"
 msgstr "Ustaw powiązane powiększenie 1:2"
 
-#: ../src/layout_util.c:1363
+#: ../src/layout_util.c:1535
 msgid "Connected Zoom 1:3"
 msgstr "Ustaw powiązane powiększenie 1:3"
 
-#: ../src/layout_util.c:1364
+#: ../src/layout_util.c:1536
 msgid "Connected Zoom 1:4"
 msgstr "Ustaw powiązane powiększenie 1:4"
 
-#: ../src/layout_util.c:1365
+#: ../src/layout_util.c:1537
 msgid "_View in new window"
 msgstr "Podgląd w _nowym oknie"
 
-#: ../src/layout_util.c:1365
+#: ../src/layout_util.c:1537
 msgid "View in new window"
 msgstr "Podgląd w nowym oknie"
 
-#: ../src/layout_util.c:1366 ../src/layout_util.c:1367
-#: ../src/layout_util.c:1368
+#: ../src/layout_util.c:1538 ../src/layout_util.c:1539
+#: ../src/layout_util.c:1540
 msgid "F_ull screen"
 msgstr "P_ełny ekran"
 
-#: ../src/layout_util.c:1369 ../src/layout_util.c:1370
+#: ../src/layout_util.c:1541 ../src/layout_util.c:1542
 msgid "_Leave full screen"
 msgstr "Wyłącz pełny ekran"
 
-#: ../src/layout_util.c:1369 ../src/layout_util.c:1370
+#: ../src/layout_util.c:1541 ../src/layout_util.c:1542
 msgid "Leave full screen"
 msgstr "Wyłącz pełny ekran"
 
-#: ../src/layout_util.c:1371
+#: ../src/layout_util.c:1543
 msgid "_Cycle through overlay modes"
-msgstr ""
-
-#: ../src/layout_util.c:1371
+msgstr "_Przechodzenie pomiędzy trybami nakładki"
+
+#: ../src/layout_util.c:1543
 msgid "Cycle through Overlay modes"
-msgstr ""
-
-#: ../src/layout_util.c:1372
+msgstr "Przechodzenie pomiędzy trybami nakładki"
+
+#: ../src/layout_util.c:1544
 msgid "Cycle through histogram ch_annels"
 msgstr "Przechodzenie pomiędzy k_anałami histogramu"
 
-#: ../src/layout_util.c:1372
+#: ../src/layout_util.c:1544
 msgid "Cycle through histogram channels"
 msgstr "Przechodzenie pomiędzy kanałami histogramu"
 
-#: ../src/layout_util.c:1373
+#: ../src/layout_util.c:1545
 msgid "Cycle through histogram mo_des"
 msgstr "Przechodzenie pomiędzy _trybami histogramu"
 
-#: ../src/layout_util.c:1373
+#: ../src/layout_util.c:1545
 msgid "Cycle through histogram modes"
 msgstr "Przechodzenie pomiędzy trybami histogramu"
 
-#: ../src/layout_util.c:1374
+#: ../src/layout_util.c:1546
 msgid "_Hide file list"
 msgstr "Ukrycie _listy plików"
 
-#: ../src/layout_util.c:1374
+#: ../src/layout_util.c:1546
 msgid "Hide file list"
 msgstr "Ukryj listę plików"
 
-#: ../src/layout_util.c:1375
+#: ../src/layout_util.c:1547
 msgid "_Pause slideshow"
 msgstr "W_strzymaj pokaz slajdów"
 
-#: ../src/layout_util.c:1375
+#: ../src/layout_util.c:1547
 msgid "Pause slideshow"
 msgstr "Wstrzymaj pokaz slajdów"
 
-#: ../src/layout_util.c:1376
+#: ../src/layout_util.c:1548
 msgid "_Refresh"
 msgstr "_Odśwież"
 
-#: ../src/layout_util.c:1376
+#: ../src/layout_util.c:1548
 msgid "Refresh"
 msgstr "Odśwież"
 
-#: ../src/layout_util.c:1377
+#: ../src/layout_util.c:1549
 msgid "_Contents"
 msgstr "Indeks"
 
-#: ../src/layout_util.c:1377
+#: ../src/layout_util.c:1549
 msgid "Contents"
 msgstr "Zawartość"
 
-#: ../src/layout_util.c:1378
+#: ../src/layout_util.c:1550
 msgid "_Keyboard shortcuts"
 msgstr "Skróty _klawiszowe"
 
-#: ../src/layout_util.c:1378
+#: ../src/layout_util.c:1550
 msgid "Keyboard shortcuts"
 msgstr "Skróty klawiszowe"
 
-#: ../src/layout_util.c:1379
+#: ../src/layout_util.c:1551
+msgid "_Keyboard map"
+msgstr "Mapowanie _klawiszy"
+
+#: ../src/layout_util.c:1551
+msgid "Keyboard map"
+msgstr "Mapowanie klawiszy"
+
+#: ../src/layout_util.c:1552
 msgid "_Release notes"
 msgstr "Wydanie"
 
-#: ../src/layout_util.c:1379
+#: ../src/layout_util.c:1552
 msgid "Release notes"
 msgstr "O wydaniu"
 
-#: ../src/layout_util.c:1380
+#: ../src/layout_util.c:1553
 msgid "_About"
 msgstr "O progr_amie"
 
-#: ../src/layout_util.c:1380 ../src/preferences.c:2328
+#: ../src/layout_util.c:1553 ../src/preferences.c:2523
 msgid "About"
 msgstr "O progr_amie"
 
-#: ../src/layout_util.c:1381
+#: ../src/layout_util.c:1554
 msgid "_Log Window"
 msgstr "Okno _logów"
 
-#: ../src/layout_util.c:1381
+#: ../src/layout_util.c:1554
 msgid "Log Window"
 msgstr "Okno logów"
 
-#: ../src/layout_util.c:1382
+#: ../src/layout_util.c:1555
 msgid "_Exif window"
 msgstr "Okno danych Exif"
 
-#: ../src/layout_util.c:1382
+#: ../src/layout_util.c:1555
 msgid "Exif window"
 msgstr "Okno danych Exif"
 
-#: ../src/layout_util.c:1383
+#: ../src/layout_util.c:1556
 msgid "_Cycle through stereo modes"
-msgstr ""
-
-#: ../src/layout_util.c:1383
+msgstr "_Przechodzenie pomiędzy trybami stereo"
+
+#: ../src/layout_util.c:1556
 msgid "Cycle through stereo modes"
-msgstr ""
-
-#: ../src/layout_util.c:1388
+msgstr "Przechodzenie pomiędzy trybami stereo"
+
+#: ../src/layout_util.c:1561
 msgid "Show _Thumbnails"
 msgstr "Pokaż _miniaturki"
 
-#: ../src/layout_util.c:1388
+#: ../src/layout_util.c:1561
 msgid "Show Thumbnails"
 msgstr "Pokaż miniaturki"
 
-#: ../src/layout_util.c:1389
+#: ../src/layout_util.c:1562
 msgid "Show _Marks"
 msgstr "Pokaż znaczniki"
 
-#: ../src/layout_util.c:1389
+#: ../src/layout_util.c:1562
 msgid "Show Marks"
 msgstr "Pokaż znaczniki"
 
-#: ../src/layout_util.c:1390
+#: ../src/layout_util.c:1563
 msgid "Pi_xel Info"
 msgstr "Wyświetlanie informacji o pikselach"
 
-#: ../src/layout_util.c:1390
+#: ../src/layout_util.c:1563
 msgid "Show Pixel Info"
 msgstr "Wyświetlaj informacje o pikselach"
 
-#: ../src/layout_util.c:1391
+#: ../src/layout_util.c:1564
 msgid "_Float file list"
 msgstr "Oderwana lista plików"
 
-#: ../src/layout_util.c:1391
+#: ../src/layout_util.c:1564
 msgid "Float file list"
 msgstr "Oderwana lista plików"
 
-#: ../src/layout_util.c:1392
+#: ../src/layout_util.c:1565
 msgid "Hide tool_bar"
 msgstr "Ukryj pasek narzędzi"
 
-#: ../src/layout_util.c:1392
+#: ../src/layout_util.c:1565
 msgid "Hide toolbar"
 msgstr "Ukryj pasek narzędzi"
 
-#: ../src/layout_util.c:1393
+#: ../src/layout_util.c:1566
 msgid "_Info sidebar"
 msgstr "Panel _Informacyjny"
 
-#: ../src/layout_util.c:1393
+#: ../src/layout_util.c:1566
 msgid "Info sidebar"
 msgstr "Panel informacyjny"
 
-#: ../src/layout_util.c:1394
+#: ../src/layout_util.c:1567
 msgid "Sort _manager"
 msgstr "_Menedżer sortowania"
 
-#: ../src/layout_util.c:1394
+#: ../src/layout_util.c:1567
 msgid "Sort manager"
 msgstr "_Menedżer sortowania"
 
-#: ../src/layout_util.c:1395
+#: ../src/layout_util.c:1568
 msgid "Toggle _slideshow"
 msgstr "Przełącz pokaz _slajdów"
 
-#: ../src/layout_util.c:1395
+#: ../src/layout_util.c:1568
 msgid "Toggle slideshow"
 msgstr "Przełącz pokaz _slajdów"
 
-#: ../src/layout_util.c:1396
+#: ../src/layout_util.c:1569
 msgid "Use _color profiles"
 msgstr "Użyj profili kolorów"
 
-#: ../src/layout_util.c:1396
+#: ../src/layout_util.c:1569
 msgid "Use color profiles"
 msgstr "Użyj profili kolorów"
 
-#: ../src/layout_util.c:1397
+#: ../src/layout_util.c:1570
 msgid "Use profile from _image"
 msgstr "Użyj prof_ili z obrazu"
 
-#: ../src/layout_util.c:1397
+#: ../src/layout_util.c:1570
 msgid "Use profile from image"
 msgstr "Użyj profili z obrazu"
 
-#: ../src/layout_util.c:1398
+#: ../src/layout_util.c:1571
 msgid "Toggle _grayscale"
 msgstr "Przełącz na odcienie szarości"
 
-#: ../src/layout_util.c:1398
+#: ../src/layout_util.c:1571
 msgid "Toggle grayscale"
 msgstr "Przełącz skalę szarości"
 
-#: ../src/layout_util.c:1399
+#: ../src/layout_util.c:1572
 msgid "Image Overlay"
-msgstr ""
-
-#: ../src/layout_util.c:1400
+msgstr "_Nakładka"
+
+#: ../src/layout_util.c:1573
 msgid "_Show Histogram"
 msgstr "Pokaż _Histogram"
 
-#: ../src/layout_util.c:1400
+#: ../src/layout_util.c:1573
 msgid "Show Histogram"
 msgstr "Pokaż Histogram"
 
-#: ../src/layout_util.c:1404
+#: ../src/layout_util.c:1577
 msgid "Image _List"
 msgstr "W postaci listy"
 
-#: ../src/layout_util.c:1404
+#: ../src/layout_util.c:1577
 msgid "View Images as List"
 msgstr "Wyświetlanie jako listę"
 
-#: ../src/layout_util.c:1405
+#: ../src/layout_util.c:1578
 msgid "I_cons"
 msgstr "Ikony"
 
-#: ../src/layout_util.c:1405
+#: ../src/layout_util.c:1578
 msgid "View Images as Icons"
 msgstr "Wyświetlanie jako ikony"
 
-#: ../src/layout_util.c:1409
+#: ../src/layout_util.c:1582
 msgid "Folder Li_st"
 msgstr "Katalogi jako lista"
 
-#: ../src/layout_util.c:1409
+#: ../src/layout_util.c:1582
 msgid "View Folders as List"
 msgstr "Pokaż katalogi jako listę"
 
-#: ../src/layout_util.c:1410
+#: ../src/layout_util.c:1583
 msgid "Folder T_ree"
 msgstr "Widok drzewiasty"
 
-#: ../src/layout_util.c:1410
+#: ../src/layout_util.c:1583
 msgid "View Folders as Tree"
 msgstr "Pokaż katalogi jako drzewo"
 
-#: ../src/layout_util.c:1414
+#: ../src/layout_util.c:1587
 msgid "_Horizontal"
 msgstr "W poziomie"
 
-#: ../src/layout_util.c:1414
+#: ../src/layout_util.c:1587
 msgid "Split Horizontal"
 msgstr "Podziel w poziomie"
 
-#: ../src/layout_util.c:1415
+#: ../src/layout_util.c:1588
 msgid "_Vertical"
 msgstr "W pionie"
 
-#: ../src/layout_util.c:1415
+#: ../src/layout_util.c:1588
 msgid "Split Vertical"
 msgstr "Podziel w pionie"
 
-#: ../src/layout_util.c:1416
+#: ../src/layout_util.c:1589
 msgid "_Quad"
 msgstr "Na cztery"
 
-#: ../src/layout_util.c:1416
+#: ../src/layout_util.c:1589
 msgid "Split Quad"
 msgstr "Podziel na cztery"
 
-#: ../src/layout_util.c:1417
+#: ../src/layout_util.c:1590
 msgid "_Single"
 msgstr "Pojedynczy"
 
-#: ../src/layout_util.c:1417
+#: ../src/layout_util.c:1590
 msgid "Split Single"
 msgstr "Bez dzielenia"
 
-#: ../src/layout_util.c:1421
+#: ../src/layout_util.c:1594
 msgid "Input _0: sRGB"
 msgstr "Profil _0: sRGB"
 
-#: ../src/layout_util.c:1421
+#: ../src/layout_util.c:1594
 msgid "Input 0: sRGB"
 msgstr "Profil 0: sRGB"
 
-#: ../src/layout_util.c:1422
+#: ../src/layout_util.c:1595
 msgid "Input _1: AdobeRGB compatible"
 msgstr "Profil _1: zgodny z AdobeRGB"
 
-#: ../src/layout_util.c:1422
+#: ../src/layout_util.c:1595
 msgid "Input 1: AdobeRGB compatible"
 msgstr "Profil 1: zgodny z AdobeRGB"
 
-#: ../src/layout_util.c:1423
+#: ../src/layout_util.c:1596
 msgid "Input _2"
 msgstr "Profil _2"
 
-#: ../src/layout_util.c:1423
+#: ../src/layout_util.c:1596
 msgid "Input 2"
 msgstr "Profil 2"
 
-#: ../src/layout_util.c:1424
+#: ../src/layout_util.c:1597
 msgid "Input _3"
 msgstr "Profil _3"
 
-#: ../src/layout_util.c:1424
+#: ../src/layout_util.c:1597
 msgid "Input 3"
 msgstr "Profil 3"
 
-#: ../src/layout_util.c:1425
+#: ../src/layout_util.c:1598
 msgid "Input _4"
 msgstr "Profil _4"
 
-#: ../src/layout_util.c:1425
+#: ../src/layout_util.c:1598
 msgid "Input 4"
 msgstr "Profil _4"
 
-#: ../src/layout_util.c:1426
+#: ../src/layout_util.c:1599
 msgid "Input _5"
 msgstr "Profil _5"
 
-#: ../src/layout_util.c:1426
+#: ../src/layout_util.c:1599
 msgid "Input 5"
 msgstr "Profil 5"
 
-#: ../src/layout_util.c:1430
+#: ../src/layout_util.c:1603
 msgid "Histogram on Red"
 msgstr "Histogram czerwonego"
 
-#: ../src/layout_util.c:1431
+#: ../src/layout_util.c:1604
 msgid "Histogram on Green"
 msgstr "Histogram zielonego"
 
-#: ../src/layout_util.c:1432
+#: ../src/layout_util.c:1605
 msgid "Histogram on Blue"
 msgstr "Histogram niebieskiego"
 
-#: ../src/layout_util.c:1433
+#: ../src/layout_util.c:1606
 msgid "Histogram on RGB"
 msgstr "_Histogram RGB"
 
-#: ../src/layout_util.c:1434
+#: ../src/layout_util.c:1607
 msgid "Histogram on Value"
 msgstr "Histogram jasności (HSV)"
 
-#: ../src/layout_util.c:1438
+#: ../src/layout_util.c:1611
 msgid "Linear Histogram"
 msgstr "Histogram liniowy"
 
-#: ../src/layout_util.c:1439
+#: ../src/layout_util.c:1612
 msgid "_Log Histogram"
 msgstr "Histogram _logarytmiczny"
 
-#: ../src/layout_util.c:1439
+#: ../src/layout_util.c:1612
 msgid "Log Histogram"
 msgstr "Histogram logarytmiczny"
 
-#: ../src/layout_util.c:1443
+#: ../src/layout_util.c:1616
 msgid "_Auto"
 msgstr "_Automatycznie"
 
-#: ../src/layout_util.c:1443
+#: ../src/layout_util.c:1616
 msgid "Stereo Auto"
 msgstr ""
 
-#: ../src/layout_util.c:1444
+#: ../src/layout_util.c:1617
 msgid "_Side by Side"
 msgstr ""
 
-#: ../src/layout_util.c:1444
+#: ../src/layout_util.c:1617
 msgid "Stereo Side by Side"
 msgstr ""
 
-#: ../src/layout_util.c:1445
+#: ../src/layout_util.c:1618
 msgid "_Cross"
 msgstr ""
 
-#: ../src/layout_util.c:1445
+#: ../src/layout_util.c:1618
 msgid "Stereo Cross"
 msgstr ""
 
-#: ../src/layout_util.c:1446
+#: ../src/layout_util.c:1619
 msgid "_Off"
 msgstr ""
 
-#: ../src/layout_util.c:1446
+#: ../src/layout_util.c:1619
 msgid "Stereo Off"
 msgstr ""
 
-#: ../src/layout_util.c:1735
+#: ../src/layout_util.c:1909
 #, c-format
 msgid "Mark _%d"
 msgstr "Znacznik _%d"
 
-#: ../src/layout_util.c:1736 ../src/view_file.c:540
+#: ../src/layout_util.c:1910 ../src/view_file.c:570
 #, c-format
 msgid "_Set mark %d"
 msgstr "U_staw znacznik %d"
 
-#: ../src/layout_util.c:1736
+#: ../src/layout_util.c:1910
 #, c-format
 msgid "Set mark %d"
 msgstr "Ustaw znacznik %d"
 
-#: ../src/layout_util.c:1737 ../src/view_file.c:541
+#: ../src/layout_util.c:1911 ../src/view_file.c:571
 #, c-format
 msgid "_Reset mark %d"
 msgstr "_Usuń znacznik %d"
 
-#: ../src/layout_util.c:1737
+#: ../src/layout_util.c:1911
 #, c-format
 msgid "Reset mark %d"
 msgstr "Usuń znacznik %d"
 
-#: ../src/layout_util.c:1738 ../src/layout_util.c:1739 ../src/view_file.c:542
+#: ../src/layout_util.c:1912 ../src/layout_util.c:1913 ../src/view_file.c:572
 #, c-format
 msgid "_Toggle mark %d"
 msgstr "_Przełącz znacznik %d"
 
-#: ../src/layout_util.c:1738 ../src/layout_util.c:1739
+#: ../src/layout_util.c:1912 ../src/layout_util.c:1913
 #, c-format
 msgid "Toggle mark %d"
 msgstr "Przełącz znacznik %d"
 
-#: ../src/layout_util.c:1740
+#: ../src/layout_util.c:1914
 #, c-format
 msgid "Se_lect mark %d"
 msgstr "Wybierz znacznik %d"
 
-#: ../src/layout_util.c:1740 ../src/layout_util.c:1741
+#: ../src/layout_util.c:1914 ../src/layout_util.c:1915
 #, c-format
 msgid "Select mark %d"
 msgstr "Wybierz znacznik %d"
 
-#: ../src/layout_util.c:1741 ../src/view_file.c:543
+#: ../src/layout_util.c:1915 ../src/view_file.c:573
 #, c-format
 msgid "_Select mark %d"
 msgstr "Wybierz znacznik %d"
 
-#: ../src/layout_util.c:1742 ../src/view_file.c:544
+#: ../src/layout_util.c:1916 ../src/view_file.c:574
 #, c-format
 msgid "_Add mark %d"
 msgstr "Dodaj znacznik %d"
 
-#: ../src/layout_util.c:1742
+#: ../src/layout_util.c:1916
 #, c-format
 msgid "Add mark %d"
 msgstr "Dodaj znacznik %d"
 
-#: ../src/layout_util.c:1743 ../src/view_file.c:545
+#: ../src/layout_util.c:1917 ../src/view_file.c:575
 #, c-format
 msgid "_Intersection with mark %d"
 msgstr "_Część wspólna ze znacznikiem %d"
 
-#: ../src/layout_util.c:1743
+#: ../src/layout_util.c:1917
 #, c-format
 msgid "Intersection with mark %d"
 msgstr "Część wspólna ze znacznikiem %d"
 
-#: ../src/layout_util.c:1744 ../src/view_file.c:546
+#: ../src/layout_util.c:1918 ../src/view_file.c:576
 #, c-format
 msgid "_Unselect mark %d"
 msgstr "_Odznacz znacznik %d"
 
-#: ../src/layout_util.c:1744
+#: ../src/layout_util.c:1918
 #, c-format
 msgid "Unselect mark %d"
 msgstr "Odznacz znacznik %d"
 
-#: ../src/layout_util.c:1745
+#: ../src/layout_util.c:1919
 #, c-format
 msgid "_Filter mark %d"
 msgstr "_Filtruj znacznik %d"
 
-#: ../src/layout_util.c:1745
+#: ../src/layout_util.c:1919
 #, c-format
 msgid "Filter mark %d"
 msgstr "Filtruj znacznik %d"
 
-#: ../src/layout_util.c:2127
+#: ../src/layout_util.c:2301
 #, c-format
 msgid "Number of files with unsaved metadata: %d"
 msgstr "Liczba plików z niezapisanymi metadanymi: %d"
 
-#: ../src/layout_util.c:2133
+#: ../src/layout_util.c:2307
 msgid "No unsaved metadata"
 msgstr "Brak niezapisanych metadanych"
 
-#: ../src/layout_util.c:2180
+#: ../src/layout_util.c:2354
 #, c-format
 msgid ""
 "Image profile: %s\n"
@@ -3097,26 +3111,26 @@
 "Profil obrazu: %s\n"
 "Profil ekranu: %s"
 
-#: ../src/layout_util.c:2188
+#: ../src/layout_util.c:2362
 msgid "Click to enable color management"
 msgstr "Kliknij, żeby włączyć zarządzanie kolorem"
 
-#: ../src/layout_util.c:2193
+#: ../src/layout_util.c:2367
 msgid "Color profiles not supported"
 msgstr "Profile koloru nie są wspierane"
 
-#: ../src/layout_util.c:2215
+#: ../src/layout_util.c:2389
 #, c-format
 msgid "Input _%d: %s"
 msgstr "Profil _%d: %s"
 
 #. something went badly wrong
-#: ../src/lirc.c:197
+#: ../src/lirc.c:209
 #, c-format
 msgid "disconnected from LIRC\n"
 msgstr "odłączony od LIRC\n"
 
-#: ../src/lirc.c:222
+#: ../src/lirc.c:234
 #, c-format
 msgid ""
 "could not read LIRC config file\n"
@@ -3127,11 +3141,11 @@
 "proszę przeczytać dokumentację LIRC, żeby  \n"
 "dowiedzieć się, jak utworzyć poprawny plik konfiguracji\n"
 
-#: ../src/logwindow.c:76
+#: ../src/logwindow.c:84
 msgid "Log"
 msgstr "Log"
 
-#: ../src/main.c:321
+#: ../src/main.c:330
 #, c-format
 msgid ""
 "Usage: %s [options] [path]\n"
@@ -3140,65 +3154,65 @@
 "Użycie: %s [opcje] [ścieżka]\n"
 "\n"
 
-#: ../src/main.c:322
+#: ../src/main.c:331
 msgid "valid options are:\n"
 msgstr "poprawnymi opcjami są:\n"
 
-#: ../src/main.c:323
+#: ../src/main.c:332
 msgid "  +t, --with-tools                 force show of tools\n"
 msgstr "  +t, --with-tools                 wymusza wyświetlenie narzędzi\n"
 
-#: ../src/main.c:324
+#: ../src/main.c:333
 msgid "  -t, --without-tools              force hide of tools\n"
 msgstr "  -t, --without-tools              wymusza ukrycie narzędzi\n"
 
-#: ../src/main.c:325
+#: ../src/main.c:334
 msgid "  -f, --fullscreen                 start in full screen mode\n"
 msgstr "  -f, --fullscreen                 uruchamia w trybie pełnoekranowym\n"
 
-#: ../src/main.c:326
+#: ../src/main.c:335
 msgid "  -s, --slideshow                  start in slideshow mode\n"
 msgstr "  -s, --slideshow                  uruchamia w trybie pokazu slajdów\n"
 
-#: ../src/main.c:327
+#: ../src/main.c:336
 msgid ""
 "  -l, --list [files] [collections] open collection window for command line\n"
 msgstr ""
 "  -l, --list [pliki] [kolekcje] otwiera okno kolekcji z plikami z wiersza "
 "poleceń\n"
 
-#: ../src/main.c:328
+#: ../src/main.c:337
 msgid "      --blank                      start with blank file list\n"
 msgstr "      --blank                      uruchom z pustą listą plików\n"
 
-#: ../src/main.c:329
+#: ../src/main.c:338
 msgid "      --geometry=XxY+XOFF+YOFF     set main window location\n"
 msgstr "      --geometry=XxY+XOFF+YOFF     ustaw położenie głównego okna\n"
 
-#: ../src/main.c:330
+#: ../src/main.c:339
 msgid ""
 "  -r, --remote                     send following commands to open window\n"
 msgstr ""
 "  -r, --remote                     wyślij następujące polecenia do otwartego "
 "okna\n"
 
-#: ../src/main.c:331
+#: ../src/main.c:340
 msgid "  -rh,--remote-help                print remote command list\n"
 msgstr ""
 "  -rh,--remote-help                wyświetl polecenia zdalnego sterowania\n"
 
-#: ../src/main.c:333
+#: ../src/main.c:342
 msgid "      --debug[=level]              turn on debug output\n"
 msgstr ""
 "      --debug[=level]              uaktywnia wyświetlanie komunikatów\n"
 "                                    diagnostycznych\n"
 
-#: ../src/main.c:335
+#: ../src/main.c:344
 msgid "  -v, --version                    print version info\n"
 msgstr ""
 "  -v, --version                    wyświetla informacje na temat wersji\n"
 
-#: ../src/main.c:336
+#: ../src/main.c:345
 msgid ""
 "  -h, --help                       show this message\n"
 "\n"
@@ -3206,43 +3220,43 @@
 "  -h, --help                       wypisuje ten komunikat\n"
 "\n"
 
-#: ../src/main.c:349
+#: ../src/main.c:358
 #, c-format
 msgid ""
 "invalid or ignored: %s\n"
 "Use --help for options\n"
 msgstr ""
 "niepoprawna lub zignorowana: %s\n"
-"Użyj --help aby uzyskać informacje o opcjach\n"
-
-#: ../src/main.c:378
+"Użyj --help, aby uzyskać informacje o opcjach\n"
+
+#: ../src/main.c:387
 msgid "Invalid or ignored remote options: "
 msgstr "Niepoprawne lub zignorowane zdalne polecenie: "
 
-#: ../src/main.c:387
+#: ../src/main.c:396
 msgid ""
 "\n"
 "Use --remote-help for valid remote options.\n"
 msgstr ""
 "\n"
-"Użyj --remote-help żeby wyświetlić opcje zdalnego sterowania.\n"
-
-#: ../src/main.c:489
+"Użyj --remote-help, żeby wyświetlić opcje zdalnego sterowania.\n"
+
+#: ../src/main.c:498
 #, c-format
 msgid "Creating %s dir:%s\n"
 msgstr "Tworzenie  katalogu %s:%s\n"
 
-#: ../src/main.c:493
+#: ../src/main.c:502
 #, c-format
 msgid "Could not create dir:%s\n"
 msgstr "Nie można utworzyć katalogu: %s\n"
 
-#: ../src/main.c:545
+#: ../src/main.c:554
 #, c-format
 msgid "error saving file: %s\n"
 msgstr "błąd przy zapisie pliku: %s\n"
 
-#: ../src/main.c:564
+#: ../src/main.c:573
 #, c-format
 msgid ""
 "error saving file: %s\n"
@@ -3251,570 +3265,571 @@
 "błąd przy zapisie pliku: %s\n"
 "błąd: %s\n"
 
-#: ../src/main.c:672
+#: ../src/main.c:681
 msgid "exit"
 msgstr "wyjście"
 
-#: ../src/main.c:677
+#: ../src/main.c:686
 #, c-format
 msgid "Quit %s"
 msgstr "Zakończ %s"
 
-#: ../src/main.c:679
+#: ../src/main.c:688
 msgid "Collections have been modified. Quit anyway?"
 msgstr "Kolekcje zostały zmienione. Mimo to zakończyć?"
 
-#: ../src/main.c:885 ../src/remote.c:601
+#: ../src/main.c:894 ../src/remote.c:611
 msgid "Command line"
 msgstr "Wiersz poleceń"
 
-#: ../src/menu.c:133
+#: ../src/menu.c:141
 msgid "Sort by size"
 msgstr "Uporządkuj według rozmiaru"
 
-#: ../src/menu.c:136
+#: ../src/menu.c:144
 msgid "Sort by date"
 msgstr "Uporządkuj według daty"
 
-#: ../src/menu.c:139
+#: ../src/menu.c:147
 msgid "Sort by file creation date"
 msgstr "Uporządkuj według daty utworzenia"
 
-#: ../src/menu.c:142
+#: ../src/menu.c:150
 msgid "Sort by Exif-date"
 msgstr "Uporządkuj według daty Exif"
 
-#: ../src/menu.c:145
+#: ../src/menu.c:153
 msgid "Unsorted"
 msgstr "Nieuporządkowane"
 
-#: ../src/menu.c:148
+#: ../src/menu.c:156
 msgid "Sort by path"
 msgstr "Uporządkuj według ścieżki"
 
-#: ../src/menu.c:151
+#: ../src/menu.c:159
 msgid "Sort by number"
 msgstr "Uporządkuj według numeru"
 
-#: ../src/menu.c:155
+#: ../src/menu.c:163
 msgid "Sort by name"
 msgstr "Uporządkuj według nazwy"
 
-#: ../src/menu.c:207
+#: ../src/menu.c:215
 msgid "Sort"
 msgstr "Uporządkuj"
 
-#: ../src/menu.c:232
+#: ../src/menu.c:240
 msgid "Rotate _180"
 msgstr "Obróć o _180"
 
-#: ../src/metadata.c:1599
+#: ../src/metadata.c:1638
 msgid "People"
 msgstr "Ludzie"
 
-#: ../src/metadata.c:1600
+#: ../src/metadata.c:1639
 msgid "Family"
 msgstr "Rodzina"
 
-#: ../src/metadata.c:1601
+#: ../src/metadata.c:1640
 msgid "Free time"
 msgstr "Wolny czas"
 
-#: ../src/metadata.c:1602
+#: ../src/metadata.c:1641
 msgid "Children"
 msgstr "Dzieci"
 
-#: ../src/metadata.c:1603
+#: ../src/metadata.c:1642
 msgid "Sport"
 msgstr "Sport"
 
-#: ../src/metadata.c:1604
+#: ../src/metadata.c:1643
 msgid "Culture"
 msgstr "Kultura"
 
-#: ../src/metadata.c:1605
+#: ../src/metadata.c:1644
 msgid "Festival"
 msgstr "Festiwal"
 
-#: ../src/metadata.c:1606
+#: ../src/metadata.c:1645
 msgid "Nature"
 msgstr "Natura"
 
-#: ../src/metadata.c:1607
+#: ../src/metadata.c:1646
 msgid "Animal"
 msgstr "Zwierzę"
 
-#: ../src/metadata.c:1608
+#: ../src/metadata.c:1647
 msgid "Bird"
 msgstr "Ptak"
 
-#: ../src/metadata.c:1609
+#: ../src/metadata.c:1648
 msgid "Insect"
 msgstr "Owady"
 
-#: ../src/metadata.c:1610
+#: ../src/metadata.c:1649
 msgid "Pets"
 msgstr "Zwierzaki"
 
-#: ../src/metadata.c:1611
+#: ../src/metadata.c:1650
 msgid "Wildlife"
 msgstr "Fauna i flora"
 
-#: ../src/metadata.c:1612
+#: ../src/metadata.c:1651
 msgid "Zoo"
 msgstr "Zoo"
 
-#: ../src/metadata.c:1613
+#: ../src/metadata.c:1652
 msgid "Plant"
 msgstr "Roślina"
 
-#: ../src/metadata.c:1614
+#: ../src/metadata.c:1653
 msgid "Tree"
 msgstr "Drzewo"
 
-#: ../src/metadata.c:1615
+#: ../src/metadata.c:1654
 msgid "Flower"
 msgstr "Kwiat"
 
-#: ../src/metadata.c:1616
+#: ../src/metadata.c:1655
 msgid "Water"
 msgstr "Woda"
 
-#: ../src/metadata.c:1617
+#: ../src/metadata.c:1656
 msgid "River"
 msgstr "Rzeka"
 
-#: ../src/metadata.c:1618
+#: ../src/metadata.c:1657
 msgid "Lake"
 msgstr "Jezioro"
 
-#: ../src/metadata.c:1619
+#: ../src/metadata.c:1658
 msgid "Sea"
 msgstr "Morze"
 
-#: ../src/metadata.c:1620 ../src/print.c:375
+#: ../src/metadata.c:1659 ../src/print.c:384
 msgid "Landscape"
 msgstr "Pejzaż"
 
-#: ../src/metadata.c:1621
+#: ../src/metadata.c:1660
 msgid "Art"
 msgstr "Sztuka"
 
-#: ../src/metadata.c:1622
+#: ../src/metadata.c:1661
 msgid "Statue"
 msgstr "Statua"
 
-#: ../src/metadata.c:1623
+#: ../src/metadata.c:1662
 msgid "Painting"
 msgstr "Malowidło"
 
-#: ../src/metadata.c:1624 ../src/metadata.c:1638
+#: ../src/metadata.c:1663 ../src/metadata.c:1677
 msgid "Historic"
 msgstr "Historyczne"
 
-#: ../src/metadata.c:1625 ../src/metadata.c:1639
+#: ../src/metadata.c:1664 ../src/metadata.c:1678
 msgid "Modern"
 msgstr "Nowoczesne"
 
-#: ../src/metadata.c:1626
+#: ../src/metadata.c:1665
 msgid "City"
 msgstr "Miasto"
 
-#: ../src/metadata.c:1627
+#: ../src/metadata.c:1666
 msgid "Park"
 msgstr "Park"
 
-#: ../src/metadata.c:1628
+#: ../src/metadata.c:1667
 msgid "Street"
 msgstr "Ulica"
 
-#: ../src/metadata.c:1629
+#: ../src/metadata.c:1668
 msgid "Square"
 msgstr "Plac"
 
-#: ../src/metadata.c:1630
+#: ../src/metadata.c:1669
 msgid "Architecture"
 msgstr "Architektura"
 
-#: ../src/metadata.c:1631
+#: ../src/metadata.c:1670
 msgid "Buildings"
 msgstr "Budynki"
 
-#: ../src/metadata.c:1632
+#: ../src/metadata.c:1671
 msgid "House"
 msgstr "Dom"
 
-#: ../src/metadata.c:1633
+#: ../src/metadata.c:1672
 msgid "Cathedral"
 msgstr "Katedra"
 
-#: ../src/metadata.c:1634
+#: ../src/metadata.c:1673
 msgid "Palace"
 msgstr "Pałac"
 
-#: ../src/metadata.c:1635
+#: ../src/metadata.c:1674
 msgid "Castle"
 msgstr "Zamek"
 
-#: ../src/metadata.c:1636
+#: ../src/metadata.c:1675
 msgid "Bridge"
 msgstr "Most"
 
-#: ../src/metadata.c:1637
+#: ../src/metadata.c:1676
 msgid "Interior"
 msgstr "Wnętrze"
 
-#: ../src/metadata.c:1640
+#: ../src/metadata.c:1679
 msgid "Places"
 msgstr "Miejsca"
 
-#: ../src/metadata.c:1641
+#: ../src/metadata.c:1680
 msgid "Conditions"
 msgstr "Warunki"
 
-#: ../src/metadata.c:1642
+#: ../src/metadata.c:1681
 msgid "Night"
 msgstr "Noc"
 
-#: ../src/metadata.c:1643
+#: ../src/metadata.c:1682
 msgid "Lights"
 msgstr "Światła"
 
-#: ../src/metadata.c:1644
+#: ../src/metadata.c:1683
 msgid "Reflections"
 msgstr "Odbicia"
 
-#: ../src/metadata.c:1645
+#: ../src/metadata.c:1684
 msgid "Sun"
 msgstr "Słońce"
 
-#: ../src/metadata.c:1646
+#: ../src/metadata.c:1685
 msgid "Weather"
 msgstr "Pogoda"
 
-#: ../src/metadata.c:1647
+#: ../src/metadata.c:1686
 msgid "Fog"
 msgstr "Mgła"
 
-#: ../src/metadata.c:1648
+#: ../src/metadata.c:1687
 msgid "Rain"
 msgstr "Deszcz"
 
-#: ../src/metadata.c:1649
+#: ../src/metadata.c:1688
 msgid "Clouds"
 msgstr "Chmury"
 
-#: ../src/metadata.c:1650
+#: ../src/metadata.c:1689
 msgid "Snow"
 msgstr "Śnieg"
 
-#: ../src/metadata.c:1651
+#: ../src/metadata.c:1690
 msgid "Sunny weather"
 msgstr "Słoneczna pogoda"
 
-#: ../src/metadata.c:1652
+#: ../src/metadata.c:1691
 msgid "Photo"
 msgstr "Fotografia"
 
-#: ../src/metadata.c:1653
+#: ../src/metadata.c:1692
 msgid "Edited"
 msgstr "Edytowany"
 
-#: ../src/metadata.c:1654
+#: ../src/metadata.c:1693
 msgid "Detail"
 msgstr "Szczegóły"
 
-#: ../src/metadata.c:1655
+#: ../src/metadata.c:1694
 msgid "Macro"
 msgstr "Makro"
 
-#: ../src/metadata.c:1656 ../src/print.c:374
+#: ../src/metadata.c:1695 ../src/print.c:383
 msgid "Portrait"
 msgstr "Portret"
 
-#: ../src/metadata.c:1657
+#: ../src/metadata.c:1696
 msgid "Black and White"
 msgstr "Biało-czarny"
 
-#: ../src/metadata.c:1658
+#: ../src/metadata.c:1697
 msgid "Perspective"
 msgstr "Perspektywa"
 
-#: ../src/options.c:158 ../src/ui_bookmark.c:560
+#: ../src/options.c:172 ../src/ui_bookmark.c:577
 msgid "Desktop"
 msgstr "Pulpit"
 
-#: ../src/pan-view.c:423
+#: ../src/pan-view/pan-view.c:439
 #, c-format
 msgid "%d images, %s"
 msgstr "%d obrazów, %s"
 
-#: ../src/pan-view.c:433
+#: ../src/pan-view/pan-view.c:449
 #, c-format
 msgid "The pan view does not support the folder \"%s\"."
 msgstr ""
 
-#: ../src/pan-view.c:434
+#: ../src/pan-view/pan-view.c:450
 msgid "Folder not supported"
 msgstr ""
 
-#: ../src/pan-view.c:986 ../src/pan-view.c:1002
+#: ../src/pan-view/pan-view.c:1002 ../src/pan-view/pan-view.c:1018
 msgid "Reading image data..."
 msgstr "Wczytywanie danych obrazu..."
 
-#: ../src/pan-view.c:1061
+#: ../src/pan-view/pan-view.c:1077
 msgid "Sorting images..."
 msgstr "Sortowanie obrazów..."
 
-#: ../src/pan-view.c:1365 ../src/print.c:2599
+#: ../src/pan-view/pan-view.c:1381 ../src/print.c:2608
 msgid "Filename:"
 msgstr "Nazwa pliku:"
 
-#: ../src/pan-view.c:1367 ../src/pan-view.c:2183 ../src/preferences.c:1493
+#: ../src/pan-view/pan-view.c:1383 ../src/pan-view/pan-view.c:2199
+#: ../src/preferences.c:1606
 msgid "Location:"
 msgstr "Położenie:"
 
-#: ../src/pan-view.c:1369 ../src/pan-view.c:1735
+#: ../src/pan-view/pan-view.c:1385 ../src/pan-view/pan-view.c:1751
 msgid "Date:"
 msgstr "Data:"
 
-#: ../src/pan-view.c:1371 ../src/preferences.c:1319 ../src/print.c:3212
-#: ../src/print.c:3417
+#: ../src/pan-view/pan-view.c:1387 ../src/preferences.c:1427
+#: ../src/print.c:3221 ../src/print.c:3426
 msgid "Size:"
 msgstr "Rozmiar:"
 
-#: ../src/pan-view.c:1473
+#: ../src/pan-view/pan-view.c:1489
 msgid "path found"
 msgstr "znaleziono ścieżkę"
 
-#: ../src/pan-view.c:1473
+#: ../src/pan-view/pan-view.c:1489
 msgid "filename found"
 msgstr "plik znaleziony"
 
-#: ../src/pan-view.c:1521
+#: ../src/pan-view/pan-view.c:1537
 msgid "partial match"
 msgstr "częściowe dopasowanie"
 
-#: ../src/pan-view.c:1732 ../src/pan-view.c:1765
+#: ../src/pan-view/pan-view.c:1748 ../src/pan-view/pan-view.c:1781
 msgid "no match"
 msgstr "brak dopasowania"
 
-#: ../src/pan-view.c:2071 ../src/search.c:2169
+#: ../src/pan-view/pan-view.c:2087 ../src/search.c:2177
 msgid "Folder not found"
 msgstr "Katalog nie został znaleziony"
 
-#: ../src/pan-view.c:2072
+#: ../src/pan-view/pan-view.c:2088
 msgid "The entered path is not a folder"
 msgstr ""
 
-#: ../src/pan-view.c:2167
+#: ../src/pan-view/pan-view.c:2183
 msgid "Pan View"
 msgstr ""
 
-#: ../src/pan-view.c:2192
+#: ../src/pan-view/pan-view.c:2208
 msgid "Timeline"
 msgstr "Linia czasu"
 
-#: ../src/pan-view.c:2193
+#: ../src/pan-view/pan-view.c:2209
 msgid "Calendar"
 msgstr "Kalendarz"
 
-#: ../src/pan-view.c:2195
+#: ../src/pan-view/pan-view.c:2211
 msgid "Folders (flower)"
 msgstr "Katalogi (kwiat)"
 
-#: ../src/pan-view.c:2196
+#: ../src/pan-view/pan-view.c:2212
 msgid "Grid"
 msgstr "Siatka"
 
-#: ../src/pan-view.c:2205
+#: ../src/pan-view/pan-view.c:2221
 msgid "Dots"
 msgstr "punkty"
 
-#: ../src/pan-view.c:2206
+#: ../src/pan-view/pan-view.c:2222
 msgid "No Images"
 msgstr "Brak obrazów"
 
-#: ../src/pan-view.c:2207
+#: ../src/pan-view/pan-view.c:2223
 msgid "Small Thumbnails"
 msgstr "Mniejsze miniaturki"
 
-#: ../src/pan-view.c:2208
+#: ../src/pan-view/pan-view.c:2224
 msgid "Normal Thumbnails"
 msgstr "Zwykłe miniaturki"
 
-#: ../src/pan-view.c:2209
+#: ../src/pan-view/pan-view.c:2225
 msgid "Large Thumbnails"
 msgstr "Duże miniaturki"
 
-#: ../src/pan-view.c:2210 ../src/pan-view.c:2665
+#: ../src/pan-view/pan-view.c:2226 ../src/pan-view/pan-view.c:2681
 msgid "1:10 (10%)"
 msgstr "1:10 (10%)"
 
-#: ../src/pan-view.c:2211 ../src/pan-view.c:2661
+#: ../src/pan-view/pan-view.c:2227 ../src/pan-view/pan-view.c:2677
 msgid "1:4 (25%)"
 msgstr "1:4 (25%)"
 
-#: ../src/pan-view.c:2212 ../src/pan-view.c:2657
+#: ../src/pan-view/pan-view.c:2228 ../src/pan-view/pan-view.c:2673
 msgid "1:3 (33%)"
 msgstr "1:3 (33%)"
 
-#: ../src/pan-view.c:2213 ../src/pan-view.c:2653
+#: ../src/pan-view/pan-view.c:2229 ../src/pan-view/pan-view.c:2669
 msgid "1:2 (50%)"
 msgstr "1:2 (50%)"
 
-#: ../src/pan-view.c:2214
+#: ../src/pan-view/pan-view.c:2230
 msgid "1:1 (100%)"
 msgstr "1:1 (100%)"
 
-#: ../src/pan-view.c:2262
+#: ../src/pan-view/pan-view.c:2278
 msgid "Find:"
 msgstr "Znajdź:"
 
-#: ../src/pan-view.c:2313
+#: ../src/pan-view/pan-view.c:2329
 msgid "Find"
 msgstr "Znajdź"
 
-#: ../src/pan-view.c:2380
+#: ../src/pan-view/pan-view.c:2396
 msgid "Pan View Performance"
 msgstr ""
 
-#: ../src/pan-view.c:2387
+#: ../src/pan-view/pan-view.c:2403
 msgid "Pan view performance may be poor."
 msgstr ""
 
-#: ../src/pan-view.c:2388
+#: ../src/pan-view/pan-view.c:2404
 msgid ""
 "To improve performance of thumbnails in the pan view the following options "
 "can be enabled. Note that both options must be enabled to notice a change in "
 "performance."
 msgstr ""
 
-#: ../src/pan-view.c:2396 ../src/preferences.c:1322
+#: ../src/pan-view/pan-view.c:2412 ../src/preferences.c:1430
 msgid "Cache thumbnails"
 msgstr "Cache miniaturek"
 
-#: ../src/pan-view.c:2398
+#: ../src/pan-view/pan-view.c:2414
 msgid "Use shared thumbnail cache"
 msgstr "Użyj współdzielonego cache miniaturek"
 
-#: ../src/pan-view.c:2404
+#: ../src/pan-view/pan-view.c:2420
 msgid "Do not show this dialog again"
 msgstr "Więcej nie pokazuj tego okna"
 
-#: ../src/pan-view.c:2633
+#: ../src/pan-view/pan-view.c:2649
 msgid "Sort by E_xif date"
 msgstr "Sortuj według daty E_xif"
 
-#: ../src/pan-view.c:2639
+#: ../src/pan-view/pan-view.c:2655
 msgid "_Show Exif information"
 msgstr "Pokaż informacje Exif"
 
-#: ../src/pan-view.c:2641
+#: ../src/pan-view/pan-view.c:2657
 msgid "Show im_age"
 msgstr "Pok_aż obraz"
 
-#: ../src/pan-view.c:2645
+#: ../src/pan-view/pan-view.c:2661
 msgid "_None"
 msgstr "Brak"
 
-#: ../src/pan-view.c:2649
+#: ../src/pan-view/pan-view.c:2665
 msgid "_Full size"
 msgstr "Pełny rozmiar"
 
-#: ../src/preferences.c:91
+#: ../src/preferences.c:106
 msgid "Unknown"
 msgstr "Nieznany"
 
-#: ../src/preferences.c:93
+#: ../src/preferences.c:108
 msgid "RAW Image"
 msgstr "Obraz RAW"
 
-#: ../src/preferences.c:446
+#: ../src/preferences.c:496
 msgid "Nearest (worst, but fastest)"
 msgstr "Najbliższy sąsiad (najgorsze, lecz najszybsze)"
 
-#: ../src/preferences.c:448
+#: ../src/preferences.c:498
 msgid "Tiles"
 msgstr "Kafle"
 
-#: ../src/preferences.c:450
+#: ../src/preferences.c:500
 msgid "Bilinear"
 msgstr "Dwuliniowe"
 
-#: ../src/preferences.c:452
+#: ../src/preferences.c:502
 msgid "Hyper (best, but slowest)"
 msgstr "Hiper (najlepsze, lecz najwolniejsze)"
 
-#: ../src/preferences.c:517 ../src/print.c:380
+#: ../src/preferences.c:567 ../src/print.c:389
 msgid "Custom"
 msgstr "Własne"
 
-#: ../src/preferences.c:600
+#: ../src/preferences.c:650
 msgid "Single image"
 msgstr "Pojedynczy obraz"
 
-#: ../src/preferences.c:602
+#: ../src/preferences.c:652
 msgid "Anaglyph Red-Cyan"
 msgstr "Anaglif czerwony-cyjan"
 
-#: ../src/preferences.c:604
+#: ../src/preferences.c:654
 msgid "Anaglyph Green-Magenta"
 msgstr "Anaglif zielony-magenta"
 
-#: ../src/preferences.c:606
+#: ../src/preferences.c:656
 msgid "Anaglyph Yellow-Blue"
 msgstr "Anaglif żólty-niebieski"
 
-#: ../src/preferences.c:608
+#: ../src/preferences.c:658
 msgid "Anaglyph Gray Red-Cyan"
 msgstr "Anaglif szary czerwony-cyjan"
 
-#: ../src/preferences.c:610
+#: ../src/preferences.c:660
 msgid "Anaglyph Gray Green-Magenta"
 msgstr "Anaglif szany zielony-magenta"
 
-#: ../src/preferences.c:612
+#: ../src/preferences.c:662
 msgid "Anaglyph Gray Yellow-Blue"
 msgstr "Anaglif szary żólty-niebieski"
 
-#: ../src/preferences.c:614
+#: ../src/preferences.c:664
 msgid "Anaglyph Dubois Red-Cyan"
 msgstr "Anaglif Dubois czerwony-cyjan"
 
-#: ../src/preferences.c:616
+#: ../src/preferences.c:666
 msgid "Anaglyph Dubois Green-Magenta"
 msgstr "Anaglif Dubois zielony-magenta"
 
-#: ../src/preferences.c:618
+#: ../src/preferences.c:668
 msgid "Anaglyph Dubois Yellow-Blue"
 msgstr "Anaglif Dubois żólty-niebieski"
 
-#: ../src/preferences.c:621
+#: ../src/preferences.c:671
 msgid "Side by Side"
 msgstr "Obok siebie"
 
-#: ../src/preferences.c:622
+#: ../src/preferences.c:672
 msgid "Side by Side Half size"
 msgstr "Obok siebie zmniejszone o połowę"
 
-#: ../src/preferences.c:629
+#: ../src/preferences.c:679
 msgid "Top - Bottom"
 msgstr "Jedno nad drugim"
 
-#: ../src/preferences.c:630
+#: ../src/preferences.c:680
 msgid "Top - Bottom Half size"
 msgstr "Jedno nad drugim zmniejszone o połowę"
 
-#: ../src/preferences.c:639 ../src/preferences.c:2169
+#: ../src/preferences.c:689 ../src/preferences.c:2358
 msgid "Fixed position"
 msgstr "Ustalone położenie"
 
-#: ../src/preferences.c:936 ../src/preferences.c:939
+#: ../src/preferences.c:986 ../src/preferences.c:989
 msgid "Reset filters"
 msgstr "Wyzeruj filtry"
 
-#: ../src/preferences.c:940
+#: ../src/preferences.c:990
 msgid ""
 "This will reset the file filters to the defaults.\n"
 "Continue?"
@@ -3822,37 +3837,39 @@
 "Ustawienia filtrów powrócą do wartości domyślnych.\n"
 "Kontynuować?"
 
-#: ../src/preferences.c:967 ../src/preferences.c:970
+#: ../src/preferences.c:1017 ../src/preferences.c:1020
 msgid "Clear trash"
 msgstr "Wyczyść kosz"
 
-#: ../src/preferences.c:971
+#: ../src/preferences.c:1021
 msgid "This will remove the trash contents."
 msgstr "Ta operacja spowoduje usunięcie zawartości kosza"
 
-#: ../src/preferences.c:1015 ../src/preferences.c:1018
+#: ../src/preferences.c:1065 ../src/preferences.c:1068
 msgid "Reset image overlay template string"
-msgstr ""
-
-#: ../src/preferences.c:1019
+msgstr "Zresetuj szablon tekstu nakładki"
+
+#: ../src/preferences.c:1069
 msgid ""
 "This will reset the image overlay template string to the default.\n"
 "Continue?"
 msgstr ""
-
-#: ../src/preferences.c:1314
+"Resetowanie szablonu tekstu nakładki do wartości domyślnej.\n"
+"Kontynuować?"
+
+#: ../src/preferences.c:1422
 msgid "General"
 msgstr "Ogólne"
 
-#: ../src/preferences.c:1320 ../src/preferences.c:1380
+#: ../src/preferences.c:1428 ../src/preferences.c:1488
 msgid "Quality:"
 msgstr "Jakość:"
 
-#: ../src/preferences.c:1328
+#: ../src/preferences.c:1436
 msgid "Use standard thumbnail cache, shared with other applications"
 msgstr "Użyj standardowego cache miniaturek dzielonego z innymi programami"
 
-#: ../src/preferences.c:1334
+#: ../src/preferences.c:1442
 msgid ""
 "Store thumbnails in '.thumbnails' folder, local to image folder (non-"
 "standard)"
@@ -3860,170 +3877,174 @@
 "Zapisuj miniaturki w katalogu '.thumbnails', lokalnie względem katalogu z "
 "obrazami (niestandardowy)"
 
-#: ../src/preferences.c:1337
+#: ../src/preferences.c:1445
 msgid "Use EXIF thumbnails when available (EXIF thumbnails may be outdated)"
 msgstr ""
 "Użyj miniaturek EXIF jeśli są dostępne (miniaturki EXIF mogą być nieaktualne)"
 
-#: ../src/preferences.c:1340
+#: ../src/preferences.c:1448
 msgid "Slide show"
 msgstr "Pokaz slajdów"
 
-#: ../src/preferences.c:1343
+#: ../src/preferences.c:1451
 msgid "Delay between image change:"
 msgstr "Czas między kolejnymi obrazami:"
 
-#: ../src/preferences.c:1343
+#: ../src/preferences.c:1451
 msgid "seconds"
 msgstr "sekund"
 
-#: ../src/preferences.c:1349
+#: ../src/preferences.c:1457
 msgid "Random"
 msgstr "Losowo"
 
-#: ../src/preferences.c:1350
+#: ../src/preferences.c:1458
 msgid "Repeat"
 msgstr "Powtarzanie"
 
-#: ../src/preferences.c:1352
+#: ../src/preferences.c:1460
 msgid "Image loading and caching"
 msgstr "Ładowanie i buforowanie obrazów"
 
-#: ../src/preferences.c:1354
+#: ../src/preferences.c:1462
 msgid "Decoded image cache size (Mb):"
 msgstr "Rozmiar cache obrazów (Mb):"
 
-#: ../src/preferences.c:1356
+#: ../src/preferences.c:1464
 msgid "Preload next image"
 msgstr "Wstępny odczyt następnego obrazu"
 
-#: ../src/preferences.c:1359
+#: ../src/preferences.c:1467
 msgid "Refresh on file change"
 msgstr "Odśwież po zmianie pliku"
 
-#: ../src/preferences.c:1377
+#: ../src/preferences.c:1485
 msgid "Zoom"
 msgstr "Skala"
 
-#: ../src/preferences.c:1383
+#: ../src/preferences.c:1491
 msgid "Use GPU acceleration via Clutter library"
 msgstr "Użyj akceleracji GPU przy pomocy biblioteki Clutter"
 
-#: ../src/preferences.c:1387
+#: ../src/preferences.c:1495
 msgid "Two pass rendering (apply HQ zoom and color correction in second pass)"
 msgstr ""
-"Dwuprzebiegowe renderowanie (stosuje wysokiej jakości skalowanie i korekcję "
+"Renderowanie dwuprzebiegowe (stosuje wysokiej jakości skalowanie i korekcję "
 "kolorów w drugim przebiegu)"
 
-#: ../src/preferences.c:1390
+#: ../src/preferences.c:1498
 msgid "Allow enlargement of image for zoom to fit"
 msgstr "Rozciąganie obrazów przy powiększaniu, aby je dopasować"
 
-#: ../src/preferences.c:1394
+#: ../src/preferences.c:1502
 msgid "Limit image size when autofitting (%):"
 msgstr "Ograniczenie rozmiaru przy automatycznym dopasowaniu okna (%):"
 
-#: ../src/preferences.c:1402
+#: ../src/preferences.c:1510
 msgid "Zoom increment:"
 msgstr "Przyrost powiększenia"
 
-#: ../src/preferences.c:1407
+#: ../src/preferences.c:1515
 msgid "When new image is selected:"
 msgstr "Po wybraniu nowego obrazu:"
 
-#: ../src/preferences.c:1411
+#: ../src/preferences.c:1519
 msgid "Zoom to original size"
 msgstr "Powiększenie do rozmiaru oryginalnego"
 
-#: ../src/preferences.c:1414
+#: ../src/preferences.c:1522
 msgid "Fit image to window"
 msgstr "Dopasuj do okna"
 
-#: ../src/preferences.c:1417
+#: ../src/preferences.c:1525
 msgid "Leave Zoom at previous setting"
 msgstr "Pozostawienie poprzedniego powiększenia"
 
-#: ../src/preferences.c:1423
+#: ../src/preferences.c:1531
 msgid "Scroll to top left corner"
 msgstr "Przewiń do lewej strony"
 
-#: ../src/preferences.c:1426
+#: ../src/preferences.c:1534
 msgid "Scroll to image center"
 msgstr "Ustaw na środku obrazu"
 
-#: ../src/preferences.c:1429
+#: ../src/preferences.c:1537
 msgid "Keep the region from previous image"
 msgstr "Zapamiętaj położenie z poprzedniego obrazu"
 
-#: ../src/preferences.c:1434
+#: ../src/preferences.c:1542
 msgid "Appearance"
 msgstr "Wygląd"
 
-#: ../src/preferences.c:1436
+#: ../src/preferences.c:1544
 msgid "Use custom border color in window mode"
 msgstr "Użyj własnego koloru obramowania w trybie okienkowym"
 
-#: ../src/preferences.c:1439
+#: ../src/preferences.c:1547
 msgid "Use custom border color in fullscreen mode"
 msgstr "Użyj własnego obramowanie w trybie pełnego ekranu"
 
-#: ../src/preferences.c:1442
+#: ../src/preferences.c:1550
 msgid "Border color"
 msgstr "Kolor obramowania"
 
-#: ../src/preferences.c:1445
+#: ../src/preferences.c:1553
 msgid "Convenience"
 msgstr "Usprawnienia"
 
-#: ../src/preferences.c:1447
+#: ../src/preferences.c:1555
 msgid "Auto rotate image using Exif information"
 msgstr "Automatyczne obracanie obrazów na podstawie Exif"
 
-#: ../src/preferences.c:1450
+#: ../src/preferences.c:1558
 msgid "Auto rotate proofs using Exif information"
 msgstr ""
 
-#: ../src/preferences.c:1467
+#: ../src/preferences.c:1575
 msgid "Windows"
 msgstr "Okna"
 
-#: ../src/preferences.c:1469
+#: ../src/preferences.c:1577
 msgid "State"
 msgstr "Stan"
 
-#: ../src/preferences.c:1471
+#: ../src/preferences.c:1579
 msgid "Remember window positions"
 msgstr "Zapamiętanie pozycji okien"
 
-#: ../src/preferences.c:1473
+#: ../src/preferences.c:1582
+msgid "Use saved window positions also for new windows"
+msgstr "Używaj zapamiętanych pozycji okien także do nowych okien"
+
+#: ../src/preferences.c:1586
 msgid "Remember tool state (float/hidden)"
 msgstr "Zapamiętanie stanu narzędzi (oderwane/ukryte)"
 
-#: ../src/preferences.c:1478
+#: ../src/preferences.c:1591
 msgid "Fit window to image when tools are hidden/floating"
 msgstr "Dopasowanie okna do obrazu, jeśli narzędzia są ukryte/oderwane"
 
-#: ../src/preferences.c:1482
+#: ../src/preferences.c:1595
 msgid "Limit size when auto-sizing window (%):"
 msgstr "Ograniczenie rozmiaru przy automatycznym dopasowaniu okna (%):"
 
-#: ../src/preferences.c:1497
+#: ../src/preferences.c:1610
 msgid "Smooth image flip"
 msgstr "Płynne odwracanie obrazu"
 
-#: ../src/preferences.c:1499
+#: ../src/preferences.c:1612
 msgid "Disable screen saver"
 msgstr "Wyłącz wygaszacz ekranu"
 
-#: ../src/preferences.c:1503
+#: ../src/preferences.c:1616
 msgid "Overlay Screen Display"
-msgstr ""
-
-#: ../src/preferences.c:1505
+msgstr "Nakładka"
+
+#: ../src/preferences.c:1618
 msgid "Image overlay template"
-msgstr ""
-
-#: ../src/preferences.c:1518
+msgstr "Szablon tekstu nakładki"
+
+#: ../src/preferences.c:1631
 msgid ""
 "<i>%name%</i> results in the filename of the picture.\n"
 "Also available: <i>%collection%</i>, <i>%number%</i>, <i>%total%</i>, <i>"
@@ -4063,76 +4084,80 @@
 "Jeśli linia jest pusta, to jest usuwana. Umożliwia to dodawanie linii, które "
 "całkowicie znikają, jeśli nie ma dostępnych danych.\n"
 
-#: ../src/preferences.c:1535 ../src/print.c:3210
+#: ../src/preferences.c:1648 ../src/print.c:3219
 msgid "Font"
 msgstr "Czcionka"
 
-#: ../src/preferences.c:1540 ../src/print.c:3400
+#: ../src/preferences.c:1660 ../src/print.c:3409
 msgid "Text"
 msgstr "Tekst"
 
-#: ../src/preferences.c:1545
+#: ../src/preferences.c:1665
 msgid "Background"
 msgstr "Tło"
 
-#: ../src/preferences.c:1552 ../src/preferences.c:1728
-#: ../src/preferences.c:2098
+#: ../src/preferences.c:1671 ../src/preferences.c:1849
+#: ../src/preferences.c:2287
 msgid "Defaults"
 msgstr "Domyślne"
 
-#: ../src/preferences.c:1606
+#: ../src/preferences.c:1725
 msgid "Show hidden files or folders"
 msgstr "Pokaż ukryte pliki lub katalogi"
 
-#: ../src/preferences.c:1608
+#: ../src/preferences.c:1727
 msgid "Show parent folder (..)"
 msgstr "Pokaż folder nadrzędny (..)"
 
-#: ../src/preferences.c:1610
+#: ../src/preferences.c:1729
 msgid "Case sensitive sort"
 msgstr "Rozróżnianie wielkość liter podczas sortowania"
 
-#: ../src/preferences.c:1612
+#: ../src/preferences.c:1731
+msgid "Natural sort order"
+msgstr "Naturalny porządek sortowania"
+
+#: ../src/preferences.c:1733
 msgid "Disable file extension checks"
 msgstr "Wyłącz sprawdzanie rozszerzeń"
 
-#: ../src/preferences.c:1615
+#: ../src/preferences.c:1736
 msgid "Disable File Filtering"
 msgstr "Bez filtrowania plików"
 
-#: ../src/preferences.c:1619
+#: ../src/preferences.c:1740
 msgid "Grouping sidecar extensions"
 msgstr "Grupowanie rozszerzeń plików sidecar"
 
-#: ../src/preferences.c:1626
+#: ../src/preferences.c:1747
 msgid "File types"
 msgstr "Typy plików"
 
-#: ../src/preferences.c:1648
+#: ../src/preferences.c:1769
 msgid "Filter"
 msgstr "Filtr"
 
-#: ../src/preferences.c:1683
+#: ../src/preferences.c:1804
 msgid "Class"
 msgstr "Klasa"
 
-#: ../src/preferences.c:1700
+#: ../src/preferences.c:1821
 msgid "Writable"
 msgstr "Zapisywalny"
 
-#: ../src/preferences.c:1711
+#: ../src/preferences.c:1832
 msgid "Sidecar is allowed"
 msgstr "Pliki sidecar dozwolone"
 
-#: ../src/preferences.c:1757
+#: ../src/preferences.c:1878
 msgid "Metadata writing process"
 msgstr "Proces zapisywania metadanych"
 
-#: ../src/preferences.c:1759
+#: ../src/preferences.c:1880
 msgid "Warning: Geeqie is built without Exiv2. Some options are disabled."
 msgstr "Uwaga: Geeqie skompilowane bez Exiv2. Niektóre opcje są wyłączone."
 
-#: ../src/preferences.c:1761
+#: ../src/preferences.c:1882
 msgid ""
 "Metadata are written in the following order. The process ends after first "
 "success."
@@ -4140,7 +4165,7 @@
 "Metadane są zapisywane w następującym porządku. Proces kończy się po "
 "pierwszym sukcesie."
 
-#: ../src/preferences.c:1764
+#: ../src/preferences.c:1885
 msgid ""
 "1) Save metadata in image files, resp. sidecar files, according to the XMP "
 "standard"
@@ -4148,23 +4173,23 @@
 "1) Zapisywanie metadanych w plikach obrazu lub plikach sidecar zgodnie ze "
 "standardem XMP"
 
-#: ../src/preferences.c:1770
+#: ../src/preferences.c:1891
 msgid ""
 "2) Save metadata in '.metadata' folder, local to image folder (non-standard)"
 msgstr ""
 "2) Zapisywanie metadanych w folderze '.metadata' w katalogu z obrazem "
 "(niestandardowe)"
 
-#: ../src/preferences.c:1773
+#: ../src/preferences.c:1894
 #, c-format
 msgid "3) Save metadata in Geeqie private directory '%s'"
 msgstr "3) Zapisywanie metadanych w prywatnym katalogu Geeqie '%s'"
 
-#: ../src/preferences.c:1779
+#: ../src/preferences.c:1900
 msgid "Step 1: Write to image files"
 msgstr "Krok 1: Zapis do plików obrazu"
 
-#: ../src/preferences.c:1787
+#: ../src/preferences.c:1908
 msgid ""
 "Store metadata also in legacy IPTC tags (converted according to IPTC4XMP "
 "standard)"
@@ -4172,19 +4197,19 @@
 "Zapisuj metadane także w starszych tagach IPTC (konwertowane zgodnie ze "
 "standardem IPTC4XMP)"
 
-#: ../src/preferences.c:1790
+#: ../src/preferences.c:1911
 msgid "Warn if the image files are unwritable"
 msgstr "Ostrzegaj, jeśli pliki obrazu są niezapisywalne"
 
-#: ../src/preferences.c:1793
+#: ../src/preferences.c:1914
 msgid "Ask before writing to image files"
 msgstr "Zapytaj przed zapisywaniem do plików obrazu"
 
-#: ../src/preferences.c:1796
+#: ../src/preferences.c:1917
 msgid "Step 2 and 3: write to Geeqie private files"
 msgstr "Krok 2 i 3: Zapis do plików prywatnych Geeqie"
 
-#: ../src/preferences.c:1801
+#: ../src/preferences.c:1922
 msgid ""
 "Use GQview legacy metadata format (supports only keywords and comments) "
 "instead of XMP"
@@ -4192,11 +4217,11 @@
 "Użyj starszego formatu metadanych GQview (obsługuje tylko słowa kluczowe i "
 "komentarze) zamiast XMP"
 
-#: ../src/preferences.c:1805
+#: ../src/preferences.c:1926
 msgid "Miscellaneous"
 msgstr "Różne"
 
-#: ../src/preferences.c:1806
+#: ../src/preferences.c:1927
 msgid ""
 "Write the same description tags (keywords, comment, etc.) to all grouped "
 "sidecars"
@@ -4204,248 +4229,277 @@
 "Zapisuj te same tagi opisu (słowa kluczowe, komentarze etc.) do wszystkich "
 "zgrupowanych plików sidecar"
 
-#: ../src/preferences.c:1809
+#: ../src/preferences.c:1930
 msgid "Allow keywords to differ only in case"
 msgstr "Dopuść słowa kluczowe różniące się tylko wielkością liter"
 
-#: ../src/preferences.c:1812
+#: ../src/preferences.c:1933
 msgid "Write altered image orientation to the metadata"
 msgstr "Zapisz zmienioną orientację obrazu do metadanych"
 
-#: ../src/preferences.c:1818
+#: ../src/preferences.c:1939
 msgid "Auto-save options"
 msgstr "Opcje autozapisu"
 
-#: ../src/preferences.c:1820
+#: ../src/preferences.c:1941
 msgid "Write metadata after timeout"
 msgstr "Zapisz metadane po upływie danego czasu"
 
-#: ../src/preferences.c:1826
+#: ../src/preferences.c:1947
 msgid "Timeout (seconds):"
 msgstr "Limit czasu (sekundy):"
 
-#: ../src/preferences.c:1829
+#: ../src/preferences.c:1950
 msgid "Write metadata on image change"
 msgstr "Zapisuj metadane przy zmianie obrazu"
 
-#: ../src/preferences.c:1832
+#: ../src/preferences.c:1953
 msgid "Write metadata on directory change"
 msgstr "Zapisz metadane przy zmianie katalogu"
 
-#: ../src/preferences.c:1846
+#: ../src/preferences.c:1993
+msgid "Perceptual"
+msgstr "Percepcyjny"
+
+#: ../src/preferences.c:1995
+msgid "Relative Colorimetric"
+msgstr "Względny kolorymetryczny"
+
+#: ../src/preferences.c:1999
+msgid "Absolute Colorimetric"
+msgstr "Bezwzględny kolorymetryczny"
+
+#: ../src/preferences.c:2024
 msgid "Color management"
 msgstr "Zarządzanie kolorami"
 
-#: ../src/preferences.c:1848
+#: ../src/preferences.c:2026
 msgid "Input profiles"
 msgstr "Profile wejścia"
 
-#: ../src/preferences.c:1856
+#: ../src/preferences.c:2034
 msgid "Type"
 msgstr "Typ"
 
-#: ../src/preferences.c:1859
+#: ../src/preferences.c:2037
 msgid "Menu name"
 msgstr "Nazwa w menu"
 
-#: ../src/preferences.c:1862
+#: ../src/preferences.c:2040
 msgid "File"
 msgstr "Plik"
 
-#: ../src/preferences.c:1870
+#: ../src/preferences.c:2048
 #, c-format
 msgid "Input %d:"
 msgstr "Profil %d:"
 
-#: ../src/preferences.c:1886 ../src/preferences.c:1906
+#: ../src/preferences.c:2064 ../src/preferences.c:2084
 msgid "Select color profile"
 msgstr "Wybierz profil koloru"
 
-#: ../src/preferences.c:1894
+#: ../src/preferences.c:2072
 msgid "Screen profile"
 msgstr "Profil ekranu"
 
-#: ../src/preferences.c:1898
+#: ../src/preferences.c:2076
 msgid "Use system screen profile if available"
 msgstr "Używaj systemowego profilu ekranu, jeśli jest dostępny"
 
-#: ../src/preferences.c:1903
+#: ../src/preferences.c:2081
 msgid "Screen:"
 msgstr "Ekran:"
 
-#: ../src/preferences.c:1925 ../src/preferences.c:1966
+#: ../src/preferences.c:2087
+msgid "Render Intent:"
+msgstr "Sposób odwzorowania barw:"
+
+#: ../src/preferences.c:2107 ../src/preferences.c:2148
 msgid "Behavior"
 msgstr "Zachowanie"
 
-#: ../src/preferences.c:1927 ../src/utilops.c:1998
+#: ../src/preferences.c:2109 ../src/utilops.c:2136
 msgid "Delete"
 msgstr "Usuń"
 
-#: ../src/preferences.c:1929
+#: ../src/preferences.c:2111
 msgid "Confirm file delete"
 msgstr "Potwierdzanie usunięcia pliku"
 
-#: ../src/preferences.c:1931
+#: ../src/preferences.c:2113
 msgid "Enable Delete key"
 msgstr "Aktywny klawisz Delete"
 
-#: ../src/preferences.c:1934
+#: ../src/preferences.c:2116
 msgid "Safe delete"
 msgstr "Bezpieczne usuwanie"
 
-#: ../src/preferences.c:1952
+#: ../src/preferences.c:2134
 msgid "Maximum size:"
 msgstr "Maksymalny rozmiar:"
 
-#: ../src/preferences.c:1952
+#: ../src/preferences.c:2134
 msgid "MB"
 msgstr "MB"
 
-#: ../src/preferences.c:1954
+#: ../src/preferences.c:2136
 msgid "Set to 0 for unlimited size"
 msgstr "Ustaw na 0 dla nieograniczonego rozmiaru"
 
-#: ../src/preferences.c:1955
+#: ../src/preferences.c:2137
 msgid "View"
 msgstr "Widok"
 
-#: ../src/preferences.c:1968
+#: ../src/preferences.c:2150
 msgid "Rectangular selection in icon view"
 msgstr "Zaznaczanie prostokątne w widoku ikon"
 
-#: ../src/preferences.c:1971
+#: ../src/preferences.c:2153
 msgid "Descend folders in tree view"
 msgstr "Odwrotna kolejność katalogów w widoku drzewiastym"
 
-#: ../src/preferences.c:1974
+#: ../src/preferences.c:2156
 msgid "In place renaming"
 msgstr "Zmiana nazwy na miejscu"
 
-#: ../src/preferences.c:1977
+#: ../src/preferences.c:2159
+msgid "List directory view uses single click to enter"
+msgstr "Lista katalogów używa pojedynczego kliknięcia do przejścia"
+
+#: ../src/preferences.c:2162
 msgid "Open recent list maximum size"
 msgstr "Maksymalna ilość ostatnio otwartych obrazów"
 
-#: ../src/preferences.c:1980
+#: ../src/preferences.c:2165
 msgid "Drag'n drop icon size"
-msgstr "Rozmiar ikon przy drag'n drop"
-
-#: ../src/preferences.c:1983
+msgstr "Rozmiar ikon przy przeciąganiu"
+
+#: ../src/preferences.c:2168
 msgid "Navigation"
 msgstr "Nawigacja"
 
-#: ../src/preferences.c:1985
+#: ../src/preferences.c:2170
 msgid "Progressive keyboard scrolling"
 msgstr "Przyrostowe przewijanie klawiaturą"
 
-#: ../src/preferences.c:1987
+#: ../src/preferences.c:2172
+msgid "Keyboard scrolling step multiplier:"
+msgstr "Mnożnik przewijania klawiaturą"
+
+#: ../src/preferences.c:2174
 msgid "Mouse wheel scrolls image"
 msgstr "Przewijanie obrazu kółkiem myszy"
 
-#: ../src/preferences.c:1990
+#: ../src/preferences.c:2176
+msgid "Navigation by left or middle click on image"
+msgstr ""
+"Nawigacja przez kliknięcie lewym lub środkowym klawiszem myszy na obrazie"
+
+#: ../src/preferences.c:2179
 msgid "Similarities"
 msgstr "Podobieństwa"
 
-#: ../src/preferences.c:1992
+#: ../src/preferences.c:2181
 msgid "Custom similarity threshold:"
 msgstr "Dowolny próg podobieństwa:"
 
-#: ../src/preferences.c:1994
+#: ../src/preferences.c:2183
 msgid "Rotation invariant duplicate check"
 msgstr "Sprawdzanie duplikatów rotacyjnie niezmiennicze"
 
-#: ../src/preferences.c:1998
+#: ../src/preferences.c:2187
 msgid "Debugging"
 msgstr "Debugowanie"
 
-#: ../src/preferences.c:2000
+#: ../src/preferences.c:2189
 msgid "Debug level:"
 msgstr "Poziom debugowania:"
 
-#: ../src/preferences.c:2018
+#: ../src/preferences.c:2207
 msgid "Keyboard"
 msgstr "Klawiatura"
 
-#: ../src/preferences.c:2020
+#: ../src/preferences.c:2209
 msgid "Accelerators"
 msgstr "Skróty klawiszowe"
 
-#: ../src/preferences.c:2039
+#: ../src/preferences.c:2228
 msgid "Action"
 msgstr "Akcja"
 
-#: ../src/preferences.c:2061
+#: ../src/preferences.c:2250
 msgid "KEY"
-msgstr ""
-
-#: ../src/preferences.c:2072
+msgstr "Klawisz"
+
+#: ../src/preferences.c:2261
 msgid "Tooltip"
 msgstr "Podpowiedź"
 
-#: ../src/preferences.c:2103
+#: ../src/preferences.c:2292
 msgid "Reset selected"
-msgstr ""
-
-#: ../src/preferences.c:2119
+msgstr "Zresetuj wybrane"
+
+#: ../src/preferences.c:2308
 msgid "Stereo"
 msgstr ""
 
-#: ../src/preferences.c:2121 ../src/preferences.c:2124
+#: ../src/preferences.c:2310 ../src/preferences.c:2313
 msgid "Windowed stereo mode"
 msgstr ""
 
-#: ../src/preferences.c:2128 ../src/preferences.c:2153
+#: ../src/preferences.c:2317 ../src/preferences.c:2342
 msgid "Mirror left image"
 msgstr ""
 
-#: ../src/preferences.c:2131 ../src/preferences.c:2156
+#: ../src/preferences.c:2320 ../src/preferences.c:2345
 msgid "Flip left image"
 msgstr ""
 
-#: ../src/preferences.c:2134 ../src/preferences.c:2159
+#: ../src/preferences.c:2323 ../src/preferences.c:2348
 msgid "Mirror right image"
 msgstr ""
 
-#: ../src/preferences.c:2137 ../src/preferences.c:2162
+#: ../src/preferences.c:2326 ../src/preferences.c:2351
 msgid "Flip right image"
 msgstr ""
 
-#: ../src/preferences.c:2139 ../src/preferences.c:2164
+#: ../src/preferences.c:2328 ../src/preferences.c:2353
 msgid "Swap left and right images"
 msgstr ""
 
-#: ../src/preferences.c:2141 ../src/preferences.c:2166
+#: ../src/preferences.c:2330 ../src/preferences.c:2355
 msgid "Disable stereo mode on single image source"
 msgstr ""
 
-#: ../src/preferences.c:2144 ../src/preferences.c:2150
+#: ../src/preferences.c:2333 ../src/preferences.c:2339
 msgid "Fullscreen stereo mode"
 msgstr ""
 
-#: ../src/preferences.c:2145
+#: ../src/preferences.c:2334
 msgid "Use different settings for fullscreen"
-msgstr ""
-
-#: ../src/preferences.c:2175
+msgstr "Używaj osobnych ustawień dla trybu pełnoekranowego"
+
+#: ../src/preferences.c:2364
 msgid "Left X"
 msgstr "Lewy X"
 
-#: ../src/preferences.c:2177
+#: ../src/preferences.c:2366
 msgid "Left Y"
 msgstr "Lewy Y"
 
-#: ../src/preferences.c:2179
+#: ../src/preferences.c:2368
 msgid "Right X"
 msgstr "Prawy X"
 
-#: ../src/preferences.c:2181
+#: ../src/preferences.c:2370
 msgid "Right Y"
 msgstr "Prawy Y"
 
-#: ../src/preferences.c:2197
+#: ../src/preferences.c:2386
 msgid "Preferences"
 msgstr "P_referencje..."
 
-#: ../src/preferences.c:2345
+#: ../src/preferences.c:2540
 #, c-format
 msgid ""
 "%s %s\n"
@@ -4466,87 +4520,87 @@
 "\n"
 "Wydany na warunkach licencji GNU GPL"
 
-#: ../src/preferences.c:2364
+#: ../src/preferences.c:2559
 msgid "Credits..."
 msgstr "Zasługi..."
 
-#: ../src/print.c:124
+#: ../src/print.c:133
 msgid "Selection"
 msgstr "Zaznaczenie"
 
-#: ../src/print.c:125
+#: ../src/print.c:134
 msgid "All"
 msgstr "Wszystkie"
 
-#: ../src/print.c:136
+#: ../src/print.c:145
 msgid "One image per page"
 msgstr "Jeden obraz na stronie"
 
-#: ../src/print.c:137
+#: ../src/print.c:146
 msgid "Proof sheet"
 msgstr "Wydruk próbny"
 
-#: ../src/print.c:150
+#: ../src/print.c:159
 msgid "Default printer"
 msgstr "Drukarka domyślna"
 
-#: ../src/print.c:151
+#: ../src/print.c:160
 msgid "Custom printer"
 msgstr "Własna drukarka"
 
-#: ../src/print.c:152
+#: ../src/print.c:161
 msgid "PostScript file"
 msgstr "Plik PostScript"
 
-#: ../src/print.c:153
+#: ../src/print.c:162
 msgid "Image file"
 msgstr "Plik obrazu"
 
-#: ../src/print.c:167
+#: ../src/print.c:176
 msgid "jpeg, low quality"
 msgstr "jpeg, niska jakość"
 
-#: ../src/print.c:168
+#: ../src/print.c:177
 msgid "jpeg, normal quality"
 msgstr "jpeg, zwykła jakość"
 
-#: ../src/print.c:169
+#: ../src/print.c:178
 msgid "jpeg, high quality"
 msgstr "jpeg, wysoka jakość"
 
-#: ../src/print.c:365 ../src/print.c:3212
+#: ../src/print.c:374 ../src/print.c:3221
 msgid "points"
 msgstr "punkty"
 
-#: ../src/print.c:366
+#: ../src/print.c:375
 msgid "millimeters"
 msgstr "milimetry"
 
-#: ../src/print.c:367
+#: ../src/print.c:376
 msgid "centimeters"
 msgstr "centymetry"
 
-#: ../src/print.c:368
+#: ../src/print.c:377
 msgid "inches"
 msgstr "cale"
 
-#: ../src/print.c:369
+#: ../src/print.c:378
 msgid "picas"
 msgstr "pica"
 
-#: ../src/print.c:381
+#: ../src/print.c:390
 msgid "Letter"
-msgstr ""
+msgstr "Letter"
 
 #. in 8.5 x 11
-#: ../src/print.c:382
+#: ../src/print.c:391
 msgid "Legal"
-msgstr ""
+msgstr "Legal"
 
 #. in 8.5 x 14
-#: ../src/print.c:383
+#: ../src/print.c:392
 msgid "Executive"
-msgstr ""
+msgstr "Executive"
 
 #. in 7.25x 10.5
 #. mm 841 x 1189
@@ -4560,60 +4614,60 @@
 #. mm 250 x 353
 #. mm 176 x 250
 #. mm 125 x 176
-#: ../src/print.c:395
+#: ../src/print.c:404
 msgid "Envelope #10"
-msgstr ""
+msgstr "Koperta #10"
 
 #. in 4.125 x 9.5
-#: ../src/print.c:396
+#: ../src/print.c:405
 msgid "Envelope #9"
-msgstr ""
+msgstr "Koperta #9"
 
 #. in 3.875 x 8.875
-#: ../src/print.c:397
+#: ../src/print.c:406
 msgid "Envelope C4"
-msgstr ""
+msgstr "Koperta C4"
 
 #. mm 229 x 324
-#: ../src/print.c:398
+#: ../src/print.c:407
 msgid "Envelope C5"
-msgstr ""
+msgstr "Koperta C5"
 
 #. mm 162 x 229
-#: ../src/print.c:399
+#: ../src/print.c:408
 msgid "Envelope C6"
-msgstr ""
+msgstr "Koperta C6"
 
 #. mm 114 x 162
-#: ../src/print.c:400
+#: ../src/print.c:409
 msgid "Photo 6x4"
-msgstr ""
+msgstr "Zdjęcie 10x15"
 
 #. in 6   x 4
-#: ../src/print.c:401
+#: ../src/print.c:410
 msgid "Photo 8x10"
-msgstr ""
+msgstr "Zdjęcie 20x25"
 
 #. in 8   x 10
-#: ../src/print.c:402
+#: ../src/print.c:411
 msgid "Postcard"
 msgstr "Kartka pocztowa"
 
 #. mm 100 x 148
-#: ../src/print.c:403
+#: ../src/print.c:412
 msgid "Tabloid"
-msgstr ""
-
-#: ../src/print.c:559
+msgstr "Tabloid"
+
+#: ../src/print.c:568
 #, c-format
 msgid "page %d of %d"
 msgstr "strona %d z %d"
 
-#: ../src/print.c:751
+#: ../src/print.c:760
 msgid "Preview"
 msgstr "Podgląd"
 
-#: ../src/print.c:1059
+#: ../src/print.c:1068
 #, c-format
 msgid ""
 "Unable to open pipe for writing.\n"
@@ -4622,147 +4676,147 @@
 "Nie można otworzyć strumienia do zapisu.\n"
 "\"%s\""
 
-#: ../src/print.c:1074 ../src/print.c:1466 ../src/ui_pathsel.c:423
+#: ../src/print.c:1083 ../src/print.c:1475 ../src/ui_pathsel.c:432
 #, c-format
 msgid "A file with name %s already exists."
 msgstr "Plik o nazwie %s już istnieje."
 
-#: ../src/print.c:1089 ../src/print.c:1521
+#: ../src/print.c:1098 ../src/print.c:1530
 #, c-format
 msgid "Failure writing to file %s"
 msgstr "Niepowodzenie zapisu do pliku %s"
 
-#: ../src/print.c:1144 ../src/print.c:1181 ../src/print.c:1217
-#: ../src/print.c:1334 ../src/print.c:1407
+#: ../src/print.c:1153 ../src/print.c:1190 ../src/print.c:1226
+#: ../src/print.c:1343 ../src/print.c:1416
 msgid "SIGPIPE error writing to printer."
 msgstr "Błąd SIGPIPE zapisu do drukarki."
 
-#: ../src/print.c:1942
+#: ../src/print.c:1951
 #, c-format
 msgid "Page %d"
 msgstr "Strona %d"
 
-#: ../src/print.c:1964 ../src/print.c:1969
+#: ../src/print.c:1973 ../src/print.c:1978
 msgid "Printing error"
 msgstr "Błąd wydruku"
 
-#: ../src/print.c:1968
+#: ../src/print.c:1977
 #, c-format
 msgid "An error occured printing to %s."
 msgstr "Wystąpił błąd w czasie drukowania na %s."
 
-#: ../src/print.c:1972
+#: ../src/print.c:1981
 msgid "Details"
 msgstr "Szczegóły"
 
-#: ../src/print.c:2587 ../src/print.c:3341
+#: ../src/print.c:2596 ../src/print.c:3350
 msgid "Print"
 msgstr "Drukuj"
 
-#: ../src/print.c:2591
+#: ../src/print.c:2600
 #, c-format
 msgid "Printing %d pages to %s."
 msgstr "Drukowanie %d stron na %s."
 
-#: ../src/print.c:2691
+#: ../src/print.c:2700
 msgid "Format:"
 msgstr "Format:"
 
-#: ../src/print.c:2766
+#: ../src/print.c:2775
 msgid "Units:"
 msgstr "Jednostki:"
 
-#: ../src/print.c:2810
+#: ../src/print.c:2819
 msgid "Orientation:"
 msgstr "Ułożenie:"
 
-#: ../src/print.c:2942
+#: ../src/print.c:2951
 msgid "Destination:"
 msgstr "Cel:"
 
-#: ../src/print.c:2990
+#: ../src/print.c:2999
 msgid "<printer name>"
 msgstr "<nazwa drukarki>"
 
-#: ../src/print.c:3079
+#: ../src/print.c:3088
 msgid "Unlimited"
 msgstr "Nieograniczone"
 
-#: ../src/print.c:3197
+#: ../src/print.c:3206
 msgid "Show"
 msgstr "Pokaż"
 
-#: ../src/print.c:3368
+#: ../src/print.c:3377
 msgid "Source"
 msgstr "Źródło"
 
-#: ../src/print.c:3380
+#: ../src/print.c:3389
 msgid "Image size:"
 msgstr "Rozmiar obrazu:"
 
-#: ../src/print.c:3384
+#: ../src/print.c:3393
 msgid "Proof size:"
 msgstr "Rozmiar próbki:"
 
-#: ../src/print.c:3410
+#: ../src/print.c:3419
 msgid "Paper"
 msgstr "Papier"
 
-#: ../src/print.c:3433
+#: ../src/print.c:3442
 msgid "Margins"
 msgstr "Merginesy"
 
-#: ../src/print.c:3435
+#: ../src/print.c:3444
 msgid "Left:"
 msgstr "Lewy:"
 
-#: ../src/print.c:3438
+#: ../src/print.c:3447
 msgid "Right:"
 msgstr "Prawy:"
 
-#: ../src/print.c:3441
+#: ../src/print.c:3450
 msgid "Top:"
 msgstr "Górny:"
 
-#: ../src/print.c:3444
+#: ../src/print.c:3453
 msgid "Bottom:"
 msgstr "Dolny:"
 
-#: ../src/print.c:3453
+#: ../src/print.c:3462
 msgid "Printer"
 msgstr "Drukarka"
 
-#: ../src/print.c:3459
+#: ../src/print.c:3468
 msgid "Custom printer:"
 msgstr "Własna drukarka:"
 
-#: ../src/print.c:3468
+#: ../src/print.c:3477
 msgid "File:"
 msgstr "Plik:"
 
-#: ../src/print.c:3477
+#: ../src/print.c:3486
 msgid "File format:"
 msgstr "Format pliku:"
 
-#: ../src/print.c:3482
+#: ../src/print.c:3491
 msgid "DPI:"
 msgstr "DPI:"
 
-#: ../src/print.c:3490
+#: ../src/print.c:3499
 msgid "Remember print settings"
 msgstr "Zapamiętanie opcji druku"
 
-#: ../src/rcfile.c:81
+#: ../src/rcfile.c:90
 #, c-format
 msgid "Option %s ignored: %s\n"
 msgstr "Opcja %s zignorowana: %s\n"
 
-#: ../src/rcfile.c:468
+#: ../src/rcfile.c:508
 #, c-format
 msgid "error saving config file: %s\n"
 msgstr "błąd przy zapisie pliku konfiguracyjnego: %s\n"
 
-#: ../src/rcfile.c:526
+#: ../src/rcfile.c:566
 #, c-format
 msgid ""
 "error saving config file: %s\n"
@@ -4772,116 +4826,116 @@
 "błąd: %s\n"
 
 #. short, long                  callback,               extra, prefer, parameter, description
-#: ../src/remote.c:640
+#: ../src/remote.c:650
 msgid "next image"
 msgstr "następny obraz"
 
-#: ../src/remote.c:641
+#: ../src/remote.c:651
 msgid "previous image"
 msgstr "poprzedni obraz"
 
-#: ../src/remote.c:642
+#: ../src/remote.c:652
 msgid "first image"
 msgstr "pierwszy obraz"
 
-#: ../src/remote.c:643
+#: ../src/remote.c:653
 msgid "last image"
 msgstr "ostatni obraz"
 
-#: ../src/remote.c:644
+#: ../src/remote.c:654
 msgid "toggle full screen"
 msgstr "przełącz pełny ekran"
 
-#: ../src/remote.c:645
+#: ../src/remote.c:655
 msgid "start full screen"
 msgstr "włącz pełny ekran"
 
-#: ../src/remote.c:646
+#: ../src/remote.c:656
 msgid "stop full screen"
 msgstr "wyłącz pełny ekran"
 
-#: ../src/remote.c:647
+#: ../src/remote.c:657
 msgid "toggle slide show"
 msgstr "przełącz pokaz slajdów"
 
-#: ../src/remote.c:648
+#: ../src/remote.c:658
 msgid "start slide show"
 msgstr "rozpocznij pokaz slajdów"
 
-#: ../src/remote.c:649
+#: ../src/remote.c:659
 msgid "stop slide show"
 msgstr "zatrzymaj pokaz slajdów"
 
-#: ../src/remote.c:650
+#: ../src/remote.c:660
 msgid "<FOLDER>"
 msgstr "<FOLDER>"
 
-#: ../src/remote.c:650
+#: ../src/remote.c:660
 msgid "start recursive slide show in FOLDER"
 msgstr "rozpocznij rekursywny pokaz slajdów w FOLDER-rze"
 
-#: ../src/remote.c:651
+#: ../src/remote.c:661
 msgid "<[N][.M]>"
 msgstr "<[N][.M]>"
 
-#: ../src/remote.c:651
+#: ../src/remote.c:661
 msgid "set slide show delay to N.M seconds"
 msgstr "ustaw opóźnienie slajdów na N.M sekund"
 
-#: ../src/remote.c:652
+#: ../src/remote.c:662
 msgid "show tools"
 msgstr "pokaż narzędzia"
 
-#: ../src/remote.c:653
+#: ../src/remote.c:663
 msgid "hide tools"
 msgstr "Ukryj pasek narzędzi"
 
-#: ../src/remote.c:654
+#: ../src/remote.c:664
 msgid "quit"
 msgstr "zakończ"
 
-#: ../src/remote.c:655 ../src/remote.c:656 ../src/remote.c:657
-#: ../src/remote.c:658 ../src/remote.c:659 ../src/remote.c:661
+#: ../src/remote.c:665 ../src/remote.c:666 ../src/remote.c:667
+#: ../src/remote.c:668 ../src/remote.c:669 ../src/remote.c:671
 msgid "<FILE>"
 msgstr "<PLIK>"
 
-#: ../src/remote.c:655
+#: ../src/remote.c:665
 msgid "load configuration from FILE"
 msgstr "wczytaj konfigurację z PLIK-u"
 
-#: ../src/remote.c:656
+#: ../src/remote.c:666
 msgid "get list of sidecars of FILE"
 msgstr "pobierz listę plików sidecar PLIK-u"
 
-#: ../src/remote.c:657
+#: ../src/remote.c:667
 msgid "get destination path of FILE"
 msgstr "pobierz ścieżkę docelową PLIK-u"
 
-#: ../src/remote.c:658
+#: ../src/remote.c:668
 msgid "open FILE"
 msgstr "otwórz PLIK"
 
-#: ../src/remote.c:659
+#: ../src/remote.c:669
 msgid "open FILE in new window"
 msgstr "otwórz PLIK w nowym oknie"
 
-#: ../src/remote.c:660
+#: ../src/remote.c:670
 msgid "clear command line collection list"
-msgstr ""
-
-#: ../src/remote.c:661
+msgstr "wyczyść kolekcję listy poleceń"
+
+#: ../src/remote.c:671
 msgid "add FILE to command line collection list"
-msgstr ""
-
-#: ../src/remote.c:662
+msgstr "dodaj PLIK do kolekcji listy poleceń"
+
+#: ../src/remote.c:672
 msgid "bring the Geeqie window to the top"
 msgstr "przenieś okno Geeqie na wierzch"
 
-#: ../src/remote.c:727
+#: ../src/remote.c:737
 msgid "Remote command list:\n"
 msgstr "Lista komend zdalnego sterowania:\n"
 
-#: ../src/remote.c:746
+#: ../src/remote.c:756
 msgid ""
 "\n"
 "  All other command line parameters are used as plain files if they exists.\n"
@@ -4890,208 +4944,208 @@
 "  Wszystkie pozostałe parametry linii poleceń są używane jako pliki, jeśli "
 "istnieją.\n"
 
-#: ../src/remote.c:796
+#: ../src/remote.c:806
 #, c-format
 msgid "Remote %s not running, starting..."
 msgstr ""
 
-#: ../src/remote.c:932
+#: ../src/remote.c:942
 msgid "Remote not available\n"
 msgstr ""
 
-#: ../src/search.c:212
+#: ../src/search.c:220
 msgid "folder"
 msgstr "katalog"
 
-#: ../src/search.c:213
+#: ../src/search.c:221
 msgid "comments"
 msgstr "komentarze"
 
-#: ../src/search.c:214
+#: ../src/search.c:222
 msgid "results"
 msgstr "wyniki"
 
-#: ../src/search.c:218 ../src/search.c:243
+#: ../src/search.c:226 ../src/search.c:251
 msgid "contains"
 msgstr "zawiera"
 
-#: ../src/search.c:219
+#: ../src/search.c:227
 msgid "is"
 msgstr "równa"
 
-#: ../src/search.c:223 ../src/search.c:230
+#: ../src/search.c:231 ../src/search.c:238
 msgid "equal to"
-msgstr "równy"
-
-#: ../src/search.c:224
+msgstr "dokładnie"
+
+#: ../src/search.c:232
 msgid "less than"
 msgstr "mniejszy niż"
 
-#: ../src/search.c:225
+#: ../src/search.c:233
 msgid "greater than"
 msgstr "większy niż"
 
-#: ../src/search.c:226 ../src/search.c:233
+#: ../src/search.c:234 ../src/search.c:241
 msgid "between"
 msgstr "pomiędzy"
 
-#: ../src/search.c:231
+#: ../src/search.c:239
 msgid "before"
 msgstr "przed"
 
-#: ../src/search.c:232
+#: ../src/search.c:240
 msgid "after"
 msgstr "po"
 
-#: ../src/search.c:237
+#: ../src/search.c:245
 msgid "match all"
 msgstr "pasują wszystkie"
 
-#: ../src/search.c:238
+#: ../src/search.c:246
 msgid "match any"
 msgstr "pasuje dowolne"
 
-#: ../src/search.c:239
+#: ../src/search.c:247
 msgid "exclude"
 msgstr "z wyjątkiem"
 
-#: ../src/search.c:244
+#: ../src/search.c:252
 msgid "miss"
-msgstr ""
-
-#: ../src/search.c:295
+msgstr "nie zawiera"
+
+#: ../src/search.c:303
 #, c-format
 msgid "%s, %d files (%s, %d)"
 msgstr "%s, %d plików (%s, %d)"
 
-#: ../src/search.c:300
+#: ../src/search.c:308
 #, c-format
 msgid "%s, %d files"
 msgstr "%s, %d plików"
 
-#: ../src/search.c:318
+#: ../src/search.c:326
 msgid "Searching..."
 msgstr "Szukanie..."
 
-#: ../src/search.c:2120
+#: ../src/search.c:2128
 msgid "File not found"
 msgstr "Plik nie został znaleziony"
 
-#: ../src/search.c:2121
+#: ../src/search.c:2129
 msgid "Please enter an existing file for image content."
 msgstr "Proszę podać istniejący plik dla zawartości obrazu."
 
-#: ../src/search.c:2170
+#: ../src/search.c:2178
 msgid "Please enter an existing folder to search."
 msgstr "Proszę podać istniejący folder do wyszukiwania."
 
-#: ../src/search.c:2588
+#: ../src/search.c:2596
 msgid "Image search"
 msgstr "Wyszukiwanie obrazu"
 
-#: ../src/search.c:2618
+#: ../src/search.c:2626
 msgid "Search:"
 msgstr "Szukaj:"
 
-#: ../src/search.c:2632
+#: ../src/search.c:2640
 msgid "Recurse"
 msgstr "Rekursywnie"
 
-#: ../src/search.c:2637
+#: ../src/search.c:2645
 msgid "File name"
 msgstr "Nazwa pliku"
 
-#: ../src/search.c:2643 ../src/search.c:2738
+#: ../src/search.c:2651 ../src/search.c:2746
 msgid "Match case"
 msgstr "Uwzględniaj wielkość liter"
 
-#: ../src/search.c:2648
+#: ../src/search.c:2656
 msgid "File size is"
 msgstr "Rozmiar pliku"
 
-#: ../src/search.c:2655 ../src/search.c:2671 ../src/search.c:2690
+#: ../src/search.c:2663 ../src/search.c:2679 ../src/search.c:2698
 msgid "and"
 msgstr "i"
 
-#: ../src/search.c:2661
+#: ../src/search.c:2669
 msgid "File date is"
 msgstr "Data pliku"
 
-#: ../src/search.c:2679
+#: ../src/search.c:2687
 msgid "Image dimensions are"
 msgstr "Wymiary obrazu"
 
-#: ../src/search.c:2700
+#: ../src/search.c:2708
 msgid "Image content is"
 msgstr "Zawartość obrazu"
 
-#: ../src/search.c:2706
+#: ../src/search.c:2714
 #, no-c-format
 msgid "% similar to"
 msgstr "% podobna do"
 
-#: ../src/search.c:2788
+#: ../src/search.c:2796
 msgid "Rank"
 msgstr "Podobieństwo"
 
-#: ../src/secure_save.c:397
+#: ../src/secure_save.c:406
 msgid "Cannot read the file"
 msgstr "Nie można odczytać pliku"
 
-#: ../src/secure_save.c:399
+#: ../src/secure_save.c:408
 msgid "Cannot get file status"
 msgstr "Nie można odczytać stanu pliku"
 
-#: ../src/secure_save.c:401
+#: ../src/secure_save.c:410
 msgid "Cannot access the file"
 msgstr "Brak dostępu do pliku"
 
-#: ../src/secure_save.c:403
+#: ../src/secure_save.c:412
 msgid "Cannot create temp file"
 msgstr "Nie można utworzyć tymczasowego pliku"
 
-#: ../src/secure_save.c:405
+#: ../src/secure_save.c:414
 msgid "Cannot rename the file"
 msgstr "Nie można zmienić nazwy pliku"
 
-#: ../src/secure_save.c:407
+#: ../src/secure_save.c:416
 msgid "File saving disabled by option"
 msgstr "Zapisywanie pliku zostało wyłączone w opcjach"
 
-#: ../src/secure_save.c:409
+#: ../src/secure_save.c:418
 msgid "Out of memory"
 msgstr "Brak pamięci"
 
-#: ../src/secure_save.c:411
+#: ../src/secure_save.c:420
 msgid "Cannot write the file"
 msgstr "Nie mogę zapisać do pliku"
 
-#: ../src/secure_save.c:415
+#: ../src/secure_save.c:424
 msgid "Secure file saving error"
 msgstr "Błąd bezpiecznego zapisu pliku"
 
-#: ../src/thumb.c:392
+#: ../src/thumb.c:400
 msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
 msgstr "Odczyt miniaturki z cache nie powiódł się, próba odtworzenia.\n"
 
-#: ../src/trash.c:80 ../src/utilops.c:2461 ../src/utilops.c:2472
-#: ../src/utilops.c:2529
+#: ../src/trash.c:88 ../src/utilops.c:2601 ../src/utilops.c:2612
+#: ../src/utilops.c:2669
 msgid "Delete failed"
 msgstr "Usunięcie nie powiodło się"
 
-#: ../src/trash.c:81
+#: ../src/trash.c:89
 msgid "Unable to remove old file from trash folder"
 msgstr "Nie można usunąć starego pliku z kosza"
 
-#: ../src/trash.c:138
+#: ../src/trash.c:146
 msgid "Could not create folder"
 msgstr "Nie można utworzyć katalogu"
 
-#: ../src/trash.c:160
+#: ../src/trash.c:168
 msgid "Permission denied"
 msgstr "Brak dostępu"
 
-#: ../src/trash.c:170
+#: ../src/trash.c:178
 #, c-format
 msgid ""
 "Unable to access or create the trash folder.\n"
@@ -5100,20 +5154,20 @@
 "Błąd podczas dostępu lub podczas tworzenia katalogu:\n"
 "\"%s\""
 
-#: ../src/trash.c:174
+#: ../src/trash.c:182
 msgid "Turn off safe delete"
 msgstr "Wyłącz bezpieczne usuwanie"
 
-#: ../src/trash.c:193
+#: ../src/trash.c:201
 msgid "Deletion by external command"
 msgstr "Usuwanie zewnętrznym poleceniem"
 
-#: ../src/trash.c:201
+#: ../src/trash.c:209
 #, c-format
 msgid " (max. %d MB)"
 msgstr " (maks. %d MB)"
 
-#: ../src/trash.c:205
+#: ../src/trash.c:213
 #, c-format
 msgid ""
 "Safe delete: %s%s\n"
@@ -5122,40 +5176,40 @@
 "Bezpieczne usuwanie: %s%s\n"
 "Kosz: %s"
 
-#: ../src/trash.c:210
+#: ../src/trash.c:218
 #, c-format
 msgid "Safe delete: %s"
 msgstr "Bezpieczne usuwanie: %s"
 
-#: ../src/ui_bookmark.c:130 ../src/ui_bookmark.c:193
+#: ../src/ui_bookmark.c:139 ../src/ui_bookmark.c:202
 msgid "New Bookmark"
 msgstr "Nowa zakładka"
 
-#: ../src/ui_bookmark.c:276 ../src/ui_bookmark.c:282
+#: ../src/ui_bookmark.c:285 ../src/ui_bookmark.c:291
 msgid "Edit Bookmark"
 msgstr "Edycja zakładki"
 
-#: ../src/ui_bookmark.c:297
+#: ../src/ui_bookmark.c:306
 msgid "Path:"
 msgstr "Ścieżka:"
 
-#: ../src/ui_bookmark.c:306
+#: ../src/ui_bookmark.c:315
 msgid "Icon:"
 msgstr "Ikona:"
 
-#: ../src/ui_bookmark.c:312
+#: ../src/ui_bookmark.c:321
 msgid "Select icon"
 msgstr "Zaznacz ikonę"
 
-#: ../src/ui_bookmark.c:405
+#: ../src/ui_bookmark.c:414
 msgid "_Properties..."
 msgstr "_Właściwości..."
 
-#: ../src/ui_bookmark.c:411
+#: ../src/ui_bookmark.c:420
 msgid "_Remove"
 msgstr "Usuń"
 
-#: ../src/ui_fileops.c:67
+#: ../src/ui_fileops.c:76
 msgid ""
 "One or more filenames are not encoded with the preferred locale character "
 "set.\n"
@@ -5163,12 +5217,12 @@
 "Jedna lub więcej nazw plików nie jest zapisana przy pomocy prefereowanego "
 "zestawu znaków.\n"
 
-#: ../src/ui_fileops.c:68
+#: ../src/ui_fileops.c:77
 #, c-format
 msgid "Operations on, and display of these files with %s may not succeed.\n"
 msgstr "Wyświetlanie i operacje na tych plikach w %s mogą się nie powieść.\n"
 
-#: ../src/ui_fileops.c:70
+#: ../src/ui_fileops.c:79
 msgid ""
 "If your filenames are not encoded in utf-8, try setting the environment "
 "variable G_BROKEN_FILENAMES=1\n"
@@ -5176,16 +5230,16 @@
 "Jeśli twoje nazwy plików nie są zapisane w utf-8, spróbuj "
 "ustawić zmienną środowiskową G_BROKEN_FILENAMES=1\n"
 
-#: ../src/ui_fileops.c:72
+#: ../src/ui_fileops.c:81
 #, c-format
 msgid "It appears G_BROKEN_FILENAMES is set to %s\n"
 msgstr "Zmienna G_BROKEN_FILENAMES ma wartość %s\n"
 
-#: ../src/ui_fileops.c:74
+#: ../src/ui_fileops.c:83
 msgid "It appears G_BROKEN_FILENAMES is not set\n"
 msgstr "Zmienna G_BROKEN_FILENAMES nie jest ustawiona\n"
 
-#: ../src/ui_fileops.c:76
+#: ../src/ui_fileops.c:85
 #, c-format
 msgid ""
 "The locale appears to be set to \"%s\"\n"
@@ -5194,7 +5248,7 @@
 "Locale ustawione na \"%s\"\n"
 "(ustawione przez zmienną środowiskową LANG)\n"
 
-#: ../src/ui_fileops.c:81
+#: ../src/ui_fileops.c:90
 msgid ""
 "\n"
 "Preferred encoding appears to be UTF-8, however the file:\n"
@@ -5202,25 +5256,25 @@
 "\n"
 "Preferowanym kodowaniem wydaje się być UTF-8, jednak plik:\n"
 
-#: ../src/ui_fileops.c:82 ../src/ui_fileops.c:85 ../src/ui_fileops.c:87
+#: ../src/ui_fileops.c:91 ../src/ui_fileops.c:94 ../src/ui_fileops.c:96
 msgid "[name not displayable]"
 msgstr "[nazwa niemożliwa do wyświetlenia]"
 
-#: ../src/ui_fileops.c:85
+#: ../src/ui_fileops.c:94
 #, c-format
 msgid "\"%s\" is encoded in valid UTF-8."
 msgstr "\"%s\" jest poprawnie zapisany w UTF-8."
 
-#: ../src/ui_fileops.c:87
+#: ../src/ui_fileops.c:96
 #, c-format
 msgid "\"%s\" is not encoded in valid UTF-8."
 msgstr "\"%s\" nie jest poprawnie zapisany w UTF-8."
 
-#: ../src/ui_fileops.c:92 ../src/ui_fileops.c:97
+#: ../src/ui_fileops.c:101 ../src/ui_fileops.c:106
 msgid "Filename encoding locale mismatch"
 msgstr "Niezgodność kodowania znaków nazwy plików"
 
-#: ../src/ui_help.c:110
+#: ../src/ui_help.c:119
 #, c-format
 msgid ""
 "Unable to load:\n"
@@ -5229,33 +5283,33 @@
 "Nie można wczytać:\n"
 "%s"
 
-#: ../src/ui_pathsel.c:424 ../src/ui_pathsel.c:430 ../src/utilops.c:2160
-#: ../src/utilops.c:2187 ../src/utilops.c:2653
+#: ../src/ui_pathsel.c:433 ../src/ui_pathsel.c:439 ../src/utilops.c:2300
+#: ../src/utilops.c:2327 ../src/utilops.c:2793
 msgid "Rename failed"
 msgstr "Błąd zmiany nazwy"
 
-#: ../src/ui_pathsel.c:429
+#: ../src/ui_pathsel.c:438
 #, c-format
 msgid "Failed to rename %s to %s."
 msgstr "Zmiana nazwy %s na %s nie powiodła się."
 
-#: ../src/ui_pathsel.c:625 ../src/ui_pathsel.c:633
+#: ../src/ui_pathsel.c:634 ../src/ui_pathsel.c:642
 msgid "_Rename"
 msgstr "Zmień nazwę"
 
-#: ../src/ui_pathsel.c:627 ../src/ui_pathsel.c:637
+#: ../src/ui_pathsel.c:636 ../src/ui_pathsel.c:646
 msgid "Add _Bookmark"
 msgstr "Dodanie zakładki"
 
-#: ../src/ui_pathsel.c:635
+#: ../src/ui_pathsel.c:644
 msgid "_Delete"
 msgstr "Usuń"
 
-#: ../src/ui_pathsel.c:742 ../src/ui_pathsel.c:1047 ../src/utilops.c:2687
+#: ../src/ui_pathsel.c:751 ../src/ui_pathsel.c:1056 ../src/utilops.c:2827
 msgid "New folder"
 msgstr "Nowy katalog"
 
-#: ../src/ui_pathsel.c:752
+#: ../src/ui_pathsel.c:761
 #, c-format
 msgid ""
 "Unable to create folder:\n"
@@ -5264,35 +5318,35 @@
 "Błąd tworzenia katalogu:\n"
 "%s"
 
-#: ../src/ui_pathsel.c:753
+#: ../src/ui_pathsel.c:762
 msgid "Error creating folder"
 msgstr "Błąd podczas tworzenia katalogu"
 
-#: ../src/ui_pathsel.c:978
+#: ../src/ui_pathsel.c:987
 msgid "All Files"
 msgstr "Wszystkie pliki"
 
-#: ../src/ui_pathsel.c:1050
+#: ../src/ui_pathsel.c:1059
 msgid "Show hidden"
 msgstr "Wyświetlanie ukrytych"
 
-#: ../src/ui_pathsel.c:1134
+#: ../src/ui_pathsel.c:1143
 msgid "Filter:"
 msgstr "Filtr:"
 
-#: ../src/ui_tabcomp.c:924
+#: ../src/ui_tabcomp.c:933
 msgid "Select path"
 msgstr "Ustaw ścieżki"
 
-#: ../src/ui_tabcomp.c:940
+#: ../src/ui_tabcomp.c:949
 msgid "All files"
 msgstr "Wszystkie pliki"
 
-#: ../src/uri_utils.c:35
+#: ../src/uri_utils.c:43
 msgid "Drag and Drop failed"
 msgstr "Przeciąganie nie powiodło się"
 
-#: ../src/utilops.c:547
+#: ../src/utilops.c:590
 msgid ""
 "\n"
 " Continue multiple file operation?"
@@ -5300,11 +5354,11 @@
 "\n"
 "Kontynuować operację na wielu plikach?"
 
-#: ../src/utilops.c:554 ../src/utilops.c:987
+#: ../src/utilops.c:597 ../src/utilops.c:1030
 msgid "Co_ntinue"
 msgstr "Ko_ntynuuj"
 
-#: ../src/utilops.c:731
+#: ../src/utilops.c:774
 #, c-format
 msgid ""
 "Removal of folder contents failed at this file:\n"
@@ -5315,7 +5369,7 @@
 "\n"
 "%s"
 
-#: ../src/utilops.c:875
+#: ../src/utilops.c:918
 #, c-format
 msgid ""
 "%s\n"
@@ -5324,103 +5378,107 @@
 "%s\n"
 "Nie można uruchomić zewnętrznego polecenia.\n"
 
-#: ../src/utilops.c:955
+#. During copy/move operations it is necessary to ensure that the
+#. * target directory exists before continuing with the next step.
+#. * If not revert to the select directory dialog
+#.
+#: ../src/utilops.c:998 ../src/utilops.c:1150
 #, c-format
 msgid "%s is not a directory"
 msgstr "%s nie jest katalogiem"
 
-#: ../src/utilops.c:985
+#: ../src/utilops.c:1028
 msgid "Really continue?"
 msgstr "Na pewno kontynuować?"
 
-#: ../src/utilops.c:999
+#: ../src/utilops.c:1042 ../src/utilops.c:1155
 msgid "This operation can't continue:"
 msgstr "Ta operacja nie może być kontynuowana:"
 
-#: ../src/utilops.c:1377 ../src/utilops.c:1490 ../src/utilops.c:1874
+#: ../src/utilops.c:1492 ../src/utilops.c:1605 ../src/utilops.c:2012
 msgid "Discard changes"
 msgstr "Cofnij zmiany"
 
-#: ../src/utilops.c:1378 ../src/utilops.c:1491 ../src/utilops.c:1824
-#: ../src/utilops.c:1840
+#: ../src/utilops.c:1493 ../src/utilops.c:1606 ../src/utilops.c:1962
+#: ../src/utilops.c:1978
 msgid "File details"
 msgstr "Szczegóły pliku"
 
-#: ../src/utilops.c:1400 ../src/utilops.c:1498
+#: ../src/utilops.c:1515 ../src/utilops.c:1613
 msgid "Sidecars"
 msgstr "Pliki sidecar"
 
-#: ../src/utilops.c:1402
+#: ../src/utilops.c:1517
 msgid "Write to file"
 msgstr "Zapisz do pliku"
 
-#: ../src/utilops.c:1442
+#: ../src/utilops.c:1557
 msgid "Choose the destination folder."
 msgstr "Wybierz katalog docelowy."
 
-#: ../src/utilops.c:1500
+#: ../src/utilops.c:1615
 msgid "New name"
 msgstr "Nowa nazwa"
 
-#: ../src/utilops.c:1530
+#: ../src/utilops.c:1652
 msgid "Manual rename"
 msgstr "Ręczna zmiana nazwy"
 
-#: ../src/utilops.c:1535
+#: ../src/utilops.c:1657
 msgid "Original name:"
 msgstr "Pierwotna nazwa:"
 
-#: ../src/utilops.c:1538
+#: ../src/utilops.c:1660
 msgid "New name:"
 msgstr "Nowa nazwa:"
 
-#: ../src/utilops.c:1551
+#: ../src/utilops.c:1673
 msgid "Auto rename"
 msgstr "Automatyczna zmiana nazwy"
 
-#: ../src/utilops.c:1557
+#: ../src/utilops.c:1679
 msgid "Begin text"
 msgstr "Początek tekstu"
 
-#: ../src/utilops.c:1565 ../src/utilops.c:1597
+#: ../src/utilops.c:1687 ../src/utilops.c:1719
 msgid "Start #"
 msgstr "Start #"
 
-#: ../src/utilops.c:1571
+#: ../src/utilops.c:1693
 msgid "End text"
 msgstr "Koniec tekstu"
 
-#: ../src/utilops.c:1579
+#: ../src/utilops.c:1701
 msgid "Padding:"
 msgstr "Ilość cyfr:"
 
-#: ../src/utilops.c:1584
+#: ../src/utilops.c:1706
 msgid "Formatted rename"
 msgstr "Zmiana nazwy wg formatu"
 
-#: ../src/utilops.c:1589
+#: ../src/utilops.c:1711
 msgid "Format (* = original name, ## = numbers)"
 msgstr "Format (* = oryginalna nazwa, ## = numery)"
 
-#: ../src/utilops.c:1727
+#: ../src/utilops.c:1865
 msgid "Another operation in progress.\n"
 msgstr "Inna operacja jest właśnie w toku.\n"
 
-#: ../src/utilops.c:1783
+#: ../src/utilops.c:1921
 #, c-format
 msgid "File: '%s'\n"
 msgstr "Plik: '%s'\n"
 
-#: ../src/utilops.c:1788
+#: ../src/utilops.c:1926
 msgid "with sidecar files:\n"
 msgstr "z plikami sidecar:\n"
 
-#: ../src/utilops.c:1794
+#: ../src/utilops.c:1932
 #, c-format
 msgid " '%s'\n"
 msgstr " '%s'\n"
 
-#: ../src/utilops.c:1798
+#: ../src/utilops.c:1936
 msgid ""
 "\n"
 "Status: "
@@ -5428,19 +5486,19 @@
 "\n"
 "Status: "
 
-#: ../src/utilops.c:1810
+#: ../src/utilops.c:1948
 msgid "no problem detected"
 msgstr "nie wykryto problemów"
 
-#: ../src/utilops.c:1826 ../src/utilops.c:1873
+#: ../src/utilops.c:1964 ../src/utilops.c:2011
 msgid "Exclude file"
 msgstr "Pomiń plik"
 
-#: ../src/utilops.c:1871 ../src/utilops.c:1896
+#: ../src/utilops.c:2009 ../src/utilops.c:2034
 msgid "Overview of changed metadata"
 msgstr "Opis zmienionych metadanych"
 
-#: ../src/utilops.c:1889
+#: ../src/utilops.c:2027
 #, c-format
 msgid ""
 "The following metadata tags will be written to\n"
@@ -5449,100 +5507,100 @@
 "Następujące metadane zostaną zapisane do\n"
 "'%s'."
 
-#: ../src/utilops.c:1893
+#: ../src/utilops.c:2031
 #, c-format
 msgid "The following metadata tags will be written to the image file itself."
 msgstr "Następujące metadane zostaną zapisane do pliku obrazu bezpośrednio."
 
-#: ../src/utilops.c:1999
+#: ../src/utilops.c:2137
 msgid "Delete files?"
 msgstr "Usunąć pliki?"
 
-#: ../src/utilops.c:2000
-msgid "This will delete the following files"
-msgstr "Ta operacja spowoduje usunięcie następujących plików"
-
-#: ../src/utilops.c:2019
-msgid "Can't write metadata"
-msgstr "Nie mogę zapisać metadanych"
-
-#: ../src/utilops.c:2042
-msgid "Write metadata"
-msgstr "Zapisz metadane"
-
-#: ../src/utilops.c:2043
-msgid "Write metadata?"
-msgstr "Zapisać metadane?"
-
-#: ../src/utilops.c:2044
-msgid "This will write the changed metadata into the following files"
-msgstr "Ta operacja zapisze zmienione metadane do następujących plików"
-
-#: ../src/utilops.c:2046
-msgid "Metadata writing failed"
-msgstr "Zapisywanie metadanych nie powiodło się"
-
-#: ../src/utilops.c:2065 ../src/utilops.c:2092
-msgid "Move failed"
-msgstr "Przenoszenie nie powiodło się"
-
-#: ../src/utilops.c:2089
-msgid "Move files?"
-msgstr "Przenieś pliki?"
-
-#: ../src/utilops.c:2090
-msgid "This will move the following files"
-msgstr "Ta operacja spowoduje przeniesienie następujących plików"
-
-#: ../src/utilops.c:2114 ../src/utilops.c:2141
-msgid "Copy failed"
-msgstr "Kopiowanie nie powiodło się"
-
 #: ../src/utilops.c:2138
+msgid "This will delete the following files"
+msgstr "Ta operacja spowoduje usunięcie następujących plików"
+
+#: ../src/utilops.c:2157
+msgid "Can't write metadata"
+msgstr "Nie mogę zapisać metadanych"
+
+#: ../src/utilops.c:2180
+msgid "Write metadata"
+msgstr "Zapisz metadane"
+
+#: ../src/utilops.c:2181
+msgid "Write metadata?"
+msgstr "Zapisać metadane?"
+
+#: ../src/utilops.c:2182
+msgid "This will write the changed metadata into the following files"
+msgstr "Ta operacja zapisze zmienione metadane do następujących plików"
+
+#: ../src/utilops.c:2184
+msgid "Metadata writing failed"
+msgstr "Zapisywanie metadanych nie powiodło się"
+
+#: ../src/utilops.c:2203 ../src/utilops.c:2231
+msgid "Move failed"
+msgstr "Przenoszenie nie powiodło się"
+
+#: ../src/utilops.c:2228
+msgid "Move files?"
+msgstr "Przenieś pliki?"
+
+#: ../src/utilops.c:2229
+msgid "This will move the following files"
+msgstr "Ta operacja spowoduje przeniesienie następujących plików"
+
+#: ../src/utilops.c:2253 ../src/utilops.c:2281
+msgid "Copy failed"
+msgstr "Kopiowanie nie powiodło się"
+
+#: ../src/utilops.c:2278
 msgid "Copy files?"
 msgstr "Kopiować pliki?"
 
-#: ../src/utilops.c:2139 ../src/utilops.c:2273
+#: ../src/utilops.c:2279 ../src/utilops.c:2413
 msgid "This will copy the following files"
 msgstr "Skopiowane zostaną następujące pliki"
 
-#: ../src/utilops.c:2183 ../src/utilops.c:2649
+#: ../src/utilops.c:2323 ../src/utilops.c:2789
 msgid "Rename"
 msgstr "Zmień nazwę"
 
-#: ../src/utilops.c:2184
+#: ../src/utilops.c:2324
 msgid "Rename files?"
 msgstr "Zmienić nazwę plików?"
 
-#: ../src/utilops.c:2185
+#: ../src/utilops.c:2325
 msgid "This will rename the following files"
 msgstr "Ta operacja spowoduje zmianę nazwy następujących plików"
 
-#: ../src/utilops.c:2237
+#: ../src/utilops.c:2377
 msgid "Can't run external editor"
 msgstr "Nie mogę uruchomić zewnętrznego edytora"
 
-#: ../src/utilops.c:2271
+#: ../src/utilops.c:2411
 msgid "Editor"
 msgstr "Edytor"
 
-#: ../src/utilops.c:2272
+#: ../src/utilops.c:2412
 msgid "Run editor?"
 msgstr "Uruchomić edytor?"
 
-#: ../src/utilops.c:2275
+#: ../src/utilops.c:2415
 msgid "External command failed"
 msgstr "Zewnętrzne polecenie nie powiodło się"
 
-#: ../src/utilops.c:2444 ../src/utilops.c:2517
+#: ../src/utilops.c:2584 ../src/utilops.c:2657
 msgid "Delete folder"
 msgstr "Usuń katalog"
 
-#: ../src/utilops.c:2445
+#: ../src/utilops.c:2585
 msgid "Delete symbolic link?"
 msgstr "Usunąć dowiązanie symboliczne?"
 
-#: ../src/utilops.c:2447
+#: ../src/utilops.c:2587
 msgid ""
 "This will delete the symbolic link.\n"
 "The folder this link points to will not be deleted."
@@ -5550,11 +5608,11 @@
 "Zaraz usuniesz dowiązanie symboliczne.\n"
 "Katalog na który wskazuje to dowiązanie NIE zostanie usunięty."
 
-#: ../src/utilops.c:2449
+#: ../src/utilops.c:2589
 msgid "Link deletion failed"
 msgstr "Usunięcie linku nie powiodło się"
 
-#: ../src/utilops.c:2459
+#: ../src/utilops.c:2599
 #, c-format
 msgid ""
 "Unable to remove folder %s\n"
@@ -5563,16 +5621,16 @@
 "Nie można usunąć katalogu %s\n"
 "Brak uprawnień by zapisywać w tym katalogu."
 
-#: ../src/utilops.c:2471 ../src/utilops.c:2528
+#: ../src/utilops.c:2611 ../src/utilops.c:2668
 #, c-format
 msgid "Unable to list contents of folder %s"
 msgstr "Nie mogę wyświetlić zawartości katalogu %s"
 
-#: ../src/utilops.c:2485 ../src/utilops.c:2493
+#: ../src/utilops.c:2625 ../src/utilops.c:2633
 msgid "Folder contains subfolders"
 msgstr "Katalog zawiera podkatalogi"
 
-#: ../src/utilops.c:2489
+#: ../src/utilops.c:2629
 #, c-format
 msgid ""
 "Unable to delete the folder:\n"
@@ -5588,19 +5646,19 @@
 "Ten katalog zawiera podkatalogi, które musza zostać przeniesione zanim "
 "katalog może zostać usunięty."
 
-#: ../src/utilops.c:2497
+#: ../src/utilops.c:2637
 msgid "Subfolders:"
 msgstr "Podkatalogi:"
 
-#: ../src/utilops.c:2518
+#: ../src/utilops.c:2658
 msgid "Delete folder?"
 msgstr "Usunąć katalog?"
 
-#: ../src/utilops.c:2519
+#: ../src/utilops.c:2659
 msgid "The folder contains these files:"
 msgstr "Ten katalog zawiera następujące pliki:"
 
-#: ../src/utilops.c:2520
+#: ../src/utilops.c:2660
 msgid ""
 "This will delete the folder.\n"
 "The contents of this folder will also be deleted."
@@ -5608,87 +5666,87 @@
 "Zaraz usuniesz katalog.\n"
 "Zawartość tego katalogu TAKŻE zostanie usunięta."
 
-#: ../src/utilops.c:2650
+#: ../src/utilops.c:2790
 msgid "Rename folder?"
 msgstr "Zmienić nazwę katalogu?"
 
-#: ../src/utilops.c:2651
+#: ../src/utilops.c:2791
 msgid "The folder contains the following files"
 msgstr "Katalog zawiera następujące pliki"
 
-#: ../src/utilops.c:2697
+#: ../src/utilops.c:2837
 msgid "Create Folder"
 msgstr "Utwórz katalog"
 
-#: ../src/utilops.c:2698
+#: ../src/utilops.c:2838
 msgid "Create folder?"
 msgstr "Utworzyć katalog?"
 
-#: ../src/utilops.c:2701
+#: ../src/utilops.c:2841
 msgid "Can't create folder"
 msgstr "Nie można utworzyć katalogu"
 
-#: ../src/view_dir.c:397
+#: ../src/view_dir.c:406
 msgid "_Copy"
 msgstr "S_kopiuj"
 
-#: ../src/view_dir.c:399
+#: ../src/view_dir.c:408
 msgid "_Move"
 msgstr "_Przenieś"
 
-#: ../src/view_dir.c:644
+#: ../src/view_dir.c:653
 msgid "_Up to parent"
 msgstr "W _górę do nadrzędnego"
 
-#: ../src/view_dir.c:649
+#: ../src/view_dir.c:658
 msgid "_Slideshow"
 msgstr "Przeglądanie _slajdowe"
 
-#: ../src/view_dir.c:651
+#: ../src/view_dir.c:660
 msgid "Slideshow recursive"
 msgstr "Rekurencyjne przeglądanie slajdowe"
 
-#: ../src/view_dir.c:655
+#: ../src/view_dir.c:664
 msgid "Find _duplicates..."
 msgstr "Wyszukaj _duplikaty..."
 
-#: ../src/view_dir.c:657
+#: ../src/view_dir.c:666
 msgid "Find duplicates recursive..."
 msgstr "Rekurencyjnie wyszukaj duplikaty..."
 
-#: ../src/view_dir.c:662
+#: ../src/view_dir.c:671
 msgid "_New folder..."
 msgstr "Nowy _folder..."
 
-#: ../src/view_dir.c:676 ../src/view_file.c:619
+#: ../src/view_dir.c:685 ../src/view_file.c:655
 msgid "View as _List"
 msgstr "Wyświetlanie jako _lista"
 
-#: ../src/view_dir.c:679
+#: ../src/view_dir.c:688
 msgid "View as _Tree"
 msgstr "Wyświetlanie jako _drzewo"
 
-#: ../src/view_dir.c:684
+#: ../src/view_dir.c:693
 msgid "Show _hidden files"
 msgstr "Wyświetlanie ukrytych plików"
 
-#: ../src/view_dir.c:687 ../src/view_file.c:637
+#: ../src/view_dir.c:696 ../src/view_file.c:673
 msgid "Re_fresh"
 msgstr "_Odśwież"
 
-#: ../src/view_file.c:622
+#: ../src/view_file.c:658
 msgid "View as _Icons"
 msgstr "Wyświetlanie jako _ikony"
 
-#: ../src/view_file.c:628
+#: ../src/view_file.c:664
 msgid "Show _thumbnails"
 msgstr "Pokaż _miniaturki"
 
-#: ../src/view_file_icon.c:2098 ../src/view_file_list.c:825
+#: ../src/view_file_icon.c:2137 ../src/view_file_list.c:834
 msgid " [NO GROUPING]"
 msgstr "[BEZ GRUPOWANIA]"
 
-#: ../src/view_file_list.c:451
+#: ../src/view_file_list.c:460
 #, c-format
 msgid ""
 "Invalid file name:\n"
@@ -5697,10 +5755,13 @@
 "Niepoprawna nazwa pliku:\n"
 "%s"
 
-#: ../src/view_file_list.c:452
+#: ../src/view_file_list.c:461
 msgid "Error renaming file"
 msgstr "Błąd podczas zmiany nazwy pliku"
 
-#: ../src/window.c:252
+#: ../src/window.c:261
 msgid "Help"
 msgstr "Pomo_c"
+
+#~ msgid "Add keywords"
+#~ msgstr "Dodaj słowa kluczowe"
--- a/src/Makefile.am	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/Makefile.am	Sat Jul 08 10:32:34 2017 +0100
@@ -81,12 +81,14 @@
 	$(extra_ICONS)
 
 include $(srcdir)/pan-view/Makefile.am
+include $(srcdir)/view_file/Makefile.am
 
 bin_PROGRAMS = geeqie
 
 geeqie_SOURCES = \
 	$(module_SLIK)	\
 	$(module_pan_view)	\
+	$(module_view_file)	\
 	ClayRGB1998.icc \
 	ClayRGB1998_icc.h \
 	advanced_exif.c	\
@@ -226,6 +228,8 @@
 	search.h	\
 	secure_save.c	\
 	secure_save.h	\
+	shortcuts.c	\
+	shortcuts.h	\
 	similar.c	\
 	similar.h	\
 	slideshow.c	\
@@ -249,10 +253,6 @@
 	view_dir_tree.h	\
 	view_file.c	\
 	view_file.h	\
-	view_file_list.c	\
-	view_file_list.h	\
-	view_file_icon.c	\
-	view_file_icon.h	\
 	window.c	\
 	window.h	\
 	lua.c		\
--- a/src/bar.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/bar.c	Sat Jul 08 10:32:34 2017 +0100
@@ -83,6 +83,14 @@
 "        </bar>"
 "    </layout>"
 "</gq>";
+static const gchar default_config_rating[] =
+"<gq>"
+"    <layout id = '_current_'>"
+"        <bar>"
+"            <pane_comment id = 'rating' expanded = 'true' key = '" RATING_KEY "' height = '10' />"
+"        </bar>"
+"    </layout>"
+"</gq>";
 
 static const gchar default_config_exif[] =
 "<gq>"
@@ -176,6 +184,7 @@
 	{PANE_COMMENT,		"title",	N_("Title"),		default_config_title},
 	{PANE_KEYWORDS,		"keywords",	N_("Keywords"),		default_config_keywords},
 	{PANE_COMMENT,		"comment",	N_("Comment"),		default_config_comment},
+	{PANE_COMMENT,		"rating",	N_("Rating"),		default_config_rating},
 	{PANE_EXIF,		"exif",		N_("Exif"),		default_config_exif},
 /* other pre-configured panes */
 	{PANE_EXIF,		"file_info",	N_("File info"),	default_config_file_info},
@@ -196,6 +205,7 @@
 	GtkWidget *vbox;
 	FileData *fd;
 	GtkWidget *label_file_name;
+	GtkWidget *add_button;
 
 	LayoutWindow *lw;
 	gint width;
@@ -322,6 +332,27 @@
 	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, bar, 0, GDK_CURRENT_TIME);
 }
 
+static void bar_menu_add_popup(GtkWidget *widget)
+{
+	GtkWidget *menu;
+	GtkWidget *bar;
+	const KnownPanes *pane = known_panes;
+
+	bar = widget;
+
+	menu = popup_menu_short_lived();
+
+	while (pane->id)
+		{
+		GtkWidget *item;
+		item = menu_item_add_stock(menu, _(pane->title), GTK_STOCK_ADD, G_CALLBACK(bar_expander_add_cb), bar);
+		g_object_set_data(G_OBJECT(item), "pane_add_id", pane->id);
+		pane++;
+		}
+
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, bar, 0, GDK_CURRENT_TIME);
+}
+
 
 static gboolean bar_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
@@ -333,6 +364,12 @@
 	return FALSE;
 }
 
+static gboolean bar_menu_add_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+	bar_menu_add_popup(widget);
+	return TRUE;
+}
+
 
 static void bar_pane_set_fd_cb(GtkWidget *expander, gpointer data)
 {
@@ -539,7 +576,7 @@
 
 void bar_populate_default(GtkWidget *bar)
 {
-	const gchar *populate_id[] = {"histogram", "title", "keywords", "comment", "exif", NULL};
+	const gchar *populate_id[] = {"histogram", "title", "keywords", "comment", "rating", "exif", NULL};
 	const gchar **id = populate_id;
 
 	while (*id)
@@ -605,6 +642,8 @@
 	BarData *bd;
 	GtkWidget *box;
 	GtkWidget *scrolled;
+	GtkWidget *tbar;
+	GtkWidget *add_box;
 
 	bd = g_new0(BarData, 1);
 
@@ -646,6 +685,14 @@
 	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled), bd->vbox);
 	gtk_viewport_set_shadow_type(GTK_VIEWPORT(gtk_bin_get_child(GTK_BIN(scrolled))), GTK_SHADOW_NONE);
 
+	add_box = gtk_vbox_new(FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(bd->widget), add_box, FALSE, FALSE, 0);
+	tbar = pref_toolbar_new(add_box, GTK_TOOLBAR_ICONS);
+	bd->add_button = pref_toolbar_button(tbar, GTK_STOCK_ADD, NULL, FALSE,
+					     _("Add Pane"),
+					     G_CALLBACK(bar_menu_add_cb), bd);
+	gtk_widget_show(add_box);
+
 #ifdef HAVE_LIBCHAMPLAIN_GTK
 	g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(scrolled))), "unrealize", G_CALLBACK(bar_unrealize_clutter_fix_cb), NULL);
 #endif
--- a/src/bar_comment.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/bar_comment.c	Sat Jul 08 10:32:34 2017 +0100
@@ -167,6 +167,19 @@
 	pcd = g_object_get_data(G_OBJECT(pane), "pane_data");
 	if (!pcd) return;
 
+	if (!g_strcmp0(pcd->pane.id, "title"))
+		{
+		pcd->height = options->info_title.height;
+		}
+	if (!g_strcmp0(pcd->pane.id, "comment"))
+		{
+		pcd->height = options->info_comment.height;
+		}
+	if (!g_strcmp0(pcd->pane.id, "rating"))
+		{
+		pcd->height = options->info_rating.height;
+		}
+
 	WRITE_NL(); WRITE_STRING("<pane_comment ");
 	write_char_option(outstr, indent, "id", pcd->pane.id);
 	write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(pcd->pane.title)));
@@ -294,6 +307,19 @@
 		log_printf("unknown attribute %s = %s\n", option, value);
 		}
 
+	if (!g_strcmp0(id, "title"))
+		{
+		options->info_title.height = height;
+		}
+	if (!g_strcmp0(id, "comment"))
+		{
+		options->info_comment.height = height;
+		}
+	if (!g_strcmp0(id, "rating"))
+		{
+		options->info_rating.height = height;
+		}
+
 	bar_pane_translate_title(PANE_COMMENT, id, &title);
 	ret = bar_pane_comment_new(id, title, key, expanded, height);
 	g_free(title);
--- a/src/bar_gps.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/bar_gps.c	Sat Jul 08 10:32:34 2017 +0100
@@ -30,9 +30,12 @@
 #include "layout.h"
 #include "metadata.h"
 #include "menu.h"
+#include "misc.h"
 #include "rcfile.h"
 #include "thumb.h"
 #include "ui_menu.h"
+#include "uri_utils.h"
+#include "ui_utildlg.h"
 
 #include <clutter-gtk/clutter-gtk.h>
 #include <champlain/champlain.h>
@@ -72,8 +75,189 @@
 	gint selection_count;
 	gboolean centre_map_checked;
 	gboolean enable_markers_checked;
+	gdouble dest_latitude;
+	gdouble dest_longitude;
+	GList *geocode_list;
 };
 
+/*
+ *-------------------------------------------------------------------
+ * drag-and-drop
+ *-------------------------------------------------------------------
+ */
+enum {
+	TARGET_APP_COLLECTION_MEMBER,
+	TARGET_APP_EXIF_ENTRY,
+	TARGET_APP_KEYWORD_PATH,
+	TARGET_URI_LIST,
+	TARGET_TEXT_PLAIN
+};
+
+static GtkTargetEntry bar_pane_gps_drop_types[] = {
+	{ "text/uri-list", 0, TARGET_URI_LIST },
+	{ "text/plain", 0, TARGET_TEXT_PLAIN }
+};
+static gint n_gps_entry_drop_types = 2;
+
+static void bar_pane_gps_close_cancel_cb(GenericDialog *gd, gpointer data)
+{
+	PaneGPSData *pgd = data;
+
+	g_list_free(pgd->geocode_list);
+}
+
+static void bar_pane_gps_close_save_cb(GenericDialog *gd, gpointer data)
+{
+	PaneGPSData *pgd = data;
+	FileData *fd;
+	GList *work;
+
+	work = g_list_first(pgd->geocode_list);
+	while (work)
+		{
+		fd = work->data;
+		if (fd->name && !fd->parent)
+			{
+			work = work->next;
+			metadata_write_GPS_coord(fd, "Xmp.exif.GPSLatitude", pgd->dest_latitude);
+			metadata_write_GPS_coord(fd, "Xmp.exif.GPSLongitude", pgd->dest_longitude);
+			}
+		}
+	g_list_free(work);
+	g_list_free(pgd->geocode_list);
+}
+
+ static void bar_pane_gps_dnd_receive(GtkWidget *pane, GdkDragContext *context,
+									  gint x, gint y,
+									  GtkSelectionData *selection_data, guint info,
+									  guint time, gpointer data)
+{
+	PaneGPSData *pgd;
+	GenericDialog *gd;
+	FileData *fd, *fd_found;
+	GList *work, *list;
+	gint count, geocoded_count;
+	gdouble latitude, longitude;
+	GString *message;
+	gchar *location;
+	gchar **latlong;
+
+	pgd = g_object_get_data(G_OBJECT(pane), "pane_data");
+	if (!pgd) return;
+
+	if (info == TARGET_URI_LIST)
+		{
+		pgd->dest_longitude = champlain_view_x_to_longitude(CHAMPLAIN_VIEW(pgd->gps_view), x);
+		pgd->dest_latitude = champlain_view_y_to_latitude(CHAMPLAIN_VIEW(pgd->gps_view), y);
+
+		count = 0;
+		geocoded_count = 0;
+		pgd->geocode_list = NULL;
+
+		list = uri_filelist_from_gtk_selection_data(selection_data);
+
+		if (list)
+			{
+			work = list;
+			while (work)
+				{
+				fd = work->data;
+				work = work->next;
+				if (fd->name && !fd->parent)
+					{
+					count++;
+					pgd->geocode_list = g_list_append(pgd->geocode_list, fd);
+					latitude = metadata_read_GPS_coord(fd, "Xmp.exif.GPSLatitude", 1000);
+					longitude = metadata_read_GPS_coord(fd, "Xmp.exif.GPSLongitude", 1000);
+					if (latitude != 1000 && longitude != 1000)
+						{
+						geocoded_count++;
+						}
+					}
+				}
+			g_list_free(work);
+
+			if(count)
+				{
+				message = g_string_new("");
+				if (count == 1)
+					{
+					fd_found = g_list_first(pgd->geocode_list)->data;
+					g_string_append_printf(message,
+							_("\nDo you want to geocode image %s?"), fd_found->name);
+					}
+				else
+					{
+					g_string_append_printf(message,
+							_("\nDo you want to geocode %i images?"), count);
+					}
+				if (geocoded_count == 1 && count == 1)
+					{
+					g_string_append_printf(message,
+							_("\nThis image is already geocoded!"));
+					}
+				else if (geocoded_count == 1 && count > 1)
+					{
+					g_string_append_printf(message,
+							_("\nOne image is already geocoded!"));
+					}
+				else if (geocoded_count > 1 && count > 1)
+					{
+					g_string_append_printf(message,
+							_("\n%i Images are already geocoded!"), geocoded_count);
+					}
+
+				location = g_strdup_printf("%lf %lf", pgd->dest_latitude,
+														pgd->dest_longitude);
+				g_string_append_printf(message, _("\n\nPosition: %s \n"), location);
+
+				gd = generic_dialog_new(_("Geocode images"),
+							"geocode_images", NULL, TRUE,
+							bar_pane_gps_close_cancel_cb, pgd);
+				generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,
+							_("Write lat/long to meta-data?"),
+							message->str);
+
+				generic_dialog_add_button(gd, GTK_STOCK_SAVE, NULL,
+												bar_pane_gps_close_save_cb, TRUE);
+
+				gtk_widget_show(gd->dialog);
+				g_free(location);
+				g_string_free(message, TRUE);
+				}
+			}
+		}
+
+	if (info == TARGET_TEXT_PLAIN)
+		{
+		location = decode_geo_parameters((gchar *)gtk_selection_data_get_data(selection_data));
+		if (!(g_strstr_len(location,-1,"Error")))
+			{
+			latlong = g_strsplit(location, " ", 2);
+			champlain_view_center_on(CHAMPLAIN_VIEW(pgd->gps_view),
+							g_ascii_strtod(latlong[0],NULL),
+							g_ascii_strtod(latlong[1],NULL));
+			g_strfreev(latlong);
+			}
+		g_free(location);
+		}
+
+	return;
+}
+
+static void bar_pane_gps_dnd_init(gpointer data)
+{
+	PaneGPSData *pgd = data;
+
+	gtk_drag_dest_set(pgd->widget,
+			  GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
+			  bar_pane_gps_drop_types, n_gps_entry_drop_types,
+			  GDK_ACTION_COPY | GDK_ACTION_MOVE);
+	g_signal_connect(G_OBJECT(pgd->widget), "drag_data_received",
+			 G_CALLBACK(bar_pane_gps_dnd_receive), NULL);
+
+}
+
 static gboolean bar_gps_draw_direction (ClutterCanvas *canvas,
 				cairo_t *cr, gpointer data)
 {
@@ -649,7 +833,7 @@
  */
 void bar_pane_gps_map_centreing(PaneGPSData *pgd)
 {
-	GtkWidget *dialog;
+	GenericDialog *gd;
 	GString *message = g_string_new("");
 
 	if (pgd->centre_map_checked)
@@ -663,16 +847,14 @@
 		pgd->centre_map_checked = TRUE;
 		}
 
-	dialog = gtk_message_dialog_new(NULL,
-							  GTK_DIALOG_DESTROY_WITH_PARENT,
-							  GTK_MESSAGE_INFO,
-							  GTK_BUTTONS_CLOSE,
-							  "%s", message->str);
-	gtk_window_set_title(GTK_WINDOW(dialog), _("Map Centreing"));
-	gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
-	gtk_dialog_run(GTK_DIALOG(dialog));
+	gd = generic_dialog_new(_("Map centering"),
+				"map_centering", NULL, TRUE, NULL, pgd);
+	generic_dialog_add_message(gd, GTK_STOCK_DIALOG_INFO,
+				"Map Centering", message->str);
+	generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, NULL, TRUE);
 
-	gtk_widget_destroy(dialog);
+	gtk_widget_show(gd->dialog);
+
 	g_string_free(message, TRUE);
 }
 
@@ -680,6 +862,8 @@
 {
 	PaneGPSData *pgd = data;
 	GtkWidget *menu;
+	GtkClipboard *clipboard;
+	gchar *geo_coords;
 
 	if (bevent->button == MOUSE_BUTTON_RIGHT)
 		{
@@ -694,7 +878,17 @@
 		}
 	else if (bevent->button == MOUSE_BUTTON_LEFT)
 		{
-		return FALSE;
+		clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+		geo_coords = g_strdup_printf("%lf %lf",
+							champlain_view_y_to_latitude(
+								CHAMPLAIN_VIEW(pgd->gps_view),bevent->y),
+							champlain_view_x_to_longitude(
+								CHAMPLAIN_VIEW(pgd->gps_view),bevent->x));
+		gtk_clipboard_set_text(clipboard, geo_coords, -1);
+
+		g_free(geo_coords);
+
+		return TRUE;
 		}
 	else
 		{
@@ -761,6 +955,10 @@
 	gtk_scale_button_set_value(GTK_SCALE_BUTTON(slider), (gdouble)zoom);
 
 	progress = gtk_progress_bar_new();
+#if GTK_CHECK_VERSION(3,0,0)
+	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), "");
+	gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(progress), TRUE);
+#endif
 	state = gtk_label_new("");
 	gtk_label_set_justify(GTK_LABEL(state), GTK_JUSTIFY_CENTER);
 
@@ -803,6 +1001,8 @@
 	g_signal_connect(pgd->gps_view, "notify::zoom-level", G_CALLBACK(bar_pane_gps_view_state_changed_cb), pgd);
 	g_signal_connect(G_OBJECT(slider), "value-changed", G_CALLBACK(bar_pane_gps_slider_changed_cb), pgd);
 
+	bar_pane_gps_dnd_init(pgd);
+
 	file_data_register_notify_func(bar_pane_gps_notify_cb, pgd, NOTIFY_PRIORITY_LOW);
 
 	pgd->create_markers_id = 0;
--- a/src/bar_keywords.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/bar_keywords.c	Sat Jul 08 10:32:34 2017 +0100
@@ -123,6 +123,8 @@
 	FileData *fd;
 	gchar *key;
 	gint height;
+
+	GList *expanded_rows;
 };
 
 typedef struct _ConfDialogData ConfDialogData;
@@ -247,20 +249,69 @@
 	bar_pane_keywords_update(pkd);
 }
 
+void bar_keyword_tree_get_expanded_cb(GtkTreeView *keyword_treeview, GtkTreePath *path,  gpointer data)
+{
+	GList **expanded = data;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	gchar *path_string;
+
+	model = gtk_tree_view_get_model(GTK_TREE_VIEW(keyword_treeview));
+	gtk_tree_model_get_iter(model, &iter, path);
+
+	path_string = gtk_tree_model_get_string_from_iter(model, &iter);
+
+	*expanded = g_list_append(*expanded, g_strdup(path_string));
+	g_free(path_string);
+}
+
+static void bar_pane_keywords_entry_write_config(gchar *entry, GString *outstr, gint indent)
+{
+	struct {
+		gchar *path;
+	} expand;
+
+	expand.path = entry;
+
+	WRITE_NL(); WRITE_STRING("<expanded ");
+	WRITE_CHAR(expand, path);
+	WRITE_STRING("/>");
+}
+
 static void bar_pane_keywords_write_config(GtkWidget *pane, GString *outstr, gint indent)
 {
 	PaneKeywordsData *pkd;
+	GList *path_expanded = NULL;
 
 	pkd = g_object_get_data(G_OBJECT(pane), "pane_data");
 	if (!pkd) return;
 
+	pkd->height = options->info_keywords.height;
+
 	WRITE_NL(); WRITE_STRING("<pane_keywords ");
 	write_char_option(outstr, indent, "id", pkd->pane.id);
 	write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(pkd->pane.title)));
 	WRITE_BOOL(pkd->pane, expanded);
 	WRITE_CHAR(*pkd, key);
 	WRITE_INT(*pkd, height);
-	WRITE_STRING("/>");
+	WRITE_STRING(">");
+	indent++;
+
+	gtk_tree_view_map_expanded_rows(GTK_TREE_VIEW(pkd->keyword_treeview),
+								(bar_keyword_tree_get_expanded_cb), &path_expanded);
+
+	g_list_first(path_expanded);
+	while (path_expanded)
+		{
+		bar_pane_keywords_entry_write_config(path_expanded->data, outstr, indent);
+		g_free(path_expanded->data);
+		path_expanded = path_expanded->next;
+		}
+	g_list_free(path_expanded);
+
+	indent--;
+	WRITE_NL();
+	WRITE_STRING("</pane_keywords>");
 }
 
 gint bar_pane_keywords_event(GtkWidget *bar, GdkEvent *event)
@@ -1013,6 +1064,11 @@
 
 	GtkTreeModel *keyword_tree;
 
+	string_list_free(pkd->expanded_rows);
+	pkd->expanded_rows = NULL;
+	gtk_tree_view_map_expanded_rows(GTK_TREE_VIEW(pkd->keyword_treeview),
+								(bar_keyword_tree_get_expanded_cb), &pkd->expanded_rows);
+
 	pkd->hide_unchecked = FALSE;
 
 	model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
@@ -1024,6 +1080,28 @@
 	bar_keyword_tree_sync(pkd);
 }
 
+static void bar_pane_keywords_revert_cb(GtkWidget *menu_widget, gpointer data)
+{
+	PaneKeywordsData *pkd = data;
+	GList *work;
+	GtkTreePath *tree_path;
+	gchar *path;
+
+	gtk_tree_view_collapse_all(GTK_TREE_VIEW(pkd->keyword_treeview));
+
+	work = pkd->expanded_rows;
+	while (work)
+		{
+		path = work->data;
+		tree_path = gtk_tree_path_new_from_string(path);
+		gtk_tree_view_expand_to_path(GTK_TREE_VIEW(pkd->keyword_treeview), tree_path);
+		work = work->next;
+		gtk_tree_path_free(tree_path);
+		}
+
+	bar_keyword_tree_sync(pkd);
+}
+
 static void bar_pane_keywords_expand_checked_cb(GtkWidget *menu_widget, gpointer data)
 {
 	PaneKeywordsData *pkd = data;
@@ -1033,6 +1111,34 @@
 	gtk_tree_model_foreach(model, bar_keyword_tree_expand_if_set_cb, pkd);
 }
 
+static void bar_pane_keywords_collapse_all_cb(GtkWidget *menu_widget, gpointer data)
+{
+	PaneKeywordsData *pkd = data;
+
+	string_list_free(pkd->expanded_rows);
+	pkd->expanded_rows = NULL;
+	gtk_tree_view_map_expanded_rows(GTK_TREE_VIEW(pkd->keyword_treeview),
+								(bar_keyword_tree_get_expanded_cb), &pkd->expanded_rows);
+
+	gtk_tree_view_collapse_all(GTK_TREE_VIEW(pkd->keyword_treeview));
+
+	bar_keyword_tree_sync(pkd);
+}
+
+static void bar_pane_keywords_revert_hidden_cb(GtkWidget *menu_widget, gpointer data)
+{
+	PaneKeywordsData *pkd = data;
+	GtkTreeModel *model;
+	GtkTreeModel *keyword_tree;
+
+	model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
+	keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
+
+	keyword_revert_hidden_in(GTK_TREE_STORE(keyword_tree), model);
+
+	bar_keyword_tree_sync(pkd);
+}
+
 static void bar_pane_keywords_collapse_unchecked_cb(GtkWidget *menu_widget, gpointer data)
 {
 	PaneKeywordsData *pkd = data;
@@ -1217,7 +1323,12 @@
 	menu_item_add(menu, _("Expand checked"), G_CALLBACK(bar_pane_keywords_expand_checked_cb), pkd);
 	menu_item_add(menu, _("Collapse unchecked"), G_CALLBACK(bar_pane_keywords_collapse_unchecked_cb), pkd);
 	menu_item_add(menu, _("Hide unchecked"), G_CALLBACK(bar_pane_keywords_hide_unchecked_cb), pkd);
+	menu_item_add(menu, _("Revert all hidden"), G_CALLBACK(bar_pane_keywords_revert_hidden_cb), pkd);
+	menu_item_add_divider(menu);
 	menu_item_add(menu, _("Show all"), G_CALLBACK(bar_pane_keywords_show_all_cb), pkd);
+	menu_item_add(menu, _("Collapse all"), G_CALLBACK(bar_pane_keywords_collapse_all_cb), pkd);
+	menu_item_add(menu, _("Revert"), G_CALLBACK(bar_pane_keywords_revert_cb), pkd);
+	menu_item_add_divider(menu);
 
 	submenu = gtk_menu_new();
 	item = menu_item_add(menu, _("On any change"), NULL, NULL);
@@ -1263,7 +1374,8 @@
 {
 	PaneKeywordsData *pkd = data;
 
-        if (pkd->click_tpath) gtk_tree_path_free(pkd->click_tpath);
+	string_list_free(pkd->expanded_rows);
+	if (pkd->click_tpath) gtk_tree_path_free(pkd->click_tpath);
 	if (pkd->idle_id) g_source_remove(pkd->idle_id);
 	file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd);
 
@@ -1300,6 +1412,7 @@
 	pkd->key = g_strdup(key);
 
 	pkd->expand_checked = TRUE;
+	pkd->expanded_rows = NULL;
 
 	hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP);
 
@@ -1448,6 +1561,7 @@
 		log_printf("unknown attribute %s = %s\n", option, value);
 		}
 
+	options->info_keywords.height = height;
 	bar_pane_translate_title(PANE_KEYWORDS, id, &title);
 	ret = bar_pane_keywords_new(id, title, key, expanded, height);
 	g_free(id);
@@ -1491,4 +1605,29 @@
 }
 
 
+void bar_pane_keywords_entry_add_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values)
+{
+	PaneKeywordsData *pkd;
+	gchar *path = NULL;
+	GtkTreePath *tree_path;
+
+	pkd = g_object_get_data(G_OBJECT(pane), "pane_data");
+	if (!pkd) return;
+
+	while (*attribute_names)
+		{
+		const gchar *option = *attribute_names++;
+		const gchar *value = *attribute_values++;
+
+		if (READ_CHAR_FULL("path", path))
+			{
+			tree_path = gtk_tree_path_new_from_string(path);
+			gtk_tree_view_expand_to_path(GTK_TREE_VIEW(pkd->keyword_treeview), tree_path);
+			gtk_tree_path_free(tree_path);
+			pkd->expanded_rows = g_list_append(pkd->expanded_rows, g_strdup(path));
+			continue;
+			}
+		log_printf("unknown attribute %s = %s\n", option, value);
+		}
+}
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/bar_keywords.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/bar_keywords.h	Sat Jul 08 10:32:34 2017 +0100
@@ -24,7 +24,7 @@
 
 GtkWidget *bar_pane_keywords_new_from_config(const gchar **attribute_names, const gchar **attribute_values);
 void bar_pane_keywords_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values);
-
+void bar_pane_keywords_entry_add_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values);
 /* used in search.c */
 GList *keyword_list_pull(GtkWidget *text_widget);
 
--- a/src/bar_sort.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/bar_sort.c	Sat Jul 08 10:32:34 2017 +0100
@@ -85,8 +85,8 @@
 	GtkWidget *undo_button;
 	SortActionType undo_action;
 	GList *undo_src_list;
-	gchar *undo_src;
-	gchar *undo_dest;
+	GList *undo_dest_list;
+	gchar *undo_collection;
 };
 
 
@@ -94,7 +94,7 @@
 #define SORT_KEY_COLLECTIONS "sort_manager_collections"
 
 
-static void bar_sort_undo_set(SortData *sd, GList *src_list, FileData *src, const gchar *dest);
+static void bar_sort_undo_set(SortData *sd, GList *src_list, const gchar *dest);
 static void bar_sort_add_close(SortData *sd);
 
 
@@ -165,7 +165,7 @@
 
 	bar_sort_add_close(sd);
 
-	bar_sort_undo_set(sd, NULL, NULL, NULL);
+	bar_sort_undo_set(sd, NULL, NULL);
 }
 
 static void bar_sort_mode_cb(GtkWidget *combo, gpointer data)
@@ -183,28 +183,42 @@
 }
 
 /* this takes control of src_list */
-static void bar_sort_undo_set(SortData *sd, GList *src_list, FileData *src, const gchar *dest)
+static void bar_sort_undo_set(SortData *sd, GList *src_list, const gchar *dest)
 {
 	string_list_free(sd->undo_src_list);
 	sd->undo_src_list = filelist_to_path_list(src_list);
 
-	g_free(sd->undo_src);
-	sd->undo_src = src ? g_strdup(src->path) : NULL;
-	g_free(sd->undo_dest);
-	sd->undo_dest = g_strdup(dest);
+	if (src_list)
+		{
+		/* we should create the undo_dest_list to use it later... */
+		string_list_free(sd->undo_dest_list);
+		sd->undo_dest_list=NULL;
+
+		GList *work = sd->undo_src_list;
+		while(work)
+			{
+			gchar *filename =  g_strdup(filename_from_path(work->data));
+			gchar *dest_path = g_build_filename(g_strdup(dest), filename, NULL);
+			sd->undo_dest_list = g_list_prepend(sd->undo_dest_list, g_strdup(dest_path));
+			work = work->next;
+			}
+		sd->undo_dest_list = g_list_reverse(sd->undo_dest_list);
+		}
 
 	sd->undo_action = sd->action;
 
 	if (sd->undo_button)
 		{
 		gtk_widget_set_sensitive(sd->undo_button,
-					 ((sd->undo_src_list || sd->undo_src) && sd->undo_dest) );
+					((sd->undo_src_list ) && sd->undo_dest_list));
 		}
 }
 
 static void bar_sort_undo_folder(SortData *sd, GtkWidget *button)
 {
-	if (!sd->undo_src || !sd->undo_dest) return;
+	gchar *origin;
+
+	if (!(sd->undo_src_list && sd->undo_dest_list)) return;
 
 	switch (sd->undo_action)
 		{
@@ -212,30 +226,57 @@
 			{
 			GList *list;
 			gchar *src_dir;
+			gchar *src_path;
 
-			list = g_list_append(NULL, file_data_new_group(sd->undo_dest));
-			src_dir = remove_level_from_path(sd->undo_src);
-			file_util_move_simple(list, src_dir, sd->lw->window);
-			g_free(src_dir);
+			if (sd->undo_src_list)
+				{
+				GList *work = NULL;
+
+				src_path = g_strdup(sd->undo_src_list->data);
+				src_dir = remove_level_from_path(src_path);
+				list = sd->undo_dest_list;
+				while (list)
+					{
+					work = g_list_prepend(work, file_data_new_group(list->data));
+					list=list->next;
+					}
+				file_util_move_simple(work, src_dir, sd->lw->window);
+				g_free(src_dir);
+				g_free(src_path);
+				}
 			}
 			break;
+
 		case BAR_SORT_COPY:
-			file_util_delete(file_data_new_group(sd->undo_dest), NULL, button);
+		case BAR_SORT_FILTER:
+			if (sd->undo_src_list)
+				{
+				GList *delete_list;
+				GList *work = NULL;
+
+				delete_list = sd->undo_dest_list;
+				while (delete_list)
+					{
+					work = g_list_append(work, file_data_new_group(delete_list->data));
+					delete_list = delete_list->next;
+					}
+				file_util_delete(NULL, work, button);
+				}
 			break;
+
 		default:
-			/* undo external command */
-			file_util_delete(file_data_new_group(sd->undo_dest), NULL, button);
 			break;
 		}
 
 	layout_refresh(sd->lw);
+	origin = (sd->undo_src_list)->data;
 
-	if (isfile(sd->undo_src))
+	if (isfile(origin))
 		{
-		layout_image_set_fd(sd->lw, file_data_new_group(sd->undo_src));
+		layout_image_set_fd(sd->lw, file_data_new_group(origin));
 		}
 
-	bar_sort_undo_set(sd, NULL, NULL, NULL);
+	bar_sort_undo_set(sd, NULL, NULL);
 }
 
 static void bar_sort_undo_collection(SortData *sd)
@@ -246,13 +287,12 @@
 	while (work)
 		{
 		gchar *source;
-
 		source = work->data;
 		work = work->next;
-		collect_manager_remove(file_data_new_group(source), sd->undo_dest);
+		collect_manager_remove(file_data_new_group(source), sd->undo_collection);
 		}
 
-	bar_sort_undo_set(sd, NULL, NULL, NULL);
+	bar_sort_undo_set(sd, NULL,  NULL);
 }
 
 static void bar_sort_undo_cb(GtkWidget *button, gpointer data)
@@ -271,38 +311,40 @@
 
 static void bar_sort_bookmark_select_folder(SortData *sd, FileData *source, const gchar *path)
 {
-	GList *list;
-	gchar *dest_path;
+	GList *orig_list;
+	GList *action_list;
+	GList *undo_src_list;
 
 	if (!isdir(path)) return;
 
-	dest_path = g_build_filename(path, source->name, NULL);
-	bar_sort_undo_set(sd, NULL, source, dest_path);
+	orig_list = layout_selection_list(sd->lw);
+	action_list = orig_list;
+	undo_src_list = orig_list;
+	orig_list = NULL;
 
-	list = g_list_append(NULL, file_data_ref(source));
+	bar_sort_undo_set(sd, undo_src_list, path);
 
 	switch (sd->action)
 		{
 		case BAR_SORT_COPY:
-			file_util_copy_simple(list, path, sd->lw->window);
-			list = NULL;
+			file_util_copy_simple(action_list, path, sd->lw->window);
+			action_list = NULL;
 			layout_image_next(sd->lw);
 			break;
+
 		case BAR_SORT_MOVE:
-			file_util_move_simple(list, path, sd->lw->window);
-			list = NULL;
+			file_util_move_simple(action_list, path, sd->lw->window);
+			action_list = NULL;
 			break;
+
 		case BAR_SORT_FILTER:
-			file_util_start_filter_from_filelist(sd->filter_key, list, path, sd->lw->window);
-			list = NULL;
+			file_util_start_filter_from_filelist(sd->filter_key, action_list, path, sd->lw->window);
 			layout_image_next(sd->lw);
 			break;
+
 		default:
 			break;
 		}
-
-	g_list_free(list);
-	g_free(dest_path);
 }
 
 static void bar_sort_bookmark_select_collection(SortData *sd, FileData *source, const gchar *path)
@@ -323,11 +365,12 @@
 
 	if (!list)
 		{
-		bar_sort_undo_set(sd, NULL, NULL, NULL);
+		bar_sort_undo_set(sd, NULL, NULL);
 		return;
 		}
 
-	bar_sort_undo_set(sd, list, NULL, path);
+	bar_sort_undo_set(sd, list, path);
+	sd->undo_collection = g_strdup(path);
 
 	while (list)
 		{
@@ -558,8 +601,9 @@
 	bar_sort_add_close(sd);
 
 	g_free(sd->filter_key);
-	g_free(sd->undo_src);
-	g_free(sd->undo_dest);
+	string_list_free(sd->undo_src_list);
+	string_list_free(sd->undo_dest_list);
+	g_free(sd->undo_collection);
 	g_free(sd);
 }
 
@@ -594,8 +638,9 @@
 		}
 
 	sd->selection = selection;
-	sd->undo_src = NULL;
-	sd->undo_dest = NULL;
+	sd->undo_src_list = NULL;
+	sd->undo_dest_list = NULL;
+	sd->undo_collection = NULL;
 
 	sd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
 	g_object_set_data(G_OBJECT(sd->vbox), "bar_sort_data", sd);
--- a/src/cache_maint.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/cache_maint.c	Sat Jul 08 10:32:34 2017 +0100
@@ -48,6 +48,7 @@
 	GtkWidget *button_close;
 	gboolean clear;
 	gboolean metadata;
+	gboolean remote;
 };
 
 #define PURGE_DIALOG_WIDTH 400
@@ -117,11 +118,14 @@
 		cm->idle_id = 0;
 		}
 
-	gtk_entry_set_text(GTK_ENTRY(cm->entry), _("done"));
-	spinner_set_interval(cm->spinner, -1);
+	if (!cm->remote)
+		{
+		gtk_entry_set_text(GTK_ENTRY(cm->entry), _("done"));
+		spinner_set_interval(cm->spinner, -1);
 
-	gtk_widget_set_sensitive(cm->button_stop, FALSE);
-	gtk_widget_set_sensitive(cm->button_close, TRUE);
+		gtk_widget_set_sensitive(cm->button_stop, FALSE);
+		gtk_widget_set_sensitive(cm->button_close, TRUE);
+		}
 }
 
 static gboolean cache_maintain_home_cb(gpointer data)
@@ -134,6 +138,7 @@
 	gboolean still_have_a_file = TRUE;
 	gsize base_length;
 	const gchar *cache_folder;
+	gboolean filter_disable;
 
 	if (cm->metadata)
 		{
@@ -158,6 +163,13 @@
 
 	DEBUG_1("purge chk (%d) \"%s\"", (cm->clear && !cm->metadata), fd->path);
 
+/**
+ * It is necessary to disable the file filter when clearing the cache,
+ * otherwise the .sim (file similarity) files are not deleted.
+ */
+	filter_disable = options->file_filter.disable;
+	options->file_filter.disable = TRUE;
+
 	if (g_list_find(cm->done_list, fd) == NULL)
 		{
 		cm->done_list = g_list_prepend(cm->done_list, fd);
@@ -194,6 +206,8 @@
 				}
 			}
 		}
+	options->file_filter.disable = filter_disable;
+
 	filelist_free(list);
 
 	cm->list = g_list_concat(dlist, cm->list);
@@ -224,7 +238,7 @@
 		file_data_unref(fd);
 		}
 
-	if (cm->list)
+	if (cm->list && !cm->remote)
 		{
 		const gchar *buf;
 
@@ -292,6 +306,7 @@
 	cm->done_list = NULL;
 	cm->clear = clear;
 	cm->metadata = metadata;
+	cm->remote = FALSE;
 
 	if (metadata)
 		{
@@ -339,6 +354,41 @@
 	cm->idle_id = g_idle_add(cache_maintain_home_cb, cm);
 }
 
+void cache_maintain_home_remote(gboolean metadata, gboolean clear)
+{
+	CMData *cm;
+	GList *dlist;
+	FileData *dir_fd;
+	const gchar *cache_folder;
+
+	if (metadata)
+		{
+		cache_folder = get_metadata_cache_dir();
+		}
+	else
+		{
+		cache_folder = get_thumbnails_cache_dir();
+		}
+
+	dir_fd = file_data_new_dir(cache_folder);
+	if (!filelist_read(dir_fd, NULL, &dlist))
+		{
+		file_data_unref(dir_fd);
+		return;
+		}
+
+	dlist = g_list_append(dlist, dir_fd);
+
+	cm = g_new0(CMData, 1);
+	cm->list = dlist;
+	cm->done_list = NULL;
+	cm->clear = clear;
+	cm->metadata = metadata;
+	cm->remote = TRUE;
+
+	cm->idle_id = g_idle_add(cache_maintain_home_cb, cm);
+}
+
 static void cache_file_move(const gchar *src, const gchar *dest)
 {
 	if (!dest || !src || !isfile(src)) return;
@@ -526,6 +576,8 @@
 	gboolean local;
 	gboolean recurse;
 
+	gboolean remote;
+
 	guint idle_id; /* event source id */
 };
 
@@ -555,14 +607,16 @@
 static void cache_manager_render_finish(CleanData *cd)
 {
 	cache_manager_render_reset(cd);
-
-	gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done"));
-	spinner_set_interval(cd->spinner, -1);
+	if (!cd->remote)
+		{
+		gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done"));
+		spinner_set_interval(cd->spinner, -1);
 
-	gtk_widget_set_sensitive(cd->group, TRUE);
-	gtk_widget_set_sensitive(cd->button_start, TRUE);
-	gtk_widget_set_sensitive(cd->button_stop, FALSE);
-	gtk_widget_set_sensitive(cd->button_close, TRUE);
+		gtk_widget_set_sensitive(cd->group, TRUE);
+		gtk_widget_set_sensitive(cd->button_start, TRUE);
+		gtk_widget_set_sensitive(cd->button_stop, FALSE);
+		gtk_widget_set_sensitive(cd->button_close, TRUE);
+		}
 }
 
 static void cache_manager_render_stop_cb(GenericDialog *fd, gpointer data)
@@ -624,7 +678,10 @@
 		success = thumb_loader_start((ThumbLoader *)cd->tl, fd);
 		if (success)
 			{
-			gtk_entry_set_text(GTK_ENTRY(cd->progress), fd->path);
+			if (!cd->remote)
+				{
+				gtk_entry_set_text(GTK_ENTRY(cd->progress), fd->path);
+				}
 			}
 		else
 			{
@@ -660,26 +717,62 @@
 	CleanData *cd = data;
 	gchar *path;
 
-	if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
+	if(!cd->remote)
+		{
+		if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
+		}
 
 	path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(cd->entry))));
 	parse_out_relatives(path);
 
 	if (!isdir(path))
 		{
-		warning_dialog(_("Invalid folder"),
-				_("The specified folder can not be found."),
-			       GTK_STOCK_DIALOG_WARNING, cd->gd->dialog);
+		if (!cd->remote)
+			{
+			warning_dialog(_("Invalid folder"),
+			_("The specified folder can not be found."),
+			GTK_STOCK_DIALOG_WARNING, cd->gd->dialog);
+			}
+		else
+			{
+			log_printf("The specified folder can not be found: %s\n", path);
+			}
 		}
 	else
 		{
 		FileData *dir_fd;
-		gtk_widget_set_sensitive(cd->group, FALSE);
-		gtk_widget_set_sensitive(cd->button_start, FALSE);
-		gtk_widget_set_sensitive(cd->button_stop, TRUE);
-		gtk_widget_set_sensitive(cd->button_close, FALSE);
+		if(!cd->remote)
+			{
+			gtk_widget_set_sensitive(cd->group, FALSE);
+			gtk_widget_set_sensitive(cd->button_start, FALSE);
+			gtk_widget_set_sensitive(cd->button_stop, TRUE);
+			gtk_widget_set_sensitive(cd->button_close, FALSE);
+
+			spinner_set_interval(cd->spinner, SPINNER_SPEED);
+			}
+		dir_fd = file_data_new_dir(path);
+		cache_manager_render_folder(cd, dir_fd);
+		file_data_unref(dir_fd);
+		while (cache_manager_render_file(cd));
+		}
 
-		spinner_set_interval(cd->spinner, SPINNER_SPEED);
+	g_free(path);
+}
+
+static void cache_manager_render_start_render_remote(CleanData *cd, const gchar *user_path)
+{
+	gchar *path;
+
+	path = remove_trailing_slash(user_path);
+	parse_out_relatives(path);
+
+	if (!isdir(path))
+		{
+		log_printf("The specified folder can not be found: %s\n", path);
+		}
+	else
+		{
+		FileData *dir_fd;
 
 		dir_fd = file_data_new_dir(path);
 		cache_manager_render_folder(cd, dir_fd);
@@ -698,6 +791,7 @@
 	GtkWidget *button;
 
 	cd = g_new0(CleanData, 1);
+	cd->remote = FALSE;
 
 	cd->gd = generic_dialog_new(_("Create thumbnails"),
 				    "create_thumbnails",
@@ -750,8 +844,17 @@
 	gtk_widget_show(cd->gd->dialog);
 }
 
+void cache_manager_render_remote(const gchar *path, gboolean recurse, gboolean local)
+{
+	CleanData *cd;
 
+	cd = g_new0(CleanData, 1);
+	cd->recurse = recurse;
+	cd->local = local;
+	cd->remote = TRUE;
 
+	cache_manager_render_start_render_remote(cd, path);
+}
 
 static void cache_manager_standard_clean_close_cb(GenericDialog *gd, gpointer data)
 {
@@ -768,12 +871,14 @@
 
 static void cache_manager_standard_clean_done(CleanData *cd)
 {
-	gtk_widget_set_sensitive(cd->button_stop, FALSE);
-	gtk_widget_set_sensitive(cd->button_close, TRUE);
+	if (!cd->remote)
+		{
+		gtk_widget_set_sensitive(cd->button_stop, FALSE);
+		gtk_widget_set_sensitive(cd->button_close, TRUE);
 
-	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0);
-	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done"));
-
+		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0);
+		gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done"));
+		}
 	if (cd->idle_id)
 		{
 		g_source_remove(cd->idle_id);
@@ -811,10 +916,13 @@
 		file_data_unref(next_fd);
 
 		cd->count_done++;
-		if (cd->count_total != 0)
+		if (!cd->remote)
 			{
-			gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
-						      (gdouble)cd->count_done / cd->count_total);
+			if (cd->count_total != 0)
+				{
+				gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
+							      (gdouble)cd->count_done / cd->count_total);
+				}
 			}
 
 		return TRUE;
@@ -838,10 +946,13 @@
 			}
 
 		cd->count_done++;
-		if (cd->count_total != 0)
+		if (!cd->remote)
 			{
-			gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
-						      (gdouble)cd->count_done / cd->count_total);
+			if (cd->count_total != 0)
+				{
+				gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
+							      (gdouble)cd->count_done / cd->count_total);
+				}
 			}
 		}
 
@@ -863,20 +974,23 @@
 		}
 }
 
-static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data)
+static void cache_manager_standard_clean_start(GenericDialog *gd, gpointer data)
 {
 	CleanData *cd = data;
 	GList *list;
 	gchar *path;
 	FileData *dir_fd;
 
-	if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
+	if (!cd->remote)
+	{
+		if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
 
-	gtk_widget_set_sensitive(cd->button_start, FALSE);
-	gtk_widget_set_sensitive(cd->button_stop, TRUE);
-	gtk_widget_set_sensitive(cd->button_close, FALSE);
+		gtk_widget_set_sensitive(cd->button_start, FALSE);
+		gtk_widget_set_sensitive(cd->button_stop, TRUE);
+		gtk_widget_set_sensitive(cd->button_close, FALSE);
 
-	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running..."));
+		gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running..."));
+	}
 
 	path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_NORMAL, NULL);
 	dir_fd = file_data_new_dir(path);
@@ -913,6 +1027,11 @@
 		}
 }
 
+static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data)
+{
+	cache_manager_standard_clean_start(gd, data);
+}
+
 static void cache_manager_standard_process(GtkWidget *widget, gboolean clear)
 {
 	CleanData *cd;
@@ -921,6 +1040,7 @@
 
 	cd = g_new0(CleanData, 1);
 	cd->clear = clear;
+	cd->remote = FALSE;
 
 	if (clear)
 		{
@@ -950,6 +1070,9 @@
 
 	cd->progress = gtk_progress_bar_new();
 	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("click start to begin"));
+#if GTK_CHECK_VERSION(3,0,0)
+	gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(cd->progress), TRUE);
+#endif
 	gtk_box_pack_start(GTK_BOX(cd->gd->vbox), cd->progress, FALSE, FALSE, 0);
 	gtk_widget_show(cd->progress);
 
@@ -960,6 +1083,20 @@
 	gtk_widget_show(cd->gd->dialog);
 }
 
+void cache_manager_standard_process_remote(gboolean clear)
+{
+	CleanData *cd;
+
+	cd = g_new0(CleanData, 1);
+	cd->clear = clear;
+	cd->days = 30;
+	cd->tl = NULL;
+	cd->idle_id = 0;
+	cd->remote = TRUE;
+
+	cache_manager_standard_clean_start(NULL, cd);
+}
+
 static void cache_manager_standard_clean_cb(GtkWidget *widget, gpointer data)
 {
 	cache_manager_standard_process(widget, FALSE);
@@ -1039,11 +1176,8 @@
 {
 	GtkWidget *label;
 	gchar *buf;
-	gchar *path;
 
-	path = g_build_filename(homedir(), subdir, NULL);
-	buf = g_strdup_printf(_("Location: %s"), path);
-	g_free(path);
+	buf = g_strdup_printf(_("Location: %s"), subdir);
 	label = pref_label_new(group, buf);
 	g_free(buf);
 	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
@@ -1058,6 +1192,7 @@
 	GtkWidget *button;
 	GtkWidget *table;
 	GtkSizeGroup *sizegroup;
+	gchar *path;
 
 	if (cache_manager)
 		{
@@ -1097,12 +1232,14 @@
 	button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE,
 				   G_CALLBACK(cache_manager_main_clear_cb), cache_manager);
 	gtk_size_group_add_widget(sizegroup, button);
-	pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0);
+	pref_table_label(table, 1, 1, _("Delete all cached data."), 0.0);
 
 
 	group = pref_group_new(gd->vbox, FALSE, _("Shared thumbnail cache"), GTK_ORIENTATION_VERTICAL);
 
-	cache_manager_location_label(group, THUMB_FOLDER_GLOBAL);
+	path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, NULL);
+	cache_manager_location_label(group, path);
+	g_free(path);
 
 	table = pref_table_new(group, 2, 2, FALSE, FALSE);
 
--- a/src/cache_maint.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/cache_maint.h	Sat Jul 08 10:32:34 2017 +0100
@@ -27,6 +27,8 @@
 void cache_notify_cb(FileData *fd, NotifyType type, gpointer data);
 void cache_manager_show(void);
 
-
+void cache_maintain_home_remote(gboolean metadata, gboolean clear);
+void cache_manager_standard_process_remote(gboolean clear);
+void cache_manager_render_remote(const gchar *path, gboolean recurse, gboolean local);
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/cellrenderericon.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/cellrenderericon.c	Sat Jul 08 10:32:34 2017 +0100
@@ -683,7 +683,11 @@
 	GdkPixbuf *pixbuf;
 	const gchar *text;
 	GdkRectangle cell_rect;
+#if GTK_CHECK_VERSION(3,0,0)
+	GtkStateFlags state;
+#else
 	GtkStateType state;
+#endif
 	gint xpad, ypad;
 
 
@@ -712,16 +716,28 @@
 	if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED)
 		{
 		if (gtk_widget_has_focus(widget))
+#if GTK_CHECK_VERSION(3,0,0)
+			state = GTK_STATE_FLAG_SELECTED;
+		else
+			state = GTK_STATE_FLAG_ACTIVE;
+#else
 			state = GTK_STATE_SELECTED;
 		else
 			state = GTK_STATE_ACTIVE;
+#endif
 		}
 	else
 		{
 		if (gtk_widget_get_state(widget) == GTK_STATE_INSENSITIVE)
+#if GTK_CHECK_VERSION(3,0,0)
+			state = GTK_STATE_FLAG_INSENSITIVE;
+		else
+			state = GTK_STATE_FLAG_NORMAL;
+#else
 			state = GTK_STATE_INSENSITIVE;
 		else
 			state = GTK_STATE_NORMAL;
+#endif
 		}
 
 #if GTK_CHECK_VERSION(3,0,0)
@@ -824,11 +840,17 @@
 			for (i = 0; i < cellicon->num_marks; i++)
 				{
 #if GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3,14,0)
+  				state &= ~(GTK_STATE_FLAG_CHECKED);
+
+				if ((cellicon->marks & (1 << i)))
+					state |= GTK_STATE_FLAG_CHECKED;
+#else
   				state &= ~(GTK_STATE_FLAG_ACTIVE);
 
 				if ((cellicon->marks & (1 << i)))
 					state |= GTK_STATE_FLAG_ACTIVE;
-
+#endif
 				cairo_save (cr);
 
 				cairo_rectangle(cr,
@@ -842,10 +864,35 @@
 
 				gtk_style_context_add_class(context, GTK_STYLE_CLASS_CHECK);
 
+				gtk_style_context_add_class(context, "marks");
+				GtkStyleProvider *provider;
+				provider = (GtkStyleProvider *)gtk_css_provider_new();
+				gtk_css_provider_load_from_data(GTK_CSS_PROVIDER(provider),
+						".marks {\n"
+						"border-color: #808080;\n"
+						"border-style: solid;\n"
+						"border-width: 1px;\n"
+						"border-radius: 0px;\n"
+						"}\n"
+						,-1, NULL);
+				gtk_style_context_add_provider(context, provider,
+							GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
 				gtk_render_check(context, cr,
 					 pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
 					 pix_rect.y,
 					 TOGGLE_WIDTH, TOGGLE_WIDTH);
+				gtk_render_frame(context, cr,
+					 pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+					 pix_rect.y,
+					 TOGGLE_WIDTH, TOGGLE_WIDTH);
+
+				if (cellicon->focused && gtk_widget_has_focus(widget))
+					{
+					gtk_render_focus(context, cr,
+						pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+						pix_rect.y, TOGGLE_WIDTH, TOGGLE_WIDTH);
+					}
 				gtk_style_context_restore(context);
 				cairo_restore(cr);
 
@@ -859,21 +906,18 @@
 #endif
 				}
 			}
-                }
+		}
 
+#if !GTK_CHECK_VERSION(3,0,0)
 	if (cellicon->focused && gtk_widget_has_focus(widget))
 		{
-#if GTK_CHECK_VERSION(3,0,0)
-#else
 		gtk_paint_focus(gtk_widget_get_style(widget), window,
 				state,
 				cell_area, widget,
 				"cellrendererfocus",
 				cell_area->x, cell_area->y,
 				cell_area->width, cell_area->height);
-#endif
 		}
-#if !GTK_CHECK_VERSION(3,0,0)
 	cairo_destroy(cr);
 #endif
 }
--- a/src/collect-table.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/collect-table.c	Sat Jul 08 10:32:34 2017 +0100
@@ -62,14 +62,6 @@
 	CTABLE_COLUMN_COUNT
 };
 
-typedef enum {
-	SELECTION_NONE		= 0,
-	SELECTION_SELECTED	= 1 << 0,
-	SELECTION_PRELIGHT	= 1 << 1,
-	SELECTION_FOCUS		= 1 << 2
-} SelectionType;
-
-
 #define INFO_SELECTED(x) (x->flag_mask & SELECTION_SELECTED)
 
 
@@ -808,6 +800,13 @@
 	ct->prev_selection= ct->click_info;
 }
 
+static void collection_table_popup_rectangular_selection_cb(GtkWidget *widget, gpointer data)
+{
+	CollectTable *ct = data;
+
+	options->collections.rectangular_selection = !(options->collections.rectangular_selection);
+}
+
 static void collection_table_popup_remove_cb(GtkWidget *widget, gpointer data)
 {
 	CollectTable *ct = data;
@@ -854,7 +853,7 @@
 	CollectTable *ct = data;
 	DupeWindow *dw;
 
-	dw = dupe_window_new(DUPE_MATCH_NAME);
+	dw = dupe_window_new();
 	dupe_window_add_collection(dw, ct->cd);
 }
 
@@ -924,6 +923,8 @@
 			G_CALLBACK(collection_table_popup_unselectall_cb), ct);
 	menu_item_add(submenu, _("Invert selection"),
 			G_CALLBACK(collection_table_popup_select_invert_cb), ct);
+	menu_item_add_check(submenu, _("Rectangular selection"), (options->collections.rectangular_selection != FALSE),
+			G_CALLBACK(collection_table_popup_rectangular_selection_cb), ct);
 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
 	menu_item_add_divider(menu);
 
@@ -1592,11 +1593,11 @@
  *-------------------------------------------------------------------
  */
 
-static gboolean collection_table_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+static gboolean collection_table_motion_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data)
 {
 	CollectTable *ct = data;
 
-	collection_table_motion_update(ct, (gint)bevent->x, (gint)bevent->y, FALSE);
+	collection_table_motion_update(ct, (gint)event->x, (gint)event->y, FALSE);
 
 	return FALSE;
 }
--- a/src/collect.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/collect.c	Sat Jul 08 10:32:34 2017 +0100
@@ -908,6 +908,12 @@
 					collection_set_sort_method(cw->cd, SORT_PATH);
 					}
 				break;
+			case 'R': case 'r':
+				if (event->state & GDK_MOD1_MASK)
+					{
+						options->collections.rectangular_selection = !(options->collections.rectangular_selection);
+					}
+				break;
 			case GDK_KEY_Delete: case GDK_KEY_KP_Delete:
 				list = g_list_copy(cw->table->selection);
 				if (list)
@@ -920,6 +926,9 @@
 					collection_remove_by_info(cw->cd, collection_table_get_focus_info(cw->table));
 					}
 				break;
+			case GDK_KEY_F1:
+				help_window_show("GuideReferenceKeyboardShortcuts.html#CollectionsKeyboardShortcuts");
+				break;
 			default:
 				stop_signal = FALSE;
 				break;
@@ -1169,8 +1178,8 @@
 
 	if (options->save_window_positions && path && collection_load_only_geometry(cw->cd, path))
 		{
-		/* FIXME: x, y is not implemented */
 		gtk_window_set_default_size(GTK_WINDOW(cw->window), cw->cd->window_w, cw->cd->window_h);
+		gtk_window_move(GTK_WINDOW(cw->window), cw->cd->window_x, cw->cd->window_y);
 		}
 	else
 		{
@@ -1210,6 +1219,10 @@
 
 	extra_label = gtk_progress_bar_new();
 	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(extra_label), 0.0);
+#if GTK_CHECK_VERSION(3,0,0)
+	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(extra_label), "");
+	gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(extra_label), TRUE);
+#endif
 	gtk_box_pack_start(GTK_BOX(cw->status_box), extra_label, TRUE, TRUE, 0);
 	gtk_widget_show(extra_label);
 
--- a/src/debug.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/debug.c	Sat Jul 08 10:32:34 2017 +0100
@@ -25,10 +25,12 @@
 #include "ui_fileops.h"
 
 #include <glib/gprintf.h>
+#include <regex.h>
 
 /*
  * Logging functions
  */
+static gchar *regexp = NULL;
 
 static gboolean log_msg_cb(gpointer data)
 {
@@ -46,6 +48,62 @@
 	return FALSE;
 }
 
+void log_domain_print_message(const gchar *domain, gchar *buf)
+{
+	gchar *buf_nl;
+	regex_t regex;
+	gint ret_comp, ret_exec;
+
+	buf_nl = g_strconcat(buf, "\n", NULL);
+
+	if (regexp && command_line)
+		{
+			ret_comp = regcomp(&regex, regexp, 0);
+			if (!ret_comp)
+				{
+				ret_exec = regexec(&regex, buf_nl, 0, NULL, 0);
+
+				if (!ret_exec)
+					{
+					print_term(buf_nl);
+					if (strcmp(domain, DOMAIN_INFO) == 0)
+						g_idle_add(log_normal_cb, buf_nl);
+					else
+						g_idle_add(log_msg_cb, buf_nl);
+					}
+				regfree(&regex);
+				}
+		}
+	else
+		{
+		print_term(buf_nl);
+		if (strcmp(domain, DOMAIN_INFO) == 0)
+			g_idle_add(log_normal_cb, buf_nl);
+		else
+			g_idle_add(log_msg_cb, buf_nl);
+		}
+	g_free(buf);
+}
+
+void log_domain_print_debug(const gchar *domain, const gchar *file_name,
+									int line_number, const gchar *format, ...)
+{
+	va_list ap;
+	gchar *message;
+	gchar *location;
+	gchar *buf;
+
+	va_start(ap, format);
+	message = g_strdup_vprintf(format, ap);
+	va_end(ap);
+
+	location = g_strdup_printf("%s:%d:", file_name, line_number);
+	buf = g_strconcat(location, message, NULL);
+	log_domain_print_message(domain,buf);
+	g_free(location);
+	g_free(message);
+}
+
 void log_domain_printf(const gchar *domain, const gchar *format, ...)
 {
 	va_list ap;
@@ -55,12 +113,7 @@
 	buf = g_strdup_vprintf(format, ap);
 	va_end(ap);
 
-	print_term(buf);
-	if (strcmp(domain, DOMAIN_INFO) == 0)
-		g_idle_add(log_normal_cb, buf);
-	else
-		g_idle_add(log_msg_cb, buf);
-
+	log_domain_print_message(domain, buf);
 }
 
 /*
@@ -152,5 +205,15 @@
 	get_exec_time();
 }
 
+void set_regexp(gchar *cmd_regexp)
+{
+	regexp = g_strdup(cmd_regexp);
+}
+
+gchar *get_regexp(void)
+{
+	return g_strdup(regexp);
+}
+
 #endif /* DEBUG */
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/debug.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/debug.h	Sat Jul 08 10:32:34 2017 +0100
@@ -27,6 +27,8 @@
 #define DOMAIN_INFO  "info"
 
 void log_domain_printf(const gchar *domain, const gchar *format, ...) G_GNUC_PRINTF(2, 3);
+void log_domain_print_debug(const gchar *domain, const gchar *file_name,
+							int line_number, const gchar *format, ...) G_GNUC_PRINTF(4, 5);
 #define log_printf(...) log_domain_printf(DOMAIN_INFO, __VA_ARGS__)
 
 #ifdef DEBUG
@@ -34,6 +36,8 @@
 #define DEBUG_LEVEL_MIN 0
 #define DEBUG_LEVEL_MAX 4
 
+void set_regexp(gchar *regexp);
+gchar *get_regexp(void);
 gint get_debug_level(void);
 void set_debug_level(gint new_level);
 void debug_level_add(gint delta);
@@ -46,14 +50,21 @@
 				gint debug_level = get_debug_level(); \
 				if (debug_level >= (n)) 	\
 					{ 		\
-					if (debug_level != 1) log_domain_printf(DOMAIN_DEBUG, "%s:%d: ", __FILE__, __LINE__); \
-					log_domain_printf(DOMAIN_DEBUG, __VA_ARGS__); \
-					log_domain_printf(DOMAIN_DEBUG, "\n"); \
+					if (debug_level != 1) \
+					{ \
+						log_domain_print_debug(DOMAIN_DEBUG, __FILE__, __LINE__, __VA_ARGS__); \
+					} \
+					else \
+						{ \
+						log_domain_printf(DOMAIN_DEBUG, __VA_ARGS__); \
+						} \
 					} \
 				} while (0)
 
 #else /* DEBUG */
 
+#define get_regexp() (0)
+#define set_regexp(regexp) do { } while(0)
 #define get_debug_level() (0)
 #define set_debug_level(new_level) do { } while(0)
 #define debug_level_add(delta) do { } while(0)
--- a/src/dupe.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/dupe.c	Sat Jul 08 10:32:34 2017 +0100
@@ -574,6 +574,8 @@
 	g_free(text[DUPE_COLUMN_DIMENSIONS]);
 }
 
+static void dupe_listview_select_dupes(DupeWindow *dw, DupeSelectType parents);
+
 static void dupe_listview_populate(DupeWindow *dw)
 {
 	GtkListStore *store;
@@ -607,6 +609,16 @@
 		}
 
 	gtk_tree_view_columns_autosize(GTK_TREE_VIEW(dw->listview));
+
+	if (options->duplicates_select_type == DUPE_SELECT_GROUP1)
+		{
+		dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP1);
+		}
+	else if (options->duplicates_select_type == DUPE_SELECT_GROUP2)
+		{
+		dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP2);
+		}
+
 }
 
 static void dupe_listview_remove(DupeWindow *dw, DupeItem *di)
@@ -712,7 +724,7 @@
 	return found;
 }
 
-static void dupe_listview_select_dupes(DupeWindow *dw, gint parents)
+static void dupe_listview_select_dupes(DupeWindow *dw, DupeSelectType parents)
 {
 	GtkTreeModel *store;
 	GtkTreeSelection *selection;
@@ -729,7 +741,7 @@
 		DupeItem *di;
 
 		gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
-		if ( (dupe_match_find_parent(dw, di) == di) == (parents) )
+		if ((dupe_match_find_parent(dw, di) == di) == (parents == DUPE_SELECT_GROUP1))
 			{
 			gtk_tree_selection_select_iter(selection, &iter);
 			}
@@ -1054,6 +1066,20 @@
 		}
 }
 
+static gint dupe_match_totals_sort_cb(gconstpointer a, gconstpointer b)
+{
+	DupeItem *da = (DupeItem *)a;
+	DupeItem *db = (DupeItem *)b;
+
+	if (g_list_length(da->group) > g_list_length(db->group)) return -1;
+	if (g_list_length(da->group) < g_list_length(db->group)) return 1;
+
+	if (da->group_rank < db->group_rank) return -1;
+	if (da->group_rank > db->group_rank) return 1;
+
+	return 0;
+}
+
 static gint dupe_match_rank_sort_cb(gconstpointer a, gconstpointer b)
 {
 	DupeItem *da = (DupeItem *)a;
@@ -1087,6 +1113,15 @@
 	return g_list_sort(list, dupe_match_rank_sort_cb);
 }
 
+/* returns allocated GList of dupes sorted by totals */
+static GList *dupe_match_totals_sort(GList *source_list)
+{
+	source_list = g_list_sort(source_list, dupe_match_totals_sort_cb);
+
+	source_list = g_list_first(source_list);
+	return g_list_reverse(source_list);
+}
+
 static void dupe_match_rank(DupeWindow *dw)
 {
 	GList *list;
@@ -1104,6 +1139,11 @@
 	if (required_debug_level(2)) dupe_match_print_list(list);
 
 	list = dupe_match_rank_sort(list);
+	if (options->sort_totals)
+		{
+		list = dupe_match_totals_sort(list);
+		}
+	if (required_debug_level(2)) dupe_match_print_list(list);
 
 	g_list_free(dw->dupes);
 	dw->dupes = list;
@@ -1756,6 +1796,40 @@
 
 	if (!di) return;
 
+	/* Ensure images in the lists have unique FileDatas */
+	GList *work;
+	DupeItem *di_list;
+	work = g_list_first(dw->list);
+	while (work)
+		{
+		di_list = work->data;
+		if (di_list->fd == di->fd)
+			{
+			return;
+			}
+		else
+			{
+			work = work->next;
+			}
+		}
+
+	if (dw->second_list)
+		{
+		work = g_list_first(dw->second_list);
+		while (work)
+			{
+			di_list = work->data;
+			if (di_list->fd == di->fd)
+				{
+				return;
+				}
+			else
+				{
+				work = work->next;
+				}
+			}
+		}
+
 	if (dw->second_drop)
 		{
 		dupe_second_add(dw, di);
@@ -2095,6 +2169,7 @@
 	DupeWindow *dw = data;
 	GtkTreeSelection *selection;
 
+	options->duplicates_select_type = DUPE_SELECT_NONE;
 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
 	gtk_tree_selection_select_all(selection);
 }
@@ -2104,6 +2179,7 @@
 	DupeWindow *dw = data;
 	GtkTreeSelection *selection;
 
+	options->duplicates_select_type = DUPE_SELECT_NONE;
 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
 	gtk_tree_selection_unselect_all(selection);
 }
@@ -2112,14 +2188,16 @@
 {
 	DupeWindow *dw = data;
 
-	dupe_listview_select_dupes(dw, TRUE);
+	options->duplicates_select_type = DUPE_SELECT_GROUP1;
+	dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP1);
 }
 
 static void dupe_menu_select_dupes_set2_cb(GtkWidget *widget, gpointer data)
 {
 	DupeWindow *dw = data;
 
-	dupe_listview_select_dupes(dw, FALSE);
+	options->duplicates_select_type = DUPE_SELECT_GROUP2;
+	dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP2);
 }
 
 static void dupe_menu_edit_cb(GtkWidget *widget, gpointer data)
@@ -2598,6 +2676,15 @@
 	dupe_window_recompare(dw);
 }
 
+static void dupe_sort_totals_toggle_cb(GtkWidget *widget, gpointer data)
+{
+	DupeWindow *dw = data;
+
+	options->sort_totals = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+	dupe_window_recompare(dw);
+
+}
+
 /*
  *-------------------------------------------------------------------
  * match type menu
@@ -2619,6 +2706,8 @@
 	if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
 	gtk_tree_model_get(store, &iter, DUPE_MENU_COLUMN_MASK, &dw->match_mask, -1);
 
+	options->duplicates_match = dw->match_mask;
+
 	dupe_window_recompare(dw);
 }
 
@@ -2793,6 +2882,7 @@
 	DupeWindow *dw = data;
 
 	dw->show_thumbs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+	options->duplicates_thumbnails = dw->show_thumbs;
 
 	if (dw->show_thumbs)
 		{
@@ -2821,6 +2911,41 @@
 	dupe_listview_set_height(dw->listview, dw->show_thumbs);
 }
 
+static void dupe_window_rotation_invariant_cb(GtkWidget *widget, gpointer data)
+{
+	DupeWindow *dw = data;
+
+	options->rot_invariant_sim = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+	dupe_window_recompare(dw);
+}
+
+static void dupe_window_custom_threshold_cb(GtkWidget *widget, gpointer data)
+{
+	DupeWindow *dw = data;
+	DupeMatchType match_type;
+	GtkTreeModel *store;
+	gboolean valid;
+	GtkTreeIter iter;
+
+	options->duplicates_similarity_threshold = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
+	dw->match_mask = DUPE_MATCH_SIM_CUSTOM;
+
+	store = gtk_combo_box_get_model(GTK_COMBO_BOX(dw->combo));
+	valid = gtk_tree_model_get_iter_first(store, &iter);
+	while (valid)
+		{
+		gtk_tree_model_get(store, &iter, DUPE_MENU_COLUMN_MASK, &match_type, -1);
+		if (match_type == DUPE_MATCH_SIM_CUSTOM)
+			{
+			break;
+			}
+		valid = gtk_tree_model_iter_next(store, &iter);
+		}
+
+	gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dw->combo), &iter);
+	dupe_window_recompare(dw);
+}
+
 static void dupe_popup_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
 {
 	GtkWidget *view = data;
@@ -2989,10 +3114,12 @@
 					}
 				break;
 			case '1':
-				dupe_listview_select_dupes(dw, TRUE);
+				options->duplicates_select_type = DUPE_SELECT_GROUP1;
+				dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP1);
 				break;
 			case '2':
-				dupe_listview_select_dupes(dw, FALSE);
+				options->duplicates_select_type = DUPE_SELECT_GROUP2;
+				dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP2);
 				break;
 			case GDK_KEY_Menu:
 			case GDK_KEY_F10:
@@ -3013,6 +3140,9 @@
 						       dupe_popup_menu_pos_cb, listview, 0, GDK_CURRENT_TIME);
 					}
 				break;
+			case GDK_KEY_F1:
+				help_window_show("GuideReferenceKeyboardShortcuts.html#DuplicatesKeyboardShortcuts");
+				break;
 			default:
 				stop_signal = FALSE;
 				break;
@@ -3071,7 +3201,7 @@
 }
 
 /* collection and files can be NULL */
-DupeWindow *dupe_window_new(DupeMatchType match_mask)
+DupeWindow *dupe_window_new()
 {
 	DupeWindow *dw;
 	GtkWidget *vbox;
@@ -3086,7 +3216,18 @@
 
 	dw = g_new0(DupeWindow, 1);
 
-	dw->match_mask = match_mask;
+	dw->match_mask = DUPE_MATCH_NAME;
+	if (options->duplicates_match == DUPE_MATCH_NAME) dw->match_mask = DUPE_MATCH_NAME;
+	if (options->duplicates_match == DUPE_MATCH_SIZE) dw->match_mask = DUPE_MATCH_SIZE;
+	if (options->duplicates_match == DUPE_MATCH_DATE) dw->match_mask = DUPE_MATCH_DATE;
+	if (options->duplicates_match == DUPE_MATCH_DIM) dw->match_mask = DUPE_MATCH_DIM;
+	if (options->duplicates_match == DUPE_MATCH_SUM) dw->match_mask = DUPE_MATCH_SUM;
+	if (options->duplicates_match == DUPE_MATCH_PATH) dw->match_mask = DUPE_MATCH_PATH;
+	if (options->duplicates_match == DUPE_MATCH_SIM_HIGH) dw->match_mask = DUPE_MATCH_SIM_HIGH;
+	if (options->duplicates_match == DUPE_MATCH_SIM_MED) dw->match_mask = DUPE_MATCH_SIM_MED;
+	if (options->duplicates_match == DUPE_MATCH_SIM_LOW) dw->match_mask = DUPE_MATCH_SIM_LOW;
+	if (options->duplicates_match == DUPE_MATCH_SIM_CUSTOM) dw->match_mask = DUPE_MATCH_SIM_CUSTOM;
+	if (options->duplicates_match == DUPE_MATCH_NAME_CI) dw->match_mask = DUPE_MATCH_NAME_CI;
 
 	dw->window = window_new(GTK_WINDOW_TOPLEVEL, "dupe", NULL, NULL, _("Find duplicates"));
 
@@ -3192,12 +3333,21 @@
 	gtk_widget_show(dw->combo);
 
 	dw->button_thumbs = gtk_check_button_new_with_label(_("Thumbnails"));
+	dw->show_thumbs = options->duplicates_thumbnails;
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dw->button_thumbs), dw->show_thumbs);
 	g_signal_connect(G_OBJECT(dw->button_thumbs), "toggled",
 			 G_CALLBACK(dupe_window_show_thumb_cb), dw);
 	gtk_box_pack_start(GTK_BOX(status_box), dw->button_thumbs, FALSE, FALSE, PREF_PAD_SPACE);
 	gtk_widget_show(dw->button_thumbs);
 
+	dw->button_rotation_invariant = gtk_check_button_new_with_label(_("Ignore Rotation"));
+	gtk_widget_set_tooltip_text(GTK_WIDGET(dw->button_rotation_invariant), "Ignore image orientation");
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dw->button_rotation_invariant), options->rot_invariant_sim);
+	g_signal_connect(G_OBJECT(dw->button_rotation_invariant), "toggled",
+			 G_CALLBACK(dupe_window_rotation_invariant_cb), dw);
+	gtk_box_pack_start(GTK_BOX(status_box), dw->button_rotation_invariant, FALSE, FALSE, PREF_PAD_SPACE);
+	gtk_widget_show(dw->button_rotation_invariant);
+
 	button = gtk_check_button_new_with_label(_("Compare two file sets"));
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), dw->second_set);
 	g_signal_connect(G_OBJECT(button), "toggled",
@@ -3218,6 +3368,25 @@
 	gtk_container_add(GTK_CONTAINER(frame), dw->status_label);
 	gtk_widget_show(dw->status_label);
 
+	button = gtk_check_button_new_with_label(_("Sort"));
+	gtk_widget_set_tooltip_text(GTK_WIDGET(button), "Sort by group totals");
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), options->sort_totals);
+	g_signal_connect(G_OBJECT(button), "toggled",
+			 G_CALLBACK(dupe_sort_totals_toggle_cb), dw);
+	gtk_box_pack_start(GTK_BOX(status_box), button, FALSE, FALSE, PREF_PAD_SPACE);
+	gtk_widget_show(button);
+
+	label = gtk_label_new(_("Custom Threshold"));
+	gtk_box_pack_start(GTK_BOX(status_box), label, FALSE, FALSE, PREF_PAD_SPACE);
+	gtk_widget_show(label);
+	dw->custom_threshold = gtk_spin_button_new_with_range(1, 100, 1);
+	gtk_widget_set_tooltip_text(GTK_WIDGET(dw->custom_threshold), "Custom similarity threshold");
+	gtk_spin_button_set_value(GTK_SPIN_BUTTON(dw->custom_threshold), options->duplicates_similarity_threshold);
+	g_signal_connect(G_OBJECT(dw->custom_threshold), "value_changed",
+													G_CALLBACK(dupe_window_custom_threshold_cb), dw);
+	gtk_box_pack_start(GTK_BOX(status_box), dw->custom_threshold, FALSE, FALSE, PREF_PAD_SPACE);
+	gtk_widget_show(dw->custom_threshold);
+
 	dw->extra_label = gtk_progress_bar_new();
 	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dw->extra_label), 0.0);
 #if GTK_CHECK_VERSION(3,0,0)
--- a/src/dupe.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/dupe.h	Sat Jul 08 10:32:34 2017 +0100
@@ -41,6 +41,13 @@
 	DUPE_MATCH_NAME_CI = 1 << 10	/* same as name, but case insensitive */
 } DupeMatchType;
 
+typedef enum
+{
+	DUPE_SELECT_NONE,
+	DUPE_SELECT_GROUP1,
+	DUPE_SELECT_GROUP2
+} DupeSelectType;
+
 typedef struct _DupeItem DupeItem;
 struct _DupeItem
 {
@@ -85,6 +92,8 @@
 	GtkWidget *status_label;
 	GtkWidget *extra_label;
 	GtkWidget *button_thumbs;
+	GtkWidget *button_rotation_invariant;
+	GtkWidget *custom_threshold;
 
 	gboolean show_thumbs;
 
@@ -119,7 +128,7 @@
 };
 
 
-DupeWindow *dupe_window_new(DupeMatchType match_mask);
+DupeWindow *dupe_window_new(void);
 
 void dupe_window_clear(DupeWindow *dw);
 void dupe_window_close(DupeWindow *dw);
--- a/src/editors.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/editors.c	Sat Jul 08 10:32:34 2017 +0100
@@ -566,6 +566,10 @@
 	vd->progress = gtk_progress_bar_new();
 	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(vd->progress), 0.0);
 	gtk_box_pack_start(GTK_BOX(hbox), vd->progress, TRUE, TRUE, 0);
+#if GTK_CHECK_VERSION(3,0,0)
+	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(vd->progress), "");
+	gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(vd->progress), TRUE);
+#endif
 	gtk_widget_show(vd->progress);
 
 	vd->spinner = spinner_new(NULL, SPINNER_SPEED);
--- a/src/exif.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/exif.c	Sat Jul 08 10:32:34 2017 +0100
@@ -1105,6 +1105,18 @@
 }
 
 
+gchar* exif_get_image_comment(FileData* fd)
+{
+	log_printf("%s", _("Can't get image comment: not compiled with Exiv2.\n"));
+	return g_strdup("");
+}
+
+void exif_set_image_comment(FileData* fd, const gchar* comment)
+{
+	log_printf("%s", _("Can't set image comment: not compiled with Exiv2.\n"));
+}
+
+
 /*
  *-------------------------------------------------------------------
  * misc
--- a/src/exif.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/exif.h	Sat Jul 08 10:32:34 2017 +0100
@@ -158,6 +158,10 @@
 
 gboolean exif_jpeg_parse_color(ExifData *exif, guchar *data, guint size);
 
+/* support for so called "jpeg comment" */
+gchar* exif_get_image_comment(FileData* fd);
+void exif_set_image_comment(FileData* fd, const gchar* comment);
+
 /*raw support */
 guchar *exif_get_preview(ExifData *exif, guint *data_len, gint requested_width, gint requested_height);
 void exif_free_preview(guchar *buf);
--- a/src/exiv2.cc	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/exiv2.cc	Sat Jul 08 10:32:34 2017 +0100
@@ -158,6 +158,10 @@
 	virtual void add_jpeg_color_profile(unsigned char *cp_data, guint cp_length) = 0;
 
 	virtual guchar *get_jpeg_color_profile(guint *data_len) = 0;
+
+	virtual std::string image_comment() const = 0;
+
+	virtual void set_image_comment(const std::string& comment) = 0;
 };
 
 // This allows read-only access to the original metadata
@@ -280,6 +284,17 @@
 		}
 		return NULL;
 	}
+
+	virtual std::string image_comment() const
+	{
+		return image_.get() ? image_->comment() : "";
+	}
+
+	virtual void set_image_comment(const std::string& comment)
+	{
+		if (image_.get())
+			image_->setComment(comment);
+	}
 };
 
 extern "C" {
@@ -415,6 +430,16 @@
 	{
 		return imageData_->get_jpeg_color_profile(data_len);
 	}
+
+	virtual std::string image_comment() const
+	{
+		return imageData_->image_comment();
+	}
+
+	virtual void set_image_comment(const std::string& comment)
+	{
+		imageData_->set_image_comment(comment);
+	}
 };
 
 
@@ -1133,6 +1158,23 @@
 	return ret;
 }
 
+gchar* exif_get_image_comment(FileData* fd)
+{
+	if (!fd || !fd->exif)
+		return g_strdup("");
+
+	return g_strdup(fd->exif->image_comment().c_str());
+}
+
+void exif_set_image_comment(FileData* fd, const gchar* comment)
+{
+	if (!fd || !fd->exif)
+		return;
+
+	fd->exif->set_image_comment(comment ? comment : "");
+}
+
+
 #if EXIV2_TEST_VERSION(0,17,90)
 
 guchar *exif_get_preview(ExifData *exif, guint *data_len, gint requested_width, gint requested_height)
--- a/src/filedata.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/filedata.c	Sat Jul 08 10:32:34 2017 +0100
@@ -427,6 +427,8 @@
 	fd->mode = st->st_mode;
 	fd->ref = 1;
 	fd->magick = FD_MAGICK;
+	fd->exifdate = 0;
+	fd->rating = 0;
 
 	if (disable_sidecars) fd->disable_grouping = TRUE;
 
@@ -465,21 +467,6 @@
 	return fd;
 }
 
-void init_exif_time_data(GList *files)
-{
-	FileData *file;
-	DEBUG_1("%s init_exif_time_data: ...", get_exec_time());
-	while (files)
-		{
-		file = files->data;
-
-		if (file)
-			file->exifdate = 0;
-
-		files = files->next;
-		}
-}
-
 void read_exif_time_data(FileData *file)
 {
 	if (file->exifdate > 0)
@@ -528,6 +515,24 @@
 		}
 }
 
+void set_rating_data(GList *files)
+{
+	gchar *rating_str;
+	DEBUG_1("%s set_rating_data: ...", get_exec_time());
+
+	while (files)
+		{
+		FileData *file = files->data;
+		rating_str = metadata_read_string(file, RATING_KEY, METADATA_PLAIN);
+		if (rating_str )
+			{
+			file->rating = atoi(rating_str);
+			g_free(rating_str);
+			}
+		files = files->next;
+		}
+}
+
 FileData *file_data_new_no_grouping(const gchar *path_utf8)
 {
 	struct stat st;
@@ -605,6 +610,7 @@
 	g_free(fd->original_path);
 	g_free(fd->collate_key_name);
 	g_free(fd->collate_key_name_nocase);
+	g_free(fd->extended_extension);
 	if (fd->thumb_pixbuf) g_object_unref(fd->thumb_pixbuf);
 	histmap_free(fd->histmap);
 
@@ -932,6 +938,8 @@
 
 	target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
 	sfd->parent = NULL;
+	g_free(sfd->extended_extension);
+	sfd->extended_extension = NULL;
 
 	file_data_unref(target);
 	file_data_unref(sfd);
@@ -1037,6 +1045,11 @@
 			if (fa->exifdate > fb->exifdate) return 1;
 			/* fall back to name */
 			break;
+		case SORT_RATING:
+			if (fa->rating < fb->rating) return -1;
+			if (fa->rating > fb->rating) return 1;
+			/* fall back to name */
+			break;
 #ifdef HAVE_STRVERSCMP
 		case SORT_NUMBER:
 			ret = strverscmp(fa->name, fb->name);
@@ -1092,6 +1105,10 @@
 		{
 		set_exif_time_data(list);
 		}
+	if (method == SORT_RATING)
+		{
+		set_rating_data(list);
+		}
 	return filelist_sort_full(list, method, ascend, (GCompareFunc) filelist_sort_file_cb);
 }
 
@@ -1119,6 +1136,37 @@
 
 	list = g_hash_table_lookup(basename_hash, basename);
 
+	if (!list)
+		{
+		DEBUG_1("TG: basename_hash not found for %s",fd->path);
+		const gchar *parent_extension = registered_extension_from_path(basename);
+
+		if (parent_extension)
+			{
+			DEBUG_1("TG: parent extension %s",parent_extension);
+			gchar *parent_basename = g_strndup(basename, parent_extension - basename);
+			DEBUG_1("TG: parent basename %s",parent_basename);
+			FileData *parent_fd = g_hash_table_lookup(file_data_pool, basename);
+			if (parent_fd)
+				{
+				DEBUG_1("TG: parent fd found");
+				list = g_hash_table_lookup(basename_hash, parent_basename);
+				if (!g_list_find(list, parent_fd))
+					{
+					DEBUG_1("TG: parent fd doesn't fit");
+					g_free(parent_basename);
+					list = NULL;
+					}
+				else
+					{
+					g_free(basename);
+					basename = parent_basename;
+					fd->extended_extension = g_strconcat(parent_extension, fd->extension, NULL);
+					}
+				}
+			}
+		}
+
 	if (!g_list_find(list, fd))
 		{
 		list = g_list_insert_sorted(list, file_data_ref(fd), file_data_sort_by_ext);
@@ -1131,6 +1179,11 @@
 	return list;
 }
 
+static void file_data_basename_hash_insert_cb(gpointer fd, gpointer basename_hash)
+{
+	file_data_basename_hash_insert((GHashTable *)basename_hash, (FileData *)fd);
+}
+
 static void file_data_basename_hash_remove_list(gpointer key, gpointer value, gpointer data)
 {
 	filelist_free((GList *)value);
@@ -1195,6 +1248,7 @@
 	gchar *pathl;
 	GList *dlist = NULL;
 	GList *flist = NULL;
+	GList *xmp_files = NULL;
 	gint (*stat_func)(const gchar *path, struct stat *buf);
 	GHashTable *basename_hash = NULL;
 
@@ -1252,7 +1306,10 @@
 					flist = g_list_prepend(flist, fd);
 					if (fd->sidecar_priority && !fd->disable_grouping)
 						{
-						file_data_basename_hash_insert(basename_hash, fd);
+						if (strcmp(fd->extension, ".xmp") != 0)
+							file_data_basename_hash_insert(basename_hash, fd);
+						else
+							xmp_files = g_list_append(xmp_files, fd);
 						}
 					}
 				}
@@ -1271,6 +1328,12 @@
 
 	g_free(pathl);
 
+	if (xmp_files)
+		{
+		g_list_foreach(xmp_files,file_data_basename_hash_insert_cb,basename_hash);
+		g_list_free(xmp_files);
+		}
+
 	if (dirs) *dirs = dlist;
 
 	if (files)
@@ -1281,9 +1344,6 @@
 		}
 	if (basename_hash) file_data_basename_hash_free(basename_hash);
 
-	// Call a separate function to initialize the exif datestamps for the found files..
-	if (files) init_exif_time_data(*files);
-
 	return TRUE;
 }
 
@@ -1531,22 +1591,29 @@
 	if (!file_data_can_write_sidecar(fd)) return NULL;
 
 	work = fd->parent ? fd->parent->sidecar_files : fd->sidecar_files;
+	gchar *extended_extension = g_strconcat(fd->parent ? fd->parent->extension : fd->extension, ".xmp", NULL);
 	while (work)
 		{
 		FileData *sfd = work->data;
 		work = work->next;
-		if (g_ascii_strcasecmp(sfd->extension, ".xmp") == 0)
+		if (g_ascii_strcasecmp(sfd->extension, ".xmp") == 0 || g_ascii_strcasecmp(sfd->extension, extended_extension) == 0)
 			{
 			sidecar_path = g_strdup(sfd->path);
 			break;
 			}
 		}
+	g_free(extended_extension);
 
 	if (!existing_only && !sidecar_path)
 		{
-		gchar *base = g_strndup(fd->path, fd->extension - fd->path);
-		sidecar_path = g_strconcat(base, ".xmp", NULL);
-		g_free(base);
+		if (options->metadata.sidecar_extended_name)
+			sidecar_path = g_strconcat(fd->path, ".xmp", NULL);
+		else
+			{
+			gchar *base = g_strndup(fd->path, fd->extension - fd->path);
+			sidecar_path = g_strconcat(base, ".xmp", NULL);
+			g_free(base);
+			}
 		}
 
 	return sidecar_path;
@@ -1670,7 +1737,7 @@
         file_data_mark_func_data[n] = data;
         file_data_destroy_mark_func[n] = notify;
 
-        if (get_mark_func)
+	if (get_mark_func && file_data_pool)
 		{
 		/* this effectively changes all known files */
 		g_hash_table_foreach(file_data_pool, file_data_notify_mark_func, NULL);
@@ -2095,11 +2162,11 @@
 
 static void file_data_update_ci_dest_preserve_ext(FileData *fd, const gchar *dest_path)
 {
-	const gchar *extension = extension_from_path(fd->change->source);
+	const gchar *extension = registered_extension_from_path(fd->change->source);
 	gchar *base = remove_extension_from_path(dest_path);
 	gchar *old_path = fd->change->dest;
 
-	fd->change->dest = g_strconcat(base, extension, NULL);
+	fd->change->dest = g_strconcat(base, fd->extended_extension ? fd->extended_extension : extension, NULL);
 	file_data_update_planned_change_hash(fd, old_path, fd->change->dest);
 
 	g_free(old_path);
@@ -2372,7 +2439,7 @@
 
 		if (!same)
 			{
-			const gchar *dest_ext = extension_from_path(fd->change->dest);
+			const gchar *dest_ext = registered_extension_from_path(fd->change->dest);
 			if (!dest_ext) dest_ext = "";
 			if (!options->file_filter.disable_file_extension_checks)
 				{
--- a/src/filedata.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/filedata.h	Sat Jul 08 10:32:34 2017 +0100
@@ -161,5 +161,6 @@
 gboolean file_data_register_real_time_monitor(FileData *fd);
 gboolean file_data_unregister_real_time_monitor(FileData *fd);
 
+void read_exif_time_data(FileData *file);
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/fullscreen.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/fullscreen.c	Sat Jul 08 10:32:34 2017 +0100
@@ -99,7 +99,7 @@
 	fs->hide_mouse_id = g_timeout_add(FULL_SCREEN_HIDE_MOUSE_DELAY, fullscreen_hide_mouse_cb, fs);
 }
 
-static gboolean fullscreen_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+static gboolean fullscreen_mouse_moved(GtkWidget *widget, GdkEventMotion *event, gpointer data)
 {
 	FullScreenData *fs = data;
 
--- a/src/history_list.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/history_list.c	Sat Jul 08 10:32:34 2017 +0100
@@ -130,6 +130,7 @@
 	SecureSaveInfo *ssi;
 	GList *list;
 	gchar *pathl;
+	gint list_count;
 
 	pathl = path_from_utf8(path);
 	ssi = secure_open(pathl);
@@ -157,10 +158,15 @@
 		 * so that when reading they are added correctly
 		 */
 		work = g_list_last(hd->list);
+		list_count = g_list_position(hd->list, g_list_last(hd->list)) + 1;
 		while (work && secsave_errno == SS_ERR_NONE)
 			{
-			secure_fprintf(ssi, "\"%s\"\n", (gchar *)work->data);
+			if (!(strcmp(hd->key, "path_list") == 0 && list_count > options->open_recent_list_maxsize))
+				{
+				secure_fprintf(ssi, "\"%s\"\n", (gchar *)work->data);
+				}
 			work = work->prev;
+			list_count--;
 			}
 		secure_fputc(ssi, '\n');
 		}
--- a/src/image-overlay.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/image-overlay.c	Sat Jul 08 10:32:34 2017 +0100
@@ -336,6 +336,10 @@
 			{
 			data = metadata_read_string(imd->image_fd, COMMENT_KEY, METADATA_PLAIN);
 			}
+		else if (strcmp(name, "imagecomment") == 0)
+			{
+			data = exif_get_image_comment(imd->image_fd);
+			}
 #ifdef HAVE_LUA
 		else if (strncmp(name, "lua/", 4) == 0)
 			{
--- a/src/image.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/image.c	Sat Jul 08 10:32:34 2017 +0100
@@ -56,6 +56,10 @@
 static void image_click_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
 {
 	ImageWindow *imd = data;
+	if (!options->image_lm_click_nav && event->button == MOUSE_BUTTON_MIDDLE)
+		{
+		imd->mouse_wheel_mode = !imd->mouse_wheel_mode;
+		}
 
 	if (imd->func_button)
 		{
@@ -63,7 +67,7 @@
 		}
 }
 
-static void image_drag_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
+static void image_drag_cb(PixbufRenderer *pr, GdkEventMotion *event, gpointer data)
 {
 	ImageWindow *imd = data;
 	gint width, height;
@@ -375,7 +379,7 @@
 
 }
 
-void image_alter_orientation(ImageWindow *imd, AlterType type)
+void image_alter_orientation(ImageWindow *imd, FileData *fd_n, AlterType type)
 {
 	static const gint rotate_90[]    = {1,   6, 7, 8, 5, 2, 3, 4, 1};
 	static const gint rotate_90_cc[] = {1,   8, 5, 6, 7, 4, 1, 2, 3};
@@ -383,37 +387,49 @@
 	static const gint mirror[]       = {1,   2, 1, 4, 3, 6, 5, 8, 7};
 	static const gint flip[]         = {1,   4, 3, 2, 1, 8, 7, 6, 5};
 
+	gint orientation;
 
-	if (!imd || !imd->pr || !imd->image_fd) return;
+	if (!imd || !imd->pr || !imd->image_fd || !fd_n) return;
 
-	if (imd->orientation < 1 || imd->orientation > 8) imd->orientation = 1;
+	orientation = EXIF_ORIENTATION_TOP_LEFT;
+	{
+	if (fd_n->user_orientation)
+		{
+		orientation = fd_n->user_orientation;
+		}
+	else
+		if (options->metadata.write_orientation)
+			{
+			orientation = metadata_read_int(fd_n, ORIENTATION_KEY, EXIF_ORIENTATION_TOP_LEFT);
+			}
+	}
 
 	switch (type)
 		{
 		case ALTER_ROTATE_90:
-			imd->orientation = rotate_90[imd->orientation];
+			orientation = rotate_90[orientation];
 			break;
 		case ALTER_ROTATE_90_CC:
-			imd->orientation = rotate_90_cc[imd->orientation];
+			orientation = rotate_90_cc[orientation];
 			break;
 		case ALTER_ROTATE_180:
-			imd->orientation = rotate_180[imd->orientation];
+			orientation = rotate_180[orientation];
 			break;
 		case ALTER_MIRROR:
-			imd->orientation = mirror[imd->orientation];
+			orientation = mirror[orientation];
 			break;
 		case ALTER_FLIP:
-			imd->orientation = flip[imd->orientation];
+			orientation = flip[orientation];
 			break;
 		case ALTER_NONE:
-			imd->orientation = imd->image_fd->exif_orientation ? imd->image_fd->exif_orientation : 1;
+			orientation = fd_n->exif_orientation ? fd_n->exif_orientation : 1;
 			break;
 		default:
 			return;
 			break;
 		}
 
-	if (imd->orientation != imd->image_fd->exif_orientation ? imd->image_fd->exif_orientation : 1)
+	if (orientation != (fd_n->exif_orientation ? fd_n->exif_orientation : 1))
 		{
 		if (!options->metadata.write_orientation)
 			{
@@ -422,29 +438,33 @@
 			   we must however handle switching metadata.write_orientation on and off, therefore
 			   we just disable referencing new fd's, not unreferencing the old ones
 			*/
-			if (imd->image_fd->user_orientation == 0) file_data_ref(imd->image_fd);
-			imd->image_fd->user_orientation = imd->orientation;
+			if (fd_n->user_orientation == 0) file_data_ref(fd_n);
+			fd_n->user_orientation = orientation;
 			}
 		}
 	else
 		{
-		if (imd->image_fd->user_orientation != 0) file_data_unref(imd->image_fd);
-		imd->image_fd->user_orientation = 0;
+		if (fd_n->user_orientation != 0) file_data_unref(fd_n);
+		fd_n->user_orientation = 0;
 		}
 
 	if (options->metadata.write_orientation)
 		{
 		if (type == ALTER_NONE)
 			{
-			metadata_write_revert(imd->image_fd, ORIENTATION_KEY);
+			metadata_write_revert(fd_n, ORIENTATION_KEY);
 			}
 		else
 			{
-			metadata_write_int(imd->image_fd, ORIENTATION_KEY, imd->orientation);
+			metadata_write_int(fd_n, ORIENTATION_KEY, orientation);
 			}
 		}
 
-	pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation);
+	if (imd->image_fd == fd_n && !(options->metadata.write_orientation && !options->image.exif_rotate_enable))
+		{
+		imd->orientation = orientation;
+		pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, orientation);
+		}
 }
 
 void image_set_desaturate(ImageWindow *imd, gboolean desaturate)
@@ -977,7 +997,7 @@
 }
 
 void image_set_drag_func(ImageWindow *imd,
-			   void (*func)(ImageWindow *, GdkEventButton *event, gdouble dx, gdouble dy, gpointer),
+			   void (*func)(ImageWindow *, GdkEventMotion *event, gdouble dx, gdouble dy, gpointer),
 			   gpointer data)
 {
 	imd->func_drag = func;
@@ -1070,6 +1090,7 @@
 	   here before it is taken over by the renderer. */
 	if (pixbuf) g_object_ref(pixbuf);
 
+	imd->orientation = EXIF_ORIENTATION_TOP_LEFT;
 	if (imd->image_fd)
 		{
 		if (imd->image_fd->user_orientation)
@@ -1722,6 +1743,7 @@
 					"window_limit_value", options->image.max_window_size,
 					"autofit_limit", options->image.limit_autofit_size,
 					"autofit_limit_value", options->image.max_autofit_size,
+					"enlargement_limit_value", options->image.max_enlargement_size,
 
 					NULL);
 
@@ -1919,7 +1941,7 @@
 
 	image_set_selectable(imd, 0);
 
-	g_signal_connect(G_OBJECT(imd->pr), "clicked",
+	g_signal_connect(G_OBJECT(imd->pr), "button_press_event",
 			 G_CALLBACK(image_click_cb), imd);
 	g_signal_connect(G_OBJECT(imd->pr), "scroll_notify",
 			 G_CALLBACK(image_scroll_notify_cb), imd);
--- a/src/image.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/image.h	Sat Jul 08 10:32:34 2017 +0100
@@ -36,7 +36,7 @@
 	void (*func)(ImageWindow *, GdkEventButton *event, gpointer),
 	gpointer data);
 void image_set_drag_func(ImageWindow *imd,
-	void (*func)(ImageWindow *, GdkEventButton *event, gdouble dx, gdouble dy, gpointer),
+	void (*func)(ImageWindow *, GdkEventMotion *event, gdouble dx, gdouble dy, gpointer),
 	gpointer data);
 void image_set_scroll_func(ImageWindow *imd,
 	void (*func)(ImageWindow *, GdkEventScroll *event, gpointer),
@@ -85,7 +85,7 @@
 			   gdouble x_align, gdouble y_align);
 void image_get_scroll_center(ImageWindow *imd, gdouble *x, gdouble *y);
 void image_set_scroll_center(ImageWindow *imd, gdouble x, gdouble y);
-void image_alter_orientation(ImageWindow *imd, AlterType type);
+void image_alter_orientation(ImageWindow *imd, FileData *fd, AlterType type);
 void image_set_desaturate(ImageWindow *imd, gboolean desaturate);
 gboolean image_get_desaturate(ImageWindow *imd);
 
--- a/src/img-view.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/img-view.c	Sat Jul 08 10:32:34 2017 +0100
@@ -421,13 +421,13 @@
 		switch (event->keyval)
 			{
 			case 'R': case 'r':
-				image_alter_orientation(imd, ALTER_ROTATE_180);
+				image_alter_orientation(imd, imd->image_fd, ALTER_ROTATE_180);
 				break;
 			case 'M': case 'm':
-				image_alter_orientation(imd, ALTER_MIRROR);
+				image_alter_orientation(imd, imd->image_fd, ALTER_MIRROR);
 				break;
 			case 'F': case 'f':
-				image_alter_orientation(imd, ALTER_FLIP);
+				image_alter_orientation(imd, imd->image_fd, ALTER_FLIP);
 				break;
 			case 'G': case 'g':
 				image_set_desaturate(imd, !image_get_desaturate(imd));
@@ -531,10 +531,10 @@
 				view_overlay_toggle(vw);
 				break;
 			case ']':
-				image_alter_orientation(imd, ALTER_ROTATE_90);
+				image_alter_orientation(imd, imd->image_fd, ALTER_ROTATE_90);
 				break;
 			case '[':
-				image_alter_orientation(imd, ALTER_ROTATE_90_CC);
+				image_alter_orientation(imd, imd->image_fd, ALTER_ROTATE_90_CC);
 				break;
 			case GDK_KEY_Delete: case GDK_KEY_KP_Delete:
 				if (options->file_ops.enable_delete_key)
@@ -600,7 +600,8 @@
 {
 	ViewWindow *vw = data;
 
-	if (event->state & GDK_CONTROL_MASK)
+	if ((event->state & GDK_CONTROL_MASK) ||
+				(imd->mouse_wheel_mode && !options->image_lm_click_nav))
 		{
 		switch (event->direction)
 			{
@@ -905,7 +906,9 @@
 	req_size.height = h;
 	gtk_widget_size_allocate(GTK_WIDGET(vw->window), &req_size);
 
+#if !GTK_CHECK_VERSION(3,0,0)
 	gtk_widget_set_size_request(vw->imd->pr, w, h);
+#endif
 
 	gtk_widget_show(vw->window);
 
@@ -1081,7 +1084,7 @@
 	type = GPOINTER_TO_INT(data);
 
 	if (!vw) return;
-	image_alter_orientation(vw->imd, type);
+	image_alter_orientation(vw->imd, vw->imd->image_fd, type);
 }
 
 static void view_wallpaper_cb(GtkWidget *widget, gpointer data)
@@ -1271,8 +1274,9 @@
 			 G_CALLBACK(view_popup_menu_destroy_cb), editmenu_fd_list);
 	item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, editmenu_fd_list);
 	menu_item_add_divider(item);
+#if !GTK_CHECK_VERSION(3,0,0)
 	menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw);
-
+#endif
 	submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw);
 
 	menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(view_new_window_cb), vw);
--- a/src/layout.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/layout.c	Sat Jul 08 10:32:34 2017 +0100
@@ -30,6 +30,7 @@
 #include "layout_config.h"
 #include "layout_image.h"
 #include "layout_util.h"
+#include "logwindow.h"
 #include "menu.h"
 #include "pixbuf-renderer.h"
 #include "pixbuf_util.h"
@@ -46,7 +47,7 @@
 #include "bar.h"
 #include "bar_sort.h"
 #include "preferences.h"
-
+#include "shortcuts.h"
 #ifdef HAVE_LIRC
 #include "lirc.h"
 #endif
@@ -183,6 +184,21 @@
 	return FALSE;
 }
 
+static void layout_box_folders_changed_cb(GtkWidget *widget, gpointer data)
+{
+	LayoutWindow *lw;
+	GList *work;
+
+/* FIXME: this is probably not the correct way to implement this */
+	work = layout_window_list;
+	while (work)
+		{
+		lw = work->data;
+		lw->options.folder_window.vdivider_pos = gtk_paned_get_position(GTK_PANED(widget));
+		work = work->next;
+		}
+}
+
 /*
  *-----------------------------------------------------------------------------
  * menu, toolbar, and dir view
@@ -272,6 +288,8 @@
 static GtkWidget *layout_tool_setup(LayoutWindow *lw)
 {
 	GtkWidget *box;
+	GtkWidget *box_folders;
+	GtkWidget *scd;
 	GtkWidget *menu_bar;
 	GtkWidget *tabcomp;
 	GtkWidget *toolbar;
@@ -292,18 +310,34 @@
 	gtk_box_pack_start(GTK_BOX(box), tabcomp, FALSE, FALSE, 0);
 	gtk_widget_show(tabcomp);
 
+#if GTK_CHECK_VERSION(3,20,0)
+	g_signal_connect(G_OBJECT(gtk_widget_get_parent(gtk_widget_get_parent(lw->path_entry))), "changed",
+			 G_CALLBACK(layout_path_entry_changed_cb), lw);
+#else
 	g_signal_connect(G_OBJECT(gtk_widget_get_parent(lw->path_entry)), "changed",
 			 G_CALLBACK(layout_path_entry_changed_cb), lw);
+#endif
+
+	box_folders = GTK_WIDGET(gtk_hpaned_new());
+	gtk_box_pack_start(GTK_BOX(box), box_folders, TRUE, TRUE, 0);
 
 	lw->vd = vd_new(lw->options.dir_view_type, lw->dir_fd);
 	vd_set_layout(lw->vd, lw);
 	vd_set_select_func(lw->vd, layout_vd_select_cb, lw);
 
 	lw->dir_view = lw->vd->widget;
-
-	gtk_box_pack_start(GTK_BOX(box), lw->dir_view, TRUE, TRUE, 0);
+	gtk_paned_add2(GTK_PANED(box_folders), lw->dir_view);
 	gtk_widget_show(lw->dir_view);
 
+	scd = shortcuts_new_default(lw);
+	gtk_paned_add1(GTK_PANED(box_folders), scd);
+	gtk_paned_set_position(GTK_PANED(box_folders), lw->options.folder_window.vdivider_pos);
+
+	gtk_widget_show(box_folders);
+
+	g_signal_connect(G_OBJECT(box_folders), "notify::position",
+			 G_CALLBACK(layout_box_folders_changed_cb), lw);
+
 	gtk_widget_show(box);
 
 	return box;
@@ -395,6 +429,113 @@
 	return button;
 }
 
+static void layout_zoom_menu_cb(GtkWidget *widget, gpointer data)
+{
+	ZoomMode mode;
+
+	if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return;
+
+	mode = (ZoomMode)GPOINTER_TO_INT(data);
+	options->image.zoom_mode = mode;
+}
+
+static void layout_scroll_menu_cb(GtkWidget *widget, gpointer data)
+{
+	guint scroll_type;
+
+	if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return;
+
+	scroll_type = GPOINTER_TO_UINT(data);
+	options->image.scroll_reset_method = scroll_type;
+	image_options_sync();
+}
+
+static void layout_zoom_menu_hide_cb(GtkWidget *widget, gpointer data)
+{
+	/* destroy the menu */
+	g_object_unref(widget);
+}
+
+static void layout_zoom_button_press_cb(GtkWidget *widget, gpointer data)
+{
+	LayoutWindow *lw = data;
+	GtkWidget *menu;
+	GdkEvent *event;
+	guint32 etime;
+
+	menu = submenu_add_zoom(NULL, G_CALLBACK(layout_zoom_menu_cb),
+			lw, FALSE, FALSE, TRUE, options->image.zoom_mode);
+
+	/* take ownership of menu */
+#ifdef GTK_OBJECT_FLOATING
+	/* GTK+ < 2.10 */
+	g_object_ref(G_OBJECT(menu));
+	gtk_object_sink(GTK_OBJECT(menu));
+#else
+	/* GTK+ >= 2.10 */
+	g_object_ref_sink(G_OBJECT(menu));
+#endif
+
+	menu_item_add_divider(menu);
+
+	menu_item_add_radio(menu, _("Scroll to top left corner"),
+			GUINT_TO_POINTER(SCROLL_RESET_TOPLEFT),
+			options->image.scroll_reset_method == SCROLL_RESET_TOPLEFT,
+			G_CALLBACK(layout_scroll_menu_cb),
+			GUINT_TO_POINTER(SCROLL_RESET_TOPLEFT));
+	menu_item_add_radio(menu, _("Scroll to image center"),
+			GUINT_TO_POINTER(SCROLL_RESET_CENTER),
+			options->image.scroll_reset_method == SCROLL_RESET_CENTER,
+			G_CALLBACK(layout_scroll_menu_cb),
+			GUINT_TO_POINTER(SCROLL_RESET_CENTER));
+	menu_item_add_radio(menu, _("Keep the region from previous image"),
+			GUINT_TO_POINTER(SCROLL_RESET_NOCHANGE),
+			options->image.scroll_reset_method == SCROLL_RESET_NOCHANGE,
+			G_CALLBACK(layout_scroll_menu_cb),
+			GUINT_TO_POINTER(SCROLL_RESET_NOCHANGE));
+
+	g_signal_connect(G_OBJECT(menu), "selection_done",
+			 G_CALLBACK(layout_zoom_menu_hide_cb), NULL);
+
+	event = gtk_get_current_event();
+	if (event)
+		{
+		etime = gdk_event_get_time(event);
+		gdk_event_free(event);
+		}
+	else
+		{
+		etime = 0;
+		}
+
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, etime);
+}
+
+static GtkWidget *layout_zoom_button(LayoutWindow *lw, GtkWidget *box, gint size, gboolean expand)
+{
+	GtkWidget *button;
+	GtkWidget *frame;
+
+
+	frame = gtk_frame_new(NULL);
+	if (size) gtk_widget_set_size_request(frame, size, -1);
+	gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+
+	gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 0);
+
+	gtk_widget_show(frame);
+
+	button = gtk_button_new_with_label("1:1");
+	g_signal_connect(G_OBJECT(button), "clicked",
+			 G_CALLBACK(layout_zoom_button_press_cb), lw);
+	gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+
+	gtk_container_add(GTK_CONTAINER(frame), button);
+	gtk_widget_show(button);
+
+	return button;
+}
+
 /*
  *-----------------------------------------------------------------------------
  * status bar
@@ -494,7 +635,7 @@
 
 	if (!n)
 		{
-		gtk_label_set_text(GTK_LABEL(lw->info_zoom), "");
+		gtk_button_set_label(GTK_BUTTON(lw->info_zoom), "");
 		gtk_label_set_text(GTK_LABEL(lw->info_details), "");
 		}
 	else
@@ -503,7 +644,7 @@
 		gchar *b;
 
 		text = image_zoom_get_as_text(lw->image);
-		gtk_label_set_text(GTK_LABEL(lw->info_zoom), text);
+		gtk_button_set_label(GTK_BUTTON(lw->info_zoom), text);
 		g_free(text);
 
 		b = image_get_fd(lw->image) ? text_from_size(image_get_fd(lw->image)->size) : g_strdup("0");
@@ -602,14 +743,20 @@
 		}
 	lw->info_progress_bar = gtk_progress_bar_new();
 	gtk_widget_set_size_request(lw->info_progress_bar, PROGRESS_WIDTH, -1);
+#if GTK_CHECK_VERSION(3,0,0)
+	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(lw->info_progress_bar), "");
+	gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(lw->info_progress_bar), TRUE);
+#endif
 	gtk_box_pack_start(GTK_BOX(hbox), lw->info_progress_bar, FALSE, FALSE, 0);
 	gtk_widget_show(lw->info_progress_bar);
 
 	lw->info_sort = layout_sort_button(lw);
+	gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_sort), _("Select sort order"));
 	gtk_box_pack_start(GTK_BOX(hbox), lw->info_sort, FALSE, FALSE, 0);
 	gtk_widget_show(lw->info_sort);
 
 	lw->info_status = layout_status_label(NULL, lw->info_box, TRUE, 0, (!small_format));
+	gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_status), _("Folder contents (files selected)"));
 
 	if (small_format)
 		{
@@ -618,6 +765,7 @@
 		gtk_widget_show(hbox);
 		}
 	lw->info_details = layout_status_label(NULL, hbox, TRUE, 0, TRUE);
+	gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_details), _("(Image dimensions) Image size"));
 	toolbar = layout_actions_toolbar(lw, TOOLBAR_STATUS);
 
 	toolbar_frame = gtk_frame_new(NULL);
@@ -626,7 +774,10 @@
 	gtk_widget_show(toolbar_frame);
 	gtk_widget_show(toolbar);
 	gtk_box_pack_end(GTK_BOX(hbox), toolbar_frame, FALSE, FALSE, 0);
-	lw->info_zoom = layout_status_label(NULL, hbox, FALSE, ZOOM_LABEL_WIDTH, FALSE);
+	lw->info_zoom = layout_zoom_button(lw, hbox, ZOOM_LABEL_WIDTH, TRUE);
+	gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_zoom), _("Select zoom mode"));
+	gtk_widget_show(lw->info_zoom);
+
 	if (small_format)
 		{
 		hbox = gtk_hbox_new(FALSE, 0);
@@ -634,6 +785,7 @@
 		gtk_widget_show(hbox);
 		}
 	lw->info_pixel = layout_status_label(NULL, hbox, FALSE, 0, small_format); /* expand only in small format */
+	gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_pixel), _("[Pixel x,y coord]: (Pixel R,G,B value)"));
 	if (!lw->options.show_info_pixel) gtk_widget_hide(gtk_widget_get_parent(lw->info_pixel));
 }
 
@@ -1174,7 +1326,7 @@
 		return FALSE;
 		}
 
-	window = gtk_widget_get_window(lw->window);
+	window = gtk_widget_get_window(lw->tools);
 	gdk_window_get_root_origin(window, x, y);
 	*w = gdk_window_get_width(window);
 	*h = gdk_window_get_height(window);
@@ -1192,9 +1344,29 @@
 	return TRUE;
 }
 
+gboolean layout_geometry_get_log_window(LayoutWindow *lw, gint *x, gint *y,
+														gint *w, gint *h)
+{
+	GdkWindow *window;
+
+	if (!layout_valid(&lw)) return FALSE;
+
+	if (!lw->log_window)
+		{
+		return FALSE;
+		}
+
+	window = gtk_widget_get_window(lw->log_window);
+	gdk_window_get_root_origin(window, x, y);
+	*w = gdk_window_get_width(window);
+	*h = gdk_window_get_height(window);
+
+	return TRUE;
+}
+
 static void layout_tools_geometry_sync(LayoutWindow *lw)
 {
-	layout_geometry_get_tools(lw, &lw->options.float_window.x, &lw->options.float_window.x,
+	layout_geometry_get_tools(lw, &lw->options.float_window.x, &lw->options.float_window.y,
 				  &lw->options.float_window.w, &lw->options.float_window.h, &lw->options.float_window.vdivider_pos);
 }
 
@@ -2015,6 +2187,10 @@
 
 	g_free(lw->options.last_path);
 	lw->options.last_path = g_strdup(layout_get_path(lw));
+
+	layout_geometry_get_log_window(lw, &lw->options.log_window.x, &lw->options.log_window.y,
+	                                 &lw->options.log_window.w, &lw->options.log_window.h);
+
 }
 
 void layout_apply_options(LayoutWindow *lw, LayoutOptions *lop)
@@ -2263,6 +2439,9 @@
 	WRITE_NL(); WRITE_INT(*layout, main_window.vdivider_pos);
 	WRITE_SEPARATOR();
 
+	WRITE_NL(); WRITE_INT(*layout, folder_window.vdivider_pos);
+	WRITE_SEPARATOR();
+
 	WRITE_NL(); WRITE_INT(*layout, float_window.x);
 	WRITE_NL(); WRITE_INT(*layout, float_window.y);
 	WRITE_NL(); WRITE_INT(*layout, float_window.w);
@@ -2284,6 +2463,14 @@
 	WRITE_NL(); WRITE_UINT(*layout, image_overlay.state);
 	WRITE_NL(); WRITE_INT(*layout, image_overlay.histogram_channel);
 	WRITE_NL(); WRITE_INT(*layout, image_overlay.histogram_mode);
+
+	WRITE_NL(); WRITE_INT(*layout, log_window.x);
+	WRITE_NL(); WRITE_INT(*layout, log_window.y);
+	WRITE_NL(); WRITE_INT(*layout, log_window.w);
+	WRITE_NL(); WRITE_INT(*layout, log_window.h);
+	WRITE_SEPARATOR();
+
+	WRITE_NL(); WRITE_BOOL(*layout, animate);
 }
 
 
@@ -2335,6 +2522,8 @@
 		if (READ_INT(*layout, main_window.hdivider_pos)) continue;
 		if (READ_INT(*layout, main_window.vdivider_pos)) continue;
 
+		if (READ_INT_CLAMP(*layout, folder_window.vdivider_pos, 1, 1000)) continue;
+
 		if (READ_INT(*layout, float_window.x)) continue;
 		if (READ_INT(*layout, float_window.y)) continue;
 		if (READ_INT(*layout, float_window.w)) continue;
@@ -2353,6 +2542,13 @@
 		if (READ_INT(*layout, image_overlay.histogram_channel)) continue;
 		if (READ_INT(*layout, image_overlay.histogram_mode)) continue;
 
+		if (READ_INT(*layout, log_window.x)) continue;
+		if (READ_INT(*layout, log_window.y)) continue;
+		if (READ_INT(*layout, log_window.w)) continue;
+		if (READ_INT(*layout, log_window.h)) continue;
+
+		if (READ_BOOL(*layout, animate)) continue;
+
 		log_printf("unknown attribute %s = %s\n", option, value);
 		}
 	if (id && strcmp(id, LAYOUT_ID_CURRENT) != 0)
@@ -2435,7 +2631,7 @@
 
 	if (use_commandline && command_line->startup_full_screen) layout_image_full_screen_start(lw);
 	if (use_commandline && command_line->startup_in_slideshow) layout_image_slideshow_start(lw);
-
+	if (use_commandline && command_line->log_window_show) log_window_new(lw);
 
 	g_free(path);
 	free_layout_options_content(&lop);
--- a/src/layout_image.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/layout_image.c	Sat Jul 08 10:32:34 2017 +0100
@@ -26,6 +26,7 @@
 #include "color-man.h"
 #include "dnd.h"
 #include "editors.h"
+#include "exif.h"
 #include "filedata.h"
 #include "fullscreen.h"
 #include "image.h"
@@ -34,6 +35,7 @@
 #include "layout.h"
 #include "layout_util.h"
 #include "menu.h"
+#include "metadata.h"
 #include "misc.h"
 #include "pixbuf_util.h"
 #include "pixbuf-renderer.h"
@@ -46,6 +48,7 @@
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
+#define FILE_COLUMN_POINTER 0
 
 static GtkWidget *layout_image_pop_menu(LayoutWindow *lw);
 static void layout_image_set_buttons(LayoutWindow *lw);
@@ -406,11 +409,17 @@
 	return TRUE;
 }
 
-static void layout_image_animate_toggle(LayoutWindow *lw)
+void layout_image_animate_toggle(LayoutWindow *lw)
 {
+	GtkAction *action;
+
 	if (!lw) return;
 
 	lw->options.animate = !lw->options.animate;
+
+	action = gtk_action_group_get_action(lw->action_group, "Animate");
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.animate);
+
 	layout_image_animate_new_file(lw);
 }
 
@@ -476,7 +485,7 @@
 	lw = submenu_item_get_data(widget);
 	type = (AlterType)GPOINTER_TO_INT(data);
 
-	image_alter_orientation(lw->image, type);
+	image_alter_orientation(lw->image, lw->image->image_fd, type);
 }
 
 static void li_pop_menu_new_cb(GtkWidget *widget, gpointer data)
@@ -659,8 +668,9 @@
 	submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, editmenu_fd_list);
 	if (!path) gtk_widget_set_sensitive(item, FALSE);
 	menu_item_add_divider(submenu);
+#if !GTK_CHECK_VERSION(3,0,0)
 	menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw);
-
+#endif
 	item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw);
 
 	item = menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(li_pop_menu_new_cb), lw);
@@ -998,12 +1008,12 @@
 		{
 		image_zoom_adjust_at_point(lw->full_screen->imd, increment, x, y);
 		}
-
-	if (!connect_zoom) return;
+	if (!connect_zoom && !lw->split_mode) return;
 
 	for (i = 0; i < MAX_SPLIT_IMAGES; i++)
 		{
-		if (lw->split_images[i] && lw->split_images[i] != lw->image)
+		if (lw->split_images[i] && lw->split_images[i] != lw->image &&
+						lw->split_images[i]->mouse_wheel_mode)
 			image_zoom_adjust_at_point(lw->split_images[i], increment, x, y);
 		}
 }
@@ -1054,7 +1064,117 @@
 {
 	if (!layout_valid(&lw)) return;
 
-	image_alter_orientation(lw->image, type);
+	GtkTreeModel *store;
+	GList *work;
+	GtkTreeSelection *selection;
+	GtkTreePath *tpath;
+	FileData *fd_n;
+	GtkTreeIter iter;
+
+	if (!lw || !lw->vf) return;
+
+	if (lw->vf->type == FILEVIEW_ICON)
+		{
+		if (!VFICON(lw->vf)->selection) return;
+		work = VFICON(lw->vf)->selection;
+		}
+	else
+		{
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(lw->vf->listview));
+		work = gtk_tree_selection_get_selected_rows(selection, &store);
+		}
+
+	while (work)
+		{
+		if (lw->vf->type == FILEVIEW_ICON)
+			{
+			fd_n = work->data;
+			work = work->next;
+			}
+		else
+			{
+			tpath = work->data;
+			gtk_tree_model_get_iter(store, &iter, tpath);
+			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1);
+			work = work->next;
+			}
+
+		image_alter_orientation(lw->image, fd_n, type);
+		}
+}
+
+static void image_alter_rating(FileData *fd_n, const gchar *rating)
+{
+	metadata_write_string(fd_n, RATING_KEY, rating);
+}
+
+void layout_image_rating(LayoutWindow *lw, const gchar *rating)
+{
+	if (!layout_valid(&lw)) return;
+
+	GtkTreeModel *store;
+	GList *work;
+	GtkTreeSelection *selection;
+	GtkTreePath *tpath;
+	FileData *fd_n;
+	GtkTreeIter iter;
+
+	if (!lw || !lw->vf) return;
+
+	if (lw->vf->type == FILEVIEW_ICON)
+		{
+		if (!VFICON(lw->vf)->selection) return;
+		work = VFICON(lw->vf)->selection;
+		}
+	else
+		{
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(lw->vf->listview));
+		work = gtk_tree_selection_get_selected_rows(selection, &store);
+		}
+
+	while (work)
+		{
+		if (lw->vf->type == FILEVIEW_ICON)
+			{
+			fd_n = work->data;
+			work = work->next;
+			}
+		else
+			{
+			tpath = work->data;
+			gtk_tree_model_get_iter(store, &iter, tpath);
+			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1);
+			work = work->next;
+			}
+
+		image_alter_rating(fd_n, rating);
+		}
+}
+
+void layout_image_reset_orientation(LayoutWindow *lw)
+{
+	ImageWindow *imd= lw->image;
+
+	if (!layout_valid(&lw)) return;
+	if (!imd || !imd->pr || !imd->image_fd) return;
+
+	if (imd->orientation < 1 || imd->orientation > 8) imd->orientation = 1;
+
+	if (options->image.exif_rotate_enable)
+		{
+		imd->orientation = metadata_read_int(imd->image_fd, ORIENTATION_KEY, EXIF_ORIENTATION_TOP_LEFT);
+		}
+	else
+		{
+		imd->orientation = 1;
+		}
+
+	if (imd->image_fd->user_orientation != 0)
+		{
+		 imd->orientation = imd->image_fd->user_orientation;
+		}
+
+	pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation);
 }
 
 void layout_image_set_desaturate(LayoutWindow *lw, gboolean desaturate)
@@ -1566,6 +1686,11 @@
 	switch (event->button)
 		{
 		case MOUSE_BUTTON_LEFT:
+			if (event->type == GDK_2BUTTON_PRESS)
+				{
+				if (lw->full_screen)
+					layout_image_full_screen_stop(lw);
+				}
 			if (options->image_lm_click_nav && lw->split_mode == SPLIT_NONE)
 				layout_image_next(lw);
 			break;
@@ -1599,7 +1724,8 @@
 		}
 
 
-	if (event->state & GDK_CONTROL_MASK)
+	if ((event->state & GDK_CONTROL_MASK) ||
+				(imd->mouse_wheel_mode && !options->image_lm_click_nav))
 		{
 		switch (event->direction)
 			{
@@ -1649,7 +1775,7 @@
 		}
 }
 
-static void layout_image_drag_cb(ImageWindow *imd, GdkEventButton *event, gdouble dx, gdouble dy, gpointer data)
+static void layout_image_drag_cb(ImageWindow *imd, GdkEventMotion *event, gdouble dx, gdouble dy, gpointer data)
 {
 	gint i;
 	LayoutWindow *lw = data;
@@ -1720,7 +1846,7 @@
 
 }
 
-static void layout_image_drag_inactive_cb(ImageWindow *imd, GdkEventButton *event, gdouble dx, gdouble dy, gpointer data)
+static void layout_image_drag_inactive_cb(ImageWindow *imd, GdkEventMotion *event, gdouble dx, gdouble dy, gpointer data)
 {
 	LayoutWindow *lw = data;
 	gint i = image_idx(lw, imd);
@@ -1926,16 +2052,19 @@
 				GList *work = g_list_last(layout_selection_list(lw));
 				gint j = 0;
 
-				if (work) work = work->prev;
-
 				while (work && j < i)
 					{
 					FileData *fd = work->data;
 					work = work->prev;
 
+					if (!fd || !*fd->path || fd->parent ||
+										fd == lw->split_images[0]->image_fd)
+						{
+						continue;
+						}
+					img_fd = fd;
+
 					j++;
-					if (!fd || !*fd->path) continue;
-					img_fd = fd;
 					}
 				}
 
--- a/src/layout_image.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/layout_image.h	Sat Jul 08 10:32:34 2017 +0100
@@ -64,6 +64,8 @@
 void layout_image_set_desaturate(LayoutWindow *lw, gboolean desaturate);
 gboolean layout_image_get_desaturate(LayoutWindow *lw);
 
+void layout_image_rating(LayoutWindow *lw, const gchar *rating);
+
 /*
 gint layout_image_stereo_get(LayoutWindow *lw);
 void layout_image_stereo_set(LayoutWindow *lw, gint stereo_mode);
@@ -95,10 +97,11 @@
 gboolean layout_image_slideshow_pause_toggle(LayoutWindow *lw);
 gboolean layout_image_slideshow_paused(LayoutWindow *lw);
 
+void layout_image_animate_toggle(LayoutWindow *lw);
 
 void layout_image_overlay_toggle(LayoutWindow *lw);
 
 void layout_image_notify_cb(FileData *fd, NotifyType type, gpointer data);
-
+void layout_image_reset_orientation(LayoutWindow *lw);
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/layout_util.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/layout_util.c	Sat Jul 08 10:32:34 2017 +0100
@@ -51,6 +51,7 @@
 #include "ui_tabcomp.h"
 #include "utilops.h"
 #include "view_dir.h"
+#include "view_file.h"
 #include "window.h"
 #include "metadata.h"
 #include "desktop_file.h"
@@ -59,9 +60,11 @@
 #include "keymap_template.c"
 
 #define MENU_EDIT_ACTION_OFFSET 16
+#define FILE_COLUMN_POINTER 0
 
 static gboolean layout_bar_enabled(LayoutWindow *lw);
 static gboolean layout_bar_sort_enabled(LayoutWindow *lw);
+static void layout_bars_hide_toggle(LayoutWindow *lw);
 static void layout_util_sync_views(LayoutWindow *lw);
 
 /*
@@ -248,7 +251,7 @@
 	LayoutWindow *lw = data;
 
 	layout_exit_fullscreen(lw);
-	dupe_window_new(DUPE_MATCH_NAME);
+	dupe_window_new();
 }
 
 static void layout_menu_pan_cb(GtkAction *action, gpointer data)
@@ -308,6 +311,16 @@
 	file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
 }
 
+static void layout_menu_delete_key_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	if (options->file_ops.enable_delete_key)
+		{
+		file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
+		}
+}
+
 static void layout_menu_disable_grouping_cb(GtkAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -342,6 +355,55 @@
 	layout_image_alter_orientation(lw, ALTER_ROTATE_90);
 }
 
+static void layout_menu_rating_0_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_rating(lw, "0");
+}
+
+static void layout_menu_rating_1_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_rating(lw, "1");
+}
+
+static void layout_menu_rating_2_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_rating(lw, "2");
+}
+
+static void layout_menu_rating_3_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_rating(lw, "3");
+}
+
+static void layout_menu_rating_4_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_rating(lw, "4");
+}
+
+static void layout_menu_rating_5_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_rating(lw, "5");
+}
+
+static void layout_menu_rating_m1_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_rating(lw, "-1");
+}
+
 static void layout_menu_alter_90cc_cb(GtkAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -384,6 +446,107 @@
 	layout_image_alter_orientation(lw, ALTER_NONE);
 }
 
+static void layout_menu_exif_rotate_cb(GtkToggleAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	options->image.exif_rotate_enable = gtk_toggle_action_get_active(action);
+	layout_image_reset_orientation(lw);
+}
+
+static void layout_menu_write_rotate(GtkToggleAction *action, gpointer data, gboolean keep_date)
+{
+	LayoutWindow *lw = data;
+	GtkTreeModel *store;
+	GList *work;
+	GtkTreeSelection *selection;
+	GtkTreePath *tpath;
+	FileData *fd_n;
+	GtkTreeIter iter;
+	gchar *rotation;
+	gchar *command;
+	gint run_result;
+	GenericDialog *gd;
+	GString *message;
+
+	if (!layout_valid(&lw)) return;
+
+	if (!lw || !lw->vf) return;
+
+	if (lw->vf->type == FILEVIEW_ICON)
+		{
+		if (!VFICON(lw->vf)->selection) return;
+		work = VFICON(lw->vf)->selection;
+		}
+	else
+		{
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(lw->vf->listview));
+		work = gtk_tree_selection_get_selected_rows(selection, &store);
+		}
+
+	while (work)
+		{
+		if (lw->vf->type == FILEVIEW_ICON)
+			{
+			fd_n = work->data;
+			work = work->next;
+			}
+		else
+			{
+			tpath = work->data;
+			gtk_tree_model_get_iter(store, &iter, tpath);
+			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1);
+			work = work->next;
+			}
+
+		rotation = g_strdup_printf("%d", fd_n->user_orientation);
+		command = g_strconcat(GQ_BIN_DIR, "/geeqie-rotate -r ", rotation,
+													keep_date ? " -t " : " ", fd_n->path, NULL);
+
+		run_result = WEXITSTATUS(runcmd(command));
+		if (!run_result)
+			{
+			fd_n->user_orientation = 0;
+			}
+		else
+			{
+			message = g_string_new("");
+			message = g_string_append(message, _("Operation failed:\n"));
+
+			if (run_result == 3)
+				message = g_string_append(message, _("Cannot create tmp file"));
+			else
+				{
+				message = g_string_append(message, _("File: "));
+				message = g_string_append(message, fd_n->name);
+				}
+
+			gd = generic_dialog_new(_("Image orientation"),
+			"Image orientation", NULL, TRUE, NULL, NULL);
+			generic_dialog_add_message(gd, GTK_STOCK_DIALOG_ERROR,
+			"Image orientation", message->str);
+			generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, NULL, TRUE);
+
+			gtk_widget_show(gd->dialog);
+
+			g_string_free(message, TRUE);
+			}
+
+		g_free(rotation);
+		g_free(command);
+		}
+}
+
+static void layout_menu_write_rotate_keep_date_cb(GtkToggleAction *action, gpointer data)
+{
+	layout_menu_write_rotate(action, data, TRUE);
+}
+
+static void layout_menu_write_rotate_cb(GtkToggleAction *action, gpointer data)
+{
+	layout_menu_write_rotate(action, data, FALSE);
+}
+
 static void layout_menu_config_cb(GtkAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -619,12 +782,20 @@
 	layout_views_set(lw, lw->options.dir_view_type, (FileViewType) gtk_radio_action_get_current_value(action));
 }
 
-static void layout_menu_view_dir_as_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
+static void layout_menu_view_dir_as_cb(GtkToggleAction *action,  gpointer data)
 {
 	LayoutWindow *lw = data;
 
 	layout_exit_fullscreen(lw);
-	layout_views_set(lw, (DirViewType) gtk_radio_action_get_current_value(action), lw->options.file_view_type);
+
+	if (gtk_toggle_action_get_active(action))
+		{
+		layout_views_set(lw, DIRVIEW_TREE, lw->options.file_view_type);
+		}
+	else
+		{
+		layout_views_set(lw, DIRVIEW_LIST, lw->options.file_view_type);
+		}
 }
 
 static void layout_menu_view_in_new_window_cb(GtkAction *action, gpointer data)
@@ -695,6 +866,21 @@
 		}
 }
 
+static void layout_menu_animate_cb(GtkToggleAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	if (lw->options.animate == gtk_toggle_action_get_active(action)) return;
+	layout_image_animate_toggle(lw);
+}
+
+static void layout_menu_rectangular_selection_cb(GtkToggleAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	options->collections.rectangular_selection = gtk_toggle_action_get_active(action);
+}
+
 static void layout_menu_histogram_toggle_channel_cb(GtkAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -809,6 +995,13 @@
 	layout_bar_sort_toggle(lw);
 }
 
+static void layout_menu_hide_bars_cb(GtkToggleAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_bars_hide_toggle(lw);
+}
+
 static void layout_menu_slideshow_cb(GtkToggleAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -1049,7 +1242,7 @@
 	LayoutWindow *lw = data;
 
 	layout_exit_fullscreen(lw);
-	log_window_new();
+	log_window_new(lw);
 }
 
 
@@ -1186,6 +1379,64 @@
 	layout_image_next(lw);
 }
 
+static void layout_menu_split_pane_next_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+	gint active_frame;
+
+	active_frame = lw->active_split_image;
+
+	if (active_frame < MAX_SPLIT_IMAGES-1 && lw->split_images[active_frame+1] )
+		{
+		active_frame++;
+		}
+	else
+		{
+		active_frame = 0;
+		}
+	layout_image_activate(lw, active_frame, FALSE);
+}
+
+static void layout_menu_split_pane_prev_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+	gint active_frame;
+
+	active_frame = lw->active_split_image;
+
+	if (active_frame >=1 && lw->split_images[active_frame-1] )
+		{
+		active_frame--;
+		}
+	else
+		{
+		active_frame = MAX_SPLIT_IMAGES-1;
+		while (!lw->split_images[active_frame])
+			{
+			active_frame--;
+			}
+		}
+	layout_image_activate(lw, active_frame, FALSE);
+}
+
+static void layout_menu_split_pane_updown_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+	gint active_frame;
+
+	active_frame = lw->active_split_image;
+
+	if (lw->split_images[MAX_SPLIT_IMAGES-1] )
+		{
+		active_frame = active_frame ^ 2;
+		}
+	else
+		{
+		active_frame = active_frame ^ 1;
+		}
+	layout_image_activate(lw, active_frame, FALSE);
+}
+
 static void layout_menu_image_last_cb(GtkAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -1443,6 +1694,7 @@
   { "EditMenu",		NULL,			N_("_Edit"),				NULL,			NULL,					NULL },
   { "SelectMenu",	NULL,			N_("_Select"),				NULL,			NULL,					NULL },
   { "OrientationMenu",	NULL,			N_("_Orientation"),			NULL,			NULL,					NULL },
+  { "RatingMenu",	NULL,			N_("_Rating"),					NULL,			NULL,					NULL },
   { "ExternalMenu",	NULL,			N_("E_xternal Editors"),		NULL,			NULL,					NULL },
   { "PreferencesMenu",	NULL,			N_("P_references"),			NULL,			NULL,					NULL },
   { "ViewMenu",		NULL,			N_("_View"),				NULL,			NULL,					NULL },
@@ -1480,14 +1732,21 @@
   { "Move",		NULL,			N_("_Move..."),				"<control>M",		N_("Move..."),				CB(layout_menu_move_cb) },
   { "Rename",		NULL,			N_("_Rename..."),			"<control>R",		N_("Rename..."),			CB(layout_menu_rename_cb) },
   { "Delete",		GTK_STOCK_DELETE,	N_("_Delete..."),			"<control>D",		N_("Delete..."),			CB(layout_menu_delete_cb) },
-  { "DeleteAlt1",	GTK_STOCK_DELETE,	N_("_Delete..."),			"Delete",		N_("Delete..."),			CB(layout_menu_delete_cb) },
-  { "DeleteAlt2",	GTK_STOCK_DELETE,	N_("_Delete..."),			"KP_Delete",		N_("Delete..."),			CB(layout_menu_delete_cb) },
+  { "DeleteAlt1",	GTK_STOCK_DELETE,	N_("_Delete..."),			"Delete",		N_("Delete..."),			CB(layout_menu_delete_key_cb) },
+  { "DeleteAlt2",	GTK_STOCK_DELETE,	N_("_Delete..."),			"KP_Delete",		N_("Delete..."),			CB(layout_menu_delete_key_cb) },
   { "EnableGrouping",	NULL,			N_("Enable file _grouping"),		NULL,			N_("Enable file grouping"),		CB(layout_menu_enable_grouping_cb) },
   { "DisableGrouping",	NULL,			N_("Disable file groupi_ng"),		NULL,			N_("Disable file grouping"),		CB(layout_menu_disable_grouping_cb) },
   { "CopyPath",		NULL,			N_("_Copy path to clipboard"),		NULL,			N_("Copy path to clipboard"),		CB(layout_menu_copy_path_cb) },
   { "CloseWindow",	GTK_STOCK_CLOSE,	N_("C_lose window"),			"<control>W",		N_("Close window"),			CB(layout_menu_close_cb) },
   { "Quit",		GTK_STOCK_QUIT, 	N_("_Quit"),				"<control>Q",		N_("Quit"),				CB(layout_menu_exit_cb) },
   { "RotateCW",		NULL,			N_("_Rotate clockwise"),		"bracketright",		N_("Rotate clockwise"),			CB(layout_menu_alter_90_cb) },
+  { "Rating0",		NULL,			N_("_Rating 0"),	"<alt>KP_0",	N_("Rating 0"),			CB(layout_menu_rating_0_cb) },
+  { "Rating1",		NULL,			N_("_Rating 1"),	"<alt>KP_1",	N_("Rating 1"),			CB(layout_menu_rating_1_cb) },
+  { "Rating2",		NULL,			N_("_Rating 2"),	"<alt>KP_2",	N_("Rating 2"),			CB(layout_menu_rating_2_cb) },
+  { "Rating3",		NULL,			N_("_Rating 3"),	"<alt>KP_3",	N_("Rating 3"),			CB(layout_menu_rating_3_cb) },
+  { "Rating4",		NULL,			N_("_Rating 4"),	"<alt>KP_4",	N_("Rating 4"),			CB(layout_menu_rating_4_cb) },
+  { "Rating5",		NULL,			N_("_Rating 5"),	"<alt>KP_5",	N_("Rating 5"),			CB(layout_menu_rating_5_cb) },
+  { "RatingM1",		NULL,			N_("_Rating -1"),	"<alt>KP_Subtract",	N_("Rating -1"),	CB(layout_menu_rating_m1_cb) },
   { "RotateCCW",	NULL,			N_("Rotate _counterclockwise"),		"bracketleft",		N_("Rotate counterclockwise"),		CB(layout_menu_alter_90cc_cb) },
   { "Rotate180",	NULL,			N_("Rotate 1_80"),			"<shift>R",		N_("Rotate 180"),			CB(layout_menu_alter_180_cb) },
   { "Mirror",		NULL,			N_("_Mirror"),				"<shift>M",		N_("Mirror"),				CB(layout_menu_alter_mirror_cb) },
@@ -1554,6 +1813,12 @@
   { "LogWindow",	NULL,			N_("_Log Window"),			NULL,			N_("Log Window"),			CB(layout_menu_log_window_cb) },
   { "ExifWin",		NULL,			N_("_Exif window"),			"<control>E",		N_("Exif window"),			CB(layout_menu_bar_exif_cb) },
   { "StereoCycle",	NULL,			N_("_Cycle through stereo modes"),	NULL,			N_("Cycle through stereo modes"),	CB(layout_menu_stereo_mode_next_cb) },
+  { "SplitNextPane",	NULL,			N_("_Next Pane"),	"<alt>Right",			N_("Next Pane"),	CB(layout_menu_split_pane_next_cb) },
+  { "SplitPreviousPane",	NULL,			N_("_Previous Pane"),	"<alt>Left",			N_("Previous Pane"),	CB(layout_menu_split_pane_prev_cb) },
+  { "SplitUpPane",	NULL,			N_("_Up Pane"),	"<alt>Up",			N_("Up Pane"),	CB(layout_menu_split_pane_updown_cb) },
+  { "SplitDownPane",	NULL,			N_("_Down Pane"),	"<alt>Down",			N_("Down Pane"),	CB(layout_menu_split_pane_updown_cb) },
+  { "WriteRotation",	NULL,			N_("_Write orientation to file"),  		NULL,		N_("Write orientation to file"),			CB(layout_menu_write_rotate_cb) },
+  { "WriteRotationKeepDate",	NULL,			N_("_Write orientation to file (preserve timestamp)"),  		NULL,		N_("Write orientation to file (preserve timestamp)"),			CB(layout_menu_write_rotate_keep_date_cb) },
 
 };
 
@@ -1565,12 +1830,16 @@
   { "HideToolbar",	NULL,			N_("Hide tool_bar"),			NULL,			N_("Hide toolbar"),			CB(layout_menu_toolbar_cb),	 FALSE  },
   { "SBar",		NULL,			N_("_Info sidebar"),			"<control>K",		N_("Info sidebar"),			CB(layout_menu_bar_cb),		 FALSE  },
   { "SBarSort",		NULL,			N_("Sort _manager"),			"<shift>S",		N_("Sort manager"),			CB(layout_menu_bar_sort_cb),	 FALSE  },
+  { "HideBars",		NULL,			N_("Hide Bars"),			"grave",		N_("Hide Bars"),			CB(layout_menu_hide_bars_cb),	 FALSE  },
   { "SlideShow",	GTK_STOCK_MEDIA_PLAY,	N_("Toggle _slideshow"),		"S",			N_("Toggle slideshow"),			CB(layout_menu_slideshow_cb),	 FALSE  },
   { "UseColorProfiles",	GTK_STOCK_SELECT_COLOR,	N_("Use _color profiles"), 		NULL,			N_("Use color profiles"), 		CB(layout_color_menu_enable_cb), FALSE},
   { "UseImageProfile",	NULL,			N_("Use profile from _image"),		NULL,			N_("Use profile from image"),		CB(layout_color_menu_use_image_cb), FALSE},
   { "Grayscale",	NULL,			N_("Toggle _grayscale"),		"<shift>G",		N_("Toggle grayscale"),			CB(layout_menu_alter_desaturate_cb), FALSE},
   { "ImageOverlay",	NULL,			N_("Image _Overlay"),			NULL,			N_("Image Overlay"),			CB(layout_menu_overlay_cb),	 FALSE },
   { "ImageHistogram",	NULL,			N_("_Show Histogram"),			NULL,			N_("Show Histogram"),			CB(layout_menu_histogram_cb),	 FALSE },
+  { "RectangularSelection",	NULL,			N_("Rectangular Selection"),			"<alt>R",			N_("Rectangular Selection"),			CB(layout_menu_rectangular_selection_cb),	 FALSE },
+  { "Animate",	NULL,	N_("GIF _animation"),		"A",			N_("Toggle GIF animation"),			CB(layout_menu_animate_cb),	 FALSE  },
+  { "ExifRotate",	GTK_STOCK_ORIENTATION_PORTRAIT,			N_("_Exif rotate"),  		"<alt>X",		N_("Exif rotate"),			CB(layout_menu_exif_rotate_cb), FALSE },
 };
 
 static GtkRadioActionEntry menu_radio_entries[] = {
@@ -1578,9 +1847,8 @@
   { "ViewIcons",	NULL,			N_("I_cons"),				"<control>I",		N_("View Images as Icons"),		FILEVIEW_ICON }
 };
 
-static GtkRadioActionEntry menu_view_dir_radio_entries[] = {
-  { "FolderList",	NULL,			N_("Folder Li_st"),			"<meta>L",		N_("View Folders as List"), 		DIRVIEW_LIST },
-  { "FolderTree",	NULL,			N_("Folder T_ree"),			"<control>T",		N_("View Folders as Tree"), 		DIRVIEW_TREE },
+static GtkToggleActionEntry menu_view_dir_toggle_entries[] = {
+  { "FolderTree",	NULL,			N_("T_oggle Folder View"),			"<control>T",		N_("Toggle Folders View"), 		CB(layout_menu_view_dir_as_cb),FALSE },
 };
 
 static GtkRadioActionEntry menu_split_radio_entries[] = {
@@ -1666,6 +1934,7 @@
 "      <menuitem action='SelectAll'/>"
 "      <menuitem action='SelectNone'/>"
 "      <menuitem action='SelectInvert'/>"
+"      <menuitem action='RectangularSelection'/>"
 "      <placeholder name='SelectSection'/>"
 "      <separator/>"
 "      <menuitem action='CopyPath'/>"
@@ -1687,6 +1956,22 @@
 "        <menuitem action='Mirror'/>"
 "        <menuitem action='Flip'/>"
 "        <menuitem action='AlterNone'/>"
+"        <separator/>"
+"        <menuitem action='ExifRotate'/>"
+"        <separator/>"
+"        <menuitem action='WriteRotation'/>"
+"        <menuitem action='WriteRotationKeepDate'/>"
+"        <separator/>"
+"      </menu>"
+"      <menu action='RatingMenu'>"
+"        <menuitem action='Rating0'/>"
+"        <menuitem action='Rating1'/>"
+"        <menuitem action='Rating2'/>"
+"        <menuitem action='Rating3'/>"
+"        <menuitem action='Rating4'/>"
+"        <menuitem action='Rating5'/>"
+"        <menuitem action='RatingM1'/>"
+"        <separator/>"
 "      </menu>"
 "      <menuitem action='SaveMetadata'/>"
 "      <placeholder name='PropertiesSection'/>"
@@ -1699,7 +1984,9 @@
 "      </menu>"
 "      <placeholder name='PreferencesSection'/>"
 "      <separator/>"
+#if !GTK_CHECK_VERSION(3,0,0)
 "      <menuitem action='Wallpaper'/>"
+#endif
 "      <separator/>"
 "    </menu>"
 "    <menu action='ViewMenu'>"
@@ -1709,7 +1996,6 @@
 "      <placeholder name='WindowSection'/>"
 "      <separator/>"
 "      <menu action='FileDirMenu'>"
-"        <menuitem action='FolderList'/>"
 "        <menuitem action='FolderTree'/>"
 "        <placeholder name='FolderSection'/>"
 "        <separator/>"
@@ -1757,6 +2043,11 @@
 "        <menuitem action='SplitVertical'/>"
 "        <menuitem action='SplitQuad'/>"
 "        <menuitem action='SplitSingle'/>"
+"        <separator/>"
+"        <menuitem action='SplitNextPane'/>"
+"        <menuitem action='SplitPreviousPane'/>"
+"        <menuitem action='SplitUpPane'/>"
+"        <menuitem action='SplitDownPane'/>"
 "      </menu>"
 "      <menu action='StereoMenu'>"
 "        <menuitem action='StereoAuto'/>"
@@ -1799,9 +2090,11 @@
 "      <separator/>"
 "      <menuitem action='SBar'/>"
 "      <menuitem action='SBarSort'/>"
+"      <menuitem action='HideBars'/>"
 "      <menuitem action='ShowInfoPixel'/>"
 "      <placeholder name='ToolsSection'/>"
 "      <separator/>"
+"      <menuitem action='Animate'/>"
 "      <menuitem action='SlideShow'/>"
 "      <menuitem action='SlideShowPause'/>"
 "      <menuitem action='Refresh'/>"
@@ -1836,6 +2129,7 @@
 "    <toolitem action='FloatTools'/>"
 "  </toolbar>"
 "  <toolbar name='StatusBar'>"
+"    <toolitem action='ExifRotate'/>"
 "    <toolitem action='ShowInfoPixel'/>"
 "    <toolitem action='UseColorProfiles'/>"
 "    <toolitem action='SaveMetadata'/>"
@@ -2133,9 +2427,9 @@
 	gtk_action_group_add_radio_actions(lw->action_group,
 					   menu_split_radio_entries, G_N_ELEMENTS(menu_split_radio_entries),
 					   0, G_CALLBACK(layout_menu_split_cb), lw);
-	gtk_action_group_add_radio_actions(lw->action_group,
-					   menu_view_dir_radio_entries, DIRVIEW_LAST + 1 /* count */,
-					   0, G_CALLBACK(layout_menu_view_dir_as_cb), lw);
+	gtk_action_group_add_toggle_actions(lw->action_group,
+					   menu_view_dir_toggle_entries, G_N_ELEMENTS(menu_view_dir_toggle_entries),
+					    lw);
 	gtk_action_group_add_radio_actions(lw->action_group,
 					   menu_color_radio_entries, COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS,
 					   0, G_CALLBACK(layout_color_menu_input_cb), lw);
@@ -2411,11 +2705,20 @@
 	if (!lw->action_group) return;
 
 	action = gtk_action_group_get_action(lw->action_group, "FolderTree");
-	gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->options.dir_view_type);
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.dir_view_type);
 
 	action = gtk_action_group_get_action(lw->action_group, "SplitSingle");
 	gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->split_mode);
 
+	action = gtk_action_group_get_action(lw->action_group, "SplitNextPane");
+	gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE));
+	action = gtk_action_group_get_action(lw->action_group, "SplitPreviousPane");
+	gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE));
+	action = gtk_action_group_get_action(lw->action_group, "SplitUpPane");
+	gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE));
+	action = gtk_action_group_get_action(lw->action_group, "SplitDownPane");
+	gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE));
+
 	action = gtk_action_group_get_action(lw->action_group, "ViewIcons");
 	gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->options.file_view_type);
 
@@ -2440,12 +2743,21 @@
 	action = gtk_action_group_get_action(lw->action_group, "SlideShow");
 	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), layout_image_slideshow_active(lw));
 
+	action = gtk_action_group_get_action(lw->action_group, "Animate");
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.animate);
+
 	action = gtk_action_group_get_action(lw->action_group, "ImageOverlay");
 	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags != OSD_SHOW_NOTHING);
 
 	action = gtk_action_group_get_action(lw->action_group, "ImageHistogram");
 	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags & OSD_SHOW_HISTOGRAM);
 
+	action = gtk_action_group_get_action(lw->action_group, "ExifRotate");
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), options->image.exif_rotate_enable);
+
+	action = gtk_action_group_get_action(lw->action_group, "RectangularSelection");
+	gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), options->collections.rectangular_selection);
+
 	if (osd_flags & OSD_SHOW_HISTOGRAM)
 		{
 		action = gtk_action_group_get_action(lw->action_group, "HistogramChanR");
@@ -2458,6 +2770,13 @@
 	action = gtk_action_group_get_action(lw->action_group, "ConnectZoomMenu");
 	gtk_action_set_sensitive(action, lw->split_mode != SPLIT_NONE);
 
+	action = gtk_action_group_get_action(lw->action_group, "WriteRotation");
+	gtk_action_set_sensitive(action, !(runcmd("which exiftran >/dev/null") ||
+							runcmd("which mogrify >/dev/null") || options->metadata.write_orientation));
+	action = gtk_action_group_get_action(lw->action_group, "WriteRotationKeepDate");
+	gtk_action_set_sensitive(action, !(runcmd("which exiftran >/dev/null") ||
+							runcmd("which mogrify >/dev/null") || options->metadata.write_orientation));
+
 	action = gtk_action_group_get_action(lw->action_group, "StereoAuto");
 	gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), layout_image_stereo_pixbuf_get(lw));
 
@@ -2655,6 +2974,39 @@
 	layout_util_sync_views(lw);
 }
 
+static void layout_bars_hide_toggle(LayoutWindow *lw)
+{
+	if (lw->options.bars_state.hidden)
+		{
+		lw->options.bars_state.hidden = FALSE;
+		if (lw->options.bars_state.sort)
+			{
+			gtk_widget_show(lw->bar_sort);
+			}
+		if (lw->options.bars_state.info)
+			{
+			gtk_widget_show(lw->bar);
+			}
+		layout_tools_float_set(lw, lw->options.tools_float,
+									lw->options.bars_state.tools_hidden);
+		}
+	else
+		{
+		lw->options.bars_state.hidden = TRUE;
+		lw->options.bars_state.sort = layout_bar_sort_enabled(lw);
+		lw->options.bars_state.info = layout_bar_enabled(lw);
+		lw->options.bars_state.tools_float = lw->options.tools_float;
+		lw->options.bars_state.tools_hidden = lw->options.tools_hidden;
+
+		gtk_widget_hide(lw->bar);
+		if (lw->bar_sort)
+			gtk_widget_hide(lw->bar_sort);
+		layout_tools_float_set(lw, lw->options.tools_float, TRUE);
+		}
+
+	layout_util_sync_views(lw);
+}
+
 void layout_bars_new_image(LayoutWindow *lw)
 {
 	layout_bar_new_image(lw);
--- a/src/logwindow.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/logwindow.c	Sat Jul 08 10:32:34 2017 +0100
@@ -22,6 +22,8 @@
 #include "logwindow.h"
 
 #include "misc.h"
+#include "secure_save.h"
+#include "ui_misc.h"
 #include "window.h"
 
 #include <gdk/gdkkeysyms.h>
@@ -38,6 +40,11 @@
 	GdkColor colors[LOG_COUNT];
 
 	guint lines;
+	GtkWidget *regexp_box;
+	GtkWidget *bar;
+	GtkWidget *pause;
+	GtkWidget *wrap;
+	GtkWidget *debug_level;
 };
 
 typedef struct _LogDef LogDef;
@@ -70,7 +77,43 @@
 	return FALSE;
 }
 
-static LogWindow *log_window_create(void)
+
+static void log_window_pause_cb(GtkWidget *widget, gpointer data)
+{
+	options->log_window.paused = !options->log_window.paused;
+}
+
+static void log_window_line_wrap_cb(GtkWidget *widget, gpointer data)
+{
+	LogWindow *logwin = data;
+
+	options->log_window.line_wrap = !options->log_window.line_wrap;
+
+	if (options->log_window.line_wrap)
+		{
+		gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(logwin->text), GTK_WRAP_WORD);
+		}
+	else
+		{
+		gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(logwin->text), GTK_WRAP_NONE);
+		}
+}
+
+static void log_window_regexp_cb(GtkWidget *text_entry, gpointer data)
+{
+	gchar *new_regexp;
+
+	new_regexp = g_strdup(gtk_entry_get_text(GTK_ENTRY(text_entry)));
+	set_regexp(new_regexp);
+	g_free(new_regexp);
+}
+
+static void log_window_debug_spin_cb(GtkSpinButton *debug_level, gpointer data)
+{
+	set_debug_level(gtk_spin_button_get_value(debug_level));
+}
+
+static LogWindow *log_window_create(LayoutWindow *lw)
 {
 	LogWindow *logwin;
 	GtkWidget *window;
@@ -78,11 +121,21 @@
 	GtkWidget *text;
 	GtkTextBuffer *buffer;
 	GtkTextIter iter;
+	GtkWidget *button;
+	GtkWidget *win_vbox;
+	GtkWidget *textbox;
+	GtkWidget *hbox;
 
 	logwin = g_new0(LogWindow, 1);
 
 	window = window_new(GTK_WINDOW_TOPLEVEL, "log", NULL, NULL, _("Log"));
-	gtk_widget_set_size_request(window, 520, 400);
+	win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
+	gtk_container_add(GTK_CONTAINER(window), win_vbox);
+	gtk_widget_show(win_vbox);
+
+	gtk_widget_set_size_request(window, lw->options.log_window.w, lw->options.log_window.h);
+	gtk_window_move(GTK_WINDOW(window), lw->options.log_window.x, lw->options.log_window.y);
+
 	g_signal_connect(G_OBJECT(window), "delete_event",
 			 G_CALLBACK(gtk_widget_hide_on_delete), NULL);
 	g_signal_connect(G_OBJECT(window), "key_press_event",
@@ -96,9 +149,31 @@
 				       GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
 	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
 					    GTK_SHADOW_IN);
-	gtk_container_add(GTK_CONTAINER(window), scrolledwin);
+
+	gtk_container_add(GTK_CONTAINER(win_vbox), scrolledwin);
 	gtk_widget_show(scrolledwin);
 
+	hbox = pref_box_new(win_vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+	gtk_widget_show(hbox);
+	logwin->debug_level = pref_spin_new_mnemonic(hbox, _("Debug level:"), NULL,
+			  0, 4, 1, 1, get_debug_level(),G_CALLBACK(log_window_debug_spin_cb),
+			  logwin->debug_level );
+
+	logwin->pause = pref_button_new(hbox, NULL, "Pause", FALSE,
+					   G_CALLBACK(log_window_pause_cb), NULL);
+
+	logwin->wrap = pref_button_new(hbox, NULL, "Line wrap", FALSE,
+					   G_CALLBACK(log_window_line_wrap_cb), logwin);
+
+	pref_label_new(hbox, "Filter regexp");
+
+	textbox = gtk_entry_new();
+	gtk_container_add(GTK_CONTAINER(hbox), textbox);
+	gtk_widget_show(textbox);
+	g_signal_connect(G_OBJECT(textbox), "activate",
+			 G_CALLBACK(log_window_regexp_cb), logwin);
+
 	text = gtk_text_view_new();
 	gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
 	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
@@ -112,7 +187,8 @@
 	logwin->scrolledwin = scrolledwin;
 	logwin->text = text;
 	logwin->lines = 1;
-
+	logwin->regexp_box = textbox;
+	lw->log_window = logwin->window;
 	return logwin;
 }
 
@@ -168,6 +244,7 @@
 	GtkTextView *text = GTK_TEXT_VIEW(logwin->text);
 	GtkTextBuffer *buffer;
 	GtkTextMark *mark;
+	gchar *regexp;
 
 	g_assert(logwin != NULL);
 
@@ -178,15 +255,22 @@
 	gtk_window_present(GTK_WINDOW(logwin->window));
 
 	log_window_append("", LOG_NORMAL); // to flush memorized lines
+
+	regexp = g_strdup(get_regexp());
+	if (regexp != NULL)
+		{
+		gtk_entry_set_text(GTK_ENTRY(logwin->regexp_box), regexp);
+		g_free(regexp);
+		}
 }
 
-void log_window_new(void)
+void log_window_new(LayoutWindow *lw)
 {
 	if (logwindow == NULL)
 		{
 		LogWindow *logwin;
 
-		logwin = log_window_create();
+		logwin = log_window_create(lw);
 		log_window_init(logwin);
 		logwindow = logwin;
 		}
@@ -220,7 +304,6 @@
 	GtkTextView *text;
 	GtkTextBuffer *buffer;
 	GtkTextIter iter;
-	guint line_limit = 1000; //FIXME: option
 	static GList *memory = NULL;
 
 	if (logwindow == NULL)
@@ -233,7 +316,7 @@
 
 			memory = g_list_prepend(memory, msg);
 
-			while (g_list_length(memory) >= line_limit)
+			while (g_list_length(memory) >= options->log_window_lines)
 				{
 				GList *work = g_list_last(memory);
 				LogMsg *oldest_msg = work->data;
@@ -248,13 +331,13 @@
 	text = GTK_TEXT_VIEW(logwindow->text);
 	buffer = gtk_text_view_get_buffer(text);
 
-	if (line_limit > 0 && logwindow->lines >= line_limit)
+	if (options->log_window_lines > 0 && logwindow->lines >= options->log_window_lines)
 		{
 		GtkTextIter start, end;
 
 		gtk_text_buffer_get_start_iter(buffer, &start);
 		end = start;
-		gtk_text_iter_forward_lines(&end, logwindow->lines - line_limit);
+		gtk_text_iter_forward_lines(&end, logwindow->lines - options->log_window_lines);
 		gtk_text_buffer_delete(buffer, &start, &end);
 		}
 
@@ -278,12 +361,15 @@
 
 	log_window_insert_text(buffer, &iter, str, logdefs[type].tag);
 
-	if (gtk_widget_get_visible(GTK_WIDGET(text)))
+	if (!options->log_window.paused)
 		{
-		GtkTextMark *mark;
+		if (gtk_widget_get_visible(GTK_WIDGET(text)))
+			{
+			GtkTextMark *mark;
 
-		mark = gtk_text_buffer_get_mark(buffer, "end");
-		gtk_text_view_scroll_mark_onscreen(text, mark);
+			mark = gtk_text_buffer_get_mark(buffer, "end");
+			gtk_text_view_scroll_mark_onscreen(text, mark);
+			}
 		}
 
 	logwindow->lines = gtk_text_buffer_get_line_count(buffer);
--- a/src/logwindow.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/logwindow.h	Sat Jul 08 10:32:34 2017 +0100
@@ -30,7 +30,7 @@
 	LOG_COUNT
 } LogType;
 
-void log_window_new(void);
+void log_window_new(LayoutWindow *lw);
 
 void log_window_append(const gchar *str, LogType type);
 
--- a/src/main.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/main.c	Sat Jul 08 10:32:34 2017 +0100
@@ -226,6 +226,7 @@
 
 	command_line->argc = argc;
 	command_line->argv = argv;
+	command_line->regexp = NULL;
 
 	if (argc > 1)
 		{
@@ -301,6 +302,27 @@
 					remote_list = remote_build_list(remote_list, argc - i, &argv[i], &remote_errors);
 					}
 				}
+			else if ((strcmp(cmd_line, "+w") == 0) ||
+						strcmp(cmd_line, "--show-log-window") == 0)
+				{
+				command_line->log_window_show = TRUE;
+				}
+			else if (strncmp(cmd_line, "-o:", 3) == 0)
+				{
+				command_line->log_file = g_strdup(cmd_line + 3);
+				}
+			else if (strncmp(cmd_line, "--log-file:", 11) == 0)
+				{
+				command_line->log_file = g_strdup(cmd_line + 11);
+				}
+			else if (strncmp(cmd_line, "-g:", 3) == 0)
+				{
+				set_regexp(g_strdup(cmd_line+3));
+				}
+			else if (strncmp(cmd_line, "-grep:", 6) == 0)
+				{
+				set_regexp(g_strdup(cmd_line+3));
+				}
 			else if (strcmp(cmd_line, "-rh") == 0 ||
 				 strcmp(cmd_line, "--remote-help") == 0)
 				{
@@ -340,7 +362,10 @@
 				print_term(_("  -rh,--remote-help                print remote command list\n"));
 #ifdef DEBUG
 				print_term(_("      --debug[=level]              turn on debug output\n"));
+				print_term(_("  -g:<regexp>, --grep:<regexp>     filter debug output\n"));
 #endif
+				print_term(_("  +w, --show-log-window            show log window\n"));
+				print_term(_("  -o:<file>, --log-file:<file>     save log data to file\n"));
 				print_term(_("  -v, --version                    print version info\n"));
 				print_term(_("  -h, --help                       show this message\n\n"));
 
@@ -639,6 +664,8 @@
 		layout_free(lw);
 		}
 
+	secure_close(command_line->ssi);
+
 	gtk_main_quit();
 }
 
@@ -871,6 +898,15 @@
 			}
 		}
 
+	if (command_line->log_file)
+		{
+		gchar *pathl;
+		gchar *path = g_strdup(command_line->log_file);
+
+		pathl = path_from_utf8(path);
+		command_line->ssi = secure_open(pathl);
+		}
+
 	if (command_line->cmd_list ||
 	    (command_line->startup_command_line_collection && command_line->collection_list))
 		{
--- a/src/menu.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/menu.c	Sat Jul 08 10:32:34 2017 +0100
@@ -158,6 +158,9 @@
 		case SORT_NUMBER:
 			return _("Sort by number");
 			break;
+		case SORT_RATING:
+			return _("Sort by rating");
+			break;
 		case SORT_NAME:
 		default:
 			return _("Sort by name");
@@ -205,6 +208,7 @@
 	submenu_add_sort_item(submenu, func, SORT_CTIME, show_current, type);
 	submenu_add_sort_item(submenu, func, SORT_EXIFTIME, show_current, type);
 	submenu_add_sort_item(submenu, func, SORT_SIZE, show_current, type);
+	submenu_add_sort_item(submenu, func, SORT_RATING, show_current, type);
 	if (include_path) submenu_add_sort_item(submenu, func, SORT_PATH, show_current, type);
 	if (include_none) submenu_add_sort_item(submenu, func, SORT_NONE, show_current, type);
 
@@ -220,6 +224,80 @@
 	return submenu;
 }
 
+gchar *zoom_type_get_text(ZoomMode method)
+{
+	switch (method)
+		{
+		case ZOOM_RESET_ORIGINAL:
+			return _("Zoom to original size");
+			break;
+		case ZOOM_RESET_FIT_WINDOW:
+			return _("Fit image to window");
+			break;
+		case ZOOM_RESET_NONE:
+			return _("Leave Zoom at previous setting");
+			break;
+		default:
+			return _("Zoom to original size");
+			break;
+		}
+
+	return "";
+}
+
+static GtkWidget *submenu_add_zoom_item(GtkWidget *menu,
+					GCallback func, ZoomMode mode,
+					gboolean show_current, ZoomMode show_mode)
+{
+	GtkWidget *item;
+
+	if (show_current)
+		{
+		item = menu_item_add_radio(menu,
+					   zoom_type_get_text(mode), GINT_TO_POINTER((gint)mode), (mode == show_mode),
+					   func, GINT_TO_POINTER((gint)mode));
+		}
+	else
+		{
+		item = menu_item_add(menu, zoom_type_get_text(mode),
+				     func, GINT_TO_POINTER((gint)mode));
+		}
+
+	return item;
+}
+
+GtkWidget *submenu_add_zoom(GtkWidget *menu, GCallback func, gpointer data,
+			    gboolean include_none, gboolean include_path,
+			    gboolean show_current, ZoomMode mode)
+{
+	GtkWidget *submenu;
+
+	if (!menu)
+		{
+		submenu = gtk_menu_new();
+		g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
+		}
+	else
+		{
+		submenu = menu;
+		}
+
+	submenu_add_zoom_item(submenu, func, ZOOM_RESET_ORIGINAL, show_current, mode);
+	submenu_add_zoom_item(submenu, func, ZOOM_RESET_FIT_WINDOW, show_current, mode);
+	submenu_add_zoom_item(submenu, func, ZOOM_RESET_NONE, show_current, mode);
+
+	if (menu)
+		{
+		GtkWidget *item;
+
+		item = menu_item_add(menu, _("Zoom"), NULL, NULL);
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+		return item;
+		}
+
+	return submenu;
+}
+
 /*
  *-----------------------------------------------------------------------------
  * altering
--- a/src/menu.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/menu.h	Sat Jul 08 10:32:34 2017 +0100
@@ -31,7 +31,9 @@
 GtkWidget *submenu_add_sort(GtkWidget *menu, GCallback func, gpointer data,
 			    gboolean include_none, gboolean include_path,
 			    gboolean show_current, SortType type);
-
+GtkWidget *submenu_add_zoom(GtkWidget *menu, GCallback func, gpointer data,
+			    gboolean include_none, gboolean include_path,
+			    gboolean show_current, ZoomMode mode);
 gchar *alter_type_get_text(AlterType type);
 GtkWidget *submenu_add_alter(GtkWidget *menu, GCallback func, gpointer data);
 
--- a/src/metadata.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/metadata.c	Sat Jul 08 10:32:34 2017 +0100
@@ -302,7 +302,7 @@
 	g_assert(fd->change);
 
 	if (fd->change->dest &&
-	    strcmp(extension_from_path(fd->change->dest), GQ_CACHE_EXT_METADATA) == 0)
+	    strcmp(registered_extension_from_path(fd->change->dest), GQ_CACHE_EXT_METADATA) == 0)
 		{
 		success = metadata_legacy_write(fd);
 		if (success) metadata_legacy_delete(fd, fd->change->dest);
@@ -833,6 +833,46 @@
 		}
 }
 
+gboolean metadata_write_GPS_coord(FileData *fd, const gchar *key, gdouble value)
+{
+	gint deg;
+	gdouble min;
+	gdouble param;
+	char *coordinate;
+	char *ref;
+	gboolean ok = TRUE;
+
+	param = value;
+	if (param < 0)
+		param = -param;
+	deg = param;
+	min = (param * 60) - (deg * 60);
+	if (g_strcmp0(key, "Xmp.exif.GPSLongitude") == 0)
+		if (value < 0)
+			ref = "W";
+		else
+			ref = "E";
+	else if (g_strcmp0(key, "Xmp.exif.GPSLatitude") == 0)
+		if (value < 0)
+			ref = "S";
+		else
+			ref = "N";
+	else
+		{
+		log_printf("unknown GPS parameter key '%s'\n", key);
+		ok = FALSE;
+		}
+
+	if (ok)
+		{
+		coordinate = g_strdup_printf("%i,%lf,%s", deg, min, ref);
+		metadata_write_string(fd, key, coordinate );
+		g_free(coordinate);
+		}
+
+	return ok;
+}
+
 gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *values)
 {
 	GList *list = metadata_read_list(fd, key, METADATA_PLAIN);
@@ -1076,6 +1116,14 @@
 	return name;
 }
 
+gchar *keyword_get_mark(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
+{
+	gchar *mark_str;
+
+	gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_MARK, &mark_str, -1);
+	return mark_str;
+}
+
 gchar *keyword_get_casefold(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
 {
 	gchar *casefold;
@@ -1557,6 +1605,20 @@
 	gtk_tree_model_foreach(GTK_TREE_MODEL(keyword_tree), keyword_show_all_in_cb, id);
 }
 
+static gboolean keyword_revert_hidden_in_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+	if (keyword_is_hidden_in(GTK_TREE_MODEL(keyword_tree), iter, data))
+		{
+		keyword_show_in(GTK_TREE_STORE(model), iter, data);
+		}
+	return FALSE;
+}
+
+void keyword_revert_hidden_in(GtkTreeStore *keyword_tree, gpointer id)
+{
+	gtk_tree_model_foreach(GTK_TREE_MODEL(keyword_tree), keyword_revert_hidden_in_cb, id);
+}
+
 static void keyword_hide_unset_in_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *iter_ptr, gpointer id, GList *keywords)
 {
 	GtkTreeIter iter = *iter_ptr;
@@ -1705,12 +1767,19 @@
 		{
 		GtkTreeIter children;
 		gchar *name;
+		gchar *mark_str;
 
 		WRITE_NL(); WRITE_STRING("<keyword ");
 		name = keyword_get_name(keyword_tree, &iter);
 		write_char_option(outstr, indent, "name", name);
 		g_free(name);
 		write_bool_option(outstr, indent, "kw", keyword_get_is_keyword(keyword_tree, &iter));
+		mark_str = keyword_get_mark(keyword_tree, &iter);
+		if (mark_str && mark_str[0])
+			{
+			write_char_option(outstr, indent, "mark", mark_str);
+			}
+
 		if (gtk_tree_model_iter_children(keyword_tree, &children, &iter))
 			{
 			WRITE_STRING(">");
@@ -1745,6 +1814,7 @@
 {
 	gchar *name = NULL;
 	gboolean is_kw = TRUE;
+	gchar *mark_str = NULL;
 
 	while (*attribute_names)
 		{
@@ -1753,6 +1823,7 @@
 
 		if (READ_CHAR_FULL("name", name)) continue;
 		if (READ_BOOL_FULL("kw", is_kw)) continue;
+		if (READ_CHAR_FULL("mark", mark_str)) continue;
 
 		log_printf("unknown attribute %s = %s\n", option, value);
 		}
@@ -1765,6 +1836,13 @@
 			gtk_tree_store_append(keyword_tree, &iter, parent);
 			}
 		keyword_set(keyword_tree, &iter, name, is_kw);
+
+		if (mark_str)
+			{
+			meta_data_connect_mark_with_keyword(GTK_TREE_MODEL(keyword_tree),
+											&iter, (gint)atoi(mark_str) - 1);
+			}
+
 		g_free(name);
 		return gtk_tree_iter_copy(&iter);
 		}
--- a/src/metadata.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/metadata.h	Sat Jul 08 10:32:34 2017 +0100
@@ -25,6 +25,7 @@
 #define COMMENT_KEY "Xmp.dc.description"
 #define KEYWORD_KEY "Xmp.dc.subject"
 #define ORIENTATION_KEY "Xmp.tiff.Orientation"
+#define RATING_KEY "Xmp.xmp.Rating"
 
 void metadata_cache_free(FileData *fd);
 
@@ -46,6 +47,7 @@
 guint64 metadata_read_int(FileData *fd, const gchar *key, guint64 fallback);
 gdouble metadata_read_GPS_coord(FileData *fd, const gchar *key, gdouble fallback);
 gdouble metadata_read_GPS_direction(FileData *fd, const gchar *key, gdouble fallback);
+gboolean metadata_write_GPS_coord(FileData *fd, const gchar *key, gdouble value);
 
 gboolean metadata_append_string(FileData *fd, const gchar *key, const char *value);
 gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *values);
@@ -71,6 +73,7 @@
 
 
 gchar *keyword_get_name(GtkTreeModel *keyword_tree, GtkTreeIter *iter);
+gchar *keyword_get_mark(GtkTreeModel *keyword_tree, GtkTreeIter *iter);
 gchar *keyword_get_casefold(GtkTreeModel *keyword_tree, GtkTreeIter *iter);
 gboolean keyword_get_is_keyword(GtkTreeModel *keyword_tree, GtkTreeIter *iter);
 
@@ -98,6 +101,7 @@
 void keyword_show_in(GtkTreeStore *keyword_tree, GtkTreeIter *iter, gpointer id);
 gboolean keyword_is_hidden_in(GtkTreeModel *keyword_tree, GtkTreeIter *iter, gpointer id);
 void keyword_show_all_in(GtkTreeStore *keyword_tree, gpointer id);
+void keyword_revert_hidden_in(GtkTreeStore *keyword_tree, gpointer id);
 void keyword_hide_unset_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords);
 void keyword_show_set_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords);
 
--- a/src/misc.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/misc.c	Sat Jul 08 10:32:34 2017 +0100
@@ -20,6 +20,7 @@
 
 #include "main.h"
 #include "misc.h"
+#include "ui_fileops.h"
 
 gdouble get_zoom_increment(void)
 {
@@ -123,6 +124,51 @@
 #endif
 }
 
+/* Search for latitude/longitude parameters in a string
+ */
+
+#define GEOCODE_NAME "geocode-parameters.awk"
+#define BUFSIZE 128
+
+gchar *decode_geo_parameters(const gchar *input_text)
+{
+	gchar *message;
+	gchar *path = g_build_filename(get_rc_dir(), GEOCODE_NAME, NULL);
+	gchar *cmd = g_strconcat("echo \'", input_text, "\'  | awk -f ", path, NULL);
+
+	if (g_file_test(path, G_FILE_TEST_EXISTS))
+		{
+		gchar buf[BUFSIZE];
+		FILE *fp;
+
+		if ((fp = popen(cmd, "r")) == NULL)
+			{
+			message = g_strconcat("Error: opening pipe\n", input_text, NULL);
+			}
+		else
+			{
+			while (fgets(buf, BUFSIZE, fp))
+				{
+				DEBUG_1("Output: %s", buf);
+				}
+
+			message = g_strconcat(buf, NULL);
+
+			if(pclose(fp))
+				{
+				message = g_strconcat("Error: Command not found or exited with error status\n", input_text, NULL);
+				}
+			}
+		}
+	else
+		{
+		message = g_strconcat(input_text, NULL);
+		}
+
+	g_free(path);
+	g_free(cmd);
+	return message;
+}
 
 /* Run a command like system() but may output debug messages. */
 int runcmd(gchar *cmd)
--- a/src/misc.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/misc.h	Sat Jul 08 10:32:34 2017 +0100
@@ -26,6 +26,7 @@
 gint utf8_compare(const gchar *s1, const gchar *s2, gboolean case_sensitive);
 gchar *expand_tilde(const gchar *filename);
 int runcmd(gchar *cmd);
+gchar *decode_geo_parameters(const gchar *input_text);
 
 #endif /* MISC_H */
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/options.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/options.c	Sat Jul 08 10:32:34 2017 +0100
@@ -48,6 +48,7 @@
 	options->dnd_icon_size = 48;
 	options->duplicates_similarity_threshold = 99;
 	options->rot_invariant_sim = TRUE;
+	options->sort_totals = FALSE;
 
 	options->file_filter.disable = FALSE;
 	options->file_filter.show_dot_directory = FALSE;
@@ -77,6 +78,15 @@
 	options->fullscreen.screen = -1;
 
 	memset(&options->image.border_color, 0, sizeof(options->image.border_color));
+	memset(&options->image.alpha_color_1, 0, sizeof(options->image.alpha_color_1));
+	memset(&options->image.alpha_color_2, 0, sizeof(options->image.alpha_color_2));
+/* alpha channel checkerboard background (same as gimp) */
+	options->image.alpha_color_1.red = 0x009999;
+	options->image.alpha_color_1.green = 0x009999;
+	options->image.alpha_color_1.blue = 0x009999;
+	options->image.alpha_color_2.red = 0x006666;
+	options->image.alpha_color_2.green = 0x006666;
+	options->image.alpha_color_2.blue = 0x006666;
 	options->image.enable_read_ahead = TRUE;
 	options->image.exif_rotate_enable = TRUE;
 	options->image.exif_proof_rotate_enable = TRUE;
@@ -84,6 +94,7 @@
 	options->image.limit_autofit_size = FALSE;
 	options->image.limit_window_size = TRUE;
 	options->image.max_autofit_size = 100;
+	options->image.max_enlargement_size = 900;
 	options->image.max_window_size = 90;
 	options->image.scroll_reset_method = SCROLL_RESET_NOCHANGE;
 	options->image.tile_cache_max = 10;
@@ -131,6 +142,7 @@
 	options->metadata.confirm_on_dir_change = TRUE;
 	options->metadata.keywords_case_sensitive = FALSE;
 	options->metadata.write_orientation = TRUE;
+	options->metadata.sidecar_extended_name = FALSE;
 
 	options->show_icon_names = TRUE;
 
@@ -158,6 +170,10 @@
 	options->stereo.fixed_x2 = 0;
 	options->stereo.fixed_y2 = 1125;
 
+	options->log_window_lines = 1000;
+	options->log_window.line_wrap = TRUE;
+	options->log_window.paused = FALSE;
+
 	return options;
 }
 
@@ -227,6 +243,7 @@
 	options->main_window.w = 720;
 	options->main_window.x = 0;
 	options->main_window.y = 0;
+	options->folder_window.vdivider_pos = 100;
 	options->order = g_strdup("123");
 	options->show_directory_date = FALSE;
 	options->show_marks = FALSE;
@@ -240,6 +257,9 @@
 	options->image_overlay.histogram_mode = 1;
 	options->image_overlay.state = OSD_SHOW_NOTHING;
 	options->animate = FALSE;
+	options->bars_state.hidden = FALSE;
+	options->log_window.w = 520;
+	options->log_window.h = 400;
 	return options;
 }
 
--- a/src/options.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/options.h	Sat Jul 08 10:32:34 2017 +0100
@@ -41,7 +41,11 @@
 	gboolean update_on_time_change;
 
 	guint duplicates_similarity_threshold;
+	guint duplicates_match;
+	gboolean duplicates_thumbnails;
+	guint duplicates_select_type;
 	gboolean rot_invariant_sim;
+	gboolean sort_totals;
 
 	gint open_recent_list_maxsize;
 	gint dnd_icon_size;
@@ -50,6 +54,25 @@
 	gboolean use_saved_window_positions_for_new_windows;
 	gboolean tools_restore_state;
 
+	gint log_window_lines;
+
+	/* info sidebar component heights */
+	struct {
+		gint height;
+	} info_comment;
+
+	struct {
+		gint height;
+	} info_keywords;
+
+	struct {
+		gint height;
+	} info_title;
+
+	struct {
+		gint height;
+	} info_rating;
+
 	/* file ops */
 	struct {
 		gboolean enable_in_place_rename;
@@ -71,6 +94,7 @@
 		gint max_window_size;
 		gboolean limit_autofit_size;
 		gint max_autofit_size;
+		gint max_enlargement_size;
 
 		gint tile_cache_max;	/* in megabytes */
 		gint image_cache_max;   /* in megabytes */
@@ -86,6 +110,8 @@
 		gboolean use_custom_border_color_in_fullscreen;
 		gboolean use_custom_border_color;
 		GdkColor border_color;
+		GdkColor alpha_color_1;
+		GdkColor alpha_color_2;
 	} image;
 
 	/* thumbnails */
@@ -207,6 +233,7 @@
 		gboolean confirm_on_dir_change;
 		gboolean keywords_case_sensitive;
 		gboolean write_orientation;
+		gboolean sidecar_extended_name;
 	} metadata;
 
 	/* Stereo */
@@ -232,6 +259,20 @@
 			gboolean fs_temp_disable;
 		} tmp;
 	} stereo;
+
+	/* copy move rename */
+	struct {
+		gint auto_start;
+		gchar *auto_end;
+		gint auto_padding;
+		gint formatted_start;
+	} cp_mv_rn;
+
+	/* log window */
+	struct {
+		gboolean paused;
+		gboolean line_wrap;
+	} log_window;
 };
 
 ConfOptions *options;
--- a/src/pan-view/Makefile.am	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/Makefile.am	Sat Jul 08 10:32:34 2017 +0100
@@ -13,4 +13,9 @@
 	%D%/pan-util.c	\
 	%D%/pan-util.h	\
 	%D%/pan-view.c	\
-	%D%/pan-view.h
+	%D%/pan-view.h	\
+	%D%/pan-view-filter.c	\
+	%D%/pan-view-filter.h	\
+	%D%/pan-view-search.c	\
+	%D%/pan-view-search.h
+
--- a/src/pan-view/pan-calendar.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/pan-calendar.c	Sat Jul 08 10:32:34 2017 +0100
@@ -26,6 +26,7 @@
 
 #include "pan-util.h"
 #include "pan-view.h"
+#include "pan-view-filter.h"
 #include "pixbuf_util.h"
 
 #define PAN_CAL_POPUP_COLOR 220, 220, 220
@@ -200,6 +201,7 @@
 	gint end_month = 0;
 
 	list = pan_list_tree(dir_fd, SORT_NONE, TRUE, pw->ignore_symlinks);
+	pan_filter_fd_list(&list, pw->filter_ui->filter_elements);
 
 	if (pw->cache_list && pw->exif_date_enable)
 		{
--- a/src/pan-view/pan-folder.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/pan-folder.c	Sat Jul 08 10:32:34 2017 +0100
@@ -25,6 +25,7 @@
 
 #include "pan-item.h"
 #include "pan-util.h"
+#include "pan-view-filter.h"
 
 static void pan_flower_size(PanWindow *pw, gint *width, gint *height)
 {
@@ -242,6 +243,8 @@
 	f = filelist_sort(f, SORT_NAME, TRUE);
 	d = filelist_sort(d, SORT_NAME, TRUE);
 
+	pan_filter_fd_list(&f, pw->filter_ui->filter_elements);
+
 	pi_box = pan_item_text_new(pw, x, y, dir_fd->path, PAN_TEXT_ATTR_NONE,
 				   PAN_TEXT_BORDER_SIZE,
 				   PAN_TEXT_COLOR, 255);
@@ -386,6 +389,8 @@
 	f = filelist_sort(f, SORT_NAME, TRUE);
 	d = filelist_sort(d, SORT_NAME, TRUE);
 
+	pan_filter_fd_list(&f, pw->filter_ui->filter_elements);
+
 	*x = PAN_BOX_BORDER + ((*level) * MAX(PAN_BOX_BORDER, PAN_THUMB_GAP));
 
 	pi_box = pan_item_text_new(pw, *x, *y, dir_fd->path, PAN_TEXT_ATTR_NONE,
--- a/src/pan-view/pan-grid.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/pan-grid.c	Sat Jul 08 10:32:34 2017 +0100
@@ -25,6 +25,7 @@
 
 #include "pan-item.h"
 #include "pan-util.h"
+#include "pan-view-filter.h"
 
 void pan_grid_compute(PanWindow *pw, FileData *dir_fd, gint *width, gint *height)
 {
@@ -35,6 +36,7 @@
 	gint next_y;
 
 	list = pan_list_tree(dir_fd, SORT_NAME, TRUE, pw->ignore_symlinks);
+	pan_filter_fd_list(&list, pw->filter_ui->filter_elements);
 
 	grid_size = (gint)sqrt((gdouble)g_list_length(list));
 	if (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE)
--- a/src/pan-view/pan-timeline.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/pan-timeline.c	Sat Jul 08 10:32:34 2017 +0100
@@ -24,13 +24,14 @@
 #include "pan-item.h"
 #include "pan-util.h"
 #include "pan-view.h"
+#include "pan-view-filter.h"
 
 void pan_timeline_compute(PanWindow *pw, FileData *dir_fd, gint *width, gint *height)
 {
 	GList *list;
 	GList *work;
 	gint x, y;
-	time_t tc;
+	time_t group_start_date;
 	gint total;
 	gint count;
 	PanItem *pi_month = NULL;
@@ -41,6 +42,7 @@
 	gint y_height;
 
 	list = pan_list_tree(dir_fd, SORT_NONE, TRUE, pw->ignore_symlinks);
+	pan_filter_fd_list(&list, pw->filter_ui->filter_elements);
 
 	if (pw->cache_list && pw->exif_date_enable)
 		{
@@ -61,7 +63,8 @@
 	day_start = month_start;
 	x_width = 0;
 	y_height = 0;
-	tc = 0;
+	group_start_date = 0;
+	// total and count are used to enforce a stride of PAN_GROUP_MAX thumbs.
 	total = 0;
 	count = 0;
 	work = list;
@@ -73,13 +76,15 @@
 		fd = work->data;
 		work = work->next;
 
-		if (!pan_date_compare(fd->date, tc, PAN_DATE_LENGTH_DAY))
+		if (!pan_date_compare(fd->date, group_start_date, PAN_DATE_LENGTH_DAY))
 			{
+			// FD starts a new day group.
 			GList *needle;
 			gchar *buf;
 
-			if (!pan_date_compare(fd->date, tc, PAN_DATE_LENGTH_MONTH))
+			if (!pan_date_compare(fd->date, group_start_date, PAN_DATE_LENGTH_MONTH))
 				{
+				// FD starts a new month group.
 				pi_day = NULL;
 
 				if (pi_month)
@@ -114,7 +119,7 @@
 
 			if (pi_day) x = pi_day->x + pi_day->width + PAN_BOX_BORDER;
 
-			tc = fd->date;
+			group_start_date = fd->date;
 			total = 1;
 			count = 0;
 
@@ -124,7 +129,7 @@
 				FileData *nfd;
 
 				nfd = needle->data;
-				if (pan_date_compare(nfd->date, tc, PAN_DATE_LENGTH_DAY))
+				if (pan_date_compare(nfd->date, group_start_date, PAN_DATE_LENGTH_DAY))
 					{
 					needle = needle->next;
 					total++;
--- a/src/pan-view/pan-types.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/pan-types.h	Sat Jul 08 10:32:34 2017 +0100
@@ -169,6 +169,19 @@
 	gboolean queued;
 };
 
+typedef struct _PanViewSearchUi PanViewSearchUi;
+struct _PanViewSearchUi
+{
+	GtkWidget *search_box;
+	GtkWidget *search_entry;
+	GtkWidget *search_label;
+	GtkWidget *search_button;
+	GtkWidget *search_button_arrow;
+};
+
+// Defined in pan-view-filter.h
+typedef struct _PanViewFilterUi PanViewFilterUi;
+
 typedef struct _PanWindow PanWindow;
 struct _PanWindow
 {
@@ -182,11 +195,8 @@
 	GtkWidget *label_message;
 	GtkWidget *label_zoom;
 
-	GtkWidget *search_box;
-	GtkWidget *search_entry;
-	GtkWidget *search_label;
-	GtkWidget *search_button;
-	GtkWidget *search_button_arrow;
+	PanViewSearchUi *search_ui;
+	PanViewFilterUi *filter_ui;
 
 	GtkWidget *date_button;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pan-view/pan-view-filter.c	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) 2006 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "pan-view-filter.h"
+
+#include "image.h"
+#include "metadata.h"
+#include "pan-item.h"
+#include "pan-util.h"
+#include "pan-view.h"
+#include "ui_fileops.h"
+#include "ui_tabcomp.h"
+#include "ui_misc.h"
+
+PanViewFilterUi *pan_filter_ui_new(PanWindow *pw)
+{
+	PanViewFilterUi *ui = g_new0(PanViewFilterUi, 1);
+	GtkWidget *combo;
+	GtkWidget *hbox;
+
+	/* Since we're using the GHashTable as a HashSet (in which key and value pointers
+	 * are always identical), specifying key _and_ value destructor callbacks will
+	 * cause a double-free.
+	 */
+	{
+		GtkTreeIter iter;
+		ui->filter_mode_model = gtk_list_store_new(3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING);
+		gtk_list_store_append(ui->filter_mode_model, &iter);
+		gtk_list_store_set(ui->filter_mode_model, &iter,
+				   0, PAN_VIEW_FILTER_REQUIRE, 1, _("Require"), 2, _("R"), -1);
+		gtk_list_store_append(ui->filter_mode_model, &iter);
+		gtk_list_store_set(ui->filter_mode_model, &iter,
+				   0, PAN_VIEW_FILTER_EXCLUDE, 1, _("Exclude"), 2, _("E"), -1);
+		gtk_list_store_append(ui->filter_mode_model, &iter);
+		gtk_list_store_set(ui->filter_mode_model, &iter,
+				   0, PAN_VIEW_FILTER_INCLUDE, 1, _("Include"), 2, _("I"), -1);
+		gtk_list_store_append(ui->filter_mode_model, &iter);
+		gtk_list_store_set(ui->filter_mode_model, &iter,
+				   0, PAN_VIEW_FILTER_GROUP, 1, _("Group"), 2, _("G"), -1);
+
+		ui->filter_mode_combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(ui->filter_mode_model));
+		gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(ui->filter_mode_combo), FALSE);
+		gtk_combo_box_set_active(GTK_COMBO_BOX(ui->filter_mode_combo), 0);
+
+		GtkCellRenderer *render = gtk_cell_renderer_text_new();
+		gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(ui->filter_mode_combo), render, TRUE);
+		gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(ui->filter_mode_combo), render, "text", 1, NULL);
+	}
+
+	// Build the actual filter UI.
+	ui->filter_box = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+	pref_spacer(ui->filter_box, 0);
+	pref_label_new(ui->filter_box, _("Keyword Filter:"));
+
+	gtk_box_pack_start(GTK_BOX(ui->filter_box), ui->filter_mode_combo, TRUE, TRUE, 0);
+	gtk_widget_show(ui->filter_mode_combo);
+
+	hbox = gtk_hbox_new(TRUE, PREF_PAD_SPACE);
+	gtk_box_pack_start(GTK_BOX(ui->filter_box), hbox, TRUE, TRUE, 0);
+	gtk_widget_show(hbox);
+
+	combo = tab_completion_new_with_history(&ui->filter_entry, "", "pan_view_filter", -1,
+						pan_filter_activate_cb, pw);
+	gtk_box_pack_start(GTK_BOX(hbox), combo, TRUE, TRUE, 0);
+	gtk_widget_show(combo);
+
+	// TODO(xsdg): Figure out whether it's useful to keep this label around.
+	ui->filter_label = gtk_label_new("");
+	//gtk_box_pack_start(GTK_BOX(hbox), ui->filter_label, FALSE, FALSE, 0);
+	//gtk_widget_show(ui->filter_label);
+
+	ui->filter_kw_hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+	gtk_box_pack_start(GTK_BOX(hbox), ui->filter_kw_hbox, TRUE, TRUE, 0);
+	gtk_widget_show(ui->filter_kw_hbox);
+
+	// Build the spin-button to show/hide the filter UI.
+	ui->filter_button = gtk_toggle_button_new();
+	gtk_button_set_relief(GTK_BUTTON(ui->filter_button), GTK_RELIEF_NONE);
+	gtk_button_set_focus_on_click(GTK_BUTTON(ui->filter_button), FALSE);
+	hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP);
+	gtk_container_add(GTK_CONTAINER(ui->filter_button), hbox);
+	gtk_widget_show(hbox);
+	ui->filter_button_arrow = gtk_arrow_new(GTK_ARROW_UP, GTK_SHADOW_NONE);
+	gtk_box_pack_start(GTK_BOX(hbox), ui->filter_button_arrow, FALSE, FALSE, 0);
+	gtk_widget_show(ui->filter_button_arrow);
+	pref_label_new(hbox, _("Filter"));
+
+	g_signal_connect(G_OBJECT(ui->filter_button), "clicked",
+			 G_CALLBACK(pan_filter_toggle_cb), pw);
+
+	return ui;
+}
+
+void pan_filter_ui_destroy(PanViewFilterUi **ui_ptr)
+{
+	if (ui_ptr == NULL || *ui_ptr == NULL) return;
+
+	// Note that g_clear_pointer handles already-NULL pointers.
+	//g_clear_pointer(&(*ui_ptr)->filter_kw_table, g_hash_table_destroy);
+
+	g_free(*ui_ptr);
+	*ui_ptr = NULL;
+}
+
+static void pan_filter_status(PanWindow *pw, const gchar *text)
+{
+	gtk_label_set_text(GTK_LABEL(pw->filter_ui->filter_label), (text) ? text : "");
+}
+
+static void pan_filter_kw_button_cb(GtkButton *widget, gpointer data)
+{
+	PanFilterCallbackState *cb_state = data;
+	PanWindow *pw = cb_state->pw;
+	PanViewFilterUi *ui = pw->filter_ui;
+
+	// TODO(xsdg): Fix filter element pointed object memory leak.
+	ui->filter_elements = g_list_delete_link(ui->filter_elements, cb_state->filter_element);
+	gtk_widget_destroy(GTK_WIDGET(widget));
+	g_free(cb_state);
+
+	pan_filter_status(pw, _("Removed keyword…"));
+	pan_layout_update(pw);
+}
+
+void pan_filter_activate_cb(const gchar *text, gpointer data)
+{
+	GtkWidget *kw_button;
+	PanWindow *pw = data;
+	PanViewFilterUi *ui = pw->filter_ui;
+	GtkTreeIter iter;
+
+	if (!text) return;
+
+	// Get all relevant state and reset UI.
+	gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ui->filter_mode_combo), &iter);
+	gtk_entry_set_text(GTK_ENTRY(ui->filter_entry), "");
+	tab_completion_append_to_history(ui->filter_entry, text);
+
+	// Add new filter element.
+	PanViewFilterElement *element = g_new0(PanViewFilterElement, 1);
+	gtk_tree_model_get(GTK_TREE_MODEL(ui->filter_mode_model), &iter, 0, &element->mode, -1);
+	element->keyword = g_strdup(text);
+	if (g_strcmp0(text, g_regex_escape_string(text, -1)))
+		{
+		// It's an actual regex, so compile
+		element->kw_regex = g_regex_new(text, G_REGEX_ANCHORED | G_REGEX_OPTIMIZE, G_REGEX_MATCH_ANCHORED, NULL);
+		}
+	ui->filter_elements = g_list_append(ui->filter_elements, element);
+
+	// Get the short version of the mode value.
+	gchar *short_mode;
+	gtk_tree_model_get(GTK_TREE_MODEL(ui->filter_mode_model), &iter, 2, &short_mode, -1);
+
+	// Create the button.
+	// TODO(xsdg): Use MVC so that the button list is an actual representation of the GList
+	gchar *label = g_strdup_printf("(%s) %s", short_mode, text);
+	kw_button = gtk_button_new_with_label(label);
+	g_clear_pointer(&label, g_free);
+
+	gtk_box_pack_start(GTK_BOX(ui->filter_kw_hbox), kw_button, FALSE, FALSE, 0);
+	gtk_widget_show(kw_button);
+
+	PanFilterCallbackState *cb_state = g_new0(PanFilterCallbackState, 1);
+	cb_state->pw = pw;
+	cb_state->filter_element = g_list_last(ui->filter_elements);
+
+	g_signal_connect(G_OBJECT(kw_button), "clicked",
+			 G_CALLBACK(pan_filter_kw_button_cb), cb_state);
+
+	pan_layout_update(pw);
+}
+
+void pan_filter_activate(PanWindow *pw)
+{
+	gchar *text;
+
+	text = g_strdup(gtk_entry_get_text(GTK_ENTRY(pw->filter_ui->filter_entry)));
+	pan_filter_activate_cb(text, pw);
+	g_free(text);
+}
+
+void pan_filter_toggle_cb(GtkWidget *button, gpointer data)
+{
+	PanWindow *pw = data;
+	PanViewFilterUi *ui = pw->filter_ui;
+	gboolean visible;
+
+	visible = gtk_widget_get_visible(ui->filter_box);
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) == visible) return;
+
+	if (visible)
+		{
+		gtk_widget_hide(ui->filter_box);
+		gtk_arrow_set(GTK_ARROW(ui->filter_button_arrow), GTK_ARROW_UP, GTK_SHADOW_NONE);
+		}
+	else
+		{
+		gtk_widget_show(ui->filter_box);
+		gtk_arrow_set(GTK_ARROW(ui->filter_button_arrow), GTK_ARROW_DOWN, GTK_SHADOW_NONE);
+		gtk_widget_grab_focus(ui->filter_entry);
+		}
+}
+
+void pan_filter_toggle_visible(PanWindow *pw, gboolean enable)
+{
+	PanViewFilterUi *ui = pw->filter_ui;
+	if (pw->fs) return;
+
+	if (enable)
+		{
+		if (gtk_widget_get_visible(ui->filter_box))
+			{
+			gtk_widget_grab_focus(ui->filter_entry);
+			}
+		else
+			{
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->filter_button), TRUE);
+			}
+		}
+	else
+		{
+		if (gtk_widget_get_visible(ui->filter_entry))
+			{
+			if (gtk_widget_has_focus(ui->filter_entry))
+				{
+				gtk_widget_grab_focus(GTK_WIDGET(pw->imd->widget));
+				}
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->filter_button), FALSE);
+			}
+		}
+}
+
+static gboolean pan_view_list_contains_kw_pattern(GList *haystack, PanViewFilterElement *filter, gchar **found_kw)
+{
+	if (filter->kw_regex)
+		{
+		// regex compile succeeded; attempt regex match.
+		GList *work = g_list_first(haystack);
+		while (work)
+			{
+			gchar *keyword = work->data;
+			work = work->next;
+			if (g_regex_match(filter->kw_regex, keyword, 0x0, NULL))
+				{
+				if (found_kw) *found_kw = keyword;
+				return TRUE;
+				}
+			}
+		return FALSE;
+		}
+	else
+		{
+		// regex compile failed; fall back to exact string match.
+		GList *found_elem = g_list_find_custom(haystack, filter->keyword, (GCompareFunc)g_strcmp0);
+		if (found_elem && found_kw) *found_kw = found_elem->data;
+		return !!found_elem;
+		}
+}
+
+gboolean pan_filter_fd_list(GList **fd_list, GList *filter_elements)
+{
+	GList *work;
+	gboolean modified = FALSE;
+	GHashTable *seen_kw_table = NULL;
+
+	if (!fd_list || !*fd_list || !filter_elements) return modified;
+
+	// seen_kw_table is only valid in this scope, so don't take ownership of any strings.
+	seen_kw_table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+
+	work = *fd_list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		GList *last_work = work;
+		work = work->next;
+
+		// TODO(xsdg): OPTIMIZATION Do the search inside of metadata.c to avoid a
+		// bunch of string list copies.
+		GList *img_keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
+
+		// TODO(xsdg): OPTIMIZATION Determine a heuristic for when to linear-search the
+		// keywords list, and when to build a hash table for the image's keywords.
+		gboolean should_reject = FALSE;
+		gchar *group_kw = NULL;
+		GList *filter_element = filter_elements;
+		while (filter_element)
+			{
+			PanViewFilterElement *filter = filter_element->data;
+			filter_element = filter_element->next;
+			gchar *found_kw = NULL;
+			gboolean has_kw = pan_view_list_contains_kw_pattern(img_keywords, filter, &found_kw);
+
+			switch (filter->mode)
+				{
+				case PAN_VIEW_FILTER_REQUIRE:
+					should_reject |= !has_kw;
+					break;
+				case PAN_VIEW_FILTER_EXCLUDE:
+					should_reject |= has_kw;
+					break;
+				case PAN_VIEW_FILTER_INCLUDE:
+					if (has_kw) should_reject = FALSE;
+					break;
+				case PAN_VIEW_FILTER_GROUP:
+					if (has_kw)
+						{
+						if (g_hash_table_contains(seen_kw_table, found_kw))
+							{
+							should_reject = TRUE;
+							}
+						else if (group_kw == NULL)
+							{
+							group_kw = found_kw;
+							}
+						}
+					break;
+				}
+			}
+
+		if (!should_reject && group_kw != NULL) g_hash_table_add(seen_kw_table, group_kw);
+
+		group_kw = NULL;  // group_kw references an item from img_keywords.
+		string_list_free(img_keywords);
+
+		if (should_reject)
+			{
+			*fd_list = g_list_delete_link(*fd_list, last_work);
+			modified = TRUE;
+			}
+		}
+
+	g_hash_table_destroy(seen_kw_table);
+	return modified;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pan-view/pan-view-filter.h	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2006 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef PAN_VIEW_PAN_VIEW_FILTER_H
+#define PAN_VIEW_PAN_VIEW_FILTER_H
+
+#include "main.h"
+#include "pan-types.h"
+
+typedef enum {
+	PAN_VIEW_FILTER_REQUIRE,
+	PAN_VIEW_FILTER_EXCLUDE,
+	PAN_VIEW_FILTER_INCLUDE,
+	PAN_VIEW_FILTER_GROUP
+} PanViewFilterMode;
+
+typedef struct _PanViewFilterElement PanViewFilterElement;
+struct _PanViewFilterElement
+{
+	PanViewFilterMode mode;
+	gchar *keyword;
+	GRegex *kw_regex;
+};
+
+typedef struct _PanFilterCallbackState PanFilterCallbackState;
+struct _PanFilterCallbackState
+{
+	PanWindow *pw;
+	GList *filter_element;
+};
+
+struct _PanViewFilterUi
+{
+	GtkWidget *filter_box;
+	GtkWidget *filter_entry;
+	GtkWidget *filter_label;
+	GtkWidget *filter_button;
+	GtkWidget *filter_button_arrow;
+	GtkWidget *filter_kw_hbox;
+	GtkListStore *filter_mode_model;
+	GtkWidget *filter_mode_combo;
+	GList *filter_elements;  // List of PanViewFilterElement.
+};
+
+void pan_filter_toggle_visible(PanWindow *pw, gboolean enable);
+void pan_filter_activate(PanWindow *pw);
+void pan_filter_activate_cb(const gchar *text, gpointer data);
+void pan_filter_toggle_cb(GtkWidget *button, gpointer data);
+
+// Creates a new PanViewFilterUi instance and returns it.
+PanViewFilterUi *pan_filter_ui_new(PanWindow *pw);
+
+// Destroys the specified PanViewFilterUi and sets the pointer to NULL.
+void pan_filter_ui_destroy(PanViewFilterUi **ui);
+
+gboolean pan_filter_fd_list(GList **fd_list, GList *filter_elements);
+
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pan-view/pan-view-search.c	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,468 @@
+/*
+ * Copyright (C) 2006 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "pan-view-search.h"
+
+#include "image.h"
+#include "pan-calendar.h"
+#include "pan-item.h"
+#include "pan-util.h"
+#include "pan-view.h"
+#include "ui_tabcomp.h"
+#include "ui_misc.h"
+
+PanViewSearchUi *pan_search_ui_new(PanWindow *pw)
+{
+	PanViewSearchUi *ui = g_new0(PanViewSearchUi, 1);
+	GtkWidget *combo;
+	GtkWidget *hbox;
+
+	// Build the actual search UI.
+	ui->search_box = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+	pref_spacer(ui->search_box, 0);
+	pref_label_new(ui->search_box, _("Find:"));
+
+	hbox = gtk_hbox_new(TRUE, PREF_PAD_SPACE);
+	gtk_box_pack_start(GTK_BOX(ui->search_box), hbox, TRUE, TRUE, 0);
+	gtk_widget_show(hbox);
+
+	combo = tab_completion_new_with_history(&ui->search_entry, "", "pan_view_search", -1,
+						pan_search_activate_cb, pw);
+	gtk_box_pack_start(GTK_BOX(hbox), combo, TRUE, TRUE, 0);
+	gtk_widget_show(combo);
+
+	ui->search_label = gtk_label_new("");
+	gtk_box_pack_start(GTK_BOX(hbox), ui->search_label, TRUE, TRUE, 0);
+	gtk_widget_show(ui->search_label);
+
+	// Build the spin-button to show/hide the search UI.
+	ui->search_button = gtk_toggle_button_new();
+	gtk_button_set_relief(GTK_BUTTON(ui->search_button), GTK_RELIEF_NONE);
+	gtk_button_set_focus_on_click(GTK_BUTTON(ui->search_button), FALSE);
+	hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP);
+	gtk_container_add(GTK_CONTAINER(ui->search_button), hbox);
+	gtk_widget_show(hbox);
+	ui->search_button_arrow = gtk_arrow_new(GTK_ARROW_UP, GTK_SHADOW_NONE);
+	gtk_box_pack_start(GTK_BOX(hbox), ui->search_button_arrow, FALSE, FALSE, 0);
+	gtk_widget_show(ui->search_button_arrow);
+	pref_label_new(hbox, _("Find"));
+
+	g_signal_connect(G_OBJECT(ui->search_button), "clicked",
+			 G_CALLBACK(pan_search_toggle_cb), pw);
+
+	return ui;
+}
+
+void pan_search_ui_destroy(PanViewSearchUi **ui_ptr)
+{
+	if (ui_ptr == NULL || *ui_ptr == NULL) return;
+
+	g_free(*ui_ptr);
+	*ui_ptr = NULL;
+}
+
+static void pan_search_status(PanWindow *pw, const gchar *text)
+{
+	gtk_label_set_text(GTK_LABEL(pw->search_ui->search_label), (text) ? text : "");
+}
+
+static gint pan_search_by_path(PanWindow *pw, const gchar *path)
+{
+	PanItem *pi;
+	GList *list;
+	GList *found;
+	PanItemType type;
+	gchar *buf;
+
+	type = (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) ? PAN_ITEM_IMAGE : PAN_ITEM_THUMB;
+
+	list = pan_item_find_by_path(pw, type, path, FALSE, FALSE);
+	if (!list) return FALSE;
+
+	found = g_list_find(list, pw->click_pi);
+	if (found && found->next)
+		{
+		found = found->next;
+		pi = found->data;
+		}
+	else
+		{
+		pi = list->data;
+		}
+
+	pan_info_update(pw, pi);
+	image_scroll_to_point(pw->imd, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5);
+
+	buf = g_strdup_printf("%s ( %d / %d )",
+			      (path[0] == G_DIR_SEPARATOR) ? _("path found") : _("filename found"),
+			      g_list_index(list, pi) + 1,
+			      g_list_length(list));
+	pan_search_status(pw, buf);
+	g_free(buf);
+
+	g_list_free(list);
+
+	return TRUE;
+}
+
+static gboolean pan_search_by_partial(PanWindow *pw, const gchar *text)
+{
+	PanItem *pi;
+	GList *list;
+	GList *found;
+	PanItemType type;
+	gchar *buf;
+
+	type = (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) ? PAN_ITEM_IMAGE : PAN_ITEM_THUMB;
+
+	list = pan_item_find_by_path(pw, type, text, TRUE, FALSE);
+	if (!list) list = pan_item_find_by_path(pw, type, text, FALSE, TRUE);
+	if (!list)
+		{
+		gchar *needle;
+
+		needle = g_utf8_strdown(text, -1);
+		list = pan_item_find_by_path(pw, type, needle, TRUE, TRUE);
+		g_free(needle);
+		}
+	if (!list) return FALSE;
+
+	found = g_list_find(list, pw->click_pi);
+	if (found && found->next)
+		{
+		found = found->next;
+		pi = found->data;
+		}
+	else
+		{
+		pi = list->data;
+		}
+
+	pan_info_update(pw, pi);
+	image_scroll_to_point(pw->imd, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5);
+
+	buf = g_strdup_printf("%s ( %d / %d )",
+			      _("partial match"),
+			      g_list_index(list, pi) + 1,
+			      g_list_length(list));
+	pan_search_status(pw, buf);
+	g_free(buf);
+
+	g_list_free(list);
+
+	return TRUE;
+}
+
+static gboolean valid_date_separator(gchar c)
+{
+	return (c == '/' || c == '-' || c == ' ' || c == '.' || c == ',');
+}
+
+static GList *pan_search_by_date_val(PanWindow *pw, PanItemType type,
+				     gint year, gint month, gint day,
+				     const gchar *key)
+{
+	GList *list = NULL;
+	GList *work;
+
+	work = g_list_last(pw->list_static);
+	while (work)
+		{
+		PanItem *pi;
+
+		pi = work->data;
+		work = work->prev;
+
+		if (pi->fd && (pi->type == type || type == PAN_ITEM_NONE) &&
+		    ((!key && !pi->key) || (key && pi->key && strcmp(key, pi->key) == 0)))
+			{
+			struct tm *tl;
+
+			tl = localtime(&pi->fd->date);
+			if (tl)
+				{
+				gint match;
+
+				match = (tl->tm_year == year - 1900);
+				if (match && month >= 0) match = (tl->tm_mon == month - 1);
+				if (match && day > 0) match = (tl->tm_mday == day);
+
+				if (match) list = g_list_prepend(list, pi);
+				}
+			}
+		}
+
+	return g_list_reverse(list);
+}
+
+static gboolean pan_search_by_date(PanWindow *pw, const gchar *text)
+{
+	PanItem *pi = NULL;
+	GList *list = NULL;
+	GList *found;
+	gint year;
+	gint month = -1;
+	gint day = -1;
+	gchar *ptr;
+	gchar *mptr;
+	struct tm *lt;
+	time_t t;
+	gchar *message;
+	gchar *buf;
+	gchar *buf_count;
+
+	if (!text) return FALSE;
+
+	ptr = (gchar *)text;
+	while (*ptr != '\0')
+		{
+		if (!g_unichar_isdigit(*ptr) && !valid_date_separator(*ptr)) return FALSE;
+		ptr++;
+		}
+
+	t = time(NULL);
+	if (t == -1) return FALSE;
+	lt = localtime(&t);
+	if (!lt) return FALSE;
+
+	if (valid_date_separator(*text))
+		{
+		year = -1;
+		mptr = (gchar *)text;
+		}
+	else
+		{
+		year = (gint)strtol(text, &mptr, 10);
+		if (mptr == text) return FALSE;
+		}
+
+	if (*mptr != '\0' && valid_date_separator(*mptr))
+		{
+		gchar *dptr;
+
+		mptr++;
+		month = strtol(mptr, &dptr, 10);
+		if (dptr == mptr)
+			{
+			if (valid_date_separator(*dptr))
+				{
+				month = lt->tm_mon + 1;
+				dptr++;
+				}
+			else
+				{
+				month = -1;
+				}
+			}
+		if (dptr != mptr && *dptr != '\0' && valid_date_separator(*dptr))
+			{
+			gchar *eptr;
+			dptr++;
+			day = strtol(dptr, &eptr, 10);
+			if (dptr == eptr)
+				{
+				day = lt->tm_mday;
+				}
+			}
+		}
+
+	if (year == -1)
+		{
+		year = lt->tm_year + 1900;
+		}
+	else if (year < 100)
+		{
+		if (year > 70)
+			year+= 1900;
+		else
+			year+= 2000;
+		}
+
+	if (year < 1970 ||
+	    month < -1 || month == 0 || month > 12 ||
+	    day < -1 || day == 0 || day > 31) return FALSE;
+
+	t = pan_date_to_time(year, month, day);
+	if (t < 0) return FALSE;
+
+	if (pw->layout == PAN_LAYOUT_CALENDAR)
+		{
+		list = pan_search_by_date_val(pw, PAN_ITEM_BOX, year, month, day, "day");
+		}
+	else
+		{
+		PanItemType type;
+
+		type = (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) ? PAN_ITEM_IMAGE : PAN_ITEM_THUMB;
+		list = pan_search_by_date_val(pw, type, year, month, day, NULL);
+		}
+
+	if (list)
+		{
+		found = g_list_find(list, pw->search_pi);
+		if (found && found->next)
+			{
+			found = found->next;
+			pi = found->data;
+			}
+		else
+			{
+			pi = list->data;
+			}
+		}
+
+	pw->search_pi = pi;
+
+	if (pw->layout == PAN_LAYOUT_CALENDAR && pi && pi->type == PAN_ITEM_BOX)
+		{
+		pan_info_update(pw, NULL);
+		pan_calendar_update(pw, pi);
+		image_scroll_to_point(pw->imd,
+				      pi->x + pi->width / 2,
+				      pi->y + pi->height / 2, 0.5, 0.5);
+		}
+	else if (pi)
+		{
+		pan_info_update(pw, pi);
+		image_scroll_to_point(pw->imd,
+				      pi->x - PAN_BOX_BORDER * 5 / 2,
+				      pi->y, 0.0, 0.5);
+		}
+
+	if (month > 0)
+		{
+		buf = pan_date_value_string(t, PAN_DATE_LENGTH_MONTH);
+		if (day > 0)
+			{
+			gchar *tmp;
+			tmp = buf;
+			buf = g_strdup_printf("%d %s", day, tmp);
+			g_free(tmp);
+			}
+		}
+	else
+		{
+		buf = pan_date_value_string(t, PAN_DATE_LENGTH_YEAR);
+		}
+
+	if (pi)
+		{
+		buf_count = g_strdup_printf("( %d / %d )",
+					    g_list_index(list, pi) + 1,
+					    g_list_length(list));
+		}
+	else
+		{
+		buf_count = g_strdup_printf("(%s)", _("no match"));
+		}
+
+	message = g_strdup_printf("%s %s %s", _("Date:"), buf, buf_count);
+	g_free(buf);
+	g_free(buf_count);
+	pan_search_status(pw, message);
+	g_free(message);
+
+	g_list_free(list);
+
+	return TRUE;
+}
+
+void pan_search_activate_cb(const gchar *text, gpointer data)
+{
+	PanWindow *pw = data;
+
+	if (!text) return;
+
+	tab_completion_append_to_history(pw->search_ui->search_entry, text);
+
+	if (pan_search_by_path(pw, text)) return;
+
+	if ((pw->layout == PAN_LAYOUT_TIMELINE ||
+	     pw->layout == PAN_LAYOUT_CALENDAR) &&
+	    pan_search_by_date(pw, text))
+		{
+		return;
+		}
+
+	if (pan_search_by_partial(pw, text)) return;
+
+	pan_search_status(pw, _("no match"));
+}
+
+void pan_search_activate(PanWindow *pw)
+{
+	gchar *text;
+
+	text = g_strdup(gtk_entry_get_text(GTK_ENTRY(pw->search_ui->search_entry)));
+	pan_search_activate_cb(text, pw);
+	g_free(text);
+}
+
+void pan_search_toggle_cb(GtkWidget *button, gpointer data)
+{
+	PanWindow *pw = data;
+	PanViewSearchUi *ui = pw->search_ui;
+	gboolean visible;
+
+	visible = gtk_widget_get_visible(ui->search_box);
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) == visible) return;
+
+	if (visible)
+		{
+		gtk_widget_hide(ui->search_box);
+		gtk_arrow_set(GTK_ARROW(ui->search_button_arrow), GTK_ARROW_UP, GTK_SHADOW_NONE);
+		}
+	else
+		{
+		gtk_widget_show(ui->search_box);
+		gtk_arrow_set(GTK_ARROW(ui->search_button_arrow), GTK_ARROW_DOWN, GTK_SHADOW_NONE);
+		gtk_widget_grab_focus(ui->search_entry);
+		}
+}
+
+void pan_search_toggle_visible(PanWindow *pw, gboolean enable)
+{
+	PanViewSearchUi *ui = pw->search_ui;
+	if (pw->fs) return;
+
+	if (enable)
+		{
+		if (gtk_widget_get_visible(ui->search_box))
+			{
+			gtk_widget_grab_focus(ui->search_entry);
+			}
+		else
+			{
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->search_button), TRUE);
+			}
+		}
+	else
+		{
+		if (gtk_widget_get_visible(ui->search_entry))
+			{
+			if (gtk_widget_has_focus(ui->search_entry))
+				{
+				gtk_widget_grab_focus(GTK_WIDGET(pw->imd->widget));
+				}
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->search_button), FALSE);
+			}
+		}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pan-view/pan-view-search.h	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef PAN_VIEW_PAN_VIEW_SEARCH_H
+#define PAN_VIEW_PAN_VIEW_SEARCH_H
+
+#include "main.h"
+#include "pan-types.h"
+
+void pan_search_toggle_visible(PanWindow *pw, gboolean enable);
+void pan_search_activate(PanWindow *pw);
+void pan_search_activate_cb(const gchar *text, gpointer data);
+void pan_search_toggle_cb(GtkWidget *button, gpointer data);
+
+// Creates a new PanViewSearchUi instance and returns it.
+PanViewSearchUi *pan_search_ui_new(PanWindow *pw);
+
+// Destroys the specified PanViewSearchUi and sets the pointer to NULL.
+void pan_search_ui_destroy(PanViewSearchUi **ui);
+
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/pan-view/pan-view.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/pan-view.c	Sat Jul 08 10:32:34 2017 +0100
@@ -38,6 +38,8 @@
 #include "pan-item.h"
 #include "pan-timeline.h"
 #include "pan-util.h"
+#include "pan-view-filter.h"
+#include "pan-view-search.h"
 #include "pixbuf-renderer.h"
 #include "pixbuf_util.h"
 #include "thumb.h"
@@ -78,9 +80,6 @@
 
 static void pan_fullscreen_toggle(PanWindow *pw, gboolean force_off);
 
-static void pan_search_toggle_visible(PanWindow *pw, gboolean enable);
-static void pan_search_activate(PanWindow *pw);
-
 static void pan_window_close(PanWindow *pw);
 
 static GtkWidget *pan_popup_menu(PanWindow *pw);
@@ -1072,7 +1071,7 @@
 		}
 }
 
-static void pan_layout_update(PanWindow *pw)
+void pan_layout_update(PanWindow *pw)
 {
 	pan_window_message(pw, _("Sorting images..."));
 	pan_layout_update_idle(pw);
@@ -1134,7 +1133,8 @@
 	imd_widget = gtk_container_get_focus_child(GTK_CONTAINER(pw->imd->widget));
 	focused = (pw->fs || (imd_widget && gtk_widget_has_focus(imd_widget)));
 	on_entry = (gtk_widget_has_focus(pw->path_entry) ||
-		    gtk_widget_has_focus(pw->search_entry));
+		    gtk_widget_has_focus(pw->search_ui->search_entry) ||
+		    gtk_widget_has_focus(pw->filter_ui->filter_entry));
 
 	if (focused)
 		{
@@ -1248,6 +1248,7 @@
 
 		if (stop_signal) return stop_signal;
 
+		// Don't steal characters from entry boxes.
 		if (!on_entry)
 			{
 			stop_signal = TRUE;
@@ -1298,6 +1299,9 @@
 				case '/':
 					pan_search_toggle_visible(pw, TRUE);
 					break;
+				case GDK_KEY_F1:
+					help_window_show("GuideReferenceKeyboardShortcuts.html#PanViewKeyboardShortcuts");
+					break;
 				default:
 					stop_signal = FALSE;
 					break;
@@ -1323,7 +1327,7 @@
 }
 
 
-static void pan_info_update(PanWindow *pw, PanItem *pi)
+void pan_info_update(PanWindow *pw, PanItem *pi)
 {
 	PanTextAlignment *ta;
 	PanItem *pbox;
@@ -1449,399 +1453,6 @@
 
 /*
  *-----------------------------------------------------------------------------
- * search
- *-----------------------------------------------------------------------------
- */
-
-static void pan_search_status(PanWindow *pw, const gchar *text)
-{
-	gtk_label_set_text(GTK_LABEL(pw->search_label), (text) ? text : "");
-}
-
-static gint pan_search_by_path(PanWindow *pw, const gchar *path)
-{
-	PanItem *pi;
-	GList *list;
-	GList *found;
-	PanItemType type;
-	gchar *buf;
-
-	type = (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) ? PAN_ITEM_IMAGE : PAN_ITEM_THUMB;
-
-	list = pan_item_find_by_path(pw, type, path, FALSE, FALSE);
-	if (!list) return FALSE;
-
-	found = g_list_find(list, pw->click_pi);
-	if (found && found->next)
-		{
-		found = found->next;
-		pi = found->data;
-		}
-	else
-		{
-		pi = list->data;
-		}
-
-	pan_info_update(pw, pi);
-	image_scroll_to_point(pw->imd, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5);
-
-	buf = g_strdup_printf("%s ( %d / %d )",
-			      (path[0] == G_DIR_SEPARATOR) ? _("path found") : _("filename found"),
-			      g_list_index(list, pi) + 1,
-			      g_list_length(list));
-	pan_search_status(pw, buf);
-	g_free(buf);
-
-	g_list_free(list);
-
-	return TRUE;
-}
-
-static gboolean pan_search_by_partial(PanWindow *pw, const gchar *text)
-{
-	PanItem *pi;
-	GList *list;
-	GList *found;
-	PanItemType type;
-	gchar *buf;
-
-	type = (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) ? PAN_ITEM_IMAGE : PAN_ITEM_THUMB;
-
-	list = pan_item_find_by_path(pw, type, text, TRUE, FALSE);
-	if (!list) list = pan_item_find_by_path(pw, type, text, FALSE, TRUE);
-	if (!list)
-		{
-		gchar *needle;
-
-		needle = g_utf8_strdown(text, -1);
-		list = pan_item_find_by_path(pw, type, needle, TRUE, TRUE);
-		g_free(needle);
-		}
-	if (!list) return FALSE;
-
-	found = g_list_find(list, pw->click_pi);
-	if (found && found->next)
-		{
-		found = found->next;
-		pi = found->data;
-		}
-	else
-		{
-		pi = list->data;
-		}
-
-	pan_info_update(pw, pi);
-	image_scroll_to_point(pw->imd, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5);
-
-	buf = g_strdup_printf("%s ( %d / %d )",
-			      _("partial match"),
-			      g_list_index(list, pi) + 1,
-			      g_list_length(list));
-	pan_search_status(pw, buf);
-	g_free(buf);
-
-	g_list_free(list);
-
-	return TRUE;
-}
-
-static gboolean valid_date_separator(gchar c)
-{
-	return (c == '/' || c == '-' || c == ' ' || c == '.' || c == ',');
-}
-
-static GList *pan_search_by_date_val(PanWindow *pw, PanItemType type,
-				     gint year, gint month, gint day,
-				     const gchar *key)
-{
-	GList *list = NULL;
-	GList *work;
-
-	work = g_list_last(pw->list_static);
-	while (work)
-		{
-		PanItem *pi;
-
-		pi = work->data;
-		work = work->prev;
-
-		if (pi->fd && (pi->type == type || type == PAN_ITEM_NONE) &&
-		    ((!key && !pi->key) || (key && pi->key && strcmp(key, pi->key) == 0)))
-			{
-			struct tm *tl;
-
-			tl = localtime(&pi->fd->date);
-			if (tl)
-				{
-				gint match;
-
-				match = (tl->tm_year == year - 1900);
-				if (match && month >= 0) match = (tl->tm_mon == month - 1);
-				if (match && day > 0) match = (tl->tm_mday == day);
-
-				if (match) list = g_list_prepend(list, pi);
-				}
-			}
-		}
-
-	return g_list_reverse(list);
-}
-
-static gboolean pan_search_by_date(PanWindow *pw, const gchar *text)
-{
-	PanItem *pi = NULL;
-	GList *list = NULL;
-	GList *found;
-	gint year;
-	gint month = -1;
-	gint day = -1;
-	gchar *ptr;
-	gchar *mptr;
-	struct tm *lt;
-	time_t t;
-	gchar *message;
-	gchar *buf;
-	gchar *buf_count;
-
-	if (!text) return FALSE;
-
-	ptr = (gchar *)text;
-	while (*ptr != '\0')
-		{
-		if (!g_unichar_isdigit(*ptr) && !valid_date_separator(*ptr)) return FALSE;
-		ptr++;
-		}
-
-	t = time(NULL);
-	if (t == -1) return FALSE;
-	lt = localtime(&t);
-	if (!lt) return FALSE;
-
-	if (valid_date_separator(*text))
-		{
-		year = -1;
-		mptr = (gchar *)text;
-		}
-	else
-		{
-		year = (gint)strtol(text, &mptr, 10);
-		if (mptr == text) return FALSE;
-		}
-
-	if (*mptr != '\0' && valid_date_separator(*mptr))
-		{
-		gchar *dptr;
-
-		mptr++;
-		month = strtol(mptr, &dptr, 10);
-		if (dptr == mptr)
-			{
-			if (valid_date_separator(*dptr))
-				{
-				month = lt->tm_mon + 1;
-				dptr++;
-				}
-			else
-				{
-				month = -1;
-				}
-			}
-		if (dptr != mptr && *dptr != '\0' && valid_date_separator(*dptr))
-			{
-			gchar *eptr;
-			dptr++;
-			day = strtol(dptr, &eptr, 10);
-			if (dptr == eptr)
-				{
-				day = lt->tm_mday;
-				}
-			}
-		}
-
-	if (year == -1)
-		{
-		year = lt->tm_year + 1900;
-		}
-	else if (year < 100)
-		{
-		if (year > 70)
-			year+= 1900;
-		else
-			year+= 2000;
-		}
-
-	if (year < 1970 ||
-	    month < -1 || month == 0 || month > 12 ||
-	    day < -1 || day == 0 || day > 31) return FALSE;
-
-	t = pan_date_to_time(year, month, day);
-	if (t < 0) return FALSE;
-
-	if (pw->layout == PAN_LAYOUT_CALENDAR)
-		{
-		list = pan_search_by_date_val(pw, PAN_ITEM_BOX, year, month, day, "day");
-		}
-	else
-		{
-		PanItemType type;
-
-		type = (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) ? PAN_ITEM_IMAGE : PAN_ITEM_THUMB;
-		list = pan_search_by_date_val(pw, type, year, month, day, NULL);
-		}
-
-	if (list)
-		{
-		found = g_list_find(list, pw->search_pi);
-		if (found && found->next)
-			{
-			found = found->next;
-			pi = found->data;
-			}
-		else
-			{
-			pi = list->data;
-			}
-		}
-
-	pw->search_pi = pi;
-
-	if (pw->layout == PAN_LAYOUT_CALENDAR && pi && pi->type == PAN_ITEM_BOX)
-		{
-		pan_info_update(pw, NULL);
-		pan_calendar_update(pw, pi);
-		image_scroll_to_point(pw->imd,
-				      pi->x + pi->width / 2,
-				      pi->y + pi->height / 2, 0.5, 0.5);
-		}
-	else if (pi)
-		{
-		pan_info_update(pw, pi);
-		image_scroll_to_point(pw->imd,
-				      pi->x - PAN_BOX_BORDER * 5 / 2,
-				      pi->y, 0.0, 0.5);
-		}
-
-	if (month > 0)
-		{
-		buf = pan_date_value_string(t, PAN_DATE_LENGTH_MONTH);
-		if (day > 0)
-			{
-			gchar *tmp;
-			tmp = buf;
-			buf = g_strdup_printf("%d %s", day, tmp);
-			g_free(tmp);
-			}
-		}
-	else
-		{
-		buf = pan_date_value_string(t, PAN_DATE_LENGTH_YEAR);
-		}
-
-	if (pi)
-		{
-		buf_count = g_strdup_printf("( %d / %d )",
-					    g_list_index(list, pi) + 1,
-					    g_list_length(list));
-		}
-	else
-		{
-		buf_count = g_strdup_printf("(%s)", _("no match"));
-		}
-
-	message = g_strdup_printf("%s %s %s", _("Date:"), buf, buf_count);
-	g_free(buf);
-	g_free(buf_count);
-	pan_search_status(pw, message);
-	g_free(message);
-
-	g_list_free(list);
-
-	return TRUE;
-}
-
-static void pan_search_activate_cb(const gchar *text, gpointer data)
-{
-	PanWindow *pw = data;
-
-	if (!text) return;
-
-	tab_completion_append_to_history(pw->search_entry, text);
-
-	if (pan_search_by_path(pw, text)) return;
-
-	if ((pw->layout == PAN_LAYOUT_TIMELINE ||
-	     pw->layout == PAN_LAYOUT_CALENDAR) &&
-	    pan_search_by_date(pw, text))
-		{
-		return;
-		}
-
-	if (pan_search_by_partial(pw, text)) return;
-
-	pan_search_status(pw, _("no match"));
-}
-
-static void pan_search_activate(PanWindow *pw)
-{
-	gchar *text;
-
-	text = g_strdup(gtk_entry_get_text(GTK_ENTRY(pw->search_entry)));
-	pan_search_activate_cb(text, pw);
-	g_free(text);
-}
-
-static void pan_search_toggle_cb(GtkWidget *button, gpointer data)
-{
-	PanWindow *pw = data;
-	gboolean visible;
-
-	visible = gtk_widget_get_visible(pw->search_box);
-	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) == visible) return;
-
-	if (visible)
-		{
-		gtk_widget_hide(pw->search_box);
-		gtk_arrow_set(GTK_ARROW(pw->search_button_arrow), GTK_ARROW_UP, GTK_SHADOW_NONE);
-		}
-	else
-		{
-		gtk_widget_show(pw->search_box);
-		gtk_arrow_set(GTK_ARROW(pw->search_button_arrow), GTK_ARROW_DOWN, GTK_SHADOW_NONE);
-		gtk_widget_grab_focus(pw->search_entry);
-		}
-}
-
-static void pan_search_toggle_visible(PanWindow *pw, gboolean enable)
-{
-	if (pw->fs) return;
-
-	if (enable)
-		{
-		if (gtk_widget_get_visible(pw->search_box))
-			{
-			gtk_widget_grab_focus(pw->search_entry);
-			}
-		else
-			{
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pw->search_button), TRUE);
-			}
-		}
-	else
-		{
-		if (gtk_widget_get_visible(pw->search_entry))
-			{
-			if (gtk_widget_has_focus(pw->search_entry))
-				{
-				gtk_widget_grab_focus(GTK_WIDGET(pw->imd->widget));
-				}
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pw->search_button), FALSE);
-			}
-		}
-}
-
-
-/*
- *-----------------------------------------------------------------------------
  * main window
  *-----------------------------------------------------------------------------
  */
@@ -2126,6 +1737,8 @@
 		}
 
 	pan_fullscreen_toggle(pw, TRUE);
+	pan_search_ui_destroy(&pw->search_ui);
+	pan_filter_ui_destroy(&pw->filter_ui);
 	gtk_widget_destroy(pw->window);
 
 	pan_window_items_free(pw);
@@ -2271,24 +1884,12 @@
 
 	/* find bar */
 
-	pw->search_box = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox), pw->search_box, FALSE, FALSE, 2);
-
-	pref_spacer(pw->search_box, 0);
-	pref_label_new(pw->search_box, _("Find:"));
-
-	hbox = gtk_hbox_new(TRUE, PREF_PAD_SPACE);
-	gtk_box_pack_start(GTK_BOX(pw->search_box), hbox, TRUE, TRUE, 0);
-	gtk_widget_show(hbox);
-
-	combo = tab_completion_new_with_history(&pw->search_entry, "", "pan_view_search", -1,
-						pan_search_activate_cb, pw);
-	gtk_box_pack_start(GTK_BOX(hbox), combo, TRUE, TRUE, 0);
-	gtk_widget_show(combo);
-
-	pw->search_label = gtk_label_new("");
-	gtk_box_pack_start(GTK_BOX(hbox), pw->search_label, TRUE, TRUE, 0);
-	gtk_widget_show(pw->search_label);
+	pw->search_ui = pan_search_ui_new(pw);
+	gtk_box_pack_start(GTK_BOX(vbox), pw->search_ui->search_box, FALSE, FALSE, 2);
+
+    /* filter bar */
+    pw->filter_ui = pan_filter_ui_new(pw);
+    gtk_box_pack_start(GTK_BOX(vbox), pw->filter_ui->filter_box, FALSE, FALSE, 2);
 
 	/* status bar */
 
@@ -2317,21 +1918,13 @@
 	gtk_container_add(GTK_CONTAINER(frame), pw->label_zoom);
 	gtk_widget_show(pw->label_zoom);
 
-	pw->search_button = gtk_toggle_button_new();
-	gtk_button_set_relief(GTK_BUTTON(pw->search_button), GTK_RELIEF_NONE);
-	gtk_button_set_focus_on_click(GTK_BUTTON(pw->search_button), FALSE);
-	hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP);
-	gtk_container_add(GTK_CONTAINER(pw->search_button), hbox);
-	gtk_widget_show(hbox);
-	pw->search_button_arrow = gtk_arrow_new(GTK_ARROW_UP, GTK_SHADOW_NONE);
-	gtk_box_pack_start(GTK_BOX(hbox), pw->search_button_arrow, FALSE, FALSE, 0);
-	gtk_widget_show(pw->search_button_arrow);
-	pref_label_new(hbox, _("Find"));
-
-	gtk_box_pack_end(GTK_BOX(box), pw->search_button, FALSE, FALSE, 0);
-	gtk_widget_show(pw->search_button);
-	g_signal_connect(G_OBJECT(pw->search_button), "clicked",
-			 G_CALLBACK(pan_search_toggle_cb), pw);
+	// Add the "Find" button to the status bar area.
+	gtk_box_pack_end(GTK_BOX(box), pw->search_ui->search_button, FALSE, FALSE, 0);
+	gtk_widget_show(pw->search_ui->search_button);
+
+	// Add the "Filter" button to the status bar area.
+	gtk_box_pack_end(GTK_BOX(box), pw->filter_ui->filter_button, FALSE, FALSE, 0);
+	gtk_widget_show(pw->filter_ui->filter_button);
 
 	g_signal_connect(G_OBJECT(pw->window), "delete_event",
 			 G_CALLBACK(pan_window_delete_cb), pw);
--- a/src/pan-view/pan-view.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pan-view/pan-view.h	Sat Jul 08 10:32:34 2017 +0100
@@ -25,6 +25,7 @@
 #include "main.h"
 #include "pan-types.h"
 
+void pan_layout_update(PanWindow *pw);
 GList *pan_layout_intersect(PanWindow *pw, gint x, gint y, gint width, gint height);
 void pan_layout_resize(PanWindow *pw);
 
@@ -32,6 +33,7 @@
 
 GList *pan_cache_sort(GList *list, SortType method, gboolean ascend);
 
+void pan_info_update(PanWindow *pw, PanItem *pi);
 
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/pixbuf-renderer.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pixbuf-renderer.c	Sat Jul 08 10:32:34 2017 +0100
@@ -105,7 +105,8 @@
 	PROP_WINDOW_LIMIT,
 	PROP_WINDOW_LIMIT_VALUE,
 	PROP_AUTOFIT_LIMIT,
-	PROP_AUTOFIT_LIMIT_VALUE
+	PROP_AUTOFIT_LIMIT_VALUE,
+	PROP_ENLARGEMENT_LIMIT_VALUE
 };
 
 typedef enum {
@@ -329,6 +330,16 @@
 							  100,
 							  G_PARAM_READABLE | G_PARAM_WRITABLE));
 
+	g_object_class_install_property(gobject_class,
+					PROP_ENLARGEMENT_LIMIT_VALUE,
+					g_param_spec_uint("enlargement_limit_value",
+							  "Size increase limit of image when autofitting",
+							  NULL,
+							  100,
+							  999,
+							  500,
+							  G_PARAM_READABLE | G_PARAM_WRITABLE));
+
 
 	signals[SIGNAL_ZOOM] =
 		g_signal_new("zoom",
@@ -530,6 +541,9 @@
 		case PROP_AUTOFIT_LIMIT_VALUE:
 			pr->autofit_limit_size = g_value_get_uint(value);
 			break;
+		case PROP_ENLARGEMENT_LIMIT_VALUE:
+			pr->enlargement_limit_size = g_value_get_uint(value);
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
 			break;
@@ -593,6 +607,9 @@
 		case PROP_AUTOFIT_LIMIT_VALUE:
 			g_value_set_uint(value, pr->autofit_limit_size);
 			break;
+		case PROP_ENLARGEMENT_LIMIT_VALUE:
+			g_value_set_uint(value, pr->enlargement_limit_size);
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
 			break;
@@ -1303,9 +1320,9 @@
 		}
 }
 
-static void pr_drag_signal(PixbufRenderer *pr, GdkEventButton *bevent)
+static void pr_drag_signal(PixbufRenderer *pr, GdkEventMotion *event)
 {
-	g_signal_emit(pr, signals[SIGNAL_DRAG], 0, bevent);
+	g_signal_emit(pr, signals[SIGNAL_DRAG], 0, event);
 }
 
 static void pr_update_pixel_signal(PixbufRenderer *pr)
@@ -1665,6 +1682,17 @@
 				scale = scale * factor;
 				}
 
+			if (pr->zoom_expand)
+				{
+				gdouble factor = (gdouble)pr->enlargement_limit_size / 100;
+				if (scale > factor)
+					{
+					w = w * factor / scale;
+					h = h * factor / scale;
+					scale = factor;
+					}
+				}
+
 			if (w < 1) w = 1;
 			if (h < 1) h = 1;
 			}
@@ -1723,10 +1751,10 @@
 		}
 
 	if (force) clamp_flags |= PR_ZOOM_INVALIDATE;
+	(void) pr_parent_window_resize(pr, pr->width, pr->height);
 	if (!pr_zoom_clamp(pr, zoom, clamp_flags)) return;
 
 	(void) pr_size_clamp(pr);
-	(void) pr_parent_window_resize(pr, pr->width, pr->height);
 
 	if (force && new)
 		{
@@ -1954,7 +1982,7 @@
  *-------------------------------------------------------------------
  */
 
-static gboolean pr_mouse_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+static gboolean pr_mouse_motion_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data)
 {
 	PixbufRenderer *pr;
 	gint accel;
@@ -1967,25 +1995,25 @@
 	 * See http://bugzilla.gnome.org/show_bug.cgi?id=587714 for more. */
 	gint x, y;
 #if GTK_CHECK_VERSION(3,0,0)
-	device_manager = gdk_display_get_device_manager(gdk_window_get_display(bevent->window));
+	device_manager = gdk_display_get_device_manager(gdk_window_get_display(event->window));
 	device = gdk_device_manager_get_client_pointer(device_manager);
-	gdk_window_get_device_position(bevent->window, device, &x, &y, NULL);
+	gdk_window_get_device_position(event->window, device, &x, &y, NULL);
 #else
-	gdk_window_get_pointer (bevent->window, &x, &y, NULL);
+	gdk_window_get_pointer (event->window, &x, &y, NULL);
 #endif
-	bevent->x = x;
-	bevent->y = y;
+	event->x = x;
+	event->y = y;
 
 	pr = PIXBUF_RENDERER(widget);
 
 	if (pr->scroller_id)
 		{
-		pr->scroller_xpos = bevent->x;
-		pr->scroller_ypos = bevent->y;
+		pr->scroller_xpos = event->x;
+		pr->scroller_ypos = event->y;
 		}
 
-	pr->x_mouse = bevent->x;
-	pr->y_mouse = bevent->y;
+	pr->x_mouse = event->x;
+	pr->y_mouse = event->y;
 	pr_update_pixel_signal(pr);
 
 	if (!pr->in_drag || !gdk_pointer_is_grabbed()) return FALSE;
@@ -1999,7 +2027,7 @@
 		widget_set_cursor(widget, GDK_FLEUR);
 		}
 
-	if (bevent->state & GDK_CONTROL_MASK)
+	if (event->state & GDK_CONTROL_MASK)
 		{
 		accel = PR_PAN_SHIFT_MULTIPLIER;
 		}
@@ -2009,19 +2037,19 @@
 		}
 
 	/* do the scroll */
-	pixbuf_renderer_scroll(pr, (pr->drag_last_x - bevent->x) * accel,
-			       (pr->drag_last_y - bevent->y) * accel);
-
-	pr_drag_signal(pr, bevent);
-
-	pr->drag_last_x = bevent->x;
-	pr->drag_last_y = bevent->y;
+	pixbuf_renderer_scroll(pr, (pr->drag_last_x - event->x) * accel,
+			       (pr->drag_last_y - event->y) * accel);
+
+	pr_drag_signal(pr, event);
+
+	pr->drag_last_x = event->x;
+	pr->drag_last_y = event->y;
 
 	/* This is recommended by the GTK+ documentation, but does not work properly.
 	 * Use deprecated way until GTK+ gets a solution for correct motion hint handling:
 	 * http://bugzilla.gnome.org/show_bug.cgi?id=587714
 	 */
-	/* gdk_event_request_motions (bevent); */
+	/* gdk_event_request_motions (event); */
 	return FALSE;
 }
 
--- a/src/pixbuf-renderer.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/pixbuf-renderer.h	Sat Jul 08 10:32:34 2017 +0100
@@ -29,9 +29,7 @@
 #define IS_PIXBUF_RENDERER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), TYPE_PIXBUF_RENDERER))
 #define PIXBUF_RENDERER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_PIXBUF_RENDERER, PixbufRendererClass))
 
-/* alpha channel checkerboard background (same as gimp) */
-#define PR_ALPHA_CHECK1 0x00999999
-#define PR_ALPHA_CHECK2 0x00666666
+/* alpha channel checkerboard (same as gimp) */
 #define PR_ALPHA_CHECK_SIZE 16
 /* when scaling image to below this size, use nearest pixel for scaling
  * (below about 4, the other scale types become slow generating their conversion tables)
@@ -160,6 +158,7 @@
 
 	gboolean autofit_limit;
 	gint autofit_limit_size;
+	gint enlargement_limit_size;
 
 	GdkColor color;
 
@@ -226,7 +225,7 @@
 	void (*update_pixel)(PixbufRenderer *pr);
 
 	void (*render_complete)(PixbufRenderer *pr);
-	void (*drag)(PixbufRenderer *pr, GdkEventButton *event);
+	void (*drag)(PixbufRenderer *pr, GdkEventMotion *event);
 };
 
 
--- a/src/preferences.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/preferences.c	Sat Jul 08 10:32:34 2017 +0100
@@ -236,6 +236,7 @@
 	options->image.max_window_size = c_options->image.max_window_size;
 	options->image.limit_autofit_size = c_options->image.limit_autofit_size;
 	options->image.max_autofit_size = c_options->image.max_autofit_size;
+	options->image.max_enlargement_size = c_options->image.max_enlargement_size;
 	options->image.use_clutter_renderer = c_options->image.use_clutter_renderer;
 	options->progressive_key_scrolling = c_options->progressive_key_scrolling;
 	options->keyboard_scroll_step = c_options->keyboard_scroll_step;
@@ -276,8 +277,6 @@
 
 	options->file_ops.enable_in_place_rename = c_options->file_ops.enable_in_place_rename;
 
-	options->collections.rectangular_selection = c_options->collections.rectangular_selection;
-
 	options->image.tile_cache_max = c_options->image.tile_cache_max;
 	options->image.image_cache_max = c_options->image.image_cache_max;
 
@@ -299,6 +298,9 @@
 		view_window_colors_update();
 		}
 
+	options->image.alpha_color_1 = c_options->image.alpha_color_1;
+	options->image.alpha_color_2 = c_options->image.alpha_color_2;
+
 	options->fullscreen.screen = c_options->fullscreen.screen;
 	options->fullscreen.clean_flip = c_options->fullscreen.clean_flip;
 	options->fullscreen.disable_saver = c_options->fullscreen.disable_saver;
@@ -318,7 +320,6 @@
 	options->image_overlay.background_blue = c_options->image_overlay.background_blue;
 	options->image_overlay.background_alpha = c_options->image_overlay.background_alpha;
 	options->update_on_time_change = c_options->update_on_time_change;
-	options->image.exif_rotate_enable = c_options->image.exif_rotate_enable;
 	options->image.exif_proof_rotate_enable = c_options->image.exif_proof_rotate_enable;
 
 	options->duplicates_similarity_threshold = c_options->duplicates_similarity_threshold;
@@ -337,6 +338,7 @@
 	options->metadata.save_legacy_format = c_options->metadata.save_legacy_format;
 	options->metadata.sync_grouped_files = c_options->metadata.sync_grouped_files;
 	options->metadata.confirm_write = c_options->metadata.confirm_write;
+	options->metadata.sidecar_extended_name = c_options->metadata.sidecar_extended_name;
 	options->metadata.confirm_timeout = c_options->metadata.confirm_timeout;
 	options->metadata.confirm_after_timeout = c_options->metadata.confirm_after_timeout;
 	options->metadata.confirm_on_image_change = c_options->metadata.confirm_on_image_change;
@@ -365,6 +367,11 @@
 	options->stereo.fixed_x2 = c_options->stereo.fixed_x2;
 	options->stereo.fixed_y2 = c_options->stereo.fixed_y2;
 
+	options->info_keywords.height = c_options->info_keywords.height;
+	options->info_title.height = c_options->info_title.height;
+	options->info_comment.height = c_options->info_comment.height;
+	options->info_rating.height = c_options->info_rating.height;
+
 #ifdef DEBUG
 	set_debug_level(debug_c);
 #endif
@@ -410,7 +417,7 @@
 
 static void config_window_help_cb(GtkWidget *widget, gpointer data)
 {
-	GtkWidget *notebook = GTK_WIDGET(data);
+	GtkWidget *notebook = data;
 	gint i;
 
 	static gchar *html_section[] =
@@ -444,7 +451,11 @@
 
 static void config_window_apply_cb(GtkWidget *widget, gpointer data)
 {
+	LayoutWindow *lw;
+	lw = layout_window_list->data;
+
 	config_window_apply();
+	layout_util_sync(lw);
 }
 
 static void config_window_save_cb(GtkWidget *widget, gpointer data)
@@ -1412,6 +1423,7 @@
 static void config_tab_general(GtkWidget *notebook)
 {
 	GtkWidget *vbox;
+	GtkWidget *hbox;
 	GtkWidget *group;
 	GtkWidget *subgroup;
 	GtkWidget *button;
@@ -1466,6 +1478,22 @@
 
 	pref_checkbox_new_int(group, _("Refresh on file change"),
 			      options->update_on_time_change, &c_options->update_on_time_change);
+
+	group = pref_group_new(vbox, FALSE, _("Info sidebar heights"), GTK_ORIENTATION_VERTICAL);
+	pref_label_new(group, _("NOTE! Geeqie must be restarted for changes to take effect"));
+	hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+	pref_spin_new_int(hbox, _("Keywords:"), NULL,
+				 1, 9999, 1,
+				 options->info_keywords.height, &c_options->info_keywords.height);
+	pref_spin_new_int(hbox, _("Title:"), NULL,
+				 1, 9999, 1,
+				 options->info_title.height, &c_options->info_title.height);
+	pref_spin_new_int(hbox, _("Comment:"), NULL,
+				 1, 9999, 1,
+				 options->info_comment.height, &c_options->info_comment.height);
+	pref_spin_new_int(hbox, _("Rating:"), NULL,
+				 1, 9999, 1,
+				 options->info_rating.height, &c_options->info_rating.height);
 }
 
 /* image tab */
@@ -1477,6 +1505,7 @@
 	GtkWidget *group;
 	GtkWidget *button;
 	GtkWidget *ct_button;
+	GtkWidget *enlargement_button;
 	GtkWidget *table;
 	GtkWidget *spin;
 
@@ -1495,11 +1524,16 @@
 	pref_checkbox_new_int(group, _("Two pass rendering (apply HQ zoom and color correction in second pass)"),
 			      options->image.zoom_2pass, &c_options->image.zoom_2pass);
 
-	pref_checkbox_new_int(group, _("Allow enlargement of image for zoom to fit"),
+	hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+	enlargement_button = pref_checkbox_new_int(hbox, _("Allow enlargement of image for zoom to fit (max. size in %)"),
 			      options->image.zoom_to_fit_allow_expand, &c_options->image.zoom_to_fit_allow_expand);
+	spin = pref_spin_new_int(hbox, NULL, NULL,
+				 100, 999, 1,
+				 options->image.max_enlargement_size, &c_options->image.max_enlargement_size);
+	pref_checkbox_link_sensitivity(enlargement_button, spin);
 
 	hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
-	ct_button = pref_checkbox_new_int(hbox, _("Limit image size when autofitting (%):"),
+	ct_button = pref_checkbox_new_int(hbox, _("Limit image size when autofitting (% of window):"),
 					  options->image.limit_autofit_size, &c_options->image.limit_autofit_size);
 	spin = pref_spin_new_int(hbox, NULL, NULL,
 				 10, 150, 1,
@@ -1512,33 +1546,6 @@
 			     G_CALLBACK(zoom_increment_cb), NULL);
 	gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
 
-	group = pref_group_new(vbox, FALSE, _("When new image is selected:"), GTK_ORIENTATION_HORIZONTAL);
-
-	vbox2 = pref_box_new(group, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
-	c_options->image.zoom_mode = options->image.zoom_mode;
-	button = pref_radiobutton_new(vbox2, NULL, _("Zoom to original size"),
-				      (options->image.zoom_mode == ZOOM_RESET_ORIGINAL),
-				      G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_ORIGINAL));
-	button = pref_radiobutton_new(vbox2, button, _("Fit image to window"),
-				      (options->image.zoom_mode == ZOOM_RESET_FIT_WINDOW),
-				      G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_FIT_WINDOW));
-	button = pref_radiobutton_new(vbox2, button, _("Leave Zoom at previous setting"),
-				      (options->image.zoom_mode == ZOOM_RESET_NONE),
-				      G_CALLBACK(zoom_mode_cb), GINT_TO_POINTER(ZOOM_RESET_NONE));
-
-	vbox2 = pref_box_new(group, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
-	c_options->image.scroll_reset_method = options->image.scroll_reset_method;
-	button = pref_radiobutton_new(vbox2, NULL, _("Scroll to top left corner"),
-				      (options->image.scroll_reset_method == SCROLL_RESET_TOPLEFT),
-				      G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_TOPLEFT));
-	button = pref_radiobutton_new(vbox2, button, _("Scroll to image center"),
-				      (options->image.scroll_reset_method == SCROLL_RESET_CENTER),
-				      G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_CENTER));
-	button = pref_radiobutton_new(vbox2, button, _("Keep the region from previous image"),
-				      (options->image.scroll_reset_method == SCROLL_RESET_NOCHANGE),
-				      G_CALLBACK(scroll_reset_cb), GINT_TO_POINTER(SCROLL_RESET_NOCHANGE));
-
-
 	group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL);
 
 	pref_checkbox_new_int(group, _("Use custom border color in window mode"),
@@ -1550,11 +1557,19 @@
 	pref_color_button_new(group, _("Border color"), &options->image.border_color,
 			      G_CALLBACK(pref_color_button_set_cb), &c_options->image.border_color);
 
+	c_options->image.border_color = options->image.border_color;
+
+	pref_color_button_new(group, _("Alpha channel color 1"), &options->image.alpha_color_1,
+			      G_CALLBACK(pref_color_button_set_cb), &c_options->image.alpha_color_1);
+
+	pref_color_button_new(group, _("Alpha channel color 2"), &options->image.alpha_color_2,
+			      G_CALLBACK(pref_color_button_set_cb), &c_options->image.alpha_color_2);
+
+	c_options->image.alpha_color_1 = options->image.alpha_color_1;
+	c_options->image.alpha_color_2 = options->image.alpha_color_2;
+
 	group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
 
-	pref_checkbox_new_int(group, _("Auto rotate image using Exif information"),
-			      options->image.exif_rotate_enable, &c_options->image.exif_rotate_enable);
-
 	pref_checkbox_new_int(group, _("Auto rotate proofs using Exif information"),
 			      options->image.exif_proof_rotate_enable, &c_options->image.exif_proof_rotate_enable);
 }
@@ -1882,7 +1897,7 @@
 	label = pref_label_new(group, _("Metadata are written in the following order. The process ends after first success."));
 	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
 
-	ct_button = pref_checkbox_new_int(group, _("1) Save metadata in image files, resp. sidecar files, according to the XMP standard"),
+	ct_button = pref_checkbox_new_int(group, _("1) Save metadata in image files, or sidecar files, according to the XMP standard"),
 			      options->metadata.save_in_image_file, &c_options->metadata.save_in_image_file);
 #ifndef HAVE_EXIV2
 	gtk_widget_set_sensitive(ct_button, FALSE);
@@ -1914,6 +1929,9 @@
 	pref_checkbox_new_int(hbox, _("Ask before writing to image files"),
 			      options->metadata.confirm_write, &c_options->metadata.confirm_write);
 
+	pref_checkbox_new_int(hbox, _("Create sidecar files named image.ext.xmp (as opposed to image.xmp)"),
+			      options->metadata.sidecar_extended_name, &c_options->metadata.sidecar_extended_name);
+
 	group = pref_group_new(vbox, FALSE, _("Step 2 and 3: write to Geeqie private files"), GTK_ORIENTATION_VERTICAL);
 #ifndef HAVE_EXIV2
 	gtk_widget_set_sensitive(group, FALSE);
@@ -2147,9 +2165,6 @@
 
 	group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
 
-	pref_checkbox_new_int(group, _("Rectangular selection in icon view"),
-			      options->collections.rectangular_selection, &c_options->collections.rectangular_selection);
-
 	pref_checkbox_new_int(group, _("Descend folders in tree view"),
 			      options->tree_descend_subdirs, &c_options->tree_descend_subdirs);
 
@@ -2159,7 +2174,7 @@
 	pref_checkbox_new_int(group, _("List directory view uses single click to enter"),
 			      options->view_dir_list_single_click_enter, &c_options->view_dir_list_single_click_enter);
 
-	pref_spin_new_int(group, _("Open recent list maximum size"), NULL,
+	pref_spin_new_int(group, _("Recent folder list maximum size"), NULL,
 			  1, 50, 1, options->open_recent_list_maxsize, &c_options->open_recent_list_maxsize);
 
 	pref_spin_new_int(group, _("Drag'n drop icon size"), NULL,
@@ -2176,18 +2191,14 @@
 	pref_checkbox_new_int(group, _("Navigation by left or middle click on image"),
 			      options->image_lm_click_nav, &c_options->image_lm_click_nav);
 
-	group = pref_group_new(vbox, FALSE, _("Similarities"), GTK_ORIENTATION_VERTICAL);
-
-	pref_spin_new_int(group, _("Custom similarity threshold:"), NULL,
-			  0, 100, 1, options->duplicates_similarity_threshold, (int *)&c_options->duplicates_similarity_threshold);
-	pref_checkbox_new_int(group, _("Rotation invariant duplicate check"),
-			      options->rot_invariant_sim, &c_options->rot_invariant_sim);
-
 #ifdef DEBUG
 	group = pref_group_new(vbox, FALSE, _("Debugging"), GTK_ORIENTATION_VERTICAL);
 
 	pref_spin_new_int(group, _("Debug level:"), NULL,
 			  DEBUG_LEVEL_MIN, DEBUG_LEVEL_MAX, 1, get_debug_level(), &debug_c);
+
+	pref_spin_new_int(group, _("Log Window max. lines:"), NULL,
+			  1, 99999, 1, options->log_window_lines, &options->log_window_lines);
 #endif
 }
 
--- a/src/print.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/print.c	Sat Jul 08 10:32:34 2017 +0100
@@ -23,6 +23,7 @@
 #include "print.h"
 
 #include "filedata.h"
+#include "filefilter.h"
 #include "image.h"
 #include "image-load.h"
 #include "pixbuf_util.h"
@@ -1449,7 +1450,7 @@
 		const gchar *ext;
 		gchar *base;
 
-		ext = extension_from_path(pw->output_path);
+		ext = registered_extension_from_path(pw->output_path);
 
 		if (ext)
 			{
--- a/src/rcfile.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/rcfile.c	Sat Jul 08 10:32:34 2017 +0100
@@ -43,6 +43,7 @@
 #include "bar.h"
 #include "metadata.h"
 #include "bar_gps.h"
+#include "dupe.h"
 
 
 /*
@@ -317,7 +318,11 @@
 	WRITE_NL(); WRITE_UINT(*options, keyboard_scroll_step);
 
 	WRITE_NL(); WRITE_UINT(*options, duplicates_similarity_threshold);
+	WRITE_NL(); WRITE_UINT(*options, duplicates_match);
+	WRITE_NL(); WRITE_UINT(*options, duplicates_select_type);
+	WRITE_NL(); WRITE_BOOL(*options, duplicates_thumbnails);
 	WRITE_NL(); WRITE_BOOL(*options, rot_invariant_sim);
+	WRITE_NL(); WRITE_BOOL(*options, sort_totals);
 	WRITE_SEPARATOR();
 
 	WRITE_NL(); WRITE_BOOL(*options, mousewheel_scrolls);
@@ -330,6 +335,8 @@
 	WRITE_NL(); WRITE_BOOL(*options, use_saved_window_positions_for_new_windows);
 	WRITE_NL(); WRITE_BOOL(*options, tools_restore_state);
 
+	WRITE_NL(); WRITE_UINT(*options, log_window_lines);
+
 	/* File operations Options */
 	WRITE_NL(); WRITE_BOOL(*options, file_ops.enable_in_place_rename);
 	WRITE_NL(); WRITE_BOOL(*options, file_ops.confirm_delete);
@@ -354,6 +361,7 @@
 	WRITE_NL(); WRITE_INT(*options, image.max_window_size);
 	WRITE_NL(); WRITE_BOOL(*options, image.limit_autofit_size);
 	WRITE_NL(); WRITE_INT(*options, image.max_autofit_size);
+	WRITE_NL(); WRITE_INT(*options, image.max_enlargement_size);
 	WRITE_NL(); WRITE_UINT(*options, image.scroll_reset_method);
 	WRITE_NL(); WRITE_INT(*options, image.tile_cache_max);
 	WRITE_NL(); WRITE_INT(*options, image.image_cache_max);
@@ -362,6 +370,8 @@
 	WRITE_NL(); WRITE_BOOL(*options, image.use_custom_border_color);
 	WRITE_NL(); WRITE_BOOL(*options, image.use_custom_border_color_in_fullscreen);
 	WRITE_NL(); WRITE_COLOR(*options, image.border_color);
+	WRITE_NL(); WRITE_COLOR(*options, image.alpha_color_1);
+	WRITE_NL(); WRITE_COLOR(*options, image.alpha_color_2);
 	WRITE_NL(); WRITE_BOOL(*options, image.use_clutter_renderer);
 
 	/* Thumbnails Options */
@@ -438,6 +448,7 @@
 	WRITE_NL(); WRITE_BOOL(*options, metadata.save_legacy_format);
 	WRITE_NL(); WRITE_BOOL(*options, metadata.sync_grouped_files);
 	WRITE_NL(); WRITE_BOOL(*options, metadata.confirm_write);
+	WRITE_NL(); WRITE_BOOL(*options, metadata.sidecar_extended_name);
 	WRITE_NL(); WRITE_INT(*options, metadata.confirm_timeout);
 	WRITE_NL(); WRITE_BOOL(*options, metadata.confirm_after_timeout);
 	WRITE_NL(); WRITE_BOOL(*options, metadata.confirm_on_image_change);
@@ -454,6 +465,12 @@
 	WRITE_NL(); WRITE_INT(*options, stereo.fixed_y1);
 	WRITE_NL(); WRITE_INT(*options, stereo.fixed_x2);
 	WRITE_NL(); WRITE_INT(*options, stereo.fixed_y2);
+
+	/* copy move rename */
+	WRITE_NL(); WRITE_INT(*options, cp_mv_rn.auto_start);
+	WRITE_NL(); WRITE_INT(*options, cp_mv_rn.auto_padding);
+	WRITE_NL(); WRITE_CHAR(*options, cp_mv_rn.auto_end);
+	WRITE_NL(); WRITE_INT(*options, cp_mv_rn.formatted_start);
 }
 
 static void write_color_profile(GString *outstr, gint indent)
@@ -594,7 +611,11 @@
 		if (READ_BOOL(*options, update_on_time_change)) continue;
 
 		if (READ_UINT_CLAMP(*options, duplicates_similarity_threshold, 0, 100)) continue;
+		if (READ_UINT_CLAMP(*options, duplicates_match, 0, DUPE_MATCH_NAME_CI)) continue;
+		if (READ_UINT_CLAMP(*options, duplicates_select_type, 0, DUPE_SELECT_GROUP2)) continue;
+		if (READ_BOOL(*options, duplicates_thumbnails)) continue;
 		if (READ_BOOL(*options, rot_invariant_sim)) continue;
+		if (READ_BOOL(*options, sort_totals)) continue;
 
 		if (READ_BOOL(*options, progressive_key_scrolling)) continue;
 		if (READ_UINT_CLAMP(*options, keyboard_scroll_step, 1, 32)) continue;
@@ -610,6 +631,8 @@
 		if (READ_BOOL(*options, use_saved_window_positions_for_new_windows)) continue;
 		if (READ_BOOL(*options, tools_restore_state)) continue;
 
+		if (READ_INT(*options, log_window_lines)) continue;
+
 		/* Properties dialog options */
 		if (READ_CHAR(*options, properties.tabs_order)) continue;
 
@@ -622,6 +645,7 @@
 		if (READ_INT(*options, image.max_window_size)) continue;
 		if (READ_BOOL(*options, image.limit_autofit_size)) continue;
 		if (READ_INT(*options, image.max_autofit_size)) continue;
+		if (READ_INT(*options, image.max_enlargement_size)) continue;
 		if (READ_UINT_CLAMP(*options, image.scroll_reset_method, 0, PR_SCROLL_RESET_COUNT - 1)) continue;
 		if (READ_INT(*options, image.tile_cache_max)) continue;
 		if (READ_INT(*options, image.image_cache_max)) continue;
@@ -632,6 +656,8 @@
 		if (READ_BOOL(*options, image.use_custom_border_color)) continue;
 		if (READ_BOOL(*options, image.use_custom_border_color_in_fullscreen)) continue;
 		if (READ_COLOR(*options, image.border_color)) continue;
+		if (READ_COLOR(*options, image.alpha_color_1)) continue;
+		if (READ_COLOR(*options, image.alpha_color_2)) continue;
 		if (READ_BOOL(*options, image.use_clutter_renderer)) continue;
 
 		/* Thumbnails options */
@@ -713,6 +739,7 @@
 		if (READ_BOOL(*options, metadata.save_legacy_format)) continue;
 		if (READ_BOOL(*options, metadata.sync_grouped_files)) continue;
 		if (READ_BOOL(*options, metadata.confirm_write)) continue;
+		if (READ_BOOL(*options, metadata.sidecar_extended_name)) continue;
 		if (READ_BOOL(*options, metadata.confirm_after_timeout)) continue;
 		if (READ_INT(*options, metadata.confirm_timeout)) continue;
 		if (READ_BOOL(*options, metadata.confirm_on_image_change)) continue;
@@ -730,6 +757,12 @@
 		if (READ_INT(*options, stereo.fixed_x2)) continue;
 		if (READ_INT(*options, stereo.fixed_y2)) continue;
 
+		/* copy move rename */
+		if (READ_INT(*options, cp_mv_rn.auto_start))  continue;
+		if (READ_INT(*options, cp_mv_rn.auto_padding)) continue;
+		if (READ_CHAR(*options, cp_mv_rn.auto_end)) continue;
+		if (READ_INT(*options, cp_mv_rn.formatted_start)) continue;
+
 		/* Dummy options */
 		if (READ_DUMMY(*options, image.dither_quality, "deprecated since 2012-08-13")) continue;
 
@@ -933,6 +966,22 @@
 		}
 }
 
+static void options_parse_pane_keywords(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
+{
+	GtkWidget *pane = data;
+
+	if (g_ascii_strcasecmp(element_name, "expanded") == 0)
+		{
+		bar_pane_keywords_entry_add_from_config(pane, attribute_names, attribute_values);
+		options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+		}
+	else
+		{
+		log_printf("unexpected in <pane_keywords>: <%s>\n", element_name);
+		options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+		}
+}
+
 static void options_parse_bar(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
 {
 	GtkWidget *bar = data;
@@ -1008,7 +1057,7 @@
 			pane = bar_pane_keywords_new_from_config(attribute_names, attribute_values);
 			bar_add(bar, pane);
 			}
-		options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+		options_parse_func_push(parser_data, options_parse_pane_keywords, NULL, pane);
 		}
 	else if (g_ascii_strcasecmp(element_name, "clear") == 0)
 		{
@@ -1048,12 +1097,17 @@
 
 		options_parse_func_push(parser_data, options_parse_bar, NULL, lw->bar);
 		}
+#if 0
+/* FIXME: The sort manager and desktop files are set up in the idle loop.
+ * Setup is not yet completed when the layout is first displayed.
+ */
 	else if (g_ascii_strcasecmp(element_name, "bar_sort") == 0)
 		{
 		GtkWidget *bar = bar_sort_new_from_config(lw, attribute_names, attribute_values);
 		layout_bar_sort_set(lw, bar);
 		options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
 		}
+#endif
 	else if (g_ascii_strcasecmp(element_name, "toolbar") == 0)
 		{
 		options_parse_func_push(parser_data, options_parse_toolbar_and_statusbar, NULL, NULL);
--- a/src/remote.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/remote.c	Sat Jul 08 10:32:34 2017 +0100
@@ -22,8 +22,10 @@
 #include "main.h"
 #include "remote.h"
 
+#include "cache_maint.h"
 #include "collect.h"
 #include "filedata.h"
+#include "image.h"
 #include "img-view.h"
 #include "layout.h"
 #include "layout_image.h"
@@ -50,6 +52,7 @@
 
 static RemoteConnection *remote_client_open(const gchar *path);
 static gint remote_client_send(RemoteConnection *rc, const gchar *text);
+static void gr_raise(const gchar *text, GIOChannel *channel, gpointer data);
 
 
 typedef struct _RemoteClient RemoteClient;
@@ -428,6 +431,54 @@
 	layout_image_slideshow_start_from_list(NULL, list);
 }
 
+static void gr_cache_thumb(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if (!g_strcmp0(text, "clear"))
+		cache_maintain_home_remote(FALSE, TRUE);
+	else if (!g_strcmp0(text, "clean"))
+		cache_maintain_home_remote(FALSE, FALSE);
+}
+
+static void gr_cache_shared(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if (!g_strcmp0(text, "clear"))
+		cache_manager_standard_process_remote(TRUE);
+	else if (!g_strcmp0(text, "clean"))
+		cache_manager_standard_process_remote(FALSE);
+}
+
+static void gr_cache_metadata(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_maintain_home_remote(TRUE, FALSE);
+}
+
+static void gr_cache_clear(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_maintain_home_remote(FALSE, TRUE);
+}
+
+static void gr_cache_render(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_manager_render_remote(text, FALSE, FALSE);
+}
+
+static void gr_cache_render_recurse(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_manager_render_remote(text, TRUE, FALSE);
+}
+
+static void gr_cache_render_standard(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if(options->thumbnails.spec_standard)
+		cache_manager_render_remote(text, FALSE, TRUE);
+}
+
+static void gr_cache_render_standard_recurse(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if(options->thumbnails.spec_standard)
+		cache_manager_render_remote(text, TRUE, TRUE);
+}
+
 static void gr_slideshow_toggle(const gchar *text, GIOChannel *channel, gpointer data)
 {
 	layout_image_slideshow_toggle(NULL);
@@ -494,7 +545,7 @@
 	g_idle_add(gr_quit_idle_cb, NULL);
 }
 
-static void gr_file_load(const gchar *text, GIOChannel *channel, gpointer data)
+static void gr_file_load_no_raise(const gchar *text, GIOChannel *channel, gpointer data)
 {
 	gchar *filename = expand_tilde(text);
 
@@ -522,6 +573,24 @@
 	g_free(filename);
 }
 
+static void gr_file_load(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	gr_file_load_no_raise(text, channel, data);
+
+	gr_raise(text, channel, data);
+}
+
+static void gr_file_tell(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	LayoutWindow *lw = NULL; /* NULL to force layout_valid() to do some magic */
+	if (!layout_valid(&lw)) return;
+	if (image_get_path(lw->image))
+		{
+		g_io_channel_write_chars(channel, image_get_path(lw->image), -1, NULL, NULL);
+		g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+		}
+}
+
 static void gr_config_load(const gchar *text, GIOChannel *channel, gpointer data)
 {
 	gchar *filename = expand_tilde(text);
@@ -665,11 +734,20 @@
 	{ NULL, "--config-load:",       gr_config_load,         TRUE,  FALSE, N_("<FILE>"), N_("load configuration from FILE") },
 	{ NULL, "--get-sidecars:",      gr_get_sidecars,        TRUE,  FALSE, N_("<FILE>"), N_("get list of sidecars of FILE") },
 	{ NULL, "--get-destination:",  	gr_get_destination,     TRUE,  FALSE, N_("<FILE>"), N_("get destination path of FILE") },
-	{ NULL, "file:",                gr_file_load,           TRUE,  FALSE, N_("<FILE>"), N_("open FILE") },
+	{ NULL, "file:",                gr_file_load,           TRUE,  FALSE, N_("<FILE>"), N_("open FILE, bring Geeqie window to the top") },
+	{ NULL, "File:",                gr_file_load_no_raise,  TRUE,  FALSE, N_("<FILE>"), N_("open FILE, do not bring Geeqie window to the top") },
+	{ NULL, "--tell",               gr_file_tell,           FALSE, FALSE, NULL, N_("print filename of current image") },
 	{ NULL, "view:",                gr_file_view,           TRUE,  FALSE, N_("<FILE>"), N_("open FILE in new window") },
 	{ NULL, "--list-clear",         gr_list_clear,          FALSE, FALSE, NULL, N_("clear command line collection list") },
 	{ NULL, "--list-add:",          gr_list_add,            TRUE,  FALSE, N_("<FILE>"), N_("add FILE to command line collection list") },
 	{ NULL, "raise",                gr_raise,               FALSE, FALSE, NULL, N_("bring the Geeqie window to the top") },
+	{ "-ct:", "--cache-thumbs:",    gr_cache_thumb,         TRUE, FALSE, N_("clear|clean"), N_("clear or clean thumbnail cache") },
+	{ "-cs:", "--cache-shared:",    gr_cache_shared,        TRUE, FALSE, N_("clear|clean"), N_("clear or clean shared thumbnail cache") },
+	{ "-cm","--cache-metadata",      gr_cache_metadata,               FALSE, FALSE, NULL, N_("    clean the metadata cache") },
+	{ "-cr:", "--cache-render:",    gr_cache_render,        TRUE, FALSE, N_("<folder>  "), N_(" render thumbnails") },
+	{ "-crr:", "--cache-render-recurse:", gr_cache_render_recurse, TRUE, FALSE, N_("<folder> "), N_("render thumbnails recursively") },
+	{ "-crs:", "--cache-render-shared:", gr_cache_render_standard, TRUE, FALSE, N_("<folder> "), N_(" render thumbnails (see Help)") },
+	{ "-crsr:", "--cache-render-shared-recurse:", gr_cache_render_standard_recurse, TRUE, FALSE, N_("<folder>"), N_(" render thumbnails recursively (see Help)") },
 	{ NULL, NULL, NULL, FALSE, FALSE, NULL }
 };
 
--- a/src/renderer-tiles.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/renderer-tiles.c	Sat Jul 08 10:32:34 2017 +0100
@@ -1272,7 +1272,13 @@
 					 scale_x, scale_y,
 					 interp_type,
 					 255, check_x, check_y,
-					 PR_ALPHA_CHECK_SIZE, PR_ALPHA_CHECK1, PR_ALPHA_CHECK2);
+					 PR_ALPHA_CHECK_SIZE,
+					 ((options->image.alpha_color_1.red << 8 & 0x00FF0000) +
+					 (options->image.alpha_color_1.green & 0x00FF00) +
+					 (options->image.alpha_color_1.blue >> 8 & 0x00FF)),
+					 ((options->image.alpha_color_2.red << 8 & 0x00FF0000) +
+					 (options->image.alpha_color_2.green & 0x00FF00) +
+					 (options->image.alpha_color_2.blue >> 8 & 0x00FF)));
 		}
 }
 
--- a/src/search.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/search.c	Sat Jul 08 10:32:34 2017 +0100
@@ -32,6 +32,7 @@
 #include "image-load.h"
 #include "img-view.h"
 #include "layout.h"
+#include "math.h"
 #include "menu.h"
 #include "metadata.h"
 #include "misc.h"
@@ -60,7 +61,6 @@
 #define SEARCH_BUFFER_MATCH_MISS 1
 #define SEARCH_BUFFER_FLUSH_SIZE 99
 
-
 typedef enum {
 	SEARCH_MATCH_NONE,
 	SEARCH_MATCH_EQUAL,
@@ -138,6 +138,11 @@
 	GtkWidget *menu_comment;
 	GtkWidget *entry_comment;
 
+	GtkWidget *check_rating;
+	GtkWidget *menu_rating;
+	GtkWidget *spin_rating;
+	GtkWidget *spin_rating_end;
+
 	FileData *search_dir_fd;
 	gboolean   search_path_recurse;
 	gchar *search_name;
@@ -159,7 +164,10 @@
 	CacheData *search_similarity_cd;
 	GList *search_keyword_list;
 	gchar *search_comment;
+	gint   search_rating;
+	gint   search_rating_end;
 	gboolean   search_comment_match_case;
+	gboolean   search_date_exif;
 
 	MatchType search_type;
 
@@ -169,6 +177,8 @@
 	MatchType match_dimensions;
 	MatchType match_keywords;
 	MatchType match_comment;
+	MatchType match_rating;
+	MatchType match_gps;
 
 	gboolean match_name_enable;
 	gboolean match_size_enable;
@@ -177,6 +187,7 @@
 	gboolean match_similarity_enable;
 	gboolean match_keywords_enable;
 	gboolean match_comment_enable;
+	gboolean match_rating_enable;
 
 	GList *search_folder_list;
 	GList *search_done_list;
@@ -198,6 +209,18 @@
 	ThumbLoader *thumb_loader;
 	gboolean thumb_enable;
 	FileData *thumb_fd;
+
+	/* Used for lat/long coordinate search
+	*/
+	gint search_gps;
+	gdouble search_lat, search_lon;
+	GtkWidget *entry_gps_coord;
+	GtkWidget *check_gps;
+	GtkWidget *spin_gps;
+	GtkWidget *units_gps;
+	GtkWidget *menu_gps;
+	gboolean match_gps_enable;
+
 };
 
 typedef struct _MatchFileData MatchFileData;
@@ -252,6 +275,20 @@
 	{ N_("miss"),		SEARCH_MATCH_NONE }
 };
 
+
+static const MatchList text_search_menu_rating[] = {
+	{ N_("equal to"),	SEARCH_MATCH_EQUAL },
+	{ N_("less than"),	SEARCH_MATCH_UNDER },
+	{ N_("greater than"),	SEARCH_MATCH_OVER },
+	{ N_("between"),	SEARCH_MATCH_BETWEEN }
+};
+
+static const MatchList text_search_menu_gps[] = {
+	{ N_("not geocoded"),	SEARCH_MATCH_NONE },
+	{ N_("less than"),	SEARCH_MATCH_UNDER },
+	{ N_("greater than"),	SEARCH_MATCH_OVER }
+};
+
 static GList *search_window_list = NULL;
 
 
@@ -1295,12 +1332,19 @@
 				{
 				GtkWidget *menu;
 
-				sd->click_fd = mfd->fd;
+				if (mfd)
+					sd->click_fd = mfd->fd;
+				else
+					sd->click_fd = NULL;
+
 				menu = search_result_menu(sd, (mfd != NULL), (search_result_count(sd, NULL) > 0));
 				gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
 					       search_result_menu_pos_cb, sd, 0, GDK_CURRENT_TIME);
 				}
 				break;
+			case GDK_KEY_F1:
+				help_window_show("GuideReferenceKeyboardShortcuts.html#SearchKeyboardShortcuts");
+				break;
 			default:
 				stop_signal = FALSE;
 				break;
@@ -1348,6 +1392,12 @@
 };
 static gint n_result_drag_types = 2;
 
+static GtkTargetEntry result_drop_types[] = {
+	{ "text/uri-list", 0, TARGET_URI_LIST },
+	{ "text/plain", 0, TARGET_TEXT_PLAIN }
+};
+static gint n_result_drop_types = 2;
+
 static void search_dnd_data_set(GtkWidget *widget, GdkDragContext *context,
 				GtkSelectionData *selection_data, guint info,
 				guint time, gpointer data)
@@ -1394,6 +1444,45 @@
 		}
 }
 
+static void search_gps_dnd_received_cb(GtkWidget *pane, GdkDragContext *context,
+										gint x, gint y,
+										GtkSelectionData *selection_data, guint info,
+										guint time, gpointer data)
+{
+	SearchData *sd = data;
+	GList *list;
+	gdouble latitude, longitude;
+	FileData *fd;
+
+	if (info == TARGET_URI_LIST)
+		{
+		list = uri_filelist_from_gtk_selection_data(selection_data);
+
+		/* If more than one file, use only the first file in a list.
+		*/
+		if (list != NULL)
+			{
+			fd = list->data;
+			latitude = metadata_read_GPS_coord(fd, "Xmp.exif.GPSLatitude", 1000);
+			longitude = metadata_read_GPS_coord(fd, "Xmp.exif.GPSLongitude", 1000);
+			if (latitude != 1000 && longitude != 1000)
+				{
+				gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord),
+							g_strdup_printf("%lf %lf", latitude, longitude));
+				}
+			else
+				{
+				gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord), "Image is not geocoded");
+				}
+			}
+		}
+
+	if (info == TARGET_TEXT_PLAIN)
+		{
+		gtk_entry_set_text(GTK_ENTRY(sd->entry_gps_coord),"");
+		}
+}
+
 static void search_dnd_init(SearchData *sd)
 {
 	gtk_drag_source_set(sd->result_view, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
@@ -1403,6 +1492,14 @@
 			 G_CALLBACK(search_dnd_data_set), sd);
 	g_signal_connect(G_OBJECT(sd->result_view), "drag_begin",
 			 G_CALLBACK(search_dnd_begin), sd);
+
+	gtk_drag_dest_set(GTK_WIDGET(sd->entry_gps_coord),
+					 GTK_DEST_DEFAULT_ALL,
+					  result_drop_types, n_result_drop_types,
+					 GDK_ACTION_COPY);
+
+	g_signal_connect(G_OBJECT(sd->entry_gps_coord), "drag_data_received",
+					G_CALLBACK(search_gps_dnd_received_cb), sd);
 }
 
 /*
@@ -1646,6 +1743,7 @@
 	gint width = 0;
 	gint height = 0;
 	gint sim = 0;
+	time_t file_date;
 
 	if (!sd->search_file_list) return FALSE;
 
@@ -1722,11 +1820,21 @@
 		tested = TRUE;
 		match = FALSE;
 
+		if (sd->search_date_exif)
+			{
+			read_exif_time_data(fd);
+			file_date = fd->exifdate;
+			}
+		else
+			{
+			file_date = fd->date;
+			}
+
 		if (sd->match_date == SEARCH_MATCH_EQUAL)
 			{
 			struct tm *lt;
 
-			lt = localtime(&fd->date);
+			lt = localtime(&file_date);
 			match = (lt &&
 				 lt->tm_year == sd->search_date_y - 1900 &&
 				 lt->tm_mon == sd->search_date_m - 1 &&
@@ -1734,11 +1842,11 @@
 			}
 		else if (sd->match_date == SEARCH_MATCH_UNDER)
 			{
-			match = (fd->date < convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y));
+			match = (file_date < convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y));
 			}
 		else if (sd->match_date == SEARCH_MATCH_OVER)
 			{
-			match = (fd->date > convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y) + 60 * 60 * 24 - 1);
+			match = (file_date > convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y) + 60 * 60 * 24 - 1);
 			}
 		else if (sd->match_date == SEARCH_MATCH_BETWEEN)
 			{
@@ -1753,7 +1861,7 @@
 				{
 				a += 60 * 60 * 24 - 1;
 				}
-			match = MATCH_IS_BETWEEN(fd->date, a, b);
+			match = MATCH_IS_BETWEEN(file_date, a, b);
 			}
 		}
 
@@ -1871,8 +1979,88 @@
 			}
 		}
 
-	if ((match || extra_only) &&
-	    (sd->match_dimensions_enable || sd->match_similarity_enable))
+	if (match && sd->match_rating_enable)
+		{
+		tested = TRUE;
+		match = FALSE;
+		gint rating;
+
+		rating = metadata_read_int(fd, RATING_KEY, 0);
+		if (sd->match_rating == SEARCH_MATCH_EQUAL)
+			{
+			match = (rating == sd->search_rating);
+			}
+		else if (sd->match_rating == SEARCH_MATCH_UNDER)
+			{
+			match = (rating < sd->search_rating);
+			}
+		else if (sd->match_rating == SEARCH_MATCH_OVER)
+			{
+			match = (rating > sd->search_rating);
+			}
+		else if (sd->match_rating == SEARCH_MATCH_BETWEEN)
+			{
+			match = MATCH_IS_BETWEEN(rating, sd->search_rating, sd->search_rating_end);
+			}
+		}
+
+	if (match && sd->match_gps_enable)
+		{
+		/* Calculate the distance the image is from the specified origin.
+		* This is a standard algorithm. A simplified one may be faster.
+		*/
+		#define RADIANS  0.0174532925
+		#define KM_EARTH_RADIUS 6371
+		#define MILES_EARTH_RADIUS 3959
+		#define NAUTICAL_MILES_EARTH_RADIUS 3440
+
+		gdouble latitude, longitude, range, conversion;
+
+		if (g_strcmp0(gtk_combo_box_text_get_active_text(
+						GTK_COMBO_BOX_TEXT(sd->units_gps)), _("km")) == 0)
+			{
+			conversion = KM_EARTH_RADIUS;
+			}
+		else if (g_strcmp0(gtk_combo_box_text_get_active_text(
+						GTK_COMBO_BOX_TEXT(sd->units_gps)), _("miles")) == 0)
+			{
+			conversion = MILES_EARTH_RADIUS;
+			}
+		else
+			{
+			conversion = NAUTICAL_MILES_EARTH_RADIUS;
+			}
+
+		tested = TRUE;
+		match = FALSE;
+
+		latitude = metadata_read_GPS_coord(fd, "Xmp.exif.GPSLatitude", 1000);
+		longitude = metadata_read_GPS_coord(fd, "Xmp.exif.GPSLongitude", 1000);
+		if (latitude != 1000 && longitude != 1000)
+			{
+			range = conversion * acos(sin(latitude * RADIANS) *
+						sin(sd->search_lat * RADIANS) + cos(latitude * RADIANS) *
+						cos(sd->search_lat * RADIANS) * cos((sd->search_lon -
+						longitude) * RADIANS));
+			if (sd->match_gps == SEARCH_MATCH_UNDER)
+				{
+				if (sd->search_gps >= range)
+					match = TRUE;
+				}
+			else if (sd->match_gps == SEARCH_MATCH_OVER)
+				{
+				if (sd->search_gps < range)
+					match = TRUE;
+				}
+			}
+		else if (sd->match_gps == SEARCH_MATCH_NONE)
+			{
+			match = TRUE;
+			}
+		}
+
+	if ((match || extra_only) && (sd->match_dimensions_enable ||
+								sd ->match_similarity_enable))
 		{
 		tested = TRUE;
 
@@ -2103,6 +2291,7 @@
 	SearchData *sd = data;
 	GtkTreeViewColumn *column;
 	gchar *path;
+	gchar *entry_text;
 
 	if (sd->search_folder_list)
 		{
@@ -2133,6 +2322,32 @@
 		tab_completion_append_to_history(sd->entry_similarity, sd->search_similarity_path);
 		}
 
+	/* Check the coordinate entry.
+	* If the result is not sensible, it should get blocked.
+	*/
+	if (sd->match_gps_enable)
+		{
+		if (sd->match_gps != SEARCH_MATCH_NONE)
+			{
+			entry_text = decode_geo_parameters(gtk_entry_get_text(
+										GTK_ENTRY(sd->entry_gps_coord)));
+
+			sd->search_lat = 1000;
+			sd->search_lon = 1000;
+			sscanf(entry_text," %lf  %lf ", &sd->search_lat, &sd->search_lon );
+			if (!(entry_text != NULL && !g_strstr_len(entry_text, -1, "Error") &&
+						sd->search_lat >= -90 && sd->search_lat <= 90 &&
+						sd->search_lon >= -180 && sd->search_lon <= 180))
+				{
+				file_util_warning_dialog(_(
+						"Entry does not contain a valid lat/long value"),
+							entry_text, GTK_STOCK_DIALOG_WARNING, sd->window);
+				return;
+				}
+			g_free(entry_text);
+			}
+		}
+
 	string_list_free(sd->search_keyword_list);
 	sd->search_keyword_list = keyword_list_pull(sd->entry_keywords);
 
@@ -2365,6 +2580,16 @@
 				(sd->match_size == SEARCH_MATCH_BETWEEN));
 }
 
+static void menu_choice_rating_cb(GtkWidget *combo, gpointer data)
+{
+	SearchData *sd = data;
+
+	if (!menu_choice_get_match_type(combo, &sd->match_rating)) return;
+
+	menu_choice_set_visible(gtk_widget_get_parent(sd->spin_rating_end),
+				(sd->match_rating == SEARCH_MATCH_BETWEEN));
+}
+
 static void menu_choice_date_cb(GtkWidget *combo, gpointer data)
 {
 	SearchData *sd = data;
@@ -2406,6 +2631,16 @@
 	*value = (gint)gtk_adjustment_get_value(adjustment);
 }
 
+static void menu_choice_gps_cb(GtkWidget *combo, gpointer data)
+{
+	SearchData *sd = data;
+
+	if (!menu_choice_get_match_type(combo, &sd->match_gps)) return;
+
+	menu_choice_set_visible(gtk_widget_get_parent(sd->spin_gps),
+					(sd->match_gps != SEARCH_MATCH_NONE));
+}
+
 static GtkWidget *menu_spin(GtkWidget *box, gdouble min, gdouble max, gint value,
 			    GCallback func, gpointer data)
 {
@@ -2583,11 +2818,15 @@
 	sd->match_dimensions = SEARCH_MATCH_EQUAL;
 	sd->match_keywords = SEARCH_MATCH_ALL;
 	sd->match_comment = SEARCH_MATCH_CONTAINS;
+	sd->match_rating = SEARCH_MATCH_EQUAL;
 
 	sd->match_name_enable = TRUE;
 
 	sd->search_similarity = 95;
 
+	sd->search_gps = 1;
+	sd->match_gps = SEARCH_MATCH_NONE;
+
 	if (example_file)
 		{
 		sd->search_similarity_path = g_strdup(example_file->path);
@@ -2681,6 +2920,8 @@
 	date_selection_time_set(sd->date_sel_end, time(NULL));
 	gtk_box_pack_start(GTK_BOX(hbox2), sd->date_sel_end, FALSE, FALSE, 0);
 	gtk_widget_show(sd->date_sel_end);
+	pref_checkbox_new_int(hbox, _("Exif date"),
+				sd->search_date_exif, &sd->search_date_exif);
 
 	/* Search for image dimensions */
 	hbox = menu_choice(sd->box_search, &sd->check_dimensions, &sd->menu_dimensions,
@@ -2746,6 +2987,51 @@
 	pref_checkbox_new_int(hbox, _("Match case"),
 			      sd->search_comment_match_case, &sd->search_comment_match_case);
 
+	/* Search for image rating */
+	hbox = menu_choice(sd->box_search, &sd->check_rating, &sd->menu_rating,
+			   _("Image rating is"), &sd->match_rating_enable,
+			   text_search_menu_rating, sizeof(text_search_menu_rating) / sizeof(MatchList),
+			   G_CALLBACK(menu_choice_rating_cb), sd);
+	sd->spin_size = menu_spin(hbox, -1, 5, sd->search_rating,
+				  G_CALLBACK(menu_choice_spin_cb), &sd->search_rating);
+	hbox2 = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+	gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
+	pref_label_new(hbox2, _("and"));
+	sd->spin_rating_end = menu_spin(hbox2, -1, 5, sd->search_rating_end,
+				      G_CALLBACK(menu_choice_spin_cb), &sd->search_rating_end);
+
+	/* Search for images within a specified range of a lat/long coordinate
+	*/
+	hbox = menu_choice(sd->box_search, &sd->check_gps, &sd->menu_gps,
+			   _("Image is"), &sd->match_gps_enable,
+			   text_search_menu_gps, sizeof(text_search_menu_gps) / sizeof(MatchList),
+			   G_CALLBACK(menu_choice_gps_cb), sd);
+
+	hbox2 = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+	gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
+	sd->spin_gps = menu_spin(hbox2, 1, 9999, sd->search_gps,
+								   G_CALLBACK(menu_choice_spin_cb), &sd->search_gps);
+
+	sd->units_gps = gtk_combo_box_text_new();
+	gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->units_gps), _("km"));
+	gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->units_gps), _("miles"));
+	gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->units_gps), _("n.m."));
+	gtk_box_pack_start(GTK_BOX(hbox2), sd->units_gps, FALSE, FALSE, 0);
+	gtk_combo_box_set_active(GTK_COMBO_BOX(sd->units_gps), 0);
+	gtk_widget_set_tooltip_text(sd->units_gps, "kilometres, miles or nautical miles");
+	gtk_widget_show(sd->units_gps);
+
+	pref_label_new(hbox2, _("from"));
+
+	sd->entry_gps_coord = gtk_entry_new();
+	gtk_editable_set_editable(GTK_EDITABLE(sd->entry_gps_coord), TRUE);
+	gtk_widget_set_has_tooltip(sd->entry_gps_coord, TRUE);
+	gtk_widget_set_tooltip_text(sd->entry_gps_coord, _("Enter a coordinate in the form:\n89.123 179.456\nor drag-and-drop a geo-coded image\nor left-click on the map and paste\nor cut-and-paste or drag-and-drop\nan internet search URL\nSee the Help file"));
+	gtk_box_pack_start(GTK_BOX(hbox2), sd->entry_gps_coord, TRUE, TRUE, 0);
+	gtk_widget_set_sensitive(sd->entry_gps_coord, TRUE);
+
+	gtk_widget_show(sd->entry_gps_coord);
+
 	/* Done the types of searches */
 
 	scrolled = gtk_scrolled_window_new(NULL, NULL);
@@ -2827,6 +3113,10 @@
 
 	sd->label_progress = gtk_progress_bar_new();
 	gtk_widget_set_size_request(sd->label_progress, 50, -1);
+#if GTK_CHECK_VERSION(3,0,0)
+	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(sd->label_progress), "");
+	gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(sd->label_progress), TRUE);
+#endif
 	gtk_box_pack_start(GTK_BOX(hbox), sd->label_progress, TRUE, TRUE, 0);
 	gtk_widget_show(sd->label_progress);
 
--- a/src/secure_save.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/secure_save.c	Sat Jul 08 10:32:34 2017 +0100
@@ -298,7 +298,6 @@
 				utime(ssi->tmp_file_name, &tb);
 				}
 			}
-		DEBUG_3("rename %s -> %s", ssi->tmp_file_name, ssi->file_name);
 		if (rename(ssi->tmp_file_name, ssi->file_name) == -1) {
 			ret = errno;
 			secsave_errno = SS_ERR_RENAME;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/shortcuts.c	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "main.h"
+#include "shortcuts.h"
+
+#include "layout.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_misc.h"
+
+typedef struct _ShortcutsData ShortcutsData;
+struct _ShortcutsData
+{
+	GtkWidget *vbox;
+	GtkWidget *bookmarks;
+	LayoutWindow *lw;
+
+	FileDialog *dialog;
+	GtkWidget *dialog_name_entry;
+
+	GtkWidget *add_button;
+};
+
+#define SHORTCUTS     "shortcuts"
+
+static void shortcuts_bookmark_select(const gchar *path, gpointer data)
+{
+	ShortcutsData *scd = data;
+
+	layout_set_path(scd->lw, path);
+}
+
+static void shortcuts_add_close(ShortcutsData *scd)
+{
+	if (scd->dialog) file_dialog_close(scd->dialog);
+	scd->dialog_name_entry = NULL;
+	scd->dialog = NULL;
+}
+
+static void shortcuts_add_ok_cb(FileDialog *fd, gpointer data)
+{
+	ShortcutsData *scd = data;
+	const gchar *name = gtk_entry_get_text(GTK_ENTRY(scd->dialog_name_entry));
+	gboolean empty_name = (name[0] == '\0');
+
+	name = gtk_entry_get_text(GTK_ENTRY(scd->dialog_name_entry));
+
+	if (empty_name)
+		{
+		name = filename_from_path(fd->dest_path);
+		}
+
+	bookmark_list_add(scd->bookmarks, name, fd->dest_path);
+
+	shortcuts_add_close(scd);
+}
+
+static void shortcuts_add_cancel_cb(FileDialog *fd, gpointer data)
+{
+	ShortcutsData *scd = data;
+
+	shortcuts_add_close(scd);
+}
+
+static void shortcuts_add_cb(GtkWidget *button, gpointer data)
+{
+	ShortcutsData *scd = data;
+	GtkWidget *hbox;
+	const gchar *title;
+
+	if (scd->dialog)
+		{
+		gtk_window_present(GTK_WINDOW(GENERIC_DIALOG(scd->dialog)->dialog));
+		return;
+		}
+
+	title = _("Add Shortcut");
+	scd->dialog = file_util_file_dlg(title,
+					"add_shortcuts", button,
+					shortcuts_add_cancel_cb, scd);
+	file_dialog_add_button(scd->dialog, GTK_STOCK_OK, NULL, shortcuts_add_ok_cb, TRUE);
+
+	generic_dialog_add_message(GENERIC_DIALOG(scd->dialog), NULL, title, NULL);
+
+	file_dialog_add_path_widgets(scd->dialog, NULL, NULL, "add_shortcuts", NULL, NULL);
+
+	hbox = pref_box_new(GENERIC_DIALOG(scd->dialog)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+	pref_label_new(hbox, _("Name:"));
+
+	scd->dialog_name_entry = gtk_entry_new();
+	gtk_box_pack_start(GTK_BOX(hbox), scd->dialog_name_entry, TRUE, TRUE, 0);
+	generic_dialog_attach_default(GENERIC_DIALOG(scd->dialog), scd->dialog_name_entry);
+	gtk_widget_show(scd->dialog_name_entry);
+
+	gtk_widget_show(GENERIC_DIALOG(scd->dialog)->dialog);
+}
+
+static void shortcuts_destroy(GtkWidget *widget, gpointer data)
+{
+	ShortcutsData *scd = data;
+
+	shortcuts_add_close(scd);
+
+	g_free(scd);
+}
+
+static GtkWidget *shortcuts_new(LayoutWindow *lw)
+{
+	ShortcutsData *scd;
+	GtkWidget *tbar;
+
+	if (!lw) return NULL;
+
+	scd = g_new0(ShortcutsData, 1);
+
+	scd->lw = lw;
+
+	scd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+	g_object_set_data(G_OBJECT(scd->vbox), "shortcuts_data", scd);
+	g_signal_connect(G_OBJECT(scd->vbox), "destroy",
+			G_CALLBACK(shortcuts_destroy), scd);
+
+	scd->bookmarks = bookmark_list_new(SHORTCUTS, shortcuts_bookmark_select, scd);
+	gtk_box_pack_start(GTK_BOX(scd->vbox), scd->bookmarks, TRUE, TRUE, 0);
+	gtk_widget_show(scd->bookmarks);
+
+	tbar = pref_toolbar_new(scd->vbox, GTK_TOOLBAR_ICONS);
+
+	scd->add_button = pref_toolbar_button(tbar, GTK_STOCK_ADD, NULL, FALSE,
+					_("Add Shortcut"),
+					G_CALLBACK(shortcuts_add_cb), scd);
+
+	return scd->vbox;
+}
+
+GtkWidget *shortcuts_new_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values)
+{
+	GtkWidget *shortcuts_bar;
+
+	shortcuts_bar = shortcuts_new(lw);
+	gtk_widget_show(shortcuts_bar);
+
+	return shortcuts_bar;
+}
+
+GtkWidget *shortcuts_new_default(LayoutWindow *lw)
+{
+	return shortcuts_new_from_config(lw, NULL, NULL);
+}
+
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/shortcuts.h	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef SHORTCUTS_H
+#define SHORTCUTS_H
+
+GtkWidget *shortcuts_new_default(LayoutWindow *lw);
+
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/typedefs.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/typedefs.h	Sat Jul 08 10:32:34 2017 +0100
@@ -66,7 +66,8 @@
 	SORT_CTIME,
 	SORT_PATH,
 	SORT_NUMBER,
-	SORT_EXIFTIME
+	SORT_EXIFTIME,
+	SORT_RATING
 } SortType;
 
 typedef enum {
@@ -251,6 +252,13 @@
 
 #define MAX_SPLIT_IMAGES 4
 
+typedef enum {
+	SELECTION_NONE		= 0,
+	SELECTION_SELECTED	= 1 << 0,
+	SELECTION_PRELIGHT	= 1 << 1,
+	SELECTION_FOCUS		= 1 << 2
+} SelectionType;
+
 typedef struct _ImageLoader ImageLoader;
 typedef struct _ThumbLoader ThumbLoader;
 
@@ -479,7 +487,7 @@
 
 	/* button, scroll functions */
 	void (*func_button)(ImageWindow *, GdkEventButton *event, gpointer);
-	void (*func_drag)(ImageWindow *, GdkEventButton *event, gdouble dx, gdouble dy, gpointer);
+	void (*func_drag)(ImageWindow *, GdkEventMotion *event, gdouble dx, gdouble dy, gpointer);
 	void (*func_scroll)(ImageWindow *, GdkEventScroll *event, gpointer);
 	void (*func_focus_in)(ImageWindow *, gpointer);
 
@@ -517,6 +525,8 @@
 	gint orientation;
 	gboolean desaturate;
 	gint user_stereo;
+
+	gboolean mouse_wheel_mode;
 };
 
 #define FILEDATA_MARKS_SIZE 6
@@ -536,6 +546,7 @@
 	gchar *path;
 	const gchar *name;
 	const gchar *extension;
+	gchar *extended_extension;
 	gchar *collate_key_name;
 	gchar *collate_key_name_nocase;
 	gint64 size;
@@ -570,6 +581,9 @@
 	time_t exifdate;
 	GHashTable *modified_xmp; // hash table which contains unwritten xmp metadata in format: key->list of string values
 	GList *cached_metadata;
+	gint rating;
+
+	SelectionType selected;  // Used by view_file_icon.
 };
 
 struct _LayoutOptions
@@ -606,6 +620,10 @@
 	} float_window;
 
 	struct {
+		gint vdivider_pos;
+	} folder_window;
+
+	struct {
 		gint w;
 		gint h;
 	} properties_window;
@@ -616,10 +634,26 @@
 		gint histogram_mode;
 	} image_overlay;
 
+	struct {
+		gint w;
+		gint h;
+		gint x;
+		gint y;
+		gboolean paused;
+	} log_window;
+
 	gboolean tools_float;
 	gboolean tools_hidden;
 	gboolean toolbar_hidden;
 
+	struct {
+		gboolean info;
+		gboolean sort;
+		gboolean tools_float;
+		gboolean tools_hidden;
+		gboolean hidden;
+	} bars_state;
+
 	gchar *home_path;
 	gchar *last_path;
 
@@ -749,6 +783,8 @@
 	GtkWidget *exif_window;
 
 	AnimationData *animation;
+
+	GtkWidget *log_window;
 };
 
 struct _ViewDir
@@ -796,6 +832,7 @@
 struct _ViewFile
 {
 	FileViewType type;
+	// TODO(xsdg): Turn this into a union (see VFLIST and VFICON from view_file.h).
 	gpointer info;
 
 	GtkWidget *widget;
@@ -849,8 +886,6 @@
 	guint select_idle_id; /* event source id */
 };
 
-struct _IconData;
-
 struct _ViewFileInfoIcon
 {
 	/* table stuff */
@@ -858,15 +893,15 @@
 	gint rows;
 
 	GList *selection;
-	struct _IconData *prev_selection;
+	FileData *prev_selection;
 
 	GtkWidget *tip_window;
 	guint tip_delay_id; /* event source id */
-	struct _IconData *tip_id;
+	FileData *tip_fd;
 
-	struct _IconData *click_id;
+	FileData *click_fd;
 
-	struct _IconData *focus_id;
+	FileData *focus_fd;
 	gint focus_row;
 	gint focus_column;
 
@@ -949,11 +984,15 @@
 	gboolean startup_command_line_collection;
 	gboolean tools_hide;
 	gboolean tools_show;
+	gboolean log_window_show;
 	gchar *path;
 	gchar *file;
 	GList *cmd_list;
 	GList *collection_list;
 	gchar *geometry;
+	gchar *regexp;
+	gchar *log_file;
+	SecureSaveInfo *ssi;
 };
 
 #endif
--- a/src/ui_fileops.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/ui_fileops.c	Sat Jul 08 10:32:34 2017 +0100
@@ -41,6 +41,9 @@
 #include "ui_utildlg.h"	/* for locale warning dialog */
 #include "md5-util.h"
 
+#include "filefilter.h"
+#include "secure_save.h"
+
 /*
  *-----------------------------------------------------------------------------
  * generic file information and manipulation routines (public)
@@ -55,6 +58,8 @@
 
 	text_l = g_locale_from_utf8(text_utf8, -1, NULL, NULL, NULL);
 	fputs((text_l) ? text_l : text_utf8, stderr);
+	if(command_line && command_line->ssi)
+		secure_fputs(command_line->ssi, (text_l) ? text_l : text_utf8);
 	g_free(text_l);
 }
 
@@ -697,7 +702,7 @@
 	name = filename_from_path(path);
 	if (!name) return NULL;
 
-	ext = extension_from_path(name);
+	ext = registered_extension_from_path(name);
 
 	if (!ext)
 		{
@@ -729,24 +734,14 @@
 
 gchar *remove_level_from_path(const gchar *path)
 {
-	gint p = 0, n = -1;
+	const gchar *base;
 
 	if (!path) return NULL;
 
-	while (path[p])
-		{
-		if (path[p] == G_DIR_SEPARATOR) n = p;
-		p++;
-		}
-	if (n <= 0) n++;
+	base = strrchr(path, G_DIR_SEPARATOR);
+	if (base) return g_strndup(path, strlen(path)-strlen(base));
 
-	return g_strndup(path, (gsize) n);
-}
-
-const gchar *extension_from_path(const gchar *path)
-{
-	if (!path) return NULL;
-	return strrchr(path, '.');
+	return NULL;
 }
 
 gboolean file_extension_match(const gchar *path, const gchar *ext)
@@ -766,18 +761,13 @@
 
 gchar *remove_extension_from_path(const gchar *path)
 {
-	gint p = 0, n = -1;
+	const gchar *reg_ext;
 
 	if (!path) return NULL;
 
-	while (path[p])
-		{
-		if (path[p] == '.') n = p;
-		p++;
-		}
-	if (n < 0) n = p;
+	reg_ext = registered_extension_from_path(path);
 
-	return g_strndup(path, (gsize) n);
+	return g_strndup(path, strlen(path) - (reg_ext == NULL ? 0 : strlen(reg_ext)));
 }
 
 void parse_out_relatives(gchar *path)
--- a/src/ui_fileops.h	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/ui_fileops.h	Sat Jul 08 10:32:34 2017 +0100
@@ -91,7 +91,6 @@
 const gchar *filename_from_path(const gchar *path);
 gchar *remove_level_from_path(const gchar *path);
 
-const gchar *extension_from_path(const gchar *path);
 gchar *remove_extension_from_path(const gchar *path);
 
 gboolean file_extension_match(const gchar *path, const gchar *ext);
--- a/src/ui_menu.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/ui_menu.c	Sat Jul 08 10:32:34 2017 +0100
@@ -118,7 +118,7 @@
 
 void menu_item_add_divider(GtkWidget *menu)
 {
-	GtkWidget *item = gtk_menu_item_new();
+	GtkWidget *item = gtk_separator_menu_item_new();
 	gtk_widget_set_sensitive(item, FALSE);
 	gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
 	gtk_widget_show(item);
--- a/src/ui_misc.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/ui_misc.c	Sat Jul 08 10:32:34 2017 +0100
@@ -1201,7 +1201,7 @@
 	return handle_size;
 }
 
-static gboolean sizer_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+static gboolean sizer_motion_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data)
 {
 	SizerData *sd = data;
 	gint x, y;
@@ -1210,8 +1210,8 @@
 
 	if (!sd->in_drag) return FALSE;
 
-	x = sd->press_x - bevent->x_root;
-	y = sd->press_y - bevent->y_root;
+	x = sd->press_x - event->x_root;
+	y = sd->press_y - event->y_root;
 
 	w = sd->press_width;
 	h = sd->press_height;
--- a/src/ui_pathsel.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/ui_pathsel.c	Sat Jul 08 10:32:34 2017 +0100
@@ -353,7 +353,7 @@
 
 	list = g_list_append(list, path);
 
-	gchar **uris = uris_from_filelist(list);
+	gchar **uris = uris_from_pathlist(list);
 	gboolean ret = gtk_selection_data_set_uris(selection_data, uris);
 	if (!ret)
 		{
@@ -786,6 +786,7 @@
 
 		tree_edit_by_path(GTK_TREE_VIEW(dd->d_view), dd->right_click_path, 0, text,
 				  dest_view_rename_cb, dd);
+		gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
 		}
 
 	g_free(path);
@@ -1145,6 +1146,9 @@
 		store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
 
 		dd->filter_combo = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
+		gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(dd->filter_combo),
+														FILTER_COLUMN_FILTER);
+
 		g_object_unref(store);
 		gtk_cell_layout_clear(GTK_CELL_LAYOUT(dd->filter_combo));
 		renderer = gtk_cell_renderer_text_new();
--- a/src/utilops.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/utilops.c	Sat Jul 08 10:32:34 2017 +0100
@@ -225,7 +225,7 @@
 		{
 		const gchar *ext;
 
-		ext = extension_from_path(name);
+		ext = registered_extension_from_path(name);
 		if (ext) n -= strlen(ext);
 		}
 
@@ -1205,7 +1205,7 @@
 		parsed = tmp;
 		}
 
-	ext = extension_from_path(name);
+	ext = registered_extension_from_path(name);
 
 	middle = strchr(parsed, '*');
 	if (middle)
@@ -1291,13 +1291,19 @@
 
 		format = gtk_entry_get_text(GTK_ENTRY(ud->format_entry));
 
+		g_free(options->cp_mv_rn.auto_end);
+		options->cp_mv_rn.auto_end = g_strdup(end);
+		options->cp_mv_rn.auto_padding = padding;
+
 		if (mode == UTILITY_RENAME_FORMATTED)
 			{
 			start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ud->format_spin));
+			options->cp_mv_rn.formatted_start = start_n;
 			}
 		else
 			{
 			start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ud->auto_spin_start));
+			options->cp_mv_rn.auto_start = start_n;
 			}
 
 		store = gtk_tree_view_get_model(GTK_TREE_VIEW(ud->listview));
@@ -1687,19 +1693,19 @@
 	box2 = furm_simple_vlabel(hbox, _("Start #"), FALSE);
 
 	ud->auto_spin_start = pref_spin_new(box2, NULL, NULL,
-					    0.0, 1000000.0, 1.0, 0, 1.0,
+					    0.0, 1000000.0, 1.0, 0, options->cp_mv_rn.auto_start,
 					    G_CALLBACK(file_util_rename_preview_adj_cb), ud);
 
 	box2 = furm_simple_vlabel(hbox, _("End text"), TRUE);
 
-	combo = history_combo_new(&ud->auto_entry_end, "", "numerical_rename_suffix", -1);
+	combo = history_combo_new(&ud->auto_entry_end, options->cp_mv_rn.auto_end, "numerical_rename_suffix", -1);
 	g_signal_connect(G_OBJECT(ud->auto_entry_end), "changed",
 			 G_CALLBACK(file_util_rename_preview_entry_cb), ud);
 	gtk_box_pack_start(GTK_BOX(box2), combo, TRUE, TRUE, 0);
 	gtk_widget_show(combo);
 
 	ud->auto_spin_pad = pref_spin_new(page, _("Padding:"), NULL,
-					  1.0, 8.0, 1.0, 0, 1.0,
+					  1.0, 8.0, 1.0, 0, options->cp_mv_rn.auto_padding,
 					  G_CALLBACK(file_util_rename_preview_adj_cb), ud);
 
 	page = gtk_vbox_new(FALSE, PREF_PAD_GAP);
@@ -1719,7 +1725,7 @@
 	box2 = furm_simple_vlabel(hbox, _("Start #"), FALSE);
 
 	ud->format_spin = pref_spin_new(box2, NULL, NULL,
-					0.0, 1000000.0, 1.0, 0, 1.0,
+					0.0, 1000000.0, 1.0, 0, options->cp_mv_rn.formatted_start,
 					G_CALLBACK(file_util_rename_preview_adj_cb), ud);
 
 //	gtk_combo_box_set_active(GTK_COMBO_BOX(ud->combo_type), 0); /* callback will take care of the rest */
--- a/src/view_dir.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/view_dir.c	Sat Jul 08 10:32:34 2017 +0100
@@ -496,7 +496,7 @@
 		list = filelist_filter(list, FALSE);
 		}
 
-	dw = dupe_window_new(DUPE_MATCH_NAME);
+	dw = dupe_window_new();
 	dupe_window_add_files(dw, list, recursive);
 
 	filelist_free(list);
--- a/src/view_file.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/view_file.c	Sat Jul 08 10:32:34 2017 +0100
@@ -31,8 +31,8 @@
 #include "ui_menu.h"
 #include "ui_fileops.h"
 #include "utilops.h"
-#include "view_file_list.h"
-#include "view_file_icon.h"
+#include "view_file/view_file_list.h"
+#include "view_file/view_file_icon.h"
 
 /*
  *-----------------------------------------------------------------------------
@@ -409,7 +409,7 @@
 	ViewFile *vf = data;
 	DupeWindow *dw;
 
-	dw = dupe_window_new(DUPE_MATCH_NAME);
+	dw = dupe_window_new();
 	dupe_window_add_files(dw, vf_pop_menu_file_list(vf), FALSE);
 }
 
@@ -555,7 +555,7 @@
 		active = (VFLIST(vf)->click_fd != NULL);
 		break;
 	case FILEVIEW_ICON:
-		active = (VFICON(vf)->click_id != NULL);
+		active = (VFICON(vf)->click_fd != NULL);
 		break;
 	}
 
@@ -1083,7 +1083,7 @@
 	if (!refresh)
 		{
 		gchar *base = remove_level_from_path(fd->path);
-		refresh = (strcmp(base, vf->dir_fd->path) == 0);
+		refresh = (g_strcmp0(base, vf->dir_fd->path) == 0);
 		g_free(base);
 		}
 
@@ -1092,14 +1092,14 @@
 		if (!refresh && fd->change->dest)
 			{
 			gchar *dest_base = remove_level_from_path(fd->change->dest);
-			refresh = (strcmp(dest_base, vf->dir_fd->path) == 0);
+			refresh = (g_strcmp0(dest_base, vf->dir_fd->path) == 0);
 			g_free(dest_base);
 			}
 
 		if (!refresh && fd->change->source)
 			{
 			gchar *source_base = remove_level_from_path(fd->change->source);
-			refresh = (strcmp(source_base, vf->dir_fd->path) == 0);
+			refresh = (g_strcmp0(source_base, vf->dir_fd->path) == 0);
 			g_free(source_base);
 			}
 		}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/view_file/Makefile.am	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,5 @@
+module_view_file = \
+	%D%/view_file_icon.c	\
+	%D%/view_file_icon.h	\
+	%D%/view_file_list.c	\
+	%D%/view_file_list.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/view_file/view_file_common.c	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,37 @@
+/*
+ *  This file is a part of Geeqie project (http://www.geeqie.org/).
+ *  Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License as published by the Free
+ *  Software Foundation; either version 2 of the License, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ *  more details.
+ */
+
+guint vfcommon_count(ViewFile *vf, gint64 *bytes)
+{
+	if (bytes)
+		{
+		gint64 b = 0;
+		GList *work;
+
+		work = vf->list;
+		while (work)
+			{
+			FileData *fd = work->data;
+			work = work->next;
+
+			b += fd->size;
+			}
+
+		*bytes = b;
+		}
+
+	return g_list_length(vf->list);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/view_file/view_file_icon.c	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,2194 @@
+/*
+ * Copyright (C) 2006 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "main.h"
+#include "view_file_icon.h"
+
+#include "bar.h"
+#include "cellrenderericon.h"
+#include "collect.h"
+#include "collect-io.h"
+#include "collect-table.h"
+#include "dnd.h"
+#include "editors.h"
+#include "img-view.h"
+#include "filedata.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "menu.h"
+#include "metadata.h"
+#include "thumb.h"
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_tree_edit.h"
+#include "uri_utils.h"
+#include "view_file.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+
+/* between these, the icon width is increased by thumb_max_width / 2 */
+#define THUMB_MIN_ICON_WIDTH 128
+#define THUMB_MAX_ICON_WIDTH 150
+
+#define VFICON_MAX_COLUMNS 32
+#define THUMB_BORDER_PADDING 2
+
+#define VFICON_TIP_DELAY 500
+
+enum {
+	FILE_COLUMN_POINTER = 0,
+	FILE_COLUMN_COUNT
+};
+
+static void vficon_toggle_filenames(ViewFile *vf);
+static void vficon_selection_remove(ViewFile *vf, FileData *id, SelectionType mask, GtkTreeIter *iter);
+static void vficon_move_focus(ViewFile *vf, gint row, gint col, gboolean relative);
+static void vficon_set_focus(ViewFile *vf, FileData *fd);
+static void vficon_populate_at_new_size(ViewFile *vf, gint w, gint h, gboolean force);
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * pop-up menu
+ *-----------------------------------------------------------------------------
+ */
+
+GList *vficon_selection_get_one(ViewFile *vf, FileData *fd)
+{
+	return g_list_prepend(filelist_copy(fd->sidecar_files), file_data_ref(fd));
+}
+
+GList *vficon_pop_menu_file_list(ViewFile *vf)
+{
+	if (!VFICON(vf)->click_fd) return NULL;
+
+	if (VFICON(vf)->click_fd->selected & SELECTION_SELECTED)
+		{
+		return vf_selection_get_list(vf);
+		}
+
+	return vficon_selection_get_one(vf, VFICON(vf)->click_fd);
+}
+
+void vficon_pop_menu_view_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	if (!VFICON(vf)->click_fd) return;
+
+	if (VFICON(vf)->click_fd->selected & SELECTION_SELECTED)
+		{
+		GList *list;
+
+		list = vf_selection_get_list(vf);
+		view_window_new_from_list(list);
+		filelist_free(list);
+		}
+	else
+		{
+		view_window_new(VFICON(vf)->click_fd);
+		}
+}
+
+void vficon_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	file_util_rename(NULL, vf_pop_menu_file_list(vf), vf->listview);
+}
+
+void vficon_pop_menu_show_names_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vficon_toggle_filenames(vf);
+}
+
+void vficon_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vf_refresh(vf);
+}
+
+void vficon_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+	vficon_selection_remove(vf, VFICON(vf)->click_fd, SELECTION_PRELIGHT, NULL);
+	VFICON(vf)->click_fd = NULL;
+	vf->popup = NULL;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * signals
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_send_layout_select(ViewFile *vf, FileData *fd)
+{
+	FileData *read_ahead_fd = NULL;
+	FileData *sel_fd;
+	FileData *cur_fd;
+
+	if (!vf->layout || !fd) return;
+
+	sel_fd = fd;
+
+	cur_fd = layout_image_get_fd(vf->layout);
+	if (sel_fd == cur_fd) return; /* no change */
+
+	if (options->image.enable_read_ahead)
+		{
+		gint row;
+
+		row = g_list_index(vf->list, fd);
+		if (row > vficon_index_by_fd(vf, cur_fd) &&
+		    (guint) (row + 1) < vf_count(vf, NULL))
+			{
+			read_ahead_fd = vf_index_get_data(vf, row + 1);
+			}
+		else if (row > 0)
+			{
+			read_ahead_fd = vf_index_get_data(vf, row - 1);
+			}
+		}
+
+	layout_image_set_with_ahead(vf->layout, sel_fd, read_ahead_fd);
+}
+
+static void vficon_toggle_filenames(ViewFile *vf)
+{
+	GtkAllocation allocation;
+	VFICON(vf)->show_text = !VFICON(vf)->show_text;
+	options->show_icon_names = VFICON(vf)->show_text;
+
+	gtk_widget_get_allocation(vf->listview, &allocation);
+	vficon_populate_at_new_size(vf, allocation.width, allocation.height, TRUE);
+}
+
+static gint vficon_get_icon_width(ViewFile *vf)
+{
+	gint width;
+
+	if (!VFICON(vf)->show_text) return options->thumbnails.max_width;
+
+	width = options->thumbnails.max_width + options->thumbnails.max_width / 2;
+	if (width < THUMB_MIN_ICON_WIDTH) width = THUMB_MIN_ICON_WIDTH;
+	if (width > THUMB_MAX_ICON_WIDTH) width = options->thumbnails.max_width;
+
+	return width;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * misc utils
+ *-------------------------------------------------------------------
+ */
+
+static gboolean vficon_find_position(ViewFile *vf, FileData *fd, gint *row, gint *col)
+{
+	gint n;
+
+	n = g_list_index(vf->list, fd);
+
+	if (n < 0) return FALSE;
+
+	*row = n / VFICON(vf)->columns;
+	*col = n - (*row * VFICON(vf)->columns);
+
+	return TRUE;
+}
+
+static gboolean vficon_find_iter(ViewFile *vf, FileData *fd, GtkTreeIter *iter, gint *column)
+{
+	GtkTreeModel *store;
+	gint row, col;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	if (!vficon_find_position(vf, fd, &row, &col)) return FALSE;
+	if (!gtk_tree_model_iter_nth_child(store, iter, NULL, row)) return FALSE;
+	if (column) *column = col;
+
+	return TRUE;
+}
+
+static FileData *vficon_find_data(ViewFile *vf, gint row, gint col, GtkTreeIter *iter)
+{
+	GtkTreeModel *store;
+	GtkTreeIter p;
+
+	if (row < 0 || col < 0) return NULL;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	if (gtk_tree_model_iter_nth_child(store, &p, NULL, row))
+		{
+		GList *list;
+
+		gtk_tree_model_get(store, &p, FILE_COLUMN_POINTER, &list, -1);
+		if (!list) return NULL;
+
+		if (iter) *iter = p;
+
+		return g_list_nth_data(list, col);
+		}
+
+	return NULL;
+}
+
+static FileData *vficon_find_data_by_coord(ViewFile *vf, gint x, gint y, GtkTreeIter *iter)
+{
+	GtkTreePath *tpath;
+	GtkTreeViewColumn *column;
+
+	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), x, y,
+					  &tpath, &column, NULL, NULL))
+		{
+		GtkTreeModel *store;
+		GtkTreeIter row;
+		GList *list;
+		gint n;
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		gtk_tree_model_get_iter(store, &row, tpath);
+		gtk_tree_path_free(tpath);
+
+		gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
+
+		n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_number"));
+		if (list)
+			{
+			if (iter) *iter = row;
+			return g_list_nth_data(list, n);
+			}
+		}
+
+	return NULL;
+}
+
+static void vficon_mark_toggled_cb(GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreeModel *store;
+	GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+	GtkTreeIter row;
+	gint column;
+	GList *list;
+	guint toggled_mark;
+	FileData *fd;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	if (!path || !gtk_tree_model_get_iter(store, &row, path)) return;
+
+	gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
+
+	column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column_number"));
+	g_object_get(G_OBJECT(cell), "toggled_mark", &toggled_mark, NULL);
+
+	fd = g_list_nth_data(list, column);
+	if (fd)
+		{
+		file_data_set_mark(fd, toggled_mark, !file_data_get_mark(fd, toggled_mark));
+		}
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * tooltip type window
+ *-------------------------------------------------------------------
+ */
+
+static void tip_show(ViewFile *vf)
+{
+	GtkWidget *label;
+	gint x, y;
+#if GTK_CHECK_VERSION(3,0,0)
+	GdkDisplay *display;
+	GdkDeviceManager *device_manager;
+	GdkDevice *device;
+#endif
+
+	if (VFICON(vf)->tip_window) return;
+
+#if GTK_CHECK_VERSION(3,0,0)
+	device_manager = gdk_display_get_device_manager(gdk_window_get_display(
+						gtk_tree_view_get_bin_window(GTK_TREE_VIEW(vf->listview))));
+	device = gdk_device_manager_get_client_pointer(device_manager);
+	gdk_window_get_device_position(gtk_tree_view_get_bin_window(GTK_TREE_VIEW(vf->listview)),
+						device, &x, &y, NULL);
+#else
+	gdk_window_get_pointer(gtk_tree_view_get_bin_window(GTK_TREE_VIEW(vf->listview)), &x, &y, NULL);
+#endif
+
+	VFICON(vf)->tip_fd = vficon_find_data_by_coord(vf, x, y, NULL);
+	if (!VFICON(vf)->tip_fd) return;
+
+	VFICON(vf)->tip_window = gtk_window_new(GTK_WINDOW_POPUP);
+	gtk_window_set_resizable(GTK_WINDOW(VFICON(vf)->tip_window), FALSE);
+	gtk_container_set_border_width(GTK_CONTAINER(VFICON(vf)->tip_window), 2);
+
+	label = gtk_label_new(VFICON(vf)->tip_fd->name);
+
+	g_object_set_data(G_OBJECT(VFICON(vf)->tip_window), "tip_label", label);
+	gtk_container_add(GTK_CONTAINER(VFICON(vf)->tip_window), label);
+	gtk_widget_show(label);
+
+#if GTK_CHECK_VERSION(3,0,0)
+	display = gdk_display_get_default();
+	device_manager = gdk_display_get_device_manager(display);
+	device = gdk_device_manager_get_client_pointer(device_manager);
+	gdk_device_get_position(device, NULL, &x, &y);
+#else
+	gdk_window_get_pointer(NULL, &x, &y, NULL);
+#endif
+
+	if (!gtk_widget_get_realized(VFICON(vf)->tip_window)) gtk_widget_realize(VFICON(vf)->tip_window);
+	gtk_window_move(GTK_WINDOW(VFICON(vf)->tip_window), x + 16, y + 16);
+	gtk_widget_show(VFICON(vf)->tip_window);
+}
+
+static void tip_hide(ViewFile *vf)
+{
+	if (VFICON(vf)->tip_window) gtk_widget_destroy(VFICON(vf)->tip_window);
+	VFICON(vf)->tip_window = NULL;
+}
+
+static gboolean tip_schedule_cb(gpointer data)
+{
+	ViewFile *vf = data;
+	GtkWidget *window;
+
+	if (!VFICON(vf)->tip_delay_id) return FALSE;
+
+	window = gtk_widget_get_toplevel(vf->listview);
+
+	if (gtk_widget_get_sensitive(window) &&
+	    gtk_window_has_toplevel_focus(GTK_WINDOW(window)))
+		{
+		tip_show(vf);
+		}
+
+	VFICON(vf)->tip_delay_id = 0;
+	return FALSE;
+}
+
+static void tip_schedule(ViewFile *vf)
+{
+	tip_hide(vf);
+
+	if (VFICON(vf)->tip_delay_id)
+		{
+		g_source_remove(VFICON(vf)->tip_delay_id);
+		VFICON(vf)->tip_delay_id = 0;
+		}
+
+	if (!VFICON(vf)->show_text)
+		{
+		VFICON(vf)->tip_delay_id = g_timeout_add(VFICON_TIP_DELAY, tip_schedule_cb, vf);
+		}
+}
+
+static void tip_unschedule(ViewFile *vf)
+{
+	tip_hide(vf);
+
+	if (VFICON(vf)->tip_delay_id)
+		{
+		g_source_remove(VFICON(vf)->tip_delay_id);
+		VFICON(vf)->tip_delay_id = 0;
+		}
+}
+
+static void tip_update(ViewFile *vf, FileData *fd)
+{
+#if GTK_CHECK_VERSION(3,0,0)
+	GdkDisplay *display = gdk_display_get_default();
+	GdkDeviceManager *device_manager = gdk_display_get_device_manager(display);
+	GdkDevice *device = gdk_device_manager_get_client_pointer(device_manager);
+#endif
+
+	if (VFICON(vf)->tip_window)
+		{
+		gint x, y;
+
+#if GTK_CHECK_VERSION(3,0,0)
+		gdk_device_get_position(device, NULL, &x, &y);
+#else
+		gdk_window_get_pointer(NULL, &x, &y, NULL);
+#endif
+		gtk_window_move(GTK_WINDOW(VFICON(vf)->tip_window), x + 16, y + 16);
+
+		if (fd != VFICON(vf)->tip_fd)
+			{
+			GtkWidget *label;
+
+			VFICON(vf)->tip_fd = fd;
+
+			if (!VFICON(vf)->tip_fd)
+				{
+				tip_hide(vf);
+				tip_schedule(vf);
+				return;
+				}
+
+			label = g_object_get_data(G_OBJECT(VFICON(vf)->tip_window), "tip_label");
+			gtk_label_set_text(GTK_LABEL(label), VFICON(vf)->tip_fd->name);
+			}
+		}
+	else
+		{
+		tip_schedule(vf);
+		}
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_dnd_get(GtkWidget *widget, GdkDragContext *context,
+			   GtkSelectionData *selection_data, guint info,
+			   guint time, gpointer data)
+{
+	ViewFile *vf = data;
+	GList *list = NULL;
+
+	if (!VFICON(vf)->click_fd) return;
+
+	if (VFICON(vf)->click_fd->selected & SELECTION_SELECTED)
+		{
+		list = vf_selection_get_list(vf);
+		}
+	else
+		{
+		list = g_list_append(NULL, file_data_ref(VFICON(vf)->click_fd));
+		}
+
+	if (!list) return;
+	uri_selection_data_set_uris_from_filelist(selection_data, list);
+	filelist_free(list);
+}
+
+static void vficon_drag_data_received(GtkWidget *entry_widget, GdkDragContext *context,
+				      int x, int y, GtkSelectionData *selection,
+				      guint info, guint time, gpointer data)
+{
+	ViewFile *vf = data;
+
+	if (info == TARGET_TEXT_PLAIN) {
+		FileData *fd = vficon_find_data_by_coord(vf, x, y, NULL);
+
+		if (fd) {
+			/* Add keywords to file */
+			gchar *str = (gchar *) gtk_selection_data_get_text(selection);
+			GList *kw_list = string_to_keywords_list(str);
+
+			metadata_append_list(fd, KEYWORD_KEY, kw_list);
+			string_list_free(kw_list);
+			g_free(str);
+		}
+	}
+}
+
+static void vficon_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+	ViewFile *vf = data;
+
+	tip_unschedule(vf);
+
+	if (VFICON(vf)->click_fd && VFICON(vf)->click_fd->thumb_pixbuf)
+		{
+		gint items;
+
+		if (VFICON(vf)->click_fd->selected & SELECTION_SELECTED)
+			items = g_list_length(VFICON(vf)->selection);
+		else
+			items = 1;
+
+		dnd_set_drag_icon(widget, context, VFICON(vf)->click_fd->thumb_pixbuf, items);
+		}
+}
+
+static void vficon_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vficon_selection_remove(vf, VFICON(vf)->click_fd, SELECTION_PRELIGHT, NULL);
+
+	if (gdk_drag_context_get_selected_action(context) == GDK_ACTION_MOVE)
+		{
+		vf_refresh(vf);
+		}
+
+	tip_unschedule(vf);
+}
+
+void vficon_dnd_init(ViewFile *vf)
+{
+	gtk_drag_source_set(vf->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+			    dnd_file_drag_types, dnd_file_drag_types_count,
+			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+	gtk_drag_dest_set(vf->listview, GTK_DEST_DEFAULT_ALL,
+			    dnd_file_drag_types, dnd_file_drag_types_count,
+			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+
+	g_signal_connect(G_OBJECT(vf->listview), "drag_data_get",
+			 G_CALLBACK(vficon_dnd_get), vf);
+	g_signal_connect(G_OBJECT(vf->listview), "drag_begin",
+			 G_CALLBACK(vficon_dnd_begin), vf);
+	g_signal_connect(G_OBJECT(vf->listview), "drag_end",
+			 G_CALLBACK(vficon_dnd_end), vf);
+	g_signal_connect(G_OBJECT(vf->listview), "drag_data_received",
+			 G_CALLBACK(vficon_drag_data_received), vf);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * cell updates
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_selection_set(ViewFile *vf, FileData *fd, SelectionType value, GtkTreeIter *iter)
+{
+	GtkTreeModel *store;
+	GList *list;
+
+	if (!fd) return;
+
+	if (fd->selected == value) return;
+	fd->selected = value;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	if (iter)
+		{
+		gtk_tree_model_get(store, iter, FILE_COLUMN_POINTER, &list, -1);
+		if (list) gtk_list_store_set(GTK_LIST_STORE(store), iter, FILE_COLUMN_POINTER, list, -1);
+		}
+	else
+		{
+		GtkTreeIter row;
+
+		if (vficon_find_iter(vf, fd, &row, NULL))
+			{
+			gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
+			if (list) gtk_list_store_set(GTK_LIST_STORE(store), &row, FILE_COLUMN_POINTER, list, -1);
+			}
+		}
+}
+
+static void vficon_selection_add(ViewFile *vf, FileData *fd, SelectionType mask, GtkTreeIter *iter)
+{
+	if (!fd) return;
+
+	vficon_selection_set(vf, fd, fd->selected | mask, iter);
+}
+
+static void vficon_selection_remove(ViewFile *vf, FileData *fd, SelectionType mask, GtkTreeIter *iter)
+{
+	if (!fd) return;
+
+	vficon_selection_set(vf, fd, fd->selected & ~mask, iter);
+}
+
+void vficon_marks_set(ViewFile *vf, gint enable)
+{
+	GtkAllocation allocation;
+	gtk_widget_get_allocation(vf->listview, &allocation);
+	vficon_populate_at_new_size(vf, allocation.width, allocation.height, TRUE);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * selections
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_verify_selections(ViewFile *vf)
+{
+	GList *work;
+
+	work = VFICON(vf)->selection;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		if (vficon_index_by_fd(vf, fd) >= 0) continue;
+
+		VFICON(vf)->selection = g_list_remove(VFICON(vf)->selection, fd);
+		}
+}
+
+void vficon_select_all(ViewFile *vf)
+{
+	GList *work;
+
+	g_list_free(VFICON(vf)->selection);
+	VFICON(vf)->selection = NULL;
+
+	work = vf->list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		VFICON(vf)->selection = g_list_append(VFICON(vf)->selection, fd);
+		vficon_selection_add(vf, fd, SELECTION_SELECTED, NULL);
+		}
+
+	vf_send_update(vf);
+}
+
+void vficon_select_none(ViewFile *vf)
+{
+	GList *work;
+
+	work = VFICON(vf)->selection;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		vficon_selection_remove(vf, fd, SELECTION_SELECTED, NULL);
+		}
+
+	g_list_free(VFICON(vf)->selection);
+	VFICON(vf)->selection = NULL;
+
+	vf_send_update(vf);
+}
+
+void vficon_select_invert(ViewFile *vf)
+{
+	GList *work;
+
+	work = vf->list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		if (fd->selected & SELECTION_SELECTED)
+			{
+			VFICON(vf)->selection = g_list_remove(VFICON(vf)->selection, fd);
+			vficon_selection_remove(vf, fd, SELECTION_SELECTED, NULL);
+			}
+		else
+			{
+			VFICON(vf)->selection = g_list_append(VFICON(vf)->selection, fd);
+			vficon_selection_add(vf, fd, SELECTION_SELECTED, NULL);
+			}
+		}
+
+	vf_send_update(vf);
+}
+
+static void vficon_select(ViewFile *vf, FileData *fd)
+{
+	VFICON(vf)->prev_selection = fd;
+
+	if (!fd || fd->selected & SELECTION_SELECTED) return;
+
+	VFICON(vf)->selection = g_list_append(VFICON(vf)->selection, fd);
+	vficon_selection_add(vf, fd, SELECTION_SELECTED, NULL);
+
+	vf_send_update(vf);
+}
+
+static void vficon_unselect(ViewFile *vf, FileData *fd)
+{
+	VFICON(vf)->prev_selection = fd;
+
+	if (!fd || !(fd->selected & SELECTION_SELECTED) ) return;
+
+	VFICON(vf)->selection = g_list_remove(VFICON(vf)->selection, fd);
+	vficon_selection_remove(vf, fd, SELECTION_SELECTED, NULL);
+
+	vf_send_update(vf);
+}
+
+static void vficon_select_util(ViewFile *vf, FileData *fd, gboolean select)
+{
+	if (select)
+		{
+		vficon_select(vf, fd);
+		}
+	else
+		{
+		vficon_unselect(vf, fd);
+		}
+}
+
+static void vficon_select_region_util(ViewFile *vf, FileData *start, FileData *end, gboolean select)
+{
+	gint row1, col1;
+	gint row2, col2;
+	gint t;
+	gint i, j;
+
+	if (!vficon_find_position(vf, start, &row1, &col1) ||
+	    !vficon_find_position(vf, end, &row2, &col2) ) return;
+
+	VFICON(vf)->prev_selection = end;
+
+	if (!options->collections.rectangular_selection)
+		{
+		GList *work;
+
+		if (g_list_index(vf->list, start) > g_list_index(vf->list, end))
+			{
+			FileData *tmp = start;
+			start = end;
+			end = tmp;
+			}
+
+		work = g_list_find(vf->list, start);
+		while (work)
+			{
+			FileData *fd = work->data;
+			vficon_select_util(vf, fd, select);
+
+			if (work->data != end)
+				work = work->next;
+			else
+				work = NULL;
+			}
+		return;
+		}
+
+	// rectangular_selection==true.
+	if (row2 < row1)
+		{
+		t = row1;
+		row1 = row2;
+		row2 = t;
+		}
+	if (col2 < col1)
+		{
+		t = col1;
+		col1 = col2;
+		col2 = t;
+		}
+
+	DEBUG_1("table: %d x %d to %d x %d", row1, col1, row2, col2);
+
+	for (i = row1; i <= row2; i++)
+		{
+		for (j = col1; j <= col2; j++)
+			{
+			FileData *fd = vficon_find_data(vf, i, j, NULL);
+			if (fd) vficon_select_util(vf, fd, select);
+			}
+		}
+}
+
+gboolean vficon_index_is_selected(ViewFile *vf, gint row)
+{
+	FileData *fd = g_list_nth_data(vf->list, row);
+
+	if (!fd) return FALSE;
+
+	return (fd->selected & SELECTION_SELECTED);
+}
+
+guint vficon_selection_count(ViewFile *vf, gint64 *bytes)
+{
+	if (bytes)
+		{
+		gint64 b = 0;
+		GList *work;
+
+		work = VFICON(vf)->selection;
+		while (work)
+			{
+			FileData *fd = work->data;
+			g_assert(fd->magick == FD_MAGICK);
+			b += fd->size;
+
+			work = work->next;
+			}
+
+		*bytes = b;
+		}
+
+	return g_list_length(VFICON(vf)->selection);
+}
+
+GList *vficon_selection_get_list(ViewFile *vf)
+{
+	GList *list = NULL;
+	GList *work, *work2;
+
+	work = VFICON(vf)->selection;
+	while (work)
+		{
+		FileData *fd = work->data;
+		g_assert(fd->magick == FD_MAGICK);
+
+		list = g_list_prepend(list, file_data_ref(fd));
+
+		work2 = fd->sidecar_files;
+		while (work2)
+			{
+			fd = work2->data;
+			list = g_list_prepend(list, file_data_ref(fd));
+			work2 = work2->next;
+			}
+
+		work = work->next;
+		}
+
+	list = g_list_reverse(list);
+
+	return list;
+}
+
+GList *vficon_selection_get_list_by_index(ViewFile *vf)
+{
+	GList *list = NULL;
+	GList *work;
+
+	work = VFICON(vf)->selection;
+	while (work)
+		{
+		list = g_list_prepend(list, GINT_TO_POINTER(g_list_index(vf->list, work->data)));
+		work = work->next;
+		}
+
+	return g_list_reverse(list);
+}
+
+void vficon_select_by_fd(ViewFile *vf, FileData *fd)
+{
+	if (!fd) return;
+	if (!g_list_find(vf->list, fd)) return;
+
+	if (!(fd->selected & SELECTION_SELECTED))
+		{
+		vf_select_none(vf);
+		vficon_select(vf, fd);
+		}
+
+	vficon_set_focus(vf, fd);
+}
+
+void vficon_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
+{
+	GList *work;
+	gint n = mark - 1;
+
+	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
+
+	work = vf->list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		gboolean mark_val, selected;
+
+		g_assert(fd->magick == FD_MAGICK);
+
+		mark_val = file_data_get_mark(fd, n);
+		selected = fd->selected & SELECTION_SELECTED;
+
+		switch (mode)
+			{
+			case MTS_MODE_SET: selected = mark_val;
+				break;
+			case MTS_MODE_OR: selected = mark_val || selected;
+				break;
+			case MTS_MODE_AND: selected = mark_val && selected;
+				break;
+			case MTS_MODE_MINUS: selected = !mark_val && selected;
+				break;
+			}
+
+		vficon_select_util(vf, fd, selected);
+
+		work = work->next;
+		}
+}
+
+void vficon_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
+{
+	GList *slist;
+	GList *work;
+	gint n = mark -1;
+
+	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
+
+	slist = vf_selection_get_list(vf);
+	work = slist;
+	while (work)
+		{
+		FileData *fd = work->data;
+
+		switch (mode)
+			{
+			case STM_MODE_SET: file_data_set_mark(fd, n, 1);
+				break;
+			case STM_MODE_RESET: file_data_set_mark(fd, n, 0);
+				break;
+			case STM_MODE_TOGGLE: file_data_set_mark(fd, n, !file_data_get_mark(fd, n));
+				break;
+			}
+		work = work->next;
+		}
+	filelist_free(slist);
+}
+
+static void vficon_select_closest(ViewFile *vf, FileData *sel_fd)
+{
+	GList *work;
+	FileData *fd = NULL;
+
+	if (sel_fd->parent) sel_fd = sel_fd->parent;
+	work = vf->list;
+
+	while (work)
+		{
+		gint match;
+
+		fd = work->data;
+		work = work->next;
+
+		match = filelist_sort_compare_filedata_full(fd, sel_fd, vf->sort_method, vf->sort_ascend);
+
+		if (match >= 0) break;
+		}
+
+	if (fd)
+		{
+		vficon_select(vf, fd);
+		vficon_send_layout_select(vf, fd);
+		}
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * focus
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_move_focus(ViewFile *vf, gint row, gint col, gboolean relative)
+{
+	gint new_row;
+	gint new_col;
+
+	if (relative)
+		{
+		new_row = VFICON(vf)->focus_row;
+		new_col = VFICON(vf)->focus_column;
+
+		new_row += row;
+		if (new_row < 0) new_row = 0;
+		if (new_row >= VFICON(vf)->rows) new_row = VFICON(vf)->rows - 1;
+
+		while (col != 0)
+			{
+			if (col < 0)
+				{
+				new_col--;
+				col++;
+				}
+			else
+				{
+				new_col++;
+				col--;
+				}
+
+			if (new_col < 0)
+				{
+				if (new_row > 0)
+					{
+					new_row--;
+					new_col = VFICON(vf)->columns - 1;
+					}
+				else
+					{
+					new_col = 0;
+					}
+				}
+			if (new_col >= VFICON(vf)->columns)
+				{
+				if (new_row < VFICON(vf)->rows - 1)
+					{
+					new_row++;
+					new_col = 0;
+					}
+				else
+					{
+					new_col = VFICON(vf)->columns - 1;
+					}
+				}
+			}
+		}
+	else
+		{
+		new_row = row;
+		new_col = col;
+
+		if (new_row >= VFICON(vf)->rows)
+			{
+			if (VFICON(vf)->rows > 0)
+				new_row = VFICON(vf)->rows - 1;
+			else
+				new_row = 0;
+			new_col = VFICON(vf)->columns - 1;
+			}
+		if (new_col >= VFICON(vf)->columns) new_col = VFICON(vf)->columns - 1;
+		}
+
+	if (new_row == VFICON(vf)->rows - 1)
+		{
+		gint l;
+
+		/* if we moved beyond the last image, go to the last image */
+
+		l = g_list_length(vf->list);
+		if (VFICON(vf)->rows > 1) l -= (VFICON(vf)->rows - 1) * VFICON(vf)->columns;
+		if (new_col >= l) new_col = l - 1;
+		}
+
+	vficon_set_focus(vf, vficon_find_data(vf, new_row, new_col, NULL));
+}
+
+static void vficon_set_focus(ViewFile *vf, FileData *fd)
+{
+	GtkTreeIter iter;
+	gint row, col;
+
+	if (g_list_find(vf->list, VFICON(vf)->focus_fd))
+		{
+		if (fd == VFICON(vf)->focus_fd)
+			{
+			/* ensure focus row col are correct */
+			vficon_find_position(vf, VFICON(vf)->focus_fd, &VFICON(vf)->focus_row, &VFICON(vf)->focus_column);
+#if GTK_CHECK_VERSION(3,0,0)
+/* FIXME: Refer to issue #467 on Github. The thumbnail position is not
+ * preserved when the icon view is refreshed. Caused by an unknown call from
+ * the idle loop. This patch hides the problem.
+ */
+			if (vficon_find_iter(vf, VFICON(vf)->focus_fd, &iter, NULL))
+				{
+				tree_view_row_make_visible(GTK_TREE_VIEW(vf->listview), &iter, FALSE);
+				}
+#endif
+			return;
+			}
+		vficon_selection_remove(vf, VFICON(vf)->focus_fd, SELECTION_FOCUS, NULL);
+		}
+
+	if (!vficon_find_position(vf, fd, &row, &col))
+		{
+		VFICON(vf)->focus_fd = NULL;
+		VFICON(vf)->focus_row = -1;
+		VFICON(vf)->focus_column = -1;
+		return;
+		}
+
+	VFICON(vf)->focus_fd = fd;
+	VFICON(vf)->focus_row = row;
+	VFICON(vf)->focus_column = col;
+	vficon_selection_add(vf, VFICON(vf)->focus_fd, SELECTION_FOCUS, NULL);
+
+	if (vficon_find_iter(vf, VFICON(vf)->focus_fd, &iter, NULL))
+		{
+		GtkTreePath *tpath;
+		GtkTreeViewColumn *column;
+		GtkTreeModel *store;
+
+		tree_view_row_make_visible(GTK_TREE_VIEW(vf->listview), &iter, FALSE);
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		tpath = gtk_tree_model_get_path(store, &iter);
+		/* focus is set to an extra column with 0 width to hide focus, we draw it ourself */
+		column = gtk_tree_view_get_column(GTK_TREE_VIEW(vf->listview), VFICON_MAX_COLUMNS);
+		gtk_tree_view_set_cursor(GTK_TREE_VIEW(vf->listview), tpath, column, FALSE);
+		gtk_tree_path_free(tpath);
+		}
+}
+
+/* used to figure the page up/down distances */
+static gint page_height(ViewFile *vf)
+{
+	GtkAdjustment *adj;
+	gint page_size;
+	gint row_height;
+	gint ret;
+
+	adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vf->listview));
+	page_size = (gint)gtk_adjustment_get_page_increment(adj);
+
+	row_height = options->thumbnails.max_height + THUMB_BORDER_PADDING * 2;
+	if (VFICON(vf)->show_text) row_height += options->thumbnails.max_height / 3;
+
+	ret = page_size / row_height;
+	if (ret < 1) ret = 1;
+
+	return ret;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * keyboard
+ *-------------------------------------------------------------------
+ */
+
+static void vfi_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreeModel *store;
+	GtkTreeIter iter;
+	gint column;
+	GtkTreePath *tpath;
+	gint cw, ch;
+
+	if (!vficon_find_iter(vf, VFICON(vf)->click_fd, &iter, &column)) return;
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	tpath = gtk_tree_model_get_path(store, &iter);
+	tree_view_get_cell_clamped(GTK_TREE_VIEW(vf->listview), tpath, column, FALSE, x, y, &cw, &ch);
+	gtk_tree_path_free(tpath);
+	*y += ch;
+	popup_menu_position_clamp(menu, x, y, 0);
+}
+
+gboolean vficon_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+	ViewFile *vf = data;
+	gint focus_row = 0;
+	gint focus_col = 0;
+	FileData *fd;
+	gboolean stop_signal;
+
+	stop_signal = TRUE;
+	switch (event->keyval)
+		{
+		case GDK_KEY_Left: case GDK_KEY_KP_Left:
+			focus_col = -1;
+			break;
+		case GDK_KEY_Right: case GDK_KEY_KP_Right:
+			focus_col = 1;
+			break;
+		case GDK_KEY_Up: case GDK_KEY_KP_Up:
+			focus_row = -1;
+			break;
+		case GDK_KEY_Down: case GDK_KEY_KP_Down:
+			focus_row = 1;
+			break;
+		case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up:
+			focus_row = -page_height(vf);
+			break;
+		case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down:
+			focus_row = page_height(vf);
+			break;
+		case GDK_KEY_Home: case GDK_KEY_KP_Home:
+			focus_row = -VFICON(vf)->focus_row;
+			focus_col = -VFICON(vf)->focus_column;
+			break;
+		case GDK_KEY_End: case GDK_KEY_KP_End:
+			focus_row = VFICON(vf)->rows - 1 - VFICON(vf)->focus_row;
+			focus_col = VFICON(vf)->columns - 1 - VFICON(vf)->focus_column;
+			break;
+		case GDK_KEY_space:
+			fd = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
+			if (fd)
+				{
+				VFICON(vf)->click_fd = fd;
+				if (event->state & GDK_CONTROL_MASK)
+					{
+					gint selected;
+
+					selected = fd->selected & SELECTION_SELECTED;
+					if (selected)
+						{
+						vficon_unselect(vf, fd);
+						}
+					else
+						{
+						vficon_select(vf, fd);
+						vficon_send_layout_select(vf, fd);
+						}
+					}
+				else
+					{
+					vf_select_none(vf);
+					vficon_select(vf, fd);
+					vficon_send_layout_select(vf, fd);
+					}
+				}
+			break;
+		case GDK_KEY_Menu:
+			fd = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
+			VFICON(vf)->click_fd = fd;
+
+			vficon_selection_add(vf, VFICON(vf)->click_fd, SELECTION_PRELIGHT, NULL);
+			tip_unschedule(vf);
+
+			vf->popup = vf_pop_menu(vf);
+			gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, vfi_menu_position_cb, vf, 0, GDK_CURRENT_TIME);
+			break;
+		default:
+			stop_signal = FALSE;
+			break;
+		}
+
+	if (focus_row != 0 || focus_col != 0)
+		{
+		FileData *new_fd;
+		FileData *old_fd;
+
+		old_fd = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
+		vficon_move_focus(vf, focus_row, focus_col, TRUE);
+		new_fd = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
+
+		if (new_fd != old_fd)
+			{
+			if (event->state & GDK_SHIFT_MASK)
+				{
+				if (!options->collections.rectangular_selection)
+					{
+					vficon_select_region_util(vf, old_fd, new_fd, FALSE);
+					}
+				else
+					{
+					vficon_select_region_util(vf, VFICON(vf)->click_fd, old_fd, FALSE);
+					}
+				vficon_select_region_util(vf, VFICON(vf)->click_fd, new_fd, TRUE);
+				vficon_send_layout_select(vf, new_fd);
+				}
+			else if (event->state & GDK_CONTROL_MASK)
+				{
+				VFICON(vf)->click_fd = new_fd;
+				}
+			else
+				{
+				VFICON(vf)->click_fd = new_fd;
+				vf_select_none(vf);
+				vficon_select(vf, new_fd);
+				vficon_send_layout_select(vf, new_fd);
+				}
+			}
+		}
+
+	if (stop_signal)
+		{
+		tip_unschedule(vf);
+		}
+
+	return stop_signal;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * mouse
+ *-------------------------------------------------------------------
+ */
+
+static gboolean vficon_motion_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data)
+{
+	ViewFile *vf = data;
+	FileData *fd;
+
+	fd = vficon_find_data_by_coord(vf, (gint)event->x, (gint)event->y, NULL);
+	tip_update(vf, fd);
+
+	return FALSE;
+}
+
+gboolean vficon_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreeIter iter;
+	FileData *fd;
+
+	tip_unschedule(vf);
+
+	fd = vficon_find_data_by_coord(vf, (gint)bevent->x, (gint)bevent->y, &iter);
+
+	VFICON(vf)->click_fd = fd;
+	vficon_selection_add(vf, VFICON(vf)->click_fd, SELECTION_PRELIGHT, &iter);
+
+	switch (bevent->button)
+		{
+		case MOUSE_BUTTON_LEFT:
+			if (!gtk_widget_has_focus(vf->listview))
+				{
+				gtk_widget_grab_focus(vf->listview);
+				}
+
+			if (bevent->type == GDK_2BUTTON_PRESS && vf->layout)
+				{
+				vficon_selection_remove(vf, VFICON(vf)->click_fd, SELECTION_PRELIGHT, &iter);
+				layout_image_full_screen_start(vf->layout);
+				}
+			break;
+		case MOUSE_BUTTON_RIGHT:
+			vf->popup = vf_pop_menu(vf);
+			gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
+			break;
+		default:
+			break;
+		}
+
+	return FALSE;
+}
+
+gboolean vficon_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreeIter iter;
+	FileData *fd = NULL;
+	gboolean was_selected;
+
+	tip_schedule(vf);
+
+	if ((gint)bevent->x != 0 || (gint)bevent->y != 0)
+		{
+		fd = vficon_find_data_by_coord(vf, (gint)bevent->x, (gint)bevent->y, &iter);
+		}
+
+	if (VFICON(vf)->click_fd)
+		{
+		vficon_selection_remove(vf, VFICON(vf)->click_fd, SELECTION_PRELIGHT, NULL);
+		}
+
+	if (!fd || VFICON(vf)->click_fd != fd) return TRUE;
+
+	was_selected = !!(fd->selected & SELECTION_SELECTED);
+
+	switch (bevent->button)
+		{
+		case MOUSE_BUTTON_LEFT:
+			{
+			vficon_set_focus(vf, fd);
+
+			if (bevent->state & GDK_CONTROL_MASK)
+				{
+				gboolean select;
+
+				select = !(fd->selected & SELECTION_SELECTED);
+				if ((bevent->state & GDK_SHIFT_MASK) && VFICON(vf)->prev_selection)
+					{
+					vficon_select_region_util(vf, VFICON(vf)->prev_selection, fd, select);
+					}
+				else
+					{
+					vficon_select_util(vf, fd, select);
+					}
+				}
+			else
+				{
+				vf_select_none(vf);
+
+				if ((bevent->state & GDK_SHIFT_MASK) && VFICON(vf)->prev_selection)
+					{
+					vficon_select_region_util(vf, VFICON(vf)->prev_selection, fd, TRUE);
+					}
+				else
+					{
+					vficon_select_util(vf, fd, TRUE);
+					was_selected = FALSE;
+					}
+				}
+			}
+			break;
+		case MOUSE_BUTTON_MIDDLE:
+			{
+			vficon_select_util(vf, fd, !(fd->selected & SELECTION_SELECTED));
+			}
+			break;
+		default:
+			break;
+		}
+
+	if (!was_selected && (fd->selected & SELECTION_SELECTED))
+		{
+		vficon_send_layout_select(vf, fd);
+		}
+
+	return TRUE;
+}
+
+static gboolean vficon_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
+{
+	ViewFile *vf = data;
+
+	tip_unschedule(vf);
+	return FALSE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * population
+ *-------------------------------------------------------------------
+ */
+
+static gboolean vficon_destroy_node_cb(GtkTreeModel *store, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data)
+{
+	GList *list;
+
+	gtk_tree_model_get(store, iter, FILE_COLUMN_POINTER, &list, -1);
+
+	/* it seems that gtk_list_store_clear may call some callbacks
+	   that use the column. Set the pointer to NULL to be safe. */
+	gtk_list_store_set(GTK_LIST_STORE(store), iter, FILE_COLUMN_POINTER, NULL, -1);
+	g_list_free(list);
+
+	return FALSE;
+}
+
+static void vficon_clear_store(ViewFile *vf)
+{
+	GtkTreeModel *store;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_model_foreach(store, vficon_destroy_node_cb, NULL);
+
+	gtk_list_store_clear(GTK_LIST_STORE(store));
+}
+
+static GList *vficon_add_row(ViewFile *vf, GtkTreeIter *iter)
+{
+	GtkListStore *store;
+	GList *list = NULL;
+	gint i;
+
+	for (i = 0; i < VFICON(vf)->columns; i++) list = g_list_prepend(list, NULL);
+
+	store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
+	gtk_list_store_append(store, iter);
+	gtk_list_store_set(store, iter, FILE_COLUMN_POINTER, list, -1);
+
+	return list;
+}
+
+static void vficon_populate(ViewFile *vf, gboolean resize, gboolean keep_position)
+{
+	GtkTreeModel *store;
+	GtkTreePath *tpath;
+	GList *work;
+	FileData *visible_fd = NULL;
+	gint r, c;
+	gboolean valid;
+	GtkTreeIter iter;
+
+	vficon_verify_selections(vf);
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+
+	if (keep_position && gtk_widget_get_realized(vf->listview) &&
+	    gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
+		{
+		GtkTreeIter iter;
+		GList *list;
+
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_path_free(tpath);
+
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+		if (list) visible_fd = list->data;
+		}
+
+
+	if (resize)
+		{
+		gint i;
+		gint thumb_width;
+
+		vficon_clear_store(vf);
+
+		thumb_width = vficon_get_icon_width(vf);
+
+		for (i = 0; i < VFICON_MAX_COLUMNS; i++)
+			{
+			GtkTreeViewColumn *column;
+			GtkCellRenderer *cell;
+			GList *list;
+
+			column = gtk_tree_view_get_column(GTK_TREE_VIEW(vf->listview), i);
+			gtk_tree_view_column_set_visible(column, (i < VFICON(vf)->columns));
+			gtk_tree_view_column_set_fixed_width(column, thumb_width + (THUMB_BORDER_PADDING * 6));
+
+			list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+			cell = (list) ? list->data : NULL;
+			g_list_free(list);
+
+			if (cell && GQV_IS_CELL_RENDERER_ICON(cell))
+				{
+				g_object_set(G_OBJECT(cell), "fixed_width", thumb_width,
+							     "fixed_height", options->thumbnails.max_height,
+							     "show_text", VFICON(vf)->show_text,
+							     "show_marks", vf->marks_enabled,
+							     "num_marks", FILEDATA_MARKS_SIZE,
+							     NULL);
+				}
+			}
+		if (gtk_widget_get_realized(vf->listview)) gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
+		}
+
+	r = -1;
+	c = 0;
+
+	valid = gtk_tree_model_iter_children(store, &iter, NULL);
+
+	work = vf->list;
+	while (work)
+		{
+		GList *list;
+		r++;
+		c = 0;
+		if (valid)
+			{
+			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+			gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1);
+			}
+		else
+			{
+			list = vficon_add_row(vf, &iter);
+			}
+
+		while (list)
+			{
+			FileData *fd;
+
+			if (work)
+				{
+				fd = work->data;
+				work = work->next;
+				c++;
+				}
+			else
+				{
+				fd = NULL;
+				}
+
+			list->data = fd;
+			list = list->next;
+			}
+		if (valid) valid = gtk_tree_model_iter_next(store, &iter);
+		}
+
+	r++;
+	while (valid)
+		{
+		GList *list;
+
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+		valid = gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
+		g_list_free(list);
+		}
+
+	VFICON(vf)->rows = r;
+
+	if (visible_fd &&
+	    gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
+		{
+		GtkTreeIter iter;
+		GList *list;
+
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_path_free(tpath);
+
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+		if (g_list_find(list, visible_fd) == NULL &&
+		    vficon_find_iter(vf, visible_fd, &iter, NULL))
+			{
+			tree_view_row_make_visible(GTK_TREE_VIEW(vf->listview), &iter, FALSE);
+			}
+		}
+
+
+	vf_send_update(vf);
+	vf_thumb_update(vf);
+}
+
+static void vficon_populate_at_new_size(ViewFile *vf, gint w, gint h, gboolean force)
+{
+	gint new_cols;
+	gint thumb_width;
+
+	thumb_width = vficon_get_icon_width(vf);
+
+	new_cols = w / (thumb_width + (THUMB_BORDER_PADDING * 6));
+	if (new_cols < 1) new_cols = 1;
+
+	if (!force && new_cols == VFICON(vf)->columns) return;
+
+	VFICON(vf)->columns = new_cols;
+
+	vficon_populate(vf, TRUE, TRUE);
+
+	DEBUG_1("col tab pop cols=%d rows=%d", VFICON(vf)->columns, VFICON(vf)->rows);
+}
+
+static void vficon_sized_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vficon_populate_at_new_size(vf, allocation->width, allocation->height, FALSE);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+void vficon_sort_set(ViewFile *vf, SortType type, gboolean ascend)
+{
+	if (vf->sort_method == type && vf->sort_ascend == ascend) return;
+
+	vf->sort_method = type;
+	vf->sort_ascend = ascend;
+
+	if (!vf->list) return;
+
+	vf_refresh(vf);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * thumb updates
+ *-----------------------------------------------------------------------------
+ */
+
+void vficon_thumb_progress_count(GList *list, gint *count, gint *done)
+{
+	GList *work = list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		if (fd->thumb_pixbuf) (*done)++;
+		(*count)++;
+		}
+}
+
+void vficon_set_thumb_fd(ViewFile *vf, FileData *fd)
+{
+	GtkTreeModel *store;
+	GtkTreeIter iter;
+	GList *list;
+
+	if (!g_list_find(vf->list, fd)) return;
+	if (!vficon_find_iter(vf, fd, &iter, NULL)) return;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+
+	gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+	gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1);
+}
+
+/* Returns the next fd without a loaded pixbuf, so the thumb-loader can load the pixbuf for it. */
+FileData *vficon_thumb_next_fd(ViewFile *vf)
+{
+	GtkTreePath *tpath;
+
+	/* First see if there are visible files that don't have a loaded thumb... */
+	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
+		{
+		GtkTreeModel *store;
+		GtkTreeIter iter;
+		gboolean valid = TRUE;
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_path_free(tpath);
+		tpath = NULL;
+
+		while (valid && tree_view_row_get_visibility(GTK_TREE_VIEW(vf->listview), &iter, FALSE) == 0)
+			{
+			GList *list;
+			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+
+			// TODO(xsdg): for loop here.
+			for (; list; list = list->next)
+				{
+				FileData *fd = list->data;
+				if (fd && !fd->thumb_pixbuf) return fd;
+				}
+
+			valid = gtk_tree_model_iter_next(store, &iter);
+			}
+		}
+
+	/* Then iterate through the entire list to load all of them. */
+	GList *work;
+	for (work = vf->list; work; work = work->next)
+		{
+		FileData *fd = work->data;
+
+		// Note: This implementation differs from view_file_list.c because sidecar files are not
+		// distinct list elements here, as they are in the list view.
+		if (!fd->thumb_pixbuf) return fd;
+		}
+
+	return NULL;
+}
+
+void vficon_thumb_reset_all(ViewFile *vf)
+{
+	GList *work = vf->list;
+
+	while (work)
+		{
+		FileData *fd = work->data;
+		if (fd->thumb_pixbuf)
+			{
+			g_object_unref(fd->thumb_pixbuf);
+			fd->thumb_pixbuf = NULL;
+			}
+		work = work->next;
+		}
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * row stuff
+ *-----------------------------------------------------------------------------
+ */
+
+FileData *vficon_index_get_data(ViewFile *vf, gint row)
+{
+	FileData *fd;
+
+	fd = g_list_nth_data(vf->list, row);
+	return fd ? fd : NULL;
+}
+
+
+gint vficon_index_by_fd(ViewFile *vf, FileData *in_fd)
+{
+	gint p = 0;
+	GList *work;
+
+	if (!in_fd) return -1;
+
+	work = vf->list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		if (fd == in_fd) return p;
+		work = work->next;
+		p++;
+		}
+
+	return -1;
+}
+
+guint vficon_count(ViewFile *vf, gint64 *bytes)
+{
+	if (bytes)
+		{
+		gint64 b = 0;
+		GList *work;
+
+		work = vf->list;
+		while (work)
+			{
+			FileData *fd = work->data;
+			work = work->next;
+
+			b += fd->size;
+			}
+
+		*bytes = b;
+		}
+
+	return g_list_length(vf->list);
+}
+
+GList *vficon_get_list(ViewFile *vf)
+{
+	GList *list = NULL;
+	GList *work;
+
+	work = vf->list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		list = g_list_prepend(list, file_data_ref(fd));
+		}
+
+	return g_list_reverse(list);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+static gboolean vficon_refresh_real(ViewFile *vf, gboolean keep_position)
+{
+	gboolean ret = TRUE;
+	GList *work, *new_work;
+	FileData *focus_fd;
+	FileData *first_selected = NULL;
+	GList *new_filelist = NULL;
+	GList *new_fd_list = NULL;
+
+	focus_fd = VFICON(vf)->focus_fd;
+
+	if (vf->dir_fd)
+		{
+		ret = filelist_read(vf->dir_fd, &new_filelist, NULL);
+		new_filelist = file_data_filter_marks_list(new_filelist, vf_marks_get_filter(vf));
+		}
+
+	vf->list = filelist_sort(vf->list, vf->sort_method, vf->sort_ascend); /* the list might not be sorted if there were renames */
+	new_filelist = filelist_sort(new_filelist, vf->sort_method, vf->sort_ascend);
+
+	if (VFICON(vf)->selection)
+		{
+		first_selected = VFICON(vf)->selection->data;
+		file_data_ref(first_selected);
+		g_list_free(VFICON(vf)->selection);
+		VFICON(vf)->selection = NULL;
+		}
+
+	/* iterate old list and new list, looking for differences */
+	work = vf->list;
+	new_work = new_filelist;
+	while (work || new_work)
+		{
+		FileData *fd = NULL;
+		FileData *new_fd = NULL;
+		gint match;
+
+		if (work && new_work)
+			{
+			fd = work->data;
+			new_fd = new_work->data;
+
+			if (fd == new_fd)
+				{
+				/* not changed, go to next */
+				work = work->next;
+				new_work = new_work->next;
+				if (fd->selected & SELECTION_SELECTED)
+					{
+					VFICON(vf)->selection = g_list_prepend(VFICON(vf)->selection, fd);
+					}
+				continue;
+				}
+
+			match = filelist_sort_compare_filedata_full(fd, new_fd, vf->sort_method, vf->sort_ascend);
+			if (match == 0) g_warning("multiple fd for the same path");
+			}
+		else if (work)
+			{
+			/* old item was deleted */
+			fd = work->data;
+			match = -1;
+			}
+		else
+			{
+			/* new item was added */
+			new_fd = new_work->data;
+			match = 1;
+			}
+
+		if (match < 0)
+			{
+			/* file no longer exists, delete from vf->list */
+			GList *to_delete = work;
+			work = work->next;
+			if (fd == VFICON(vf)->prev_selection) VFICON(vf)->prev_selection = NULL;
+			if (fd == VFICON(vf)->click_fd) VFICON(vf)->click_fd = NULL;
+			file_data_unref(fd);
+			vf->list = g_list_delete_link(vf->list, to_delete);
+			}
+		else
+			{
+			/* new file, add to vf->list */
+			file_data_ref(new_fd);
+			new_fd->selected = SELECTION_NONE;
+			if (work)
+				{
+				vf->list = g_list_insert_before(vf->list, work, new_fd);
+				}
+			else
+				{
+				/* it is faster to append all new entries together later */
+				new_fd_list = g_list_prepend(new_fd_list, new_fd);
+				}
+
+			new_work = new_work->next;
+			}
+		}
+
+	if (new_fd_list)
+		{
+		vf->list = g_list_concat(vf->list, g_list_reverse(new_fd_list));
+		}
+
+	VFICON(vf)->selection = g_list_reverse(VFICON(vf)->selection);
+
+	filelist_free(new_filelist);
+
+	vficon_populate(vf, TRUE, keep_position);
+
+	if (first_selected && !VFICON(vf)->selection)
+		{
+		/* all selected files disappeared */
+		vficon_select_closest(vf, first_selected);
+		}
+	file_data_unref(first_selected);
+
+	/* attempt to keep focus on same icon when refreshing */
+	if (focus_fd && g_list_find(vf->list, focus_fd))
+		{
+		vficon_set_focus(vf, focus_fd);
+		}
+
+	return ret;
+}
+
+gboolean vficon_refresh(ViewFile *vf)
+{
+	return vficon_refresh_real(vf, TRUE);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * draw, etc.
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _ColumnData ColumnData;
+struct _ColumnData
+{
+	ViewFile *vf;
+	gint number;
+};
+
+static void vficon_cell_data_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+				GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+	GList *list;
+	FileData *fd;
+	ColumnData *cd = data;
+	ViewFile *vf = cd->vf;
+
+	if (!GQV_IS_CELL_RENDERER_ICON(cell)) return;
+
+	gtk_tree_model_get(tree_model, iter, FILE_COLUMN_POINTER, &list, -1);
+
+	fd = g_list_nth_data(list, cd->number);
+
+	if (fd)
+		{
+		GdkColor color_fg;
+		GdkColor color_bg;
+		GtkStyle *style;
+		gchar *name_sidecars;
+		gchar *link;
+		GtkStateType state = GTK_STATE_NORMAL;
+
+		g_assert(fd->magick == FD_MAGICK);
+
+		link = islink(fd->path) ? GQ_LINK_STR : "";
+		if (fd->sidecar_files)
+			{
+			gchar *sidecars = file_data_sc_list_to_string(fd);
+			name_sidecars = g_strdup_printf("%s%s %s", link, fd->name, sidecars);
+			g_free(sidecars);
+			}
+		else
+			{
+			gchar *disabled_grouping = fd->disable_grouping ? _(" [NO GROUPING]") : "";
+			name_sidecars = g_strdup_printf("%s%s%s", link, fd->name, disabled_grouping);
+			}
+
+		style = gtk_widget_get_style(vf->listview);
+		if (fd->selected & SELECTION_SELECTED)
+			{
+			state = GTK_STATE_SELECTED;
+			}
+
+		memcpy(&color_fg, &style->text[state], sizeof(color_fg));
+		memcpy(&color_bg, &style->base[state], sizeof(color_bg));
+
+		if (fd->selected & SELECTION_PRELIGHT)
+			{
+			shift_color(&color_bg, -1, 0);
+			}
+
+		g_object_set(cell,	"pixbuf", fd->thumb_pixbuf,
+					"text", name_sidecars,
+					"marks", file_data_get_marks(fd),
+					"show_marks", vf->marks_enabled,
+					"cell-background-gdk", &color_bg,
+					"cell-background-set", TRUE,
+					"foreground-gdk", &color_fg,
+					"foreground-set", TRUE,
+					"has-focus", (VFICON(vf)->focus_fd == fd), NULL);
+		g_free(name_sidecars);
+		}
+	else
+		{
+		g_object_set(cell,	"pixbuf", NULL,
+					"text", NULL,
+					"show_marks", FALSE,
+					"cell-background-set", FALSE,
+					"foreground-set", FALSE,
+					"has-focus", FALSE, NULL);
+		}
+}
+
+static void vficon_append_column(ViewFile *vf, gint n)
+{
+	ColumnData *cd;
+	GtkTreeViewColumn *column;
+	GtkCellRenderer *renderer;
+
+	column = gtk_tree_view_column_new();
+	gtk_tree_view_column_set_min_width(column, 0);
+
+	gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+	gtk_tree_view_column_set_alignment(column, 0.5);
+
+	renderer = gqv_cell_renderer_icon_new();
+	gtk_tree_view_column_pack_start(column, renderer, FALSE);
+	g_object_set(G_OBJECT(renderer), "xpad", THUMB_BORDER_PADDING * 2,
+					 "ypad", THUMB_BORDER_PADDING,
+					 "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
+
+	g_object_set_data(G_OBJECT(column), "column_number", GINT_TO_POINTER(n));
+	g_object_set_data(G_OBJECT(renderer), "column_number", GINT_TO_POINTER(n));
+
+	cd = g_new0(ColumnData, 1);
+	cd->vf = vf;
+	cd->number = n;
+	gtk_tree_view_column_set_cell_data_func(column, renderer, vficon_cell_data_cb, cd, g_free);
+
+	gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column);
+
+	g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vficon_mark_toggled_cb), vf);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * base
+ *-----------------------------------------------------------------------------
+ */
+
+gboolean vficon_set_fd(ViewFile *vf, FileData *dir_fd)
+{
+	gboolean ret;
+
+	if (!dir_fd) return FALSE;
+	if (vf->dir_fd == dir_fd) return TRUE;
+
+	file_data_unref(vf->dir_fd);
+	vf->dir_fd = file_data_ref(dir_fd);
+
+	g_list_free(VFICON(vf)->selection);
+	VFICON(vf)->selection = NULL;
+
+	g_list_free(vf->list);
+	vf->list = NULL;
+
+	/* NOTE: populate will clear the store for us */
+	ret = vficon_refresh_real(vf, FALSE);
+
+	VFICON(vf)->focus_fd = NULL;
+	vficon_move_focus(vf, 0, 0, FALSE);
+
+	return ret;
+}
+
+void vficon_destroy_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vf_refresh_idle_cancel(vf);
+
+	file_data_unregister_notify_func(vf_notify_cb, vf);
+
+	tip_unschedule(vf);
+
+	vf_thumb_cleanup(vf);
+
+	g_list_free(vf->list);
+	g_list_free(VFICON(vf)->selection);
+}
+
+ViewFile *vficon_new(ViewFile *vf, FileData *dir_fd)
+{
+	GtkListStore *store;
+	GtkTreeSelection *selection;
+	gint i;
+
+	vf->info = g_new0(ViewFileInfoIcon, 1);
+
+	VFICON(vf)->show_text = options->show_icon_names;
+
+	store = gtk_list_store_new(1, G_TYPE_POINTER);
+	vf->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+	g_object_unref(store);
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_NONE);
+
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vf->listview), FALSE);
+	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vf->listview), FALSE);
+
+	for (i = 0; i < VFICON_MAX_COLUMNS; i++)
+		{
+		vficon_append_column(vf, i);
+		}
+
+	/* zero width column to hide tree view focus, we draw it ourselves */
+	vficon_append_column(vf, i);
+	/* end column to fill white space */
+	vficon_append_column(vf, i);
+
+	g_signal_connect(G_OBJECT(vf->listview), "size_allocate",
+			 G_CALLBACK(vficon_sized_cb), vf);
+
+	gtk_widget_set_events(vf->listview, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK |
+			      GDK_BUTTON_PRESS_MASK | GDK_LEAVE_NOTIFY_MASK);
+
+	g_signal_connect(G_OBJECT(vf->listview),"motion_notify_event",
+			 G_CALLBACK(vficon_motion_cb), vf);
+	g_signal_connect(G_OBJECT(vf->listview), "leave_notify_event",
+			 G_CALLBACK(vficon_leave_cb), vf);
+
+	/* force VFICON(vf)->columns to be at least 1 (sane) - this will be corrected in the size_cb */
+	vficon_populate_at_new_size(vf, 1, 1, FALSE);
+
+	file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
+
+	return vf;
+}
+
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/view_file/view_file_icon.h	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef VIEW_FILE_VIEW_FILE_ICON_H
+#define VIEW_FILE_VIEW_FILE_ICON_H
+
+#include "filedata.h"
+
+gboolean vficon_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data);
+gboolean vficon_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
+gboolean vficon_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
+
+void vficon_dnd_init(ViewFile *vf);
+
+void vficon_destroy_cb(GtkWidget *widget, gpointer data);
+ViewFile *vficon_new(ViewFile *vf, FileData *dir_fd);
+
+gboolean vficon_set_fd(ViewFile *vf, FileData *dir_fd);
+gboolean vficon_refresh(ViewFile *vf);
+
+void vficon_sort_set(ViewFile *vf, SortType type, gboolean ascend);
+
+void vficon_marks_set(ViewFile *vf, gboolean enable);
+
+GList *vficon_selection_get_one(ViewFile *vf, FileData *fd);
+GList *vficon_pop_menu_file_list(ViewFile *vf);
+void vficon_pop_menu_view_cb(GtkWidget *widget, gpointer data);
+void vficon_pop_menu_rename_cb(GtkWidget *widget, gpointer data);
+void vficon_pop_menu_refresh_cb(GtkWidget *widget, gpointer data);
+void vficon_popup_destroy_cb(GtkWidget *widget, gpointer data);
+void vficon_pop_menu_show_names_cb(GtkWidget *widget, gpointer data);
+
+FileData *vficon_index_get_data(ViewFile *vf, gint row);
+gint vficon_index_by_fd(ViewFile *vf, FileData *in_fd);
+guint vficon_count(ViewFile *vf, gint64 *bytes);
+GList *vficon_get_list(ViewFile *vf);
+
+gboolean vficon_index_is_selected(ViewFile *vf, gint row);
+guint vficon_selection_count(ViewFile *vf, gint64 *bytes);
+GList *vficon_selection_get_list(ViewFile *vf);
+GList *vficon_selection_get_list_by_index(ViewFile *vf);
+
+void vficon_select_all(ViewFile *vf);
+void vficon_select_none(ViewFile *vf);
+void vficon_select_invert(ViewFile *vf);
+void vficon_select_by_fd(ViewFile *vf, FileData *fd);
+
+void vficon_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode);
+void vficon_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode);
+
+
+void vficon_thumb_progress_count(GList *list, gint *count, gint *done);
+void vficon_set_thumb_fd(ViewFile *vf, FileData *fd);
+FileData *vficon_thumb_next_fd(ViewFile *vf);
+void vficon_thumb_reset_all(ViewFile *vf);
+
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/view_file/view_file_list.c	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,2053 @@
+/*
+ * Copyright (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "main.h"
+#include "view_file_list.h"
+
+#include "bar.h"
+#include "cache_maint.h"
+#include "dnd.h"
+#include "editors.h"
+#include "img-view.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "menu.h"
+#include "metadata.h"
+#include "thumb.h"
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_tree_edit.h"
+#include "uri_utils.h"
+#include "view_file.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+/* Index to tree store */
+enum {
+	FILE_COLUMN_POINTER = 0,
+	FILE_COLUMN_VERSION,
+	FILE_COLUMN_THUMB,
+	FILE_COLUMN_FORMATTED,
+	FILE_COLUMN_NAME,
+	FILE_COLUMN_SIDECARS,
+	FILE_COLUMN_SIZE,
+	FILE_COLUMN_DATE,
+	FILE_COLUMN_EXPANDED,
+	FILE_COLUMN_COLOR,
+	FILE_COLUMN_MARKS,
+	FILE_COLUMN_MARKS_LAST = FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1,
+	FILE_COLUMN_COUNT
+};
+
+
+/* Index to tree view */
+enum {
+	FILE_VIEW_COLUMN_MARKS = 0,
+	FILE_VIEW_COLUMN_MARKS_LAST = FILE_VIEW_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1,
+	FILE_VIEW_COLUMN_THUMB,
+	FILE_VIEW_COLUMN_FORMATTED,
+	FILE_VIEW_COLUMN_SIZE,
+	FILE_VIEW_COLUMN_DATE,
+	FILE_VIEW_COLUMN_COUNT
+};
+
+
+
+static gboolean vflist_row_is_selected(ViewFile *vf, FileData *fd);
+static gboolean vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data);
+static void vflist_populate_view(ViewFile *vf, gboolean force);
+static gboolean vflist_is_multiline(ViewFile *vf);
+static void vflist_set_expanded(ViewFile *vf, GtkTreeIter *iter, gboolean expanded);
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+typedef struct {
+	FileData *fd;
+	GtkTreeIter *iter;
+	gboolean found;
+	gint row;
+} ViewFileFindRowData;
+
+static gboolean vflist_find_row_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+	ViewFileFindRowData *find = data;
+	FileData *fd;
+	gtk_tree_model_get(model, iter, FILE_COLUMN_POINTER, &fd, -1);
+	if (fd == find->fd)
+		{
+		*find->iter = *iter;
+		find->found = TRUE;
+		return TRUE;
+		}
+	find->row++;
+	return FALSE;
+}
+
+static gint vflist_find_row(ViewFile *vf, FileData *fd, GtkTreeIter *iter)
+{
+	GtkTreeModel *store;
+	ViewFileFindRowData data = {fd, iter, FALSE, 0};
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_model_foreach(store, vflist_find_row_cb, &data);
+
+	if (data.found)
+		{
+		return data.row;
+		}
+
+	return -1;
+}
+
+static FileData *vflist_find_data_by_coord(ViewFile *vf, gint x, gint y, GtkTreeIter *iter)
+{
+	GtkTreePath *tpath;
+	GtkTreeViewColumn *column;
+
+	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), x, y,
+					  &tpath, &column, NULL, NULL))
+		{
+		GtkTreeModel *store;
+		GtkTreeIter row;
+		FileData *fd;
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		gtk_tree_model_get_iter(store, &row, tpath);
+		gtk_tree_path_free(tpath);
+		gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &fd, -1);
+
+		return fd;
+		}
+
+	return NULL;
+}
+
+static gboolean vflist_store_clear_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+	FileData *fd;
+	gtk_tree_model_get(model, iter, FILE_COLUMN_POINTER, &fd, -1);
+
+	/* it seems that gtk_tree_store_clear may call some callbacks
+	   that use the column. Set the pointer to NULL to be safe. */
+	gtk_tree_store_set(GTK_TREE_STORE(model), iter, FILE_COLUMN_POINTER, NULL, -1);
+	file_data_unref(fd);
+	return FALSE;
+}
+
+static void vflist_store_clear(ViewFile *vf, gboolean unlock_files)
+{
+	GtkTreeModel *store;
+	GList *files = NULL;
+
+	if (unlock_files && vf->marks_enabled)
+		{
+		// unlock locked files in this directory
+		filelist_read(vf->dir_fd, &files, NULL);
+		while (files)
+			{
+			FileData *fd = files->data;
+			files = files->next;
+			file_data_unlock(fd);
+			file_data_unref(fd);  // undo the ref that got added in filelist_read
+			}
+		}
+
+	g_list_free(files);
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_model_foreach(store, vflist_store_clear_cb, NULL);
+	gtk_tree_store_clear(GTK_TREE_STORE(store));
+}
+
+void vflist_color_set(ViewFile *vf, FileData *fd, gboolean color_set)
+{
+	GtkTreeModel *store;
+	GtkTreeIter iter;
+
+	if (vflist_find_row(vf, fd, &iter) < 0) return;
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_store_set(GTK_TREE_STORE(store), &iter, FILE_COLUMN_COLOR, color_set, -1);
+}
+
+static void vflist_move_cursor(ViewFile *vf, GtkTreeIter *iter)
+{
+	GtkTreeModel *store;
+	GtkTreePath *tpath;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+
+	tpath = gtk_tree_model_get_path(store, iter);
+	gtk_tree_view_set_cursor(GTK_TREE_VIEW(vf->listview), tpath, NULL, FALSE);
+	gtk_tree_path_free(tpath);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * dnd
+ *-----------------------------------------------------------------------------
+ */
+
+static void vflist_dnd_get(GtkWidget *widget, GdkDragContext *context,
+			   GtkSelectionData *selection_data, guint info,
+			   guint time, gpointer data)
+{
+	ViewFile *vf = data;
+	GList *list = NULL;
+
+	if (!VFLIST(vf)->click_fd) return;
+
+	if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
+		{
+		list = vf_selection_get_list(vf);
+		}
+	else
+		{
+		list = g_list_append(NULL, file_data_ref(VFLIST(vf)->click_fd));
+		}
+
+	if (!list) return;
+	uri_selection_data_set_uris_from_filelist(selection_data, list);
+	filelist_free(list);
+}
+
+static void vflist_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vflist_color_set(vf, VFLIST(vf)->click_fd, TRUE);
+
+	if (VFLIST(vf)->thumbs_enabled &&
+	    VFLIST(vf)->click_fd && VFLIST(vf)->click_fd->thumb_pixbuf)
+		{
+		guint items;
+
+		if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
+			items = vf_selection_count(vf, NULL);
+		else
+			items = 1;
+
+		dnd_set_drag_icon(widget, context, VFLIST(vf)->click_fd->thumb_pixbuf, items);
+		}
+}
+
+static void vflist_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
+
+	if (gdk_drag_context_get_selected_action(context) == GDK_ACTION_MOVE)
+		{
+		vf_refresh(vf);
+		}
+}
+
+static void vflist_drag_data_received(GtkWidget *entry_widget, GdkDragContext *context,
+				      int x, int y, GtkSelectionData *selection,
+				      guint info, guint time, gpointer data)
+{
+	ViewFile *vf = data;
+
+	if (info == TARGET_TEXT_PLAIN) {
+		FileData *fd = vflist_find_data_by_coord(vf, x, y, NULL);
+
+		if (fd) {
+			/* Add keywords to file */
+			gchar *str = (gchar *) gtk_selection_data_get_text(selection);
+			GList *kw_list = string_to_keywords_list(str);
+
+			metadata_append_list(fd, KEYWORD_KEY, kw_list);
+			string_list_free(kw_list);
+			g_free(str);
+		}
+	}
+}
+
+void vflist_dnd_init(ViewFile *vf)
+{
+	gtk_drag_source_set(vf->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+			    dnd_file_drag_types, dnd_file_drag_types_count,
+			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+	gtk_drag_dest_set(vf->listview, GTK_DEST_DEFAULT_ALL,
+			    dnd_file_drag_types, dnd_file_drag_types_count,
+			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+
+	g_signal_connect(G_OBJECT(vf->listview), "drag_data_get",
+			 G_CALLBACK(vflist_dnd_get), vf);
+	g_signal_connect(G_OBJECT(vf->listview), "drag_begin",
+			 G_CALLBACK(vflist_dnd_begin), vf);
+	g_signal_connect(G_OBJECT(vf->listview), "drag_end",
+			 G_CALLBACK(vflist_dnd_end), vf);
+	g_signal_connect(G_OBJECT(vf->listview), "drag_data_received",
+			 G_CALLBACK(vflist_drag_data_received), vf);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * pop-up menu
+ *-----------------------------------------------------------------------------
+ */
+
+GList *vflist_selection_get_one(ViewFile *vf, FileData *fd)
+{
+	GList *list = g_list_append(NULL, file_data_ref(fd));
+
+	if (fd->sidecar_files)
+		{
+		/* check if the row is expanded */
+		GtkTreeModel *store;
+		GtkTreeIter iter;
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		if (vflist_find_row(vf, fd, &iter) >= 0)
+			{
+			GtkTreePath *tpath;
+
+			tpath = gtk_tree_model_get_path(store, &iter);
+			if (!gtk_tree_view_row_expanded(GTK_TREE_VIEW(vf->listview), tpath))
+				{
+				/* unexpanded - add whole group */
+				GList *work = fd->sidecar_files;
+				while (work)
+					{
+					FileData *sfd = work->data;
+					list = g_list_prepend(list, file_data_ref(sfd));
+					work = work->next;
+					}
+				}
+			gtk_tree_path_free(tpath);
+			}
+		list = g_list_reverse(list);
+		}
+
+	return list;
+}
+
+GList *vflist_pop_menu_file_list(ViewFile *vf)
+{
+	if (!VFLIST(vf)->click_fd) return NULL;
+
+	if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
+		{
+		return vf_selection_get_list(vf);
+		}
+	return vflist_selection_get_one(vf, VFLIST(vf)->click_fd);
+}
+
+
+void vflist_pop_menu_view_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
+		{
+		GList *list;
+
+		list = vf_selection_get_list(vf);
+		view_window_new_from_list(list);
+		filelist_free(list);
+		}
+	else
+		{
+		view_window_new(VFLIST(vf)->click_fd);
+		}
+}
+
+void vflist_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+	GList *list;
+
+	list = vf_pop_menu_file_list(vf);
+	if (options->file_ops.enable_in_place_rename &&
+	    list && !list->next && VFLIST(vf)->click_fd)
+		{
+		GtkTreeModel *store;
+		GtkTreeIter iter;
+
+		filelist_free(list);
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		if (vflist_find_row(vf, VFLIST(vf)->click_fd, &iter) >= 0)
+			{
+			GtkTreePath *tpath;
+
+			tpath = gtk_tree_model_get_path(store, &iter);
+			tree_edit_by_path(GTK_TREE_VIEW(vf->listview), tpath,
+					  FILE_VIEW_COLUMN_FORMATTED, VFLIST(vf)->click_fd->name,
+					  vflist_row_rename_cb, vf);
+			gtk_tree_path_free(tpath);
+			}
+		return;
+		}
+
+	file_util_rename(NULL, list, vf->listview);
+}
+
+void vflist_pop_menu_thumbs_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
+	if (vf->layout)
+		{
+		layout_thumb_set(vf->layout, !VFLIST(vf)->thumbs_enabled);
+		}
+	else
+		{
+		vflist_thumb_set(vf, !VFLIST(vf)->thumbs_enabled);
+		}
+}
+
+void vflist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
+	vf_refresh(vf);
+	gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
+}
+
+void vflist_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
+	VFLIST(vf)->click_fd = NULL;
+	vf->popup = NULL;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * callbacks
+ *-----------------------------------------------------------------------------
+ */
+
+static gboolean vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data)
+{
+	ViewFile *vf = data;
+	gchar *new_path;
+
+	if (!new || !new[0]) return FALSE;
+
+	new_path = g_build_filename(vf->dir_fd->path, new, NULL);
+
+	if (strchr(new, G_DIR_SEPARATOR) != NULL)
+		{
+		gchar *text = g_strdup_printf(_("Invalid file name:\n%s"), new);
+		file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, vf->listview);
+		g_free(text);
+		}
+	else
+		{
+		gchar *old_path = g_build_filename(vf->dir_fd->path, old, NULL);
+		FileData *fd = file_data_new_group(old_path); /* get the fd from cache */
+		file_util_rename_simple(fd, new_path, vf->listview);
+		file_data_unref(fd);
+		g_free(old_path);
+		}
+
+	g_free(new_path);
+
+	return FALSE;
+}
+
+static void vflist_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreeModel *store;
+	GtkTreeIter iter;
+	GtkTreePath *tpath;
+	gint cw, ch;
+
+	if (vflist_find_row(vf, VFLIST(vf)->click_fd, &iter) < 0) return;
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	tpath = gtk_tree_model_get_path(store, &iter);
+	tree_view_get_cell_clamped(GTK_TREE_VIEW(vf->listview), tpath, FILE_COLUMN_NAME - 1, TRUE, x, y, &cw, &ch);
+	gtk_tree_path_free(tpath);
+	*y += ch;
+	popup_menu_position_clamp(menu, x, y, 0);
+}
+
+gboolean vflist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreePath *tpath;
+
+	if (event->keyval != GDK_KEY_Menu) return FALSE;
+
+	gtk_tree_view_get_cursor(GTK_TREE_VIEW(vf->listview), &tpath, NULL);
+	if (tpath)
+		{
+		GtkTreeModel *store;
+		GtkTreeIter iter;
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &VFLIST(vf)->click_fd, -1);
+		gtk_tree_path_free(tpath);
+		}
+	else
+		{
+		VFLIST(vf)->click_fd = NULL;
+		}
+
+	vf->popup = vf_pop_menu(vf);
+	gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, vflist_menu_position_cb, vf, 0, GDK_CURRENT_TIME);
+
+	return TRUE;
+}
+
+gboolean vflist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreePath *tpath;
+	GtkTreeIter iter;
+	FileData *fd = NULL;
+	GtkTreeViewColumn *column;
+
+	vf->clicked_mark = 0;
+
+	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+					  &tpath, &column, NULL, NULL))
+		{
+		GtkTreeModel *store;
+		gint col_idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_store_idx"));
+
+		if (bevent->button == MOUSE_BUTTON_LEFT &&
+		    col_idx >= FILE_COLUMN_MARKS && col_idx <= FILE_COLUMN_MARKS_LAST)
+			return FALSE;
+
+		if (col_idx >= FILE_COLUMN_MARKS && col_idx <= FILE_COLUMN_MARKS_LAST)
+			vf->clicked_mark = 1 + (col_idx - FILE_COLUMN_MARKS);
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+		gtk_tree_path_free(tpath);
+		}
+
+	VFLIST(vf)->click_fd = fd;
+
+	if (bevent->button == MOUSE_BUTTON_RIGHT)
+		{
+		vf->popup = vf_pop_menu(vf);
+		gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, NULL, NULL,
+				bevent->button, bevent->time);
+		return TRUE;
+		}
+
+	if (!fd) return FALSE;
+
+	if (bevent->button == MOUSE_BUTTON_MIDDLE)
+		{
+		if (!vflist_row_is_selected(vf, fd))
+			{
+			vflist_color_set(vf, fd, TRUE);
+			}
+		return TRUE;
+		}
+
+
+	if (bevent->button == MOUSE_BUTTON_LEFT && bevent->type == GDK_BUTTON_PRESS &&
+	    !(bevent->state & GDK_SHIFT_MASK ) &&
+	    !(bevent->state & GDK_CONTROL_MASK ) &&
+	    vflist_row_is_selected(vf, fd))
+		{
+		GtkTreeSelection *selection;
+
+		gtk_widget_grab_focus(widget);
+
+
+		/* returning FALSE and further processing of the event is needed for
+		   correct operation of the expander, to show the sidecar files.
+		   It however resets the selection of multiple files. With this condition
+		   it should work for both cases */
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+		return (gtk_tree_selection_count_selected_rows(selection) > 1);
+		}
+
+	if (bevent->button == MOUSE_BUTTON_LEFT && bevent->type == GDK_2BUTTON_PRESS)
+		{
+		if (vf->layout) layout_image_full_screen_start(vf->layout);
+		}
+
+	return FALSE;
+}
+
+gboolean vflist_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreePath *tpath;
+	GtkTreeIter iter;
+	FileData *fd = NULL;
+
+	if (bevent->button == MOUSE_BUTTON_MIDDLE)
+		{
+		vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
+		}
+
+	if (bevent->button != MOUSE_BUTTON_LEFT && bevent->button != MOUSE_BUTTON_MIDDLE)
+		{
+		return TRUE;
+		}
+
+	if ((bevent->x != 0 || bevent->y != 0) &&
+	    gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+					  &tpath, NULL, NULL, NULL))
+		{
+		GtkTreeModel *store;
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+		gtk_tree_path_free(tpath);
+		}
+
+	if (bevent->button == MOUSE_BUTTON_MIDDLE)
+		{
+		if (fd && VFLIST(vf)->click_fd == fd)
+			{
+			GtkTreeSelection *selection;
+
+			selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+			if (vflist_row_is_selected(vf, fd))
+				{
+				gtk_tree_selection_unselect_iter(selection, &iter);
+				}
+			else
+				{
+				gtk_tree_selection_select_iter(selection, &iter);
+				}
+			}
+		return TRUE;
+		}
+
+	if (fd && VFLIST(vf)->click_fd == fd &&
+	    !(bevent->state & GDK_SHIFT_MASK ) &&
+	    !(bevent->state & GDK_CONTROL_MASK ) &&
+	    vflist_row_is_selected(vf, fd))
+		{
+		GtkTreeSelection *selection;
+
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+		gtk_tree_selection_unselect_all(selection);
+		gtk_tree_selection_select_iter(selection, &iter);
+		vflist_move_cursor(vf, &iter);
+		}
+
+	return FALSE;
+}
+
+static void vflist_select_image(ViewFile *vf, FileData *sel_fd)
+{
+	FileData *read_ahead_fd = NULL;
+	gint row;
+	FileData *cur_fd;
+
+	if (!sel_fd) return;
+
+	cur_fd = layout_image_get_fd(vf->layout);
+	if (sel_fd == cur_fd) return; /* no change */
+
+	row = g_list_index(vf->list, sel_fd);
+	// FIXME sidecar data
+
+	if (sel_fd && options->image.enable_read_ahead && row >= 0)
+		{
+		if (row > g_list_index(vf->list, cur_fd) &&
+		    (guint) (row + 1) < vf_count(vf, NULL))
+			{
+			read_ahead_fd = vf_index_get_data(vf, row + 1);
+			}
+		else if (row > 0)
+			{
+			read_ahead_fd = vf_index_get_data(vf, row - 1);
+			}
+		}
+
+	layout_image_set_with_ahead(vf->layout, sel_fd, read_ahead_fd);
+}
+
+static gboolean vflist_select_idle_cb(gpointer data)
+{
+	ViewFile *vf = data;
+
+	if (!vf->layout)
+		{
+		VFLIST(vf)->select_idle_id = 0;
+		return FALSE;
+		}
+
+	vf_send_update(vf);
+
+	if (VFLIST(vf)->select_fd)
+		{
+		vflist_select_image(vf, VFLIST(vf)->select_fd);
+		VFLIST(vf)->select_fd = NULL;
+		}
+
+	VFLIST(vf)->select_idle_id = 0;
+	return FALSE;
+}
+
+static void vflist_select_idle_cancel(ViewFile *vf)
+{
+	if (VFLIST(vf)->select_idle_id)
+		{
+		g_source_remove(VFLIST(vf)->select_idle_id);
+		VFLIST(vf)->select_idle_id = 0;
+		}
+}
+
+static gboolean vflist_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath,
+				 gboolean path_currently_selected, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreeIter iter;
+
+	if (!path_currently_selected &&
+	    gtk_tree_model_get_iter(store, &iter, tpath))
+		{
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &VFLIST(vf)->select_fd, -1);
+		}
+	else
+		{
+		VFLIST(vf)->select_fd = NULL;
+		}
+
+	if (vf->layout &&
+	    !VFLIST(vf)->select_idle_id)
+		{
+		VFLIST(vf)->select_idle_id = g_idle_add(vflist_select_idle_cb, vf);
+		}
+
+	return TRUE;
+}
+
+static void vflist_expand_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data)
+{
+	ViewFile *vf = data;
+	vflist_set_expanded(vf, iter, TRUE);
+}
+
+static void vflist_collapse_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data)
+{
+	ViewFile *vf = data;
+	vflist_set_expanded(vf, iter, FALSE);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+
+static gchar* vflist_get_formatted(ViewFile *vf, const gchar *name, const gchar *sidecars, const gchar *size, const gchar *time, gboolean expanded)
+ {
+	gboolean multiline = vflist_is_multiline(vf);
+	gchar *text;
+
+	if (multiline)
+		{
+		text = g_strdup_printf("%s %s\n%s\n%s", name, expanded ? "" : sidecars, size, time);
+		}
+	else
+		{
+		text = g_strdup_printf("%s %s", name, expanded ? "" : sidecars);
+		}
+	return text;
+}
+
+static void vflist_set_expanded(ViewFile *vf, GtkTreeIter *iter, gboolean expanded)
+{
+	GtkTreeStore *store;
+	gchar *name;
+	gchar *sidecars;
+	gchar *size;
+	gchar *time;
+	gchar *formatted;
+
+	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
+
+	gtk_tree_model_get(GTK_TREE_MODEL(store), iter,
+					FILE_COLUMN_NAME, &name,
+					FILE_COLUMN_SIDECARS, &sidecars,
+					FILE_COLUMN_SIZE, &size,
+					FILE_COLUMN_DATE, &time,
+					-1);
+	formatted = vflist_get_formatted(vf, name, sidecars, size, time, expanded);
+
+	gtk_tree_store_set(store, iter, FILE_COLUMN_FORMATTED, formatted,
+					FILE_COLUMN_EXPANDED, expanded,
+					-1);
+	g_free(time);
+	g_free(size);
+	g_free(sidecars);
+	g_free(name);
+	g_free(formatted);
+}
+
+static void vflist_setup_iter(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *iter, FileData *fd)
+{
+	gchar *size;
+	gchar *sidecars = NULL;
+	gchar *name;
+	const gchar *time = text_from_time(fd->date);
+	gchar *link = islink(fd->path) ? GQ_LINK_STR : "";
+	const gchar *disabled_grouping;
+	gchar *formatted;
+	gboolean expanded = FALSE;
+
+	if (fd->sidecar_files) /* expanded has no effect on files without sidecars */
+		{
+		gtk_tree_model_get(GTK_TREE_MODEL(store), iter, FILE_COLUMN_EXPANDED, &expanded, -1);
+		}
+
+	sidecars = file_data_sc_list_to_string(fd);
+
+	disabled_grouping = fd->disable_grouping ? _(" [NO GROUPING]") : "";
+	name = g_strdup_printf("%s%s%s", link, fd->name, disabled_grouping);
+	size = text_from_size(fd->size);
+
+	formatted = vflist_get_formatted(vf, name, sidecars, size, time, expanded);
+
+	gtk_tree_store_set(store, iter, FILE_COLUMN_POINTER, fd,
+					FILE_COLUMN_VERSION, fd->version,
+					FILE_COLUMN_THUMB, fd->thumb_pixbuf,
+					FILE_COLUMN_FORMATTED, formatted,
+					FILE_COLUMN_SIDECARS, sidecars,
+					FILE_COLUMN_NAME, name,
+					FILE_COLUMN_SIZE, size,
+					FILE_COLUMN_DATE, time,
+#define STORE_SET_IS_SLOW 1
+#if STORE_SET_IS_SLOW
+/* this is 3x faster on a directory with 20000 files */
+					FILE_COLUMN_MARKS + 0, file_data_get_mark(fd, 0),
+					FILE_COLUMN_MARKS + 1, file_data_get_mark(fd, 1),
+					FILE_COLUMN_MARKS + 2, file_data_get_mark(fd, 2),
+					FILE_COLUMN_MARKS + 3, file_data_get_mark(fd, 3),
+					FILE_COLUMN_MARKS + 4, file_data_get_mark(fd, 4),
+					FILE_COLUMN_MARKS + 5, file_data_get_mark(fd, 5),
+#if FILEDATA_MARKS_SIZE != 6
+#error this needs to be updated
+#endif
+#endif
+					FILE_COLUMN_COLOR, FALSE, -1);
+
+#if !STORE_SET_IS_SLOW
+	{
+	gint i;
+	for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
+		gtk_tree_store_set(store, iter, FILE_COLUMN_MARKS + i, file_data_get_mark(fd, i), -1);
+	}
+#endif
+	g_free(size);
+	g_free(sidecars);
+	g_free(name);
+	g_free(formatted);
+}
+
+static void vflist_setup_iter_recursive(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *parent_iter, GList *list, GList *selected, gboolean force)
+{
+	GList *work;
+	GtkTreeIter iter;
+	gboolean valid;
+	gint num_ordered = 0;
+	gint num_prepended = 0;
+
+	valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(store), &iter, parent_iter);
+
+	work = list;
+	while (work)
+		{
+		gint match;
+		FileData *fd = work->data;
+		gboolean done = FALSE;
+
+		while (!done)
+			{
+			FileData *old_fd = NULL;
+			gint old_version = 0;
+
+			if (valid)
+				{
+				gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
+						   FILE_COLUMN_POINTER, &old_fd,
+						   FILE_COLUMN_VERSION, &old_version,
+						   -1);
+
+				if (fd == old_fd)
+					{
+					match = 0;
+					}
+				else
+					{
+					if (parent_iter)
+						match = filelist_sort_compare_filedata_full(fd, old_fd, SORT_NAME, TRUE); /* always sort sidecars by name */
+					else
+						match = filelist_sort_compare_filedata_full(fd, old_fd, vf->sort_method, vf->sort_ascend);
+
+					if (match == 0) g_warning("multiple fd for the same path");
+					}
+
+				}
+			else
+				{
+				match = -1;
+				}
+
+			if (match < 0)
+				{
+				GtkTreeIter new;
+
+				if (valid)
+					{
+					num_ordered++;
+					gtk_tree_store_insert_before(store, &new, parent_iter, &iter);
+					}
+				else
+					{
+					/*
+					    here should be used gtk_tree_store_append, but this function seems to be O(n)
+					    and it seems to be much faster to add new entries to the beginning and reorder later
+					*/
+					num_prepended++;
+					gtk_tree_store_prepend(store, &new, parent_iter);
+					}
+
+				vflist_setup_iter(vf, store, &new, file_data_ref(fd));
+				vflist_setup_iter_recursive(vf, store, &new, fd->sidecar_files, selected, force);
+
+				if (g_list_find(selected, fd))
+					{
+					/* renamed files - the same fd appears at different position - select it again*/
+					GtkTreeSelection *selection;
+					selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+					gtk_tree_selection_select_iter(selection, &new);
+					}
+
+				done = TRUE;
+				}
+			else if (match > 0)
+				{
+				file_data_unref(old_fd);
+				valid = gtk_tree_store_remove(store, &iter);
+				}
+			else
+				{
+				num_ordered++;
+				if (fd->version != old_version || force)
+					{
+					vflist_setup_iter(vf, store, &iter, fd);
+					vflist_setup_iter_recursive(vf, store, &iter, fd->sidecar_files, selected, force);
+					}
+
+				if (valid) valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
+
+				done = TRUE;
+				}
+			}
+		work = work->next;
+		}
+
+	while (valid)
+		{
+		FileData *old_fd;
+		gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1);
+		file_data_unref(old_fd);
+
+		valid = gtk_tree_store_remove(store, &iter);
+		}
+
+	/* move the prepended entries to the correct position */
+	if (num_prepended)
+		{
+		gint i;
+		gint num_total = num_prepended + num_ordered;
+		gint *new_order = g_malloc(num_total * sizeof(gint));
+
+		for (i = 0; i < num_total; i++)
+			{
+			if (i < num_ordered)
+				new_order[i] = num_prepended + i;
+			else
+				new_order[i] = num_total - 1 - i;
+			}
+		gtk_tree_store_reorder(store, parent_iter, new_order);
+
+		g_free(new_order);
+		}
+}
+
+void vflist_sort_set(ViewFile *vf, SortType type, gboolean ascend)
+{
+	gint i;
+	GHashTable *fd_idx_hash = g_hash_table_new(NULL, NULL);
+	gint *new_order;
+	GtkTreeStore *store;
+	GList *work;
+
+	if (vf->sort_method == type && vf->sort_ascend == ascend) return;
+	if (!vf->list) return;
+
+	work = vf->list;
+	i = 0;
+	while (work)
+		{
+		FileData *fd = work->data;
+		g_hash_table_insert(fd_idx_hash, fd, GINT_TO_POINTER(i));
+		i++;
+		work = work->next;
+		}
+
+	vf->sort_method = type;
+	vf->sort_ascend = ascend;
+
+	vf->list = filelist_sort(vf->list, vf->sort_method, vf->sort_ascend);
+
+	new_order = g_malloc(i * sizeof(gint));
+
+	work = vf->list;
+	i = 0;
+	while (work)
+		{
+		FileData *fd = work->data;
+		new_order[i] = GPOINTER_TO_INT(g_hash_table_lookup(fd_idx_hash, fd));
+		i++;
+		work = work->next;
+		}
+
+	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
+	gtk_tree_store_reorder(store, NULL, new_order);
+
+	g_free(new_order);
+	g_hash_table_destroy(fd_idx_hash);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * thumb updates
+ *-----------------------------------------------------------------------------
+ */
+
+
+void vflist_thumb_progress_count(GList *list, gint *count, gint *done)
+{
+	GList *work = list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		if (fd->thumb_pixbuf) (*done)++;
+
+		if (fd->sidecar_files)
+			{
+			vflist_thumb_progress_count(fd->sidecar_files, count, done);
+			}
+		(*count)++;
+		}
+}
+
+void vflist_set_thumb_fd(ViewFile *vf, FileData *fd)
+{
+	GtkTreeStore *store;
+	GtkTreeIter iter;
+
+	if (!fd || vflist_find_row(vf, fd, &iter) < 0) return;
+
+	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
+	gtk_tree_store_set(store, &iter, FILE_COLUMN_THUMB, fd->thumb_pixbuf, -1);
+}
+
+FileData *vflist_thumb_next_fd(ViewFile *vf)
+{
+	GtkTreePath *tpath;
+	FileData *fd = NULL;
+
+	/* first check the visible files */
+
+	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
+		{
+		GtkTreeModel *store;
+		GtkTreeIter iter;
+		gboolean valid = TRUE;
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_path_free(tpath);
+		tpath = NULL;
+
+		while (!fd && valid && tree_view_row_get_visibility(GTK_TREE_VIEW(vf->listview), &iter, FALSE) == 0)
+			{
+			FileData *nfd;
+
+			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &nfd, -1);
+
+			if (!nfd->thumb_pixbuf) fd = nfd;
+
+			valid = gtk_tree_model_iter_next(store, &iter);
+			}
+		}
+
+	/* then find first undone */
+
+	if (!fd)
+		{
+		GList *work = vf->list;
+		while (work && !fd)
+			{
+			FileData *fd_p = work->data;
+			if (!fd_p->thumb_pixbuf)
+				fd = fd_p;
+			else
+				{
+				GList *work2 = fd_p->sidecar_files;
+
+				while (work2 && !fd)
+					{
+					fd_p = work2->data;
+					if (!fd_p->thumb_pixbuf) fd = fd_p;
+					work2 = work2->next;
+					}
+				}
+			work = work->next;
+			}
+		}
+
+	return fd;
+}
+
+
+void vflist_thumb_reset_all(ViewFile *vf)
+{
+	GList *work = vf->list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		if (fd->thumb_pixbuf)
+			{
+			g_object_unref(fd->thumb_pixbuf);
+			fd->thumb_pixbuf = NULL;
+			}
+		work = work->next;
+		}
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * row stuff
+ *-----------------------------------------------------------------------------
+ */
+
+FileData *vflist_index_get_data(ViewFile *vf, gint row)
+{
+	return g_list_nth_data(vf->list, row);
+}
+
+gint vflist_index_by_fd(ViewFile *vf, FileData *fd)
+{
+	gint p = 0;
+	GList *work, *work2;
+
+	work = vf->list;
+	while (work)
+		{
+		FileData *list_fd = work->data;
+		if (list_fd == fd) return p;
+
+		work2 = list_fd->sidecar_files;
+		while (work2)
+			{
+			/* FIXME: return the same index also for sidecars
+			   it is sufficient for next/prev navigation but it should be rewritten
+			   without using indexes at all
+			*/
+			FileData *sidecar_fd = work2->data;
+			if (sidecar_fd == fd) return p;
+			work2 = work2->next;
+			}
+
+		work = work->next;
+		p++;
+		}
+
+	return -1;
+}
+
+guint vflist_count(ViewFile *vf, gint64 *bytes)
+{
+	if (bytes)
+		{
+		gint64 b = 0;
+		GList *work;
+
+		work = vf->list;
+		while (work)
+			{
+			FileData *fd = work->data;
+			work = work->next;
+			b += fd->size;
+			}
+
+		*bytes = b;
+		}
+
+	return g_list_length(vf->list);
+}
+
+GList *vflist_get_list(ViewFile *vf)
+{
+	GList *list = NULL;
+	GList *work;
+
+	work = vf->list;
+	while (work)
+		{
+		FileData *fd = work->data;
+		work = work->next;
+
+		list = g_list_prepend(list, file_data_ref(fd));
+		}
+
+	return g_list_reverse(list);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * selections
+ *-----------------------------------------------------------------------------
+ */
+
+static gboolean vflist_row_is_selected(ViewFile *vf, FileData *fd)
+{
+	GtkTreeModel *store;
+	GtkTreeSelection *selection;
+	GList *slist;
+	GList *work;
+	gboolean found = FALSE;
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	slist = gtk_tree_selection_get_selected_rows(selection, &store);
+	work = slist;
+	while (!found && work)
+		{
+		GtkTreePath *tpath = work->data;
+		FileData *fd_n;
+		GtkTreeIter iter;
+
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1);
+		if (fd_n == fd) found = TRUE;
+		work = work->next;
+		}
+	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free(slist);
+
+	return found;
+}
+
+gboolean vflist_index_is_selected(ViewFile *vf, gint row)
+{
+	FileData *fd;
+
+	fd = vf_index_get_data(vf, row);
+	return vflist_row_is_selected(vf, fd);
+}
+
+guint vflist_selection_count(ViewFile *vf, gint64 *bytes)
+{
+	GtkTreeModel *store;
+	GtkTreeSelection *selection;
+	GList *slist;
+	guint count;
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	slist = gtk_tree_selection_get_selected_rows(selection, &store);
+
+	if (bytes)
+		{
+		gint64 b = 0;
+		GList *work;
+
+		work = slist;
+		while (work)
+			{
+			GtkTreePath *tpath = work->data;
+			GtkTreeIter iter;
+			FileData *fd;
+
+			gtk_tree_model_get_iter(store, &iter, tpath);
+			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+			b += fd->size;
+
+			work = work->next;
+			}
+
+		*bytes = b;
+		}
+
+	count = g_list_length(slist);
+	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free(slist);
+
+	return count;
+}
+
+GList *vflist_selection_get_list(ViewFile *vf)
+{
+	GtkTreeModel *store;
+	GtkTreeSelection *selection;
+	GList *slist;
+	GList *list = NULL;
+	GList *work;
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	slist = gtk_tree_selection_get_selected_rows(selection, &store);
+	work = slist;
+	while (work)
+		{
+		GtkTreePath *tpath = work->data;
+		FileData *fd;
+		GtkTreeIter iter;
+
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+
+		list = g_list_prepend(list, file_data_ref(fd));
+
+		if (!fd->parent && !gtk_tree_view_row_expanded(GTK_TREE_VIEW(vf->listview), tpath))
+			{
+			/* unexpanded - add whole group */
+			GList *work2 = fd->sidecar_files;
+			while (work2)
+				{
+				FileData *sfd = work2->data;
+				list = g_list_prepend(list, file_data_ref(sfd));
+				work2 = work2->next;
+				}
+			}
+
+		work = work->next;
+		}
+	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free(slist);
+
+	return g_list_reverse(list);
+}
+
+GList *vflist_selection_get_list_by_index(ViewFile *vf)
+{
+	GtkTreeModel *store;
+	GtkTreeSelection *selection;
+	GList *slist;
+	GList *list = NULL;
+	GList *work;
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	slist = gtk_tree_selection_get_selected_rows(selection, &store);
+	work = slist;
+	while (work)
+		{
+		GtkTreePath *tpath = work->data;
+		FileData *fd;
+		GtkTreeIter iter;
+
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+
+		list = g_list_prepend(list, GINT_TO_POINTER(g_list_index(vf->list, fd)));
+
+		work = work->next;
+		}
+	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free(slist);
+
+	return g_list_reverse(list);
+}
+
+void vflist_select_all(ViewFile *vf)
+{
+	GtkTreeSelection *selection;
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_selection_select_all(selection);
+
+	VFLIST(vf)->select_fd = NULL;
+}
+
+void vflist_select_none(ViewFile *vf)
+{
+	GtkTreeSelection *selection;
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_selection_unselect_all(selection);
+}
+
+static gboolean tree_model_iter_prev(GtkTreeModel *store, GtkTreeIter *iter)
+{
+	GtkTreePath *tpath;
+	gboolean result;
+
+	tpath = gtk_tree_model_get_path(store, iter);
+	result = gtk_tree_path_prev(tpath);
+	if (result)
+		gtk_tree_model_get_iter(store, iter, tpath);
+
+	gtk_tree_path_free(tpath);
+
+	return result;
+}
+
+static gboolean tree_model_get_iter_last(GtkTreeModel *store, GtkTreeIter *iter)
+{
+	if (!gtk_tree_model_get_iter_first(store, iter))
+		return FALSE;
+
+	while (TRUE)
+		{
+		GtkTreeIter next = *iter;
+
+		if (gtk_tree_model_iter_next(store, &next))
+			*iter = next;
+		else
+			break;
+		}
+
+	return TRUE;
+}
+
+void vflist_select_invert(ViewFile *vf)
+{
+	GtkTreeIter iter;
+	GtkTreeSelection *selection;
+	GtkTreeModel *store;
+	gboolean valid;
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+
+	/* Backward iteration prevents scrolling to the end of the list,
+	 * it scrolls to the first selected row instead. */
+	valid = tree_model_get_iter_last(store, &iter);
+
+	while (valid)
+		{
+		gboolean selected = gtk_tree_selection_iter_is_selected(selection, &iter);
+
+		if (selected)
+			gtk_tree_selection_unselect_iter(selection, &iter);
+		else
+			gtk_tree_selection_select_iter(selection, &iter);
+
+		valid = tree_model_iter_prev(store, &iter);
+		}
+}
+
+void vflist_select_by_fd(ViewFile *vf, FileData *fd)
+{
+	GtkTreeIter iter;
+
+	if (vflist_find_row(vf, fd, &iter) < 0) return;
+
+	tree_view_row_make_visible(GTK_TREE_VIEW(vf->listview), &iter, TRUE);
+
+	if (!vflist_row_is_selected(vf, fd))
+		{
+		GtkTreeSelection *selection;
+		GtkTreeModel *store;
+		GtkTreePath *tpath;
+
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+		gtk_tree_selection_unselect_all(selection);
+		gtk_tree_selection_select_iter(selection, &iter);
+		vflist_move_cursor(vf, &iter);
+
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+		tpath = gtk_tree_model_get_path(store, &iter);
+		gtk_tree_view_set_cursor(GTK_TREE_VIEW(vf->listview), tpath, NULL, FALSE);
+		gtk_tree_path_free(tpath);
+		}
+}
+
+static void vflist_select_closest(ViewFile *vf, FileData *sel_fd)
+{
+	GList *work;
+	FileData *fd = NULL;
+
+	if (sel_fd->parent) sel_fd = sel_fd->parent;
+	work = vf->list;
+
+	while (work)
+		{
+		gint match;
+		fd = work->data;
+		work = work->next;
+
+		match = filelist_sort_compare_filedata_full(fd, sel_fd, vf->sort_method, vf->sort_ascend);
+
+		if (match >= 0) break;
+		}
+
+	if (fd) vflist_select_by_fd(vf, fd);
+
+}
+
+void vflist_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
+{
+	GtkTreeModel *store;
+	GtkTreeIter iter;
+	GtkTreeSelection *selection;
+	gboolean valid;
+	gint n = mark - 1;
+
+	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
+
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+
+	valid = gtk_tree_model_get_iter_first(store, &iter);
+	while (valid)
+		{
+		FileData *fd;
+		gboolean mark_val, selected;
+		gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, -1);
+
+		mark_val = file_data_get_mark(fd, n);
+		selected = gtk_tree_selection_iter_is_selected(selection, &iter);
+
+		switch (mode)
+			{
+			case MTS_MODE_SET: selected = mark_val;
+				break;
+			case MTS_MODE_OR: selected = mark_val || selected;
+				break;
+			case MTS_MODE_AND: selected = mark_val && selected;
+				break;
+			case MTS_MODE_MINUS: selected = !mark_val && selected;
+				break;
+			}
+
+		if (selected)
+			gtk_tree_selection_select_iter(selection, &iter);
+		else
+			gtk_tree_selection_unselect_iter(selection, &iter);
+
+		valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
+		}
+}
+
+void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
+{
+	GtkTreeModel *store;
+	GtkTreeSelection *selection;
+	GList *slist;
+	GList *work;
+	gint n = mark - 1;
+
+	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	slist = gtk_tree_selection_get_selected_rows(selection, &store);
+	work = slist;
+	while (work)
+		{
+		GtkTreePath *tpath = work->data;
+		FileData *fd;
+		GtkTreeIter iter;
+
+		gtk_tree_model_get_iter(store, &iter, tpath);
+		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+
+		/* the change has a very limited range and the standard notification would trigger
+		   complete re-read of the directory - try to do only minimal update instead */
+		file_data_unregister_notify_func(vf_notify_cb, vf); /* we don't need the notification */
+
+		switch (mode)
+			{
+			case STM_MODE_SET: file_data_set_mark(fd, n, 1);
+				break;
+			case STM_MODE_RESET: file_data_set_mark(fd, n, 0);
+				break;
+			case STM_MODE_TOGGLE: file_data_set_mark(fd, n, !file_data_get_mark(fd, n));
+				break;
+			}
+
+		if (!file_data_filter_marks(fd, vf_marks_get_filter(vf))) /* file no longer matches the filter -> remove it */
+			{
+			vf_refresh_idle(vf);
+			}
+		else
+			{
+			/* mark functions can have various side effects - update all columns to be sure */
+			vflist_setup_iter(vf, GTK_TREE_STORE(store), &iter, fd);
+			/* mark functions can change sidecars too */
+			vflist_setup_iter_recursive(vf, GTK_TREE_STORE(store), &iter, fd->sidecar_files, NULL, FALSE);
+			}
+
+
+		file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
+
+		work = work->next;
+		}
+	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free(slist);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * core (population)
+ *-----------------------------------------------------------------------------
+ */
+
+static void vflist_listview_set_columns(GtkWidget *listview, gboolean thumb, gboolean multiline)
+{
+	GtkTreeViewColumn *column;
+	GtkCellRenderer *cell;
+	GList *list;
+
+	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_THUMB);
+	if (!column) return;
+
+	gtk_tree_view_column_set_fixed_width(column, options->thumbnails.max_width + 4);
+
+	list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+	if (!list) return;
+	cell = list->data;
+	g_list_free(list);
+
+	g_object_set(G_OBJECT(cell), "height", options->thumbnails.max_height, NULL);
+	gtk_tree_view_column_set_visible(column, thumb);
+
+	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_FORMATTED);
+	if (!column) return;
+	gtk_tree_view_set_expander_column(GTK_TREE_VIEW(listview), column);
+
+	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_SIZE);
+	if (!column) return;
+	gtk_tree_view_column_set_visible(column, !multiline);
+
+	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_DATE);
+	if (!column) return;
+	gtk_tree_view_column_set_visible(column, !multiline);
+}
+
+static gboolean vflist_is_multiline(ViewFile *vf)
+{
+	return (VFLIST(vf)->thumbs_enabled && options->thumbnails.max_height >= 48);
+}
+
+
+static void vflist_populate_view(ViewFile *vf, gboolean force)
+{
+	GtkTreeStore *store;
+	GList *selected;
+
+	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
+
+	vf_thumb_stop(vf);
+
+	if (!vf->list)
+		{
+		vflist_store_clear(vf, FALSE);
+		vf_send_update(vf);
+		return;
+		}
+
+	vflist_listview_set_columns(vf->listview, VFLIST(vf)->thumbs_enabled, vflist_is_multiline(vf));
+
+	selected = vflist_selection_get_list(vf);
+
+	vflist_setup_iter_recursive(vf, store, NULL, vf->list, selected, force);
+
+	if (selected && vflist_selection_count(vf, NULL) == 0)
+		{
+		/* all selected files disappeared */
+		vflist_select_closest(vf, selected->data);
+		}
+
+	filelist_free(selected);
+
+	vf_send_update(vf);
+	vf_thumb_update(vf);
+}
+
+gboolean vflist_refresh(ViewFile *vf)
+{
+	GList *old_list;
+	gboolean ret = TRUE;
+
+	old_list = vf->list;
+	vf->list = NULL;
+
+	DEBUG_1("%s vflist_refresh: read dir", get_exec_time());
+	if (vf->dir_fd)
+		{
+		file_data_unregister_notify_func(vf_notify_cb, vf); /* we don't need the notification of changes detected by filelist_read */
+
+		ret = filelist_read(vf->dir_fd, &vf->list, NULL);
+
+		if (vf->marks_enabled)
+		        {
+		        // When marks are enabled, lock FileDatas so that we don't end up re-parsing XML
+		        // each time a mark is changed.
+		        file_data_lock_list(vf->list);
+		        }
+	        else
+			{
+			// FIXME: only do this when needed (aka when we just switched from
+			// FIXME: marks-enabled to marks-disabled)
+			file_data_unlock_list(vf->list);
+			}
+
+		vf->list = file_data_filter_marks_list(vf->list, vf_marks_get_filter(vf));
+		file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
+
+		DEBUG_1("%s vflist_refresh: sort", get_exec_time());
+		vf->list = filelist_sort(vf->list, vf->sort_method, vf->sort_ascend);
+		}
+
+	DEBUG_1("%s vflist_refresh: populate view", get_exec_time());
+
+	vflist_populate_view(vf, FALSE);
+
+	DEBUG_1("%s vflist_refresh: free filelist", get_exec_time());
+
+	filelist_free(old_list);
+	DEBUG_1("%s vflist_refresh: done", get_exec_time());
+
+	return ret;
+}
+
+
+
+/* this overrides the low default of a GtkCellRenderer from 100 to CELL_HEIGHT_OVERRIDE, something sane for our purposes */
+
+#define CELL_HEIGHT_OVERRIDE 512
+
+static void cell_renderer_height_override(GtkCellRenderer *renderer)
+{
+	GParamSpec *spec;
+
+	spec = g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(renderer)), "height");
+	if (spec && G_IS_PARAM_SPEC_INT(spec))
+		{
+		GParamSpecInt *spec_int;
+
+		spec_int = G_PARAM_SPEC_INT(spec);
+		if (spec_int->maximum < CELL_HEIGHT_OVERRIDE) spec_int->maximum = CELL_HEIGHT_OVERRIDE;
+		}
+}
+
+static GdkColor *vflist_listview_color_shifted(GtkWidget *widget)
+{
+	static GdkColor color;
+	static GtkWidget *done = NULL;
+
+	if (done != widget)
+		{
+		GtkStyle *style;
+
+		style = gtk_widget_get_style(widget);
+		memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
+		shift_color(&color, -1, 0);
+		done = widget;
+		}
+
+	return &color;
+}
+
+static void vflist_listview_color_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+				     GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+	ViewFile *vf = data;
+	gboolean set;
+
+	gtk_tree_model_get(tree_model, iter, FILE_COLUMN_COLOR, &set, -1);
+	g_object_set(G_OBJECT(cell),
+		     "cell-background-gdk", vflist_listview_color_shifted(vf->listview),
+		     "cell-background-set", set, NULL);
+}
+
+static void vflist_listview_add_column(ViewFile *vf, gint n, const gchar *title, gboolean image, gboolean right_justify, gboolean expand)
+{
+	GtkTreeViewColumn *column;
+	GtkCellRenderer *renderer;
+
+	column = gtk_tree_view_column_new();
+	gtk_tree_view_column_set_title(column, title);
+	gtk_tree_view_column_set_min_width(column, 4);
+
+	if (!image)
+		{
+		gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+		renderer = gtk_cell_renderer_text_new();
+		if (right_justify)
+			{
+			g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
+			}
+		gtk_tree_view_column_pack_start(column, renderer, TRUE);
+		gtk_tree_view_column_add_attribute(column, renderer, "text", n);
+		if (expand)
+			gtk_tree_view_column_set_expand(column, TRUE);
+		}
+	else
+		{
+		gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+		renderer = gtk_cell_renderer_pixbuf_new();
+		cell_renderer_height_override(renderer);
+		gtk_tree_view_column_pack_start(column, renderer, TRUE);
+		gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", n);
+		}
+
+	gtk_tree_view_column_set_cell_data_func(column, renderer, vflist_listview_color_cb, vf, NULL);
+	g_object_set_data(G_OBJECT(column), "column_store_idx", GUINT_TO_POINTER(n));
+	g_object_set_data(G_OBJECT(renderer), "column_store_idx", GUINT_TO_POINTER(n));
+
+	gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column);
+}
+
+static void vflist_listview_mark_toggled_cb(GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
+{
+	ViewFile *vf = data;
+	GtkTreeStore *store;
+	GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+	GtkTreeIter iter;
+	FileData *fd;
+	gboolean marked;
+	guint col_idx;
+
+	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
+	if (!path || !gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
+		return;
+
+	col_idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column_store_idx"));
+
+	g_assert(col_idx >= FILE_COLUMN_MARKS && col_idx <= FILE_COLUMN_MARKS_LAST);
+
+	gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, col_idx, &marked, -1);
+	marked = !marked;
+
+	/* the change has a very limited range and the standard notification would trigger
+	   complete re-read of the directory - try to do only minimal update instead */
+	file_data_unregister_notify_func(vf_notify_cb, vf);
+	file_data_set_mark(fd, col_idx - FILE_COLUMN_MARKS, marked);
+	if (!file_data_filter_marks(fd, vf_marks_get_filter(vf))) /* file no longer matches the filter -> remove it */
+		{
+		vf_refresh_idle(vf);
+		}
+	else
+		{
+		/* mark functions can have various side effects - update all columns to be sure */
+		vflist_setup_iter(vf, GTK_TREE_STORE(store), &iter, fd);
+		/* mark functions can change sidecars too */
+		vflist_setup_iter_recursive(vf, GTK_TREE_STORE(store), &iter, fd->sidecar_files, NULL, FALSE);
+		}
+	file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
+
+	gtk_tree_path_free(path);
+}
+
+static void vflist_listview_add_column_toggle(ViewFile *vf, gint n, const gchar *title)
+{
+	GtkTreeViewColumn *column;
+	GtkCellRenderer *renderer;
+
+	renderer = gtk_cell_renderer_toggle_new();
+	column = gtk_tree_view_column_new_with_attributes(title, renderer, "active", n, NULL);
+
+	gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+	g_object_set_data(G_OBJECT(column), "column_store_idx", GUINT_TO_POINTER(n));
+	g_object_set_data(G_OBJECT(renderer), "column_store_idx", GUINT_TO_POINTER(n));
+
+	gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column);
+	gtk_tree_view_column_set_fixed_width(column, 22);
+	gtk_tree_view_column_set_visible(column, vf->marks_enabled);
+
+
+	g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vflist_listview_mark_toggled_cb), vf);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * base
+ *-----------------------------------------------------------------------------
+ */
+
+gboolean vflist_set_fd(ViewFile *vf, FileData *dir_fd)
+{
+	gboolean ret;
+	if (!dir_fd) return FALSE;
+	if (vf->dir_fd == dir_fd) return TRUE;
+
+	file_data_unref(vf->dir_fd);
+	vf->dir_fd = file_data_ref(dir_fd);
+
+	/* force complete reload */
+	vflist_store_clear(vf, TRUE);
+
+	filelist_free(vf->list);
+	vf->list = NULL;
+
+	ret = vf_refresh(vf);
+	gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
+	return ret;
+}
+
+void vflist_destroy_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	file_data_unregister_notify_func(vf_notify_cb, vf);
+
+	vflist_select_idle_cancel(vf);
+	vf_refresh_idle_cancel(vf);
+	vf_thumb_stop(vf);
+
+	filelist_free(vf->list);
+}
+
+ViewFile *vflist_new(ViewFile *vf, FileData *dir_fd)
+{
+	GtkTreeStore *store;
+	GtkTreeSelection *selection;
+	GType flist_types[FILE_COLUMN_COUNT];
+	gint i;
+	gint column;
+
+	vf->info = g_new0(ViewFileInfoList, 1);
+
+	flist_types[FILE_COLUMN_POINTER] = G_TYPE_POINTER;
+	flist_types[FILE_COLUMN_VERSION] = G_TYPE_INT;
+	flist_types[FILE_COLUMN_THUMB] = GDK_TYPE_PIXBUF;
+	flist_types[FILE_COLUMN_FORMATTED] = G_TYPE_STRING;
+	flist_types[FILE_COLUMN_NAME] = G_TYPE_STRING;
+	flist_types[FILE_COLUMN_SIDECARS] = G_TYPE_STRING;
+	flist_types[FILE_COLUMN_SIZE] = G_TYPE_STRING;
+	flist_types[FILE_COLUMN_DATE] = G_TYPE_STRING;
+	flist_types[FILE_COLUMN_EXPANDED] = G_TYPE_BOOLEAN;
+	flist_types[FILE_COLUMN_COLOR] = G_TYPE_BOOLEAN;
+	for (i = FILE_COLUMN_MARKS; i < FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE; i++)
+		flist_types[i] = G_TYPE_BOOLEAN;
+
+	store = gtk_tree_store_newv(FILE_COLUMN_COUNT, flist_types);
+
+	vf->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+	g_object_unref(store);
+
+	g_signal_connect(G_OBJECT(vf->listview), "row-expanded",
+			 G_CALLBACK(vflist_expand_cb), vf);
+
+	g_signal_connect(G_OBJECT(vf->listview), "row-collapsed",
+			 G_CALLBACK(vflist_collapse_cb), vf);
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
+	gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE);
+	gtk_tree_selection_set_select_function(selection, vflist_select_cb, vf, NULL);
+
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vf->listview), FALSE);
+	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vf->listview), FALSE);
+
+	column = 0;
+
+	for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
+		{
+		vflist_listview_add_column_toggle(vf, i + FILE_COLUMN_MARKS, "");
+		g_assert(column == FILE_VIEW_COLUMN_MARKS + i);
+		column++;
+		}
+
+	vflist_listview_add_column(vf, FILE_COLUMN_THUMB, "", TRUE, FALSE, FALSE);
+	g_assert(column == FILE_VIEW_COLUMN_THUMB);
+	column++;
+
+	vflist_listview_add_column(vf, FILE_COLUMN_FORMATTED, _("Name"), FALSE, FALSE, TRUE);
+	g_assert(column == FILE_VIEW_COLUMN_FORMATTED);
+	column++;
+
+	vflist_listview_add_column(vf, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE, FALSE);
+	g_assert(column == FILE_VIEW_COLUMN_SIZE);
+	column++;
+
+	vflist_listview_add_column(vf, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE, FALSE);
+	g_assert(column == FILE_VIEW_COLUMN_DATE);
+	column++;
+
+	file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
+	return vf;
+}
+
+void vflist_thumb_set(ViewFile *vf, gboolean enable)
+{
+	if (VFLIST(vf)->thumbs_enabled == enable) return;
+
+	VFLIST(vf)->thumbs_enabled = enable;
+
+	/* vflist_populate_view is better than vf_refresh:
+	   - no need to re-read the directory
+	   - force update because the formatted string has changed
+	*/
+	if (vf->layout)
+		{
+		vflist_populate_view(vf, TRUE);
+		gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
+		}
+}
+
+void vflist_marks_set(ViewFile *vf, gboolean enable)
+{
+	GList *columns, *work;
+
+	columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(vf->listview));
+
+	work = columns;
+	while (work)
+		{
+		GtkTreeViewColumn *column = work->data;
+		gint col_idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_store_idx"));
+		work = work->next;
+
+		if (col_idx <= FILE_COLUMN_MARKS_LAST && col_idx >= FILE_COLUMN_MARKS)
+			gtk_tree_view_column_set_visible(column, enable);
+		}
+
+	if (enable)
+		{
+		// Previously disabled, which means that vf->list is complete
+		file_data_lock_list(vf->list);
+		}
+	else
+		{
+		// Previously enabled, which means that vf->list is incomplete
+		}
+
+	g_list_free(columns);
+}
+
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/view_file/view_file_list.h	Sat Jul 08 10:32:34 2017 +0100
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * Author: John Ellis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef VIEW_FILE_VIEW_FILE_LIST_H
+#define VIEW_FILE_VIEW_FILE_LIST_H
+
+#include "filedata.h"
+
+gboolean vflist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data);
+gboolean vflist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
+gboolean vflist_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
+
+void vflist_dnd_init(ViewFile *vf);
+
+void vflist_destroy_cb(GtkWidget *widget, gpointer data);
+ViewFile *vflist_new(ViewFile *vf, FileData *dir_fd);
+
+gboolean vflist_set_fd(ViewFile *vf, FileData *dir_fd);
+gboolean vflist_refresh(ViewFile *vf);
+
+void vflist_thumb_set(ViewFile *vf, gboolean enable);
+void vflist_marks_set(ViewFile *vf, gboolean enable);
+void vflist_sort_set(ViewFile *vf, SortType type, gboolean ascend);
+
+GList *vflist_selection_get_one(ViewFile *vf, FileData *fd);
+GList *vflist_pop_menu_file_list(ViewFile *vf);
+void vflist_pop_menu_view_cb(GtkWidget *widget, gpointer data);
+void vflist_pop_menu_rename_cb(GtkWidget *widget, gpointer data);
+void vflist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data);
+void vflist_popup_destroy_cb(GtkWidget *widget, gpointer data);
+void vflist_pop_menu_thumbs_cb(GtkWidget *widget, gpointer data);
+
+FileData *vflist_index_get_data(ViewFile *vf, gint row);
+gint vflist_index_by_fd(ViewFile *vf, FileData *fd);
+guint vflist_count(ViewFile *vf, gint64 *bytes);
+GList *vflist_get_list(ViewFile *vf);
+
+gboolean vflist_index_is_selected(ViewFile *vf, gint row);
+guint vflist_selection_count(ViewFile *vf, gint64 *bytes);
+GList *vflist_selection_get_list(ViewFile *vf);
+GList *vflist_selection_get_list_by_index(ViewFile *vf);
+
+void vflist_select_all(ViewFile *vf);
+void vflist_select_none(ViewFile *vf);
+void vflist_select_invert(ViewFile *vf);
+void vflist_select_by_fd(ViewFile *vf, FileData *fd);
+
+void vflist_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode);
+void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode);
+
+void vflist_color_set(ViewFile *vf, FileData *fd, gboolean color_set);
+
+void vflist_thumb_progress_count(GList *list, gint *count, gint *done);
+void vflist_set_thumb_fd(ViewFile *vf, FileData *fd);
+FileData *vflist_thumb_next_fd(ViewFile *vf);
+void vflist_thumb_reset_all(ViewFile *vf);
+
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/view_file_icon.c	Wed Jan 11 22:00:49 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2304 +0,0 @@
-/*
- * Copyright (C) 2006 John Ellis
- * Copyright (C) 2008 - 2016 The Geeqie Team
- *
- * Author: John Ellis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "main.h"
-#include "view_file_icon.h"
-
-#include "bar.h"
-#include "cellrenderericon.h"
-#include "collect.h"
-#include "collect-io.h"
-#include "collect-table.h"
-#include "dnd.h"
-#include "editors.h"
-#include "img-view.h"
-#include "filedata.h"
-#include "layout.h"
-#include "layout_image.h"
-#include "menu.h"
-#include "metadata.h"
-#include "thumb.h"
-#include "utilops.h"
-#include "ui_fileops.h"
-#include "ui_menu.h"
-#include "ui_tree_edit.h"
-#include "uri_utils.h"
-#include "view_file.h"
-
-#include <gdk/gdkkeysyms.h> /* for keyboard values */
-
-
-/* between these, the icon width is increased by thumb_max_width / 2 */
-#define THUMB_MIN_ICON_WIDTH 128
-#define THUMB_MAX_ICON_WIDTH 150
-
-#define VFICON_MAX_COLUMNS 32
-#define THUMB_BORDER_PADDING 2
-
-#define VFICON_TIP_DELAY 500
-
-enum {
-	FILE_COLUMN_POINTER = 0,
-	FILE_COLUMN_COUNT
-};
-
-typedef enum {
-	SELECTION_NONE		= 0,
-	SELECTION_SELECTED	= 1 << 0,
-	SELECTION_PRELIGHT	= 1 << 1,
-	SELECTION_FOCUS		= 1 << 2
-} SelectionType;
-
-typedef struct _IconData IconData;
-struct _IconData
-{
-	SelectionType selected;
-	FileData *fd;
-};
-
-static gint vficon_index_by_id(ViewFile *vf, IconData *in_id);
-
-static IconData *vficon_icon_data(ViewFile *vf, FileData *fd)
-{
-	IconData *id = NULL;
-	GList *work;
-
-	if (!fd) return NULL;
-	work = vf->list;
-	while (work && !id)
-		{
-		IconData *chk = work->data;
-		work = work->next;
-		if (chk->fd == fd) id = chk;
-		}
-	return id;
-}
-
-static void iconlist_free(GList *list)
-{
-	GList *work = list;
-	while (work)
-		{
-		IconData *id = work->data;
-		file_data_unref(id->fd);
-		g_free(id);
-		work = work->next;
-		}
-
-	g_list_free(list);
-
-}
-
-gint iconlist_sort_file_cb(gpointer a, gpointer b)
-{
-	IconData *ida = a;
-	IconData *idb = b;
-	return filelist_sort_compare_filedata(ida->fd, idb->fd);
-}
-
-GList *iconlist_sort(GList *list, SortType method, gboolean ascend)
-{
-	return filelist_sort_full(list, method, ascend, (GCompareFunc) iconlist_sort_file_cb);
-}
-
-GList *iconlist_insert_sort(GList *list, IconData *id, SortType method, gboolean ascend)
-{
-	return filelist_insert_sort_full(list, id, method, ascend, (GCompareFunc) iconlist_sort_file_cb);
-}
-
-
-static void vficon_toggle_filenames(ViewFile *vf);
-static void vficon_selection_remove(ViewFile *vf, IconData *id, SelectionType mask, GtkTreeIter *iter);
-static void vficon_move_focus(ViewFile *vf, gint row, gint col, gboolean relative);
-static void vficon_set_focus(ViewFile *vf, IconData *id);
-static void vficon_populate_at_new_size(ViewFile *vf, gint w, gint h, gboolean force);
-
-
-/*
- *-----------------------------------------------------------------------------
- * pop-up menu
- *-----------------------------------------------------------------------------
- */
-
-GList *vficon_selection_get_one(ViewFile *vf, FileData *fd)
-{
-	return g_list_prepend(filelist_copy(fd->sidecar_files), file_data_ref(fd));
-}
-
-GList *vficon_pop_menu_file_list(ViewFile *vf)
-{
-	if (!VFICON(vf)->click_id) return NULL;
-
-	if (VFICON(vf)->click_id->selected & SELECTION_SELECTED)
-		{
-		return vf_selection_get_list(vf);
-		}
-
-	return vficon_selection_get_one(vf, VFICON(vf)->click_id->fd);
-}
-
-void vficon_pop_menu_view_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	if (!VFICON(vf)->click_id) return;
-
-	if (VFICON(vf)->click_id->selected & SELECTION_SELECTED)
-		{
-		GList *list;
-
-		list = vf_selection_get_list(vf);
-		view_window_new_from_list(list);
-		filelist_free(list);
-		}
-	else
-		{
-		view_window_new(VFICON(vf)->click_id->fd);
-		}
-}
-
-void vficon_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	file_util_rename(NULL, vf_pop_menu_file_list(vf), vf->listview);
-}
-
-void vficon_pop_menu_show_names_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vficon_toggle_filenames(vf);
-}
-
-void vficon_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vf_refresh(vf);
-}
-
-void vficon_popup_destroy_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-	vficon_selection_remove(vf, VFICON(vf)->click_id, SELECTION_PRELIGHT, NULL);
-	VFICON(vf)->click_id = NULL;
-	vf->popup = NULL;
-}
-
-/*
- *-------------------------------------------------------------------
- * signals
- *-------------------------------------------------------------------
- */
-
-static void vficon_send_layout_select(ViewFile *vf, IconData *id)
-{
-	FileData *read_ahead_fd = NULL;
-	FileData *sel_fd;
-	FileData *cur_fd;
-
-	if (!vf->layout || !id || !id->fd) return;
-
-	sel_fd = id->fd;
-
-	cur_fd = layout_image_get_fd(vf->layout);
-	if (sel_fd == cur_fd) return; /* no change */
-
-	if (options->image.enable_read_ahead)
-		{
-		gint row;
-
-		row = g_list_index(vf->list, id);
-		if (row > vficon_index_by_fd(vf, cur_fd) &&
-		    (guint) (row + 1) < vf_count(vf, NULL))
-			{
-			read_ahead_fd = vf_index_get_data(vf, row + 1);
-			}
-		else if (row > 0)
-			{
-			read_ahead_fd = vf_index_get_data(vf, row - 1);
-			}
-		}
-
-	layout_image_set_with_ahead(vf->layout, sel_fd, read_ahead_fd);
-}
-
-static void vficon_toggle_filenames(ViewFile *vf)
-{
-	GtkAllocation allocation;
-	VFICON(vf)->show_text = !VFICON(vf)->show_text;
-	options->show_icon_names = VFICON(vf)->show_text;
-
-	gtk_widget_get_allocation(vf->listview, &allocation);
-	vficon_populate_at_new_size(vf, allocation.width, allocation.height, TRUE);
-}
-
-static gint vficon_get_icon_width(ViewFile *vf)
-{
-	gint width;
-
-	if (!VFICON(vf)->show_text) return options->thumbnails.max_width;
-
-	width = options->thumbnails.max_width + options->thumbnails.max_width / 2;
-	if (width < THUMB_MIN_ICON_WIDTH) width = THUMB_MIN_ICON_WIDTH;
-	if (width > THUMB_MAX_ICON_WIDTH) width = options->thumbnails.max_width;
-
-	return width;
-}
-
-/*
- *-------------------------------------------------------------------
- * misc utils
- *-------------------------------------------------------------------
- */
-
-static gboolean vficon_find_position(ViewFile *vf, IconData *id, gint *row, gint *col)
-{
-	gint n;
-
-	n = g_list_index(vf->list, id);
-
-	if (n < 0) return FALSE;
-
-	*row = n / VFICON(vf)->columns;
-	*col = n - (*row * VFICON(vf)->columns);
-
-	return TRUE;
-}
-
-static gboolean vficon_find_iter(ViewFile *vf, IconData *id, GtkTreeIter *iter, gint *column)
-{
-	GtkTreeModel *store;
-	gint row, col;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	if (!vficon_find_position(vf, id, &row, &col)) return FALSE;
-	if (!gtk_tree_model_iter_nth_child(store, iter, NULL, row)) return FALSE;
-	if (column) *column = col;
-
-	return TRUE;
-}
-
-static IconData *vficon_find_data(ViewFile *vf, gint row, gint col, GtkTreeIter *iter)
-{
-	GtkTreeModel *store;
-	GtkTreeIter p;
-
-	if (row < 0 || col < 0) return NULL;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	if (gtk_tree_model_iter_nth_child(store, &p, NULL, row))
-		{
-		GList *list;
-
-		gtk_tree_model_get(store, &p, FILE_COLUMN_POINTER, &list, -1);
-		if (!list) return NULL;
-
-		if (iter) *iter = p;
-
-		return g_list_nth_data(list, col);
-		}
-
-	return NULL;
-}
-
-static IconData *vficon_find_data_by_coord(ViewFile *vf, gint x, gint y, GtkTreeIter *iter)
-{
-	GtkTreePath *tpath;
-	GtkTreeViewColumn *column;
-
-	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), x, y,
-					  &tpath, &column, NULL, NULL))
-		{
-		GtkTreeModel *store;
-		GtkTreeIter row;
-		GList *list;
-		gint n;
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		gtk_tree_model_get_iter(store, &row, tpath);
-		gtk_tree_path_free(tpath);
-
-		gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
-
-		n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_number"));
-		if (list)
-			{
-			if (iter) *iter = row;
-			return g_list_nth_data(list, n);
-			}
-		}
-
-	return NULL;
-}
-
-static void vficon_mark_toggled_cb(GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreeModel *store;
-	GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
-	GtkTreeIter row;
-	gint column;
-	GList *list;
-	guint toggled_mark;
-	IconData *id;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	if (!path || !gtk_tree_model_get_iter(store, &row, path))
-		return;
-
-	gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
-
-	column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column_number"));
-	g_object_get(G_OBJECT(cell), "toggled_mark", &toggled_mark, NULL);
-
-	id = g_list_nth_data(list, column);
-	if (id)
-		{
-		FileData *fd = id->fd;
-		file_data_set_mark(fd, toggled_mark, !file_data_get_mark(fd, toggled_mark));
-		}
-}
-
-
-/*
- *-------------------------------------------------------------------
- * tooltip type window
- *-------------------------------------------------------------------
- */
-
-static void tip_show(ViewFile *vf)
-{
-	GtkWidget *label;
-	gint x, y;
-#if GTK_CHECK_VERSION(3,0,0)
-	GdkDisplay *display;
-	GdkDeviceManager *device_manager;
-	GdkDevice *device;
-#endif
-
-	if (VFICON(vf)->tip_window) return;
-
-#if GTK_CHECK_VERSION(3,0,0)
-	device_manager = gdk_display_get_device_manager(gdk_window_get_display(
-						gtk_tree_view_get_bin_window(GTK_TREE_VIEW(vf->listview))));
-	device = gdk_device_manager_get_client_pointer(device_manager);
-	gdk_window_get_device_position(gtk_tree_view_get_bin_window(GTK_TREE_VIEW(vf->listview)),
-						device, &x, &y, NULL);
-#else
-	gdk_window_get_pointer(gtk_tree_view_get_bin_window(GTK_TREE_VIEW(vf->listview)), &x, &y, NULL);
-#endif
-
-	VFICON(vf)->tip_id = vficon_find_data_by_coord(vf, x, y, NULL);
-	if (!VFICON(vf)->tip_id) return;
-
-	VFICON(vf)->tip_window = gtk_window_new(GTK_WINDOW_POPUP);
-	gtk_window_set_resizable(GTK_WINDOW(VFICON(vf)->tip_window), FALSE);
-	gtk_container_set_border_width(GTK_CONTAINER(VFICON(vf)->tip_window), 2);
-
-	label = gtk_label_new(VFICON(vf)->tip_id->fd->name);
-
-	g_object_set_data(G_OBJECT(VFICON(vf)->tip_window), "tip_label", label);
-	gtk_container_add(GTK_CONTAINER(VFICON(vf)->tip_window), label);
-	gtk_widget_show(label);
-
-#if GTK_CHECK_VERSION(3,0,0)
-	display = gdk_display_get_default();
-	device_manager = gdk_display_get_device_manager(display);
-	device = gdk_device_manager_get_client_pointer(device_manager);
-	gdk_device_get_position(device, NULL, &x, &y);
-#else
-	gdk_window_get_pointer(NULL, &x, &y, NULL);
-#endif
-
-	if (!gtk_widget_get_realized(VFICON(vf)->tip_window)) gtk_widget_realize(VFICON(vf)->tip_window);
-	gtk_window_move(GTK_WINDOW(VFICON(vf)->tip_window), x + 16, y + 16);
-	gtk_widget_show(VFICON(vf)->tip_window);
-}
-
-static void tip_hide(ViewFile *vf)
-{
-	if (VFICON(vf)->tip_window) gtk_widget_destroy(VFICON(vf)->tip_window);
-	VFICON(vf)->tip_window = NULL;
-}
-
-static gboolean tip_schedule_cb(gpointer data)
-{
-	ViewFile *vf = data;
-	GtkWidget *window;
-
-	if (!VFICON(vf)->tip_delay_id) return FALSE;
-
-	window = gtk_widget_get_toplevel(vf->listview);
-
-	if (gtk_widget_get_sensitive(window) &&
-	    gtk_window_has_toplevel_focus(GTK_WINDOW(window)))
-		{
-		tip_show(vf);
-		}
-
-	VFICON(vf)->tip_delay_id = 0;
-	return FALSE;
-}
-
-static void tip_schedule(ViewFile *vf)
-{
-	tip_hide(vf);
-
-	if (VFICON(vf)->tip_delay_id)
-		{
-		g_source_remove(VFICON(vf)->tip_delay_id);
-		VFICON(vf)->tip_delay_id = 0;
-		}
-
-	if (!VFICON(vf)->show_text)
-		{
-		VFICON(vf)->tip_delay_id = g_timeout_add(VFICON_TIP_DELAY, tip_schedule_cb, vf);
-		}
-}
-
-static void tip_unschedule(ViewFile *vf)
-{
-	tip_hide(vf);
-
-	if (VFICON(vf)->tip_delay_id)
-		{
-		g_source_remove(VFICON(vf)->tip_delay_id);
-		VFICON(vf)->tip_delay_id = 0;
-		}
-}
-
-static void tip_update(ViewFile *vf, IconData *id)
-{
-#if GTK_CHECK_VERSION(3,0,0)
-	GdkDisplay *display = gdk_display_get_default();
-	GdkDeviceManager *device_manager = gdk_display_get_device_manager(display);
-	GdkDevice *device = gdk_device_manager_get_client_pointer(device_manager);
-#endif
-
-	if (VFICON(vf)->tip_window)
-		{
-		gint x, y;
-
-#if GTK_CHECK_VERSION(3,0,0)
-		gdk_device_get_position(device, NULL, &x, &y);
-#else
-		gdk_window_get_pointer(NULL, &x, &y, NULL);
-#endif
-		gtk_window_move(GTK_WINDOW(VFICON(vf)->tip_window), x + 16, y + 16);
-
-		if (id != VFICON(vf)->tip_id)
-			{
-			GtkWidget *label;
-
-			VFICON(vf)->tip_id = id;
-
-			if (!VFICON(vf)->tip_id)
-				{
-				tip_hide(vf);
-				tip_schedule(vf);
-				return;
-				}
-
-			label = g_object_get_data(G_OBJECT(VFICON(vf)->tip_window), "tip_label");
-			gtk_label_set_text(GTK_LABEL(label), VFICON(vf)->tip_id->fd->name);
-			}
-		}
-	else
-		{
-		tip_schedule(vf);
-		}
-}
-
-/*
- *-------------------------------------------------------------------
- * dnd
- *-------------------------------------------------------------------
- */
-
-static void vficon_dnd_get(GtkWidget *widget, GdkDragContext *context,
-			   GtkSelectionData *selection_data, guint info,
-			   guint time, gpointer data)
-{
-	ViewFile *vf = data;
-	GList *list = NULL;
-
-	if (!VFICON(vf)->click_id) return;
-
-	if (VFICON(vf)->click_id->selected & SELECTION_SELECTED)
-		{
-		list = vf_selection_get_list(vf);
-		}
-	else
-		{
-		list = g_list_append(NULL, file_data_ref(VFICON(vf)->click_id->fd));
-		}
-
-	if (!list) return;
-	uri_selection_data_set_uris_from_filelist(selection_data, list);
-	filelist_free(list);
-}
-
-static void vficon_drag_data_received(GtkWidget *entry_widget, GdkDragContext *context,
-				      int x, int y, GtkSelectionData *selection,
-				      guint info, guint time, gpointer data)
-{
-	ViewFile *vf = data;
-
-	if (info == TARGET_TEXT_PLAIN) {
-		IconData *id = vficon_find_data_by_coord(vf, x, y, NULL);
-
-		if (id && id->fd) {
-			/* Add keywords to file */
-			FileData *fd = id->fd;
-			gchar *str = (gchar *) gtk_selection_data_get_text(selection);
-			GList *kw_list = string_to_keywords_list(str);
-
-			metadata_append_list(fd, KEYWORD_KEY, kw_list);
-			string_list_free(kw_list);
-			g_free(str);
-		}
-	}
-}
-
-static void vficon_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-	ViewFile *vf = data;
-
-	tip_unschedule(vf);
-
-	if (VFICON(vf)->click_id && VFICON(vf)->click_id->fd->thumb_pixbuf)
-		{
-		gint items;
-
-		if (VFICON(vf)->click_id->selected & SELECTION_SELECTED)
-			items = g_list_length(VFICON(vf)->selection);
-		else
-			items = 1;
-
-		dnd_set_drag_icon(widget, context, VFICON(vf)->click_id->fd->thumb_pixbuf, items);
-		}
-}
-
-static void vficon_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vficon_selection_remove(vf, VFICON(vf)->click_id, SELECTION_PRELIGHT, NULL);
-
-	if (gdk_drag_context_get_selected_action(context) == GDK_ACTION_MOVE)
-		{
-		vf_refresh(vf);
-		}
-
-	tip_unschedule(vf);
-}
-
-void vficon_dnd_init(ViewFile *vf)
-{
-	gtk_drag_source_set(vf->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
-			    dnd_file_drag_types, dnd_file_drag_types_count,
-			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-	gtk_drag_dest_set(vf->listview, GTK_DEST_DEFAULT_ALL,
-			    dnd_file_drag_types, dnd_file_drag_types_count,
-			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-
-	g_signal_connect(G_OBJECT(vf->listview), "drag_data_get",
-			 G_CALLBACK(vficon_dnd_get), vf);
-	g_signal_connect(G_OBJECT(vf->listview), "drag_begin",
-			 G_CALLBACK(vficon_dnd_begin), vf);
-	g_signal_connect(G_OBJECT(vf->listview), "drag_end",
-			 G_CALLBACK(vficon_dnd_end), vf);
-	g_signal_connect(G_OBJECT(vf->listview), "drag_data_received",
-			 G_CALLBACK(vficon_drag_data_received), vf);
-}
-
-/*
- *-------------------------------------------------------------------
- * cell updates
- *-------------------------------------------------------------------
- */
-
-static void vficon_selection_set(ViewFile *vf, IconData *id, SelectionType value, GtkTreeIter *iter)
-{
-	GtkTreeModel *store;
-	GList *list;
-
-	if (!id) return;
-
-
-	if (id->selected == value) return;
-	id->selected = value;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	if (iter)
-		{
-		gtk_tree_model_get(store, iter, FILE_COLUMN_POINTER, &list, -1);
-		if (list) gtk_list_store_set(GTK_LIST_STORE(store), iter, FILE_COLUMN_POINTER, list, -1);
-		}
-	else
-		{
-		GtkTreeIter row;
-
-		if (vficon_find_iter(vf, id, &row, NULL))
-			{
-			gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
-			if (list) gtk_list_store_set(GTK_LIST_STORE(store), &row, FILE_COLUMN_POINTER, list, -1);
-			}
-		}
-}
-
-static void vficon_selection_add(ViewFile *vf, IconData *id, SelectionType mask, GtkTreeIter *iter)
-{
-	if (!id) return;
-
-	vficon_selection_set(vf, id, id->selected | mask, iter);
-}
-
-static void vficon_selection_remove(ViewFile *vf, IconData *id, SelectionType mask, GtkTreeIter *iter)
-{
-	if (!id) return;
-
-	vficon_selection_set(vf, id, id->selected & ~mask, iter);
-}
-
-void vficon_marks_set(ViewFile *vf, gint enable)
-{
-	GtkAllocation allocation;
-	gtk_widget_get_allocation(vf->listview, &allocation);
-	vficon_populate_at_new_size(vf, allocation.width, allocation.height, TRUE);
-}
-
-/*
- *-------------------------------------------------------------------
- * selections
- *-------------------------------------------------------------------
- */
-
-static void vficon_verify_selections(ViewFile *vf)
-{
-	GList *work;
-
-	work = VFICON(vf)->selection;
-	while (work)
-		{
-		IconData *id = work->data;
-		work = work->next;
-
-		if (vficon_index_by_id(vf, id) >= 0) continue;
-
-		VFICON(vf)->selection = g_list_remove(VFICON(vf)->selection, id);
-		}
-}
-
-void vficon_select_all(ViewFile *vf)
-{
-	GList *work;
-
-	g_list_free(VFICON(vf)->selection);
-	VFICON(vf)->selection = NULL;
-
-	work = vf->list;
-	while (work)
-		{
-		IconData *id = work->data;
-		work = work->next;
-
-		VFICON(vf)->selection = g_list_append(VFICON(vf)->selection, id);
-		vficon_selection_add(vf, id, SELECTION_SELECTED, NULL);
-		}
-
-	vf_send_update(vf);
-}
-
-void vficon_select_none(ViewFile *vf)
-{
-	GList *work;
-
-	work = VFICON(vf)->selection;
-	while (work)
-		{
-		IconData *id = work->data;
-		work = work->next;
-
-		vficon_selection_remove(vf, id, SELECTION_SELECTED, NULL);
-		}
-
-	g_list_free(VFICON(vf)->selection);
-	VFICON(vf)->selection = NULL;
-
-	vf_send_update(vf);
-}
-
-void vficon_select_invert(ViewFile *vf)
-{
-	GList *work;
-
-	work = vf->list;
-	while (work)
-		{
-		IconData *id = work->data;
-		work = work->next;
-
-		if (id->selected & SELECTION_SELECTED)
-			{
-			VFICON(vf)->selection = g_list_remove(VFICON(vf)->selection, id);
-			vficon_selection_remove(vf, id, SELECTION_SELECTED, NULL);
-			}
-		else
-			{
-			VFICON(vf)->selection = g_list_append(VFICON(vf)->selection, id);
-			vficon_selection_add(vf, id, SELECTION_SELECTED, NULL);
-			}
-		}
-
-	vf_send_update(vf);
-}
-
-static void vficon_select(ViewFile *vf, IconData *id)
-{
-	VFICON(vf)->prev_selection = id;
-
-	if (!id || id->selected & SELECTION_SELECTED) return;
-
-	VFICON(vf)->selection = g_list_append(VFICON(vf)->selection, id);
-	vficon_selection_add(vf, id, SELECTION_SELECTED, NULL);
-
-	vf_send_update(vf);
-}
-
-static void vficon_unselect(ViewFile *vf, IconData *id)
-{
-	VFICON(vf)->prev_selection = id;
-
-	if (!id || !(id->selected & SELECTION_SELECTED) ) return;
-
-	VFICON(vf)->selection = g_list_remove(VFICON(vf)->selection, id);
-	vficon_selection_remove(vf, id, SELECTION_SELECTED, NULL);
-
-	vf_send_update(vf);
-}
-
-static void vficon_select_util(ViewFile *vf, IconData *id, gboolean select)
-{
-	if (select)
-		{
-		vficon_select(vf, id);
-		}
-	else
-		{
-		vficon_unselect(vf, id);
-		}
-}
-
-static void vficon_select_region_util(ViewFile *vf, IconData *start, IconData *end, gboolean select)
-{
-	gint row1, col1;
-	gint row2, col2;
-	gint t;
-	gint i, j;
-
-	if (!vficon_find_position(vf, start, &row1, &col1) ||
-	    !vficon_find_position(vf, end, &row2, &col2) ) return;
-
-	VFICON(vf)->prev_selection = end;
-
-	if (!options->collections.rectangular_selection)
-		{
-		GList *work;
-		IconData *id;
-
-		if (g_list_index(vf->list, start) > g_list_index(vf->list, end))
-			{
-			id = start;
-			start = end;
-			end = id;
-			}
-
-		work = g_list_find(vf->list, start);
-		while (work)
-			{
-			id = work->data;
-			vficon_select_util(vf, id, select);
-
-			if (work->data != end)
-				work = work->next;
-			else
-				work = NULL;
-			}
-		return;
-		}
-
-	if (row2 < row1)
-		{
-		t = row1;
-		row1 = row2;
-		row2 = t;
-		}
-	if (col2 < col1)
-		{
-		t = col1;
-		col1 = col2;
-		col2 = t;
-		}
-
-	DEBUG_1("table: %d x %d to %d x %d", row1, col1, row2, col2);
-
-	for (i = row1; i <= row2; i++)
-		{
-		for (j = col1; j <= col2; j++)
-			{
-			IconData *id = vficon_find_data(vf, i, j, NULL);
-			if (id) vficon_select_util(vf, id, select);
-			}
-		}
-}
-
-gboolean vficon_index_is_selected(ViewFile *vf, gint row)
-{
-	IconData *id = g_list_nth_data(vf->list, row);
-
-	if (!id) return FALSE;
-
-	return (id->selected & SELECTION_SELECTED);
-}
-
-guint vficon_selection_count(ViewFile *vf, gint64 *bytes)
-{
-	if (bytes)
-		{
-		gint64 b = 0;
-		GList *work;
-
-		work = VFICON(vf)->selection;
-		while (work)
-			{
-			IconData *id = work->data;
-			FileData *fd = id->fd;
-			g_assert(fd->magick == FD_MAGICK);
-			b += fd->size;
-
-			work = work->next;
-			}
-
-		*bytes = b;
-		}
-
-	return g_list_length(VFICON(vf)->selection);
-}
-
-GList *vficon_selection_get_list(ViewFile *vf)
-{
-	GList *list = NULL;
-	GList *work, *work2;
-
-	work = VFICON(vf)->selection;
-	while (work)
-		{
-		IconData *id = work->data;
-		FileData *fd = id->fd;
-		g_assert(fd->magick == FD_MAGICK);
-
-		list = g_list_prepend(list, file_data_ref(fd));
-
-		work2 = fd->sidecar_files;
-		while (work2)
-			{
-			fd = work2->data;
-			list = g_list_prepend(list, file_data_ref(fd));
-			work2 = work2->next;
-			}
-
-		work = work->next;
-		}
-
-	list = g_list_reverse(list);
-
-	return list;
-}
-
-GList *vficon_selection_get_list_by_index(ViewFile *vf)
-{
-	GList *list = NULL;
-	GList *work;
-
-	work = VFICON(vf)->selection;
-	while (work)
-		{
-		list = g_list_prepend(list, GINT_TO_POINTER(g_list_index(vf->list, work->data)));
-		work = work->next;
-		}
-
-	return g_list_reverse(list);
-}
-
-static void vficon_select_by_id(ViewFile *vf, IconData *id)
-{
-	if (!id) return;
-
-	if (!(id->selected & SELECTION_SELECTED))
-		{
-		vf_select_none(vf);
-		vficon_select(vf, id);
-		}
-
-	vficon_set_focus(vf, id);
-}
-
-void vficon_select_by_fd(ViewFile *vf, FileData *fd)
-{
-	IconData *id = NULL;
-	GList *work;
-
-	if (!fd) return;
-	work = vf->list;
-	while (work && !id)
-		{
-		IconData *chk = work->data;
-		work = work->next;
-		if (chk->fd == fd) id = chk;
-		}
-	vficon_select_by_id(vf, id);
-}
-
-void vficon_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
-{
-	GList *work;
-	gint n = mark - 1;
-
-	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
-
-	work = vf->list;
-	while (work)
-		{
-		IconData *id = work->data;
-		FileData *fd = id->fd;
-		gboolean mark_val, selected;
-
-		g_assert(fd->magick == FD_MAGICK);
-
-		mark_val = file_data_get_mark(fd, n);
-		selected = (id->selected & SELECTION_SELECTED);
-
-		switch (mode)
-			{
-			case MTS_MODE_SET: selected = mark_val;
-				break;
-			case MTS_MODE_OR: selected = mark_val || selected;
-				break;
-			case MTS_MODE_AND: selected = mark_val && selected;
-				break;
-			case MTS_MODE_MINUS: selected = !mark_val && selected;
-				break;
-			}
-
-		vficon_select_util(vf, id, selected);
-
-		work = work->next;
-		}
-}
-
-void vficon_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
-{
-	GList *slist;
-	GList *work;
-	gint n = mark -1;
-
-	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
-
-	slist = vf_selection_get_list(vf);
-	work = slist;
-	while (work)
-		{
-		FileData *fd = work->data;
-
-		switch (mode)
-			{
-			case STM_MODE_SET: file_data_set_mark(fd, n, 1);
-				break;
-			case STM_MODE_RESET: file_data_set_mark(fd, n, 0);
-				break;
-			case STM_MODE_TOGGLE: file_data_set_mark(fd, n, !file_data_get_mark(fd, n));
-				break;
-			}
-		work = work->next;
-		}
-	filelist_free(slist);
-}
-
-static void vficon_select_closest(ViewFile *vf, FileData *sel_fd)
-{
-	GList *work;
-	IconData *id = NULL;
-
-	if (sel_fd->parent) sel_fd = sel_fd->parent;
-	work = vf->list;
-
-	while (work)
-		{
-		gint match;
-		FileData *fd;
-
-		id = work->data;
-		fd = id->fd;
-		work = work->next;
-
-		match = filelist_sort_compare_filedata_full(fd, sel_fd, vf->sort_method, vf->sort_ascend);
-
-		if (match >= 0) break;
-		}
-
-	if (id)
-		{
-		vficon_select(vf, id);
-		vficon_send_layout_select(vf, id);
-		}
-}
-
-
-/*
- *-------------------------------------------------------------------
- * focus
- *-------------------------------------------------------------------
- */
-
-static void vficon_move_focus(ViewFile *vf, gint row, gint col, gboolean relative)
-{
-	gint new_row;
-	gint new_col;
-
-	if (relative)
-		{
-		new_row = VFICON(vf)->focus_row;
-		new_col = VFICON(vf)->focus_column;
-
-		new_row += row;
-		if (new_row < 0) new_row = 0;
-		if (new_row >= VFICON(vf)->rows) new_row = VFICON(vf)->rows - 1;
-
-		while (col != 0)
-			{
-			if (col < 0)
-				{
-				new_col--;
-				col++;
-				}
-			else
-				{
-				new_col++;
-				col--;
-				}
-
-			if (new_col < 0)
-				{
-				if (new_row > 0)
-					{
-					new_row--;
-					new_col = VFICON(vf)->columns - 1;
-					}
-				else
-					{
-					new_col = 0;
-					}
-				}
-			if (new_col >= VFICON(vf)->columns)
-				{
-				if (new_row < VFICON(vf)->rows - 1)
-					{
-					new_row++;
-					new_col = 0;
-					}
-				else
-					{
-					new_col = VFICON(vf)->columns - 1;
-					}
-				}
-			}
-		}
-	else
-		{
-		new_row = row;
-		new_col = col;
-
-		if (new_row >= VFICON(vf)->rows)
-			{
-			if (VFICON(vf)->rows > 0)
-				new_row = VFICON(vf)->rows - 1;
-			else
-				new_row = 0;
-			new_col = VFICON(vf)->columns - 1;
-			}
-		if (new_col >= VFICON(vf)->columns) new_col = VFICON(vf)->columns - 1;
-		}
-
-	if (new_row == VFICON(vf)->rows - 1)
-		{
-		gint l;
-
-		/* if we moved beyond the last image, go to the last image */
-
-		l = g_list_length(vf->list);
-		if (VFICON(vf)->rows > 1) l -= (VFICON(vf)->rows - 1) * VFICON(vf)->columns;
-		if (new_col >= l) new_col = l - 1;
-		}
-
-	vficon_set_focus(vf, vficon_find_data(vf, new_row, new_col, NULL));
-}
-
-static void vficon_set_focus(ViewFile *vf, IconData *id)
-{
-	GtkTreeIter iter;
-	gint row, col;
-
-	if (g_list_find(vf->list, VFICON(vf)->focus_id))
-		{
-		if (id == VFICON(vf)->focus_id)
-			{
-			/* ensure focus row col are correct */
-			vficon_find_position(vf, VFICON(vf)->focus_id, &VFICON(vf)->focus_row, &VFICON(vf)->focus_column);
-			return;
-			}
-		vficon_selection_remove(vf, VFICON(vf)->focus_id, SELECTION_FOCUS, NULL);
-		}
-
-	if (!vficon_find_position(vf, id, &row, &col))
-		{
-		VFICON(vf)->focus_id = NULL;
-		VFICON(vf)->focus_row = -1;
-		VFICON(vf)->focus_column = -1;
-		return;
-		}
-
-	VFICON(vf)->focus_id = id;
-	VFICON(vf)->focus_row = row;
-	VFICON(vf)->focus_column = col;
-	vficon_selection_add(vf, VFICON(vf)->focus_id, SELECTION_FOCUS, NULL);
-
-	if (vficon_find_iter(vf, VFICON(vf)->focus_id, &iter, NULL))
-		{
-		GtkTreePath *tpath;
-		GtkTreeViewColumn *column;
-		GtkTreeModel *store;
-
-		tree_view_row_make_visible(GTK_TREE_VIEW(vf->listview), &iter, FALSE);
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		tpath = gtk_tree_model_get_path(store, &iter);
-		/* focus is set to an extra column with 0 width to hide focus, we draw it ourself */
-		column = gtk_tree_view_get_column(GTK_TREE_VIEW(vf->listview), VFICON_MAX_COLUMNS);
-		gtk_tree_view_set_cursor(GTK_TREE_VIEW(vf->listview), tpath, column, FALSE);
-		gtk_tree_path_free(tpath);
-		}
-}
-
-/* used to figure the page up/down distances */
-static gint page_height(ViewFile *vf)
-{
-	GtkAdjustment *adj;
-	gint page_size;
-	gint row_height;
-	gint ret;
-
-	adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vf->listview));
-	page_size = (gint)gtk_adjustment_get_page_increment(adj);
-
-	row_height = options->thumbnails.max_height + THUMB_BORDER_PADDING * 2;
-	if (VFICON(vf)->show_text) row_height += options->thumbnails.max_height / 3;
-
-	ret = page_size / row_height;
-	if (ret < 1) ret = 1;
-
-	return ret;
-}
-
-/*
- *-------------------------------------------------------------------
- * keyboard
- *-------------------------------------------------------------------
- */
-
-static void vfi_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreeModel *store;
-	GtkTreeIter iter;
-	gint column;
-	GtkTreePath *tpath;
-	gint cw, ch;
-
-	if (!vficon_find_iter(vf, VFICON(vf)->click_id, &iter, &column)) return;
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	tpath = gtk_tree_model_get_path(store, &iter);
-	tree_view_get_cell_clamped(GTK_TREE_VIEW(vf->listview), tpath, column, FALSE, x, y, &cw, &ch);
-	gtk_tree_path_free(tpath);
-	*y += ch;
-	popup_menu_position_clamp(menu, x, y, 0);
-}
-
-gboolean vficon_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
-{
-	ViewFile *vf = data;
-	gint focus_row = 0;
-	gint focus_col = 0;
-	IconData *id;
-	gboolean stop_signal;
-
-	stop_signal = TRUE;
-	switch (event->keyval)
-		{
-		case GDK_KEY_Left: case GDK_KEY_KP_Left:
-			focus_col = -1;
-			break;
-		case GDK_KEY_Right: case GDK_KEY_KP_Right:
-			focus_col = 1;
-			break;
-		case GDK_KEY_Up: case GDK_KEY_KP_Up:
-			focus_row = -1;
-			break;
-		case GDK_KEY_Down: case GDK_KEY_KP_Down:
-			focus_row = 1;
-			break;
-		case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up:
-			focus_row = -page_height(vf);
-			break;
-		case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down:
-			focus_row = page_height(vf);
-			break;
-		case GDK_KEY_Home: case GDK_KEY_KP_Home:
-			focus_row = -VFICON(vf)->focus_row;
-			focus_col = -VFICON(vf)->focus_column;
-			break;
-		case GDK_KEY_End: case GDK_KEY_KP_End:
-			focus_row = VFICON(vf)->rows - 1 - VFICON(vf)->focus_row;
-			focus_col = VFICON(vf)->columns - 1 - VFICON(vf)->focus_column;
-			break;
-		case GDK_KEY_space:
-			id = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
-			if (id)
-				{
-				VFICON(vf)->click_id = id;
-				if (event->state & GDK_CONTROL_MASK)
-					{
-					gint selected;
-
-					selected = id->selected & SELECTION_SELECTED;
-					if (selected)
-						{
-						vficon_unselect(vf, id);
-						}
-					else
-						{
-						vficon_select(vf, id);
-						vficon_send_layout_select(vf, id);
-						}
-					}
-				else
-					{
-					vf_select_none(vf);
-					vficon_select(vf, id);
-					vficon_send_layout_select(vf, id);
-					}
-				}
-			break;
-		case GDK_KEY_Menu:
-			id = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
-			VFICON(vf)->click_id = id;
-
-			vficon_selection_add(vf, VFICON(vf)->click_id, SELECTION_PRELIGHT, NULL);
-			tip_unschedule(vf);
-
-			vf->popup = vf_pop_menu(vf);
-			gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, vfi_menu_position_cb, vf, 0, GDK_CURRENT_TIME);
-			break;
-		default:
-			stop_signal = FALSE;
-			break;
-		}
-
-	if (focus_row != 0 || focus_col != 0)
-		{
-		IconData *new_id;
-		IconData *old_id;
-
-		old_id = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
-		vficon_move_focus(vf, focus_row, focus_col, TRUE);
-		new_id = vficon_find_data(vf, VFICON(vf)->focus_row, VFICON(vf)->focus_column, NULL);
-
-		if (new_id != old_id)
-			{
-			if (event->state & GDK_SHIFT_MASK)
-				{
-				if (!options->collections.rectangular_selection)
-					{
-					vficon_select_region_util(vf, old_id, new_id, FALSE);
-					}
-				else
-					{
-					vficon_select_region_util(vf, VFICON(vf)->click_id, old_id, FALSE);
-					}
-				vficon_select_region_util(vf, VFICON(vf)->click_id, new_id, TRUE);
-				vficon_send_layout_select(vf, new_id);
-				}
-			else if (event->state & GDK_CONTROL_MASK)
-				{
-				VFICON(vf)->click_id = new_id;
-				}
-			else
-				{
-				VFICON(vf)->click_id = new_id;
-				vf_select_none(vf);
-				vficon_select(vf, new_id);
-				vficon_send_layout_select(vf, new_id);
-				}
-			}
-		}
-
-	if (stop_signal)
-		{
-		tip_unschedule(vf);
-		}
-
-	return stop_signal;
-}
-
-/*
- *-------------------------------------------------------------------
- * mouse
- *-------------------------------------------------------------------
- */
-
-static gboolean vficon_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
-{
-	ViewFile *vf = data;
-	IconData *id;
-
-	id = vficon_find_data_by_coord(vf, (gint)bevent->x, (gint)bevent->y, NULL);
-	tip_update(vf, id);
-
-	return FALSE;
-}
-
-gboolean vficon_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreeIter iter;
-	IconData *id;
-
-	tip_unschedule(vf);
-
-	id = vficon_find_data_by_coord(vf, (gint)bevent->x, (gint)bevent->y, &iter);
-
-	VFICON(vf)->click_id = id;
-	vficon_selection_add(vf, VFICON(vf)->click_id, SELECTION_PRELIGHT, &iter);
-
-	switch (bevent->button)
-		{
-		case MOUSE_BUTTON_LEFT:
-			if (!gtk_widget_has_focus(vf->listview))
-				{
-				gtk_widget_grab_focus(vf->listview);
-				}
-
-			if (bevent->type == GDK_2BUTTON_PRESS &&
-			    vf->layout)
-				{
-				vficon_selection_remove(vf, VFICON(vf)->click_id, SELECTION_PRELIGHT, &iter);
-				layout_image_full_screen_start(vf->layout);
-				}
-			break;
-		case MOUSE_BUTTON_RIGHT:
-			vf->popup = vf_pop_menu(vf);
-			gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
-			break;
-		default:
-			break;
-		}
-
-	return FALSE;
-}
-
-gboolean vficon_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreeIter iter;
-	IconData *id = NULL;
-	gboolean was_selected;
-
-	tip_schedule(vf);
-
-	if ((gint)bevent->x != 0 || (gint)bevent->y != 0)
-		{
-		id = vficon_find_data_by_coord(vf, (gint)bevent->x, (gint)bevent->y, &iter);
-		}
-
-	if (VFICON(vf)->click_id)
-		{
-		vficon_selection_remove(vf, VFICON(vf)->click_id, SELECTION_PRELIGHT, NULL);
-		}
-
-	if (!id || VFICON(vf)->click_id != id) return TRUE;
-
-	was_selected = !!(id->selected & SELECTION_SELECTED);
-
-	switch (bevent->button)
-		{
-		case MOUSE_BUTTON_LEFT:
-			{
-			vficon_set_focus(vf, id);
-
-			if (bevent->state & GDK_CONTROL_MASK)
-				{
-				gboolean select;
-
-				select = !(id->selected & SELECTION_SELECTED);
-				if ((bevent->state & GDK_SHIFT_MASK) && VFICON(vf)->prev_selection)
-					{
-					vficon_select_region_util(vf, VFICON(vf)->prev_selection, id, select);
-					}
-				else
-					{
-					vficon_select_util(vf, id, select);
-					}
-				}
-			else
-				{
-				vf_select_none(vf);
-
-				if ((bevent->state & GDK_SHIFT_MASK) && VFICON(vf)->prev_selection)
-					{
-					vficon_select_region_util(vf, VFICON(vf)->prev_selection, id, TRUE);
-					}
-				else
-					{
-					vficon_select_util(vf, id, TRUE);
-					was_selected = FALSE;
-					}
-				}
-			}
-			break;
-		case MOUSE_BUTTON_MIDDLE:
-			{
-			vficon_select_util(vf, id, !(id->selected & SELECTION_SELECTED));
-			}
-			break;
-		default:
-			break;
-		}
-
-	if (!was_selected && (id->selected & SELECTION_SELECTED))
-		{
-		vficon_send_layout_select(vf, id);
-		}
-
-	return TRUE;
-}
-
-static gboolean vficon_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
-{
-	ViewFile *vf = data;
-
-	tip_unschedule(vf);
-	return FALSE;
-}
-
-/*
- *-------------------------------------------------------------------
- * population
- *-------------------------------------------------------------------
- */
-
-static gboolean vficon_destroy_node_cb(GtkTreeModel *store, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data)
-{
-	GList *list;
-
-	gtk_tree_model_get(store, iter, FILE_COLUMN_POINTER, &list, -1);
-
-	/* it seems that gtk_list_store_clear may call some callbacks
-	   that use the column. Set the pointer to NULL to be safe. */
-	gtk_list_store_set(GTK_LIST_STORE(store), iter, FILE_COLUMN_POINTER, NULL, -1);
-	g_list_free(list);
-
-	return FALSE;
-}
-
-static void vficon_clear_store(ViewFile *vf)
-{
-	GtkTreeModel *store;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_model_foreach(store, vficon_destroy_node_cb, NULL);
-
-	gtk_list_store_clear(GTK_LIST_STORE(store));
-}
-
-static GList *vficon_add_row(ViewFile *vf, GtkTreeIter *iter)
-{
-	GtkListStore *store;
-	GList *list = NULL;
-	gint i;
-
-	for (i = 0; i < VFICON(vf)->columns; i++) list = g_list_prepend(list, NULL);
-
-	store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
-	gtk_list_store_append(store, iter);
-	gtk_list_store_set(store, iter, FILE_COLUMN_POINTER, list, -1);
-
-	return list;
-}
-
-static void vficon_populate(ViewFile *vf, gboolean resize, gboolean keep_position)
-{
-	GtkTreeModel *store;
-	GtkTreePath *tpath;
-	GList *work;
-	IconData *visible_id = NULL;
-	gint r, c;
-	gboolean valid;
-	GtkTreeIter iter;
-
-	vficon_verify_selections(vf);
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-
-	if (keep_position && gtk_widget_get_realized(vf->listview) &&
-	    gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
-		{
-		GtkTreeIter iter;
-		GList *list;
-
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_path_free(tpath);
-
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
-		if (list) visible_id = list->data;
-		}
-
-
-	if (resize)
-		{
-		gint i;
-		gint thumb_width;
-
-		vficon_clear_store(vf);
-
-		thumb_width = vficon_get_icon_width(vf);
-
-		for (i = 0; i < VFICON_MAX_COLUMNS; i++)
-			{
-			GtkTreeViewColumn *column;
-			GtkCellRenderer *cell;
-			GList *list;
-
-			column = gtk_tree_view_get_column(GTK_TREE_VIEW(vf->listview), i);
-			gtk_tree_view_column_set_visible(column, (i < VFICON(vf)->columns));
-			gtk_tree_view_column_set_fixed_width(column, thumb_width + (THUMB_BORDER_PADDING * 6));
-
-			list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
-			cell = (list) ? list->data : NULL;
-			g_list_free(list);
-
-			if (cell && GQV_IS_CELL_RENDERER_ICON(cell))
-				{
-				g_object_set(G_OBJECT(cell), "fixed_width", thumb_width,
-							     "fixed_height", options->thumbnails.max_height,
-							     "show_text", VFICON(vf)->show_text,
-							     "show_marks", vf->marks_enabled,
-							     "num_marks", FILEDATA_MARKS_SIZE,
-							     NULL);
-				}
-			}
-		if (gtk_widget_get_realized(vf->listview)) gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
-		}
-
-	r = -1;
-	c = 0;
-
-	valid = gtk_tree_model_iter_children(store, &iter, NULL);
-
-	work = vf->list;
-	while (work)
-		{
-		GList *list;
-		r++;
-		c = 0;
-		if (valid)
-			{
-			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
-			gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1);
-			}
-		else
-			{
-			list = vficon_add_row(vf, &iter);
-			}
-
-		while (list)
-			{
-			IconData *id;
-
-			if (work)
-				{
-				id = work->data;
-				work = work->next;
-				c++;
-				}
-			else
-				{
-				id = NULL;
-				}
-
-			list->data = id;
-			list = list->next;
-			}
-		if (valid) valid = gtk_tree_model_iter_next(store, &iter);
-		}
-
-	r++;
-	while (valid)
-		{
-		GList *list;
-
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
-		valid = gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
-		g_list_free(list);
-		}
-
-	VFICON(vf)->rows = r;
-
-	if (visible_id &&
-	    gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
-		{
-		GtkTreeIter iter;
-		GList *list;
-
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_path_free(tpath);
-
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
-		if (g_list_find(list, visible_id) == NULL &&
-		    vficon_find_iter(vf, visible_id, &iter, NULL))
-			{
-			tree_view_row_make_visible(GTK_TREE_VIEW(vf->listview), &iter, FALSE);
-			}
-		}
-
-
-	vf_send_update(vf);
-	vf_thumb_update(vf);
-}
-
-static void vficon_populate_at_new_size(ViewFile *vf, gint w, gint h, gboolean force)
-{
-	gint new_cols;
-	gint thumb_width;
-
-	thumb_width = vficon_get_icon_width(vf);
-
-	new_cols = w / (thumb_width + (THUMB_BORDER_PADDING * 6));
-	if (new_cols < 1) new_cols = 1;
-
-	if (!force && new_cols == VFICON(vf)->columns) return;
-
-	VFICON(vf)->columns = new_cols;
-
-	vficon_populate(vf, TRUE, TRUE);
-
-	DEBUG_1("col tab pop cols=%d rows=%d", VFICON(vf)->columns, VFICON(vf)->rows);
-}
-
-static void vficon_sized_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vficon_populate_at_new_size(vf, allocation->width, allocation->height, FALSE);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * misc
- *-----------------------------------------------------------------------------
- */
-
-void vficon_sort_set(ViewFile *vf, SortType type, gboolean ascend)
-{
-	if (vf->sort_method == type && vf->sort_ascend == ascend) return;
-
-	vf->sort_method = type;
-	vf->sort_ascend = ascend;
-
-	if (!vf->list) return;
-
-	vf_refresh(vf);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * thumb updates
- *-----------------------------------------------------------------------------
- */
-
-void vficon_thumb_progress_count(GList *list, gint *count, gint *done)
-{
-	GList *work = list;
-	while (work)
-		{
-		IconData *id = work->data;
-		FileData *fd = id->fd;
-		work = work->next;
-
-		if (fd->thumb_pixbuf) (*done)++;
-		(*count)++;
-		}
-}
-
-void vficon_set_thumb_fd(ViewFile *vf, FileData *fd)
-{
-	GtkTreeModel *store;
-	GtkTreeIter iter;
-	GList *list;
-
-	if (!vficon_find_iter(vf, vficon_icon_data(vf, fd), &iter, NULL)) return;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-
-	gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
-	gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1);
-}
-
-
-FileData *vficon_thumb_next_fd(ViewFile *vf)
-{
-	GtkTreePath *tpath;
-	FileData *fd = NULL;
-
-	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
-		{
-		GtkTreeModel *store;
-		GtkTreeIter iter;
-		gboolean valid = TRUE;
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_path_free(tpath);
-
-		while (!fd && valid && tree_view_row_get_visibility(GTK_TREE_VIEW(vf->listview), &iter, FALSE) == 0)
-			{
-			GList *list;
-
-			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
-
-			while (!fd && list)
-				{
-				IconData *id = list->data;
-				if (id && !id->fd->thumb_pixbuf) fd = id->fd;
-				list = list->next;
-				}
-
-			valid = gtk_tree_model_iter_next(store, &iter);
-			}
-		}
-
-	/* then find first undone */
-
-	if (!fd)
-		{
-		GList *work = vf->list;
-		while (work && !fd)
-			{
-			IconData *id = work->data;
-			FileData *fd_p = id->fd;
-			work = work->next;
-
-			if (!fd_p->thumb_pixbuf) fd = fd_p;
-			}
-		}
-
-	return fd;
-}
-
-void vficon_thumb_reset_all(ViewFile *vf)
-{
-	GList *work = vf->list;
-
-	while (work)
-		{
-		IconData *id = work->data;
-		FileData *fd = id->fd;
-		if (fd->thumb_pixbuf)
-			{
-			g_object_unref(fd->thumb_pixbuf);
-			fd->thumb_pixbuf = NULL;
-			}
-		work = work->next;
-		}
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- * row stuff
- *-----------------------------------------------------------------------------
- */
-
-FileData *vficon_index_get_data(ViewFile *vf, gint row)
-{
-	IconData *id;
-
-	id = g_list_nth_data(vf->list, row);
-	return id ? id->fd : NULL;
-}
-
-
-gint vficon_index_by_fd(ViewFile *vf, FileData *in_fd)
-{
-	gint p = 0;
-	GList *work;
-
-	if (!in_fd) return -1;
-
-	work = vf->list;
-	while (work)
-		{
-		IconData *id = work->data;
-		FileData *fd = id->fd;
-		if (fd == in_fd) return p;
-		work = work->next;
-		p++;
-		}
-
-	return -1;
-}
-
-static gint vficon_index_by_id(ViewFile *vf, IconData *in_id)
-{
-	gint p = 0;
-	GList *work;
-
-	if (!in_id) return -1;
-
-	work = vf->list;
-	while (work)
-		{
-		IconData *id = work->data;
-		if (id == in_id) return p;
-		work = work->next;
-		p++;
-		}
-
-	return -1;
-}
-
-guint vficon_count(ViewFile *vf, gint64 *bytes)
-{
-	if (bytes)
-		{
-		gint64 b = 0;
-		GList *work;
-
-		work = vf->list;
-		while (work)
-			{
-			IconData *id = work->data;
-			FileData *fd = id->fd;
-			work = work->next;
-
-			b += fd->size;
-			}
-
-		*bytes = b;
-		}
-
-	return g_list_length(vf->list);
-}
-
-GList *vficon_get_list(ViewFile *vf)
-{
-	GList *list = NULL;
-	GList *work;
-
-	work = vf->list;
-	while (work)
-		{
-		IconData *id = work->data;
-		FileData *fd = id->fd;
-		work = work->next;
-
-		list = g_list_prepend(list, file_data_ref(fd));
-		}
-
-	return g_list_reverse(list);
-}
-
-/*
- *-----------------------------------------------------------------------------
- *
- *-----------------------------------------------------------------------------
- */
-
-static gboolean vficon_refresh_real(ViewFile *vf, gboolean keep_position)
-{
-	gboolean ret = TRUE;
-	GList *work, *work_fd;
-	IconData *focus_id;
-	GList *new_filelist = NULL;
-	FileData *first_selected = NULL;
-	GList *new_iconlist = NULL;
-
-	focus_id = VFICON(vf)->focus_id;
-
-	if (vf->dir_fd)
-		{
-		ret = filelist_read(vf->dir_fd, &new_filelist, NULL);
-		new_filelist = file_data_filter_marks_list(new_filelist, vf_marks_get_filter(vf));
-		}
-
-	vf->list = iconlist_sort(vf->list, vf->sort_method, vf->sort_ascend); /* the list might not be sorted if there were renames */
-	new_filelist = filelist_sort(new_filelist, vf->sort_method, vf->sort_ascend);
-
-	if (VFICON(vf)->selection)
-		{
-		first_selected = ((IconData *)(VFICON(vf)->selection->data))->fd;
-		file_data_ref(first_selected);
-		g_list_free(VFICON(vf)->selection);
-		VFICON(vf)->selection = NULL;
-
-
-		}
-
-	/* check for same files from old_list */
-	work = vf->list;
-	work_fd = new_filelist;
-	while (work || work_fd)
-		{
-		IconData *id = NULL;
-		FileData *fd = NULL;
-		FileData *new_fd = NULL;
-		gint match;
-
-		if (work && work_fd)
-			{
-			id = work->data;
-			fd = id->fd;
-
-			new_fd = work_fd->data;
-
-			if (fd == new_fd)
-				{
-				/* not changed, go to next */
-				work = work->next;
-				work_fd = work_fd->next;
-				if (id->selected & SELECTION_SELECTED)
-					{
-					VFICON(vf)->selection = g_list_prepend(VFICON(vf)->selection, id);
-					}
-				continue;
-				}
-
-			match = filelist_sort_compare_filedata_full(fd, new_fd, vf->sort_method, vf->sort_ascend);
-			if (match == 0) g_warning("multiple fd for the same path");
-			}
-		else if (work)
-			{
-			id = work->data;
-			fd = id->fd;
-			match = -1;
-			}
-		else /* work_fd */
-			{
-			new_fd = work_fd->data;
-			match = 1;
-			}
-
-		if (match < 0)
-			{
-			/* file no longer exists, delete from vf->list */
-			GList *to_delete = work;
-			work = work->next;
-			if (id == VFICON(vf)->prev_selection) VFICON(vf)->prev_selection = NULL;
-			if (id == VFICON(vf)->click_id) VFICON(vf)->click_id = NULL;
-			file_data_unref(fd);
-			g_free(id);
-			vf->list = g_list_delete_link(vf->list, to_delete);
-			}
-		else
-			{
-			/* new file, add to vf->list */
-			id = g_new0(IconData, 1);
-
-			id->selected = SELECTION_NONE;
-			id->fd = file_data_ref(new_fd);
-			if (work)
-				vf->list = g_list_insert_before(vf->list, work, id);
-			else
-				new_iconlist = g_list_prepend(new_iconlist, id); /* it is faster to append all new entries together later */
-
-			work_fd = work_fd->next;
-			}
-
-		}
-
-	if (new_iconlist)
-		{
-		vf->list = g_list_concat(vf->list, g_list_reverse(new_iconlist));
-		}
-
-	VFICON(vf)->selection = g_list_reverse(VFICON(vf)->selection);
-
-	filelist_free(new_filelist);
-
-	vficon_populate(vf, TRUE, keep_position);
-
-	if (first_selected && !VFICON(vf)->selection)
-		{
-		/* all selected files disappeared */
-		vficon_select_closest(vf, first_selected);
-		}
-	file_data_unref(first_selected);
-
-	/* attempt to keep focus on same icon when refreshing */
-	if (focus_id && g_list_find(vf->list, focus_id))
-		{
-		vficon_set_focus(vf, focus_id);
-		}
-
-	return ret;
-}
-
-gboolean vficon_refresh(ViewFile *vf)
-{
-	return vficon_refresh_real(vf, TRUE);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * draw, etc.
- *-----------------------------------------------------------------------------
- */
-
-typedef struct _ColumnData ColumnData;
-struct _ColumnData
-{
-	ViewFile *vf;
-	gint number;
-};
-
-static void vficon_cell_data_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
-				GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
-{
-	GList *list;
-	IconData *id;
-	ColumnData *cd = data;
-	ViewFile *vf = cd->vf;
-
-	if (!GQV_IS_CELL_RENDERER_ICON(cell)) return;
-
-	gtk_tree_model_get(tree_model, iter, FILE_COLUMN_POINTER, &list, -1);
-
-	id = g_list_nth_data(list, cd->number);
-
-	if (id)
-		{
-		GdkColor color_fg;
-		GdkColor color_bg;
-		GtkStyle *style;
-		gchar *name_sidecars;
-		gchar *link;
-		GtkStateType state = GTK_STATE_NORMAL;
-
-		g_assert(id->fd->magick == FD_MAGICK);
-
-		link = islink(id->fd->path) ? GQ_LINK_STR : "";
-		if (id->fd->sidecar_files)
-			{
-			gchar *sidecars = file_data_sc_list_to_string(id->fd);
-			name_sidecars = g_strdup_printf("%s%s %s", link, id->fd->name, sidecars);
-			g_free(sidecars);
-			}
-		else
-			{
-			gchar *disabled_grouping = id->fd->disable_grouping ? _(" [NO GROUPING]") : "";
-			name_sidecars = g_strdup_printf("%s%s%s", link, id->fd->name, disabled_grouping);
-			}
-
-		style = gtk_widget_get_style(vf->listview);
-		if (id->selected & SELECTION_SELECTED)
-			{
-			state = GTK_STATE_SELECTED;
-			}
-
-		memcpy(&color_fg, &style->text[state], sizeof(color_fg));
-		memcpy(&color_bg, &style->base[state], sizeof(color_bg));
-
-		if (id->selected & SELECTION_PRELIGHT)
-			{
-			shift_color(&color_bg, -1, 0);
-			}
-
-		g_object_set(cell,	"pixbuf", id->fd->thumb_pixbuf,
-					"text", name_sidecars,
-					"marks", file_data_get_marks(id->fd),
-					"show_marks", vf->marks_enabled,
-					"cell-background-gdk", &color_bg,
-					"cell-background-set", TRUE,
-					"foreground-gdk", &color_fg,
-					"foreground-set", TRUE,
-					"has-focus", (VFICON(vf)->focus_id == id), NULL);
-		g_free(name_sidecars);
-		}
-	else
-		{
-		g_object_set(cell,	"pixbuf", NULL,
-					"text", NULL,
-					"show_marks", FALSE,
-					"cell-background-set", FALSE,
-					"foreground-set", FALSE,
-					"has-focus", FALSE, NULL);
-		}
-}
-
-static void vficon_append_column(ViewFile *vf, gint n)
-{
-	ColumnData *cd;
-	GtkTreeViewColumn *column;
-	GtkCellRenderer *renderer;
-
-	column = gtk_tree_view_column_new();
-	gtk_tree_view_column_set_min_width(column, 0);
-
-	gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
-	gtk_tree_view_column_set_alignment(column, 0.5);
-
-	renderer = gqv_cell_renderer_icon_new();
-	gtk_tree_view_column_pack_start(column, renderer, FALSE);
-	g_object_set(G_OBJECT(renderer), "xpad", THUMB_BORDER_PADDING * 2,
-					 "ypad", THUMB_BORDER_PADDING,
-					 "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
-
-	g_object_set_data(G_OBJECT(column), "column_number", GINT_TO_POINTER(n));
-	g_object_set_data(G_OBJECT(renderer), "column_number", GINT_TO_POINTER(n));
-
-	cd = g_new0(ColumnData, 1);
-	cd->vf = vf;
-	cd->number = n;
-	gtk_tree_view_column_set_cell_data_func(column, renderer, vficon_cell_data_cb, cd, g_free);
-
-	gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column);
-
-	g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vficon_mark_toggled_cb), vf);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * base
- *-----------------------------------------------------------------------------
- */
-
-gboolean vficon_set_fd(ViewFile *vf, FileData *dir_fd)
-{
-	gboolean ret;
-
-	if (!dir_fd) return FALSE;
-	if (vf->dir_fd == dir_fd) return TRUE;
-
-	file_data_unref(vf->dir_fd);
-	vf->dir_fd = file_data_ref(dir_fd);
-
-	g_list_free(VFICON(vf)->selection);
-	VFICON(vf)->selection = NULL;
-
-	iconlist_free(vf->list);
-	vf->list = NULL;
-
-	/* NOTE: populate will clear the store for us */
-	ret = vficon_refresh_real(vf, FALSE);
-
-	VFICON(vf)->focus_id = NULL;
-	vficon_move_focus(vf, 0, 0, FALSE);
-
-	return ret;
-}
-
-void vficon_destroy_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vf_refresh_idle_cancel(vf);
-
-	file_data_unregister_notify_func(vf_notify_cb, vf);
-
-	tip_unschedule(vf);
-
-	vf_thumb_cleanup(vf);
-
-	iconlist_free(vf->list);
-	g_list_free(VFICON(vf)->selection);
-}
-
-ViewFile *vficon_new(ViewFile *vf, FileData *dir_fd)
-{
-	GtkListStore *store;
-	GtkTreeSelection *selection;
-	gint i;
-
-	vf->info = g_new0(ViewFileInfoIcon, 1);
-
-	VFICON(vf)->show_text = options->show_icon_names;
-
-	store = gtk_list_store_new(1, G_TYPE_POINTER);
-	vf->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
-	g_object_unref(store);
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_NONE);
-
-	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vf->listview), FALSE);
-	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vf->listview), FALSE);
-
-	for (i = 0; i < VFICON_MAX_COLUMNS; i++)
-		{
-		vficon_append_column(vf, i);
-		}
-
-	/* zero width column to hide tree view focus, we draw it ourselves */
-	vficon_append_column(vf, i);
-	/* end column to fill white space */
-	vficon_append_column(vf, i);
-
-	g_signal_connect(G_OBJECT(vf->listview), "size_allocate",
-			 G_CALLBACK(vficon_sized_cb), vf);
-
-	gtk_widget_set_events(vf->listview, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK |
-			      GDK_BUTTON_PRESS_MASK | GDK_LEAVE_NOTIFY_MASK);
-
-	g_signal_connect(G_OBJECT(vf->listview),"motion_notify_event",
-			 G_CALLBACK(vficon_motion_cb), vf);
-	g_signal_connect(G_OBJECT(vf->listview), "leave_notify_event",
-			 G_CALLBACK(vficon_leave_cb), vf);
-
-	/* force VFICON(vf)->columns to be at least 1 (sane) - this will be corrected in the size_cb */
-	vficon_populate_at_new_size(vf, 1, 1, FALSE);
-
-	file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
-
-	return vf;
-}
-
-/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/view_file_icon.h	Wed Jan 11 22:00:49 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2004 John Ellis
- * Copyright (C) 2008 - 2016 The Geeqie Team
- *
- * Author: John Ellis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef VIEW_FILE_ICON_H
-#define VIEW_FILE_ICON_H
-
-gboolean vficon_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data);
-gboolean vficon_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-gboolean vficon_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-
-void vficon_dnd_init(ViewFile *vf);
-
-void vficon_destroy_cb(GtkWidget *widget, gpointer data);
-ViewFile *vficon_new(ViewFile *vf, FileData *dir_fd);
-
-gboolean vficon_set_fd(ViewFile *vf, FileData *dir_fd);
-gboolean vficon_refresh(ViewFile *vf);
-
-void vficon_sort_set(ViewFile *vf, SortType type, gboolean ascend);
-
-void vficon_marks_set(ViewFile *vf, gboolean enable);
-
-GList *vficon_selection_get_one(ViewFile *vf, FileData *fd);
-GList *vficon_pop_menu_file_list(ViewFile *vf);
-void vficon_pop_menu_view_cb(GtkWidget *widget, gpointer data);
-void vficon_pop_menu_rename_cb(GtkWidget *widget, gpointer data);
-void vficon_pop_menu_refresh_cb(GtkWidget *widget, gpointer data);
-void vficon_popup_destroy_cb(GtkWidget *widget, gpointer data);
-void vficon_pop_menu_show_names_cb(GtkWidget *widget, gpointer data);
-
-FileData *vficon_index_get_data(ViewFile *vf, gint row);
-gint vficon_index_by_fd(ViewFile *vf, FileData *in_fd);
-guint vficon_count(ViewFile *vf, gint64 *bytes);
-GList *vficon_get_list(ViewFile *vf);
-
-gboolean vficon_index_is_selected(ViewFile *vf, gint row);
-guint vficon_selection_count(ViewFile *vf, gint64 *bytes);
-GList *vficon_selection_get_list(ViewFile *vf);
-GList *vficon_selection_get_list_by_index(ViewFile *vf);
-
-void vficon_select_all(ViewFile *vf);
-void vficon_select_none(ViewFile *vf);
-void vficon_select_invert(ViewFile *vf);
-void vficon_select_by_fd(ViewFile *vf, FileData *fd);
-
-void vficon_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode);
-void vficon_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode);
-
-
-void vficon_thumb_progress_count(GList *list, gint *count, gint *done);
-void vficon_set_thumb_fd(ViewFile *vf, FileData *fd);
-FileData *vficon_thumb_next_fd(ViewFile *vf);
-void vficon_thumb_reset_all(ViewFile *vf);
-
-#endif
-/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/view_file_list.c	Wed Jan 11 22:00:49 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2052 +0,0 @@
-/*
- * Copyright (C) 2004 John Ellis
- * Copyright (C) 2008 - 2016 The Geeqie Team
- *
- * Author: John Ellis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "main.h"
-#include "view_file_list.h"
-
-#include "bar.h"
-#include "cache_maint.h"
-#include "dnd.h"
-#include "editors.h"
-#include "img-view.h"
-#include "layout.h"
-#include "layout_image.h"
-#include "menu.h"
-#include "metadata.h"
-#include "thumb.h"
-#include "utilops.h"
-#include "ui_fileops.h"
-#include "ui_menu.h"
-#include "ui_tree_edit.h"
-#include "uri_utils.h"
-#include "view_file.h"
-
-#include <gdk/gdkkeysyms.h> /* for keyboard values */
-
-/* Index to tree store */
-enum {
-	FILE_COLUMN_POINTER = 0,
-	FILE_COLUMN_VERSION,
-	FILE_COLUMN_THUMB,
-	FILE_COLUMN_FORMATTED,
-	FILE_COLUMN_NAME,
-	FILE_COLUMN_SIDECARS,
-	FILE_COLUMN_SIZE,
-	FILE_COLUMN_DATE,
-	FILE_COLUMN_EXPANDED,
-	FILE_COLUMN_COLOR,
-	FILE_COLUMN_MARKS,
-	FILE_COLUMN_MARKS_LAST = FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1,
-	FILE_COLUMN_COUNT
-};
-
-
-/* Index to tree view */
-enum {
-	FILE_VIEW_COLUMN_MARKS = 0,
-	FILE_VIEW_COLUMN_MARKS_LAST = FILE_VIEW_COLUMN_MARKS + FILEDATA_MARKS_SIZE - 1,
-	FILE_VIEW_COLUMN_THUMB,
-	FILE_VIEW_COLUMN_FORMATTED,
-	FILE_VIEW_COLUMN_SIZE,
-	FILE_VIEW_COLUMN_DATE,
-	FILE_VIEW_COLUMN_COUNT
-};
-
-
-
-static gboolean vflist_row_is_selected(ViewFile *vf, FileData *fd);
-static gboolean vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data);
-static void vflist_populate_view(ViewFile *vf, gboolean force);
-static gboolean vflist_is_multiline(ViewFile *vf);
-static void vflist_set_expanded(ViewFile *vf, GtkTreeIter *iter, gboolean expanded);
-
-
-/*
- *-----------------------------------------------------------------------------
- * misc
- *-----------------------------------------------------------------------------
- */
-typedef struct {
-	FileData *fd;
-	GtkTreeIter *iter;
-	gboolean found;
-	gint row;
-} ViewFileFindRowData;
-
-static gboolean vflist_find_row_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-	ViewFileFindRowData *find = data;
-	FileData *fd;
-	gtk_tree_model_get(model, iter, FILE_COLUMN_POINTER, &fd, -1);
-	if (fd == find->fd)
-		{
-		*find->iter = *iter;
-		find->found = TRUE;
-		return TRUE;
-		}
-	find->row++;
-	return FALSE;
-}
-
-static gint vflist_find_row(ViewFile *vf, FileData *fd, GtkTreeIter *iter)
-{
-	GtkTreeModel *store;
-	ViewFileFindRowData data = {fd, iter, FALSE, 0};
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_model_foreach(store, vflist_find_row_cb, &data);
-
-	if (data.found)
-		{
-		return data.row;
-		}
-
-	return -1;
-}
-
-static FileData *vflist_find_data_by_coord(ViewFile *vf, gint x, gint y, GtkTreeIter *iter)
-{
-	GtkTreePath *tpath;
-	GtkTreeViewColumn *column;
-
-	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), x, y,
-					  &tpath, &column, NULL, NULL))
-		{
-		GtkTreeModel *store;
-		GtkTreeIter row;
-		FileData *fd;
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		gtk_tree_model_get_iter(store, &row, tpath);
-		gtk_tree_path_free(tpath);
-		gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &fd, -1);
-
-		return fd;
-		}
-
-	return NULL;
-}
-
-static gboolean vflist_store_clear_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-	FileData *fd;
-	gtk_tree_model_get(model, iter, FILE_COLUMN_POINTER, &fd, -1);
-
-	/* it seems that gtk_tree_store_clear may call some callbacks
-	   that use the column. Set the pointer to NULL to be safe. */
-	gtk_tree_store_set(GTK_TREE_STORE(model), iter, FILE_COLUMN_POINTER, NULL, -1);
-	file_data_unref(fd);
-	return FALSE;
-}
-
-static void vflist_store_clear(ViewFile *vf, gboolean unlock_files)
-{
-	GtkTreeModel *store;
-	GList *files = NULL;
-
-	if (unlock_files && vf->marks_enabled)
-		{
-		// unlock locked files in this directory
-		filelist_read(vf->dir_fd, &files, NULL);
-		while (files)
-			{
-			FileData *fd = files->data;
-			files = files->next;
-			file_data_unlock(fd);
-			file_data_unref(fd);  // undo the ref that got added in filelist_read
-			}
-		}
-
-	g_list_free(files);
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_model_foreach(store, vflist_store_clear_cb, NULL);
-	gtk_tree_store_clear(GTK_TREE_STORE(store));
-}
-
-void vflist_color_set(ViewFile *vf, FileData *fd, gboolean color_set)
-{
-	GtkTreeModel *store;
-	GtkTreeIter iter;
-
-	if (vflist_find_row(vf, fd, &iter) < 0) return;
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_store_set(GTK_TREE_STORE(store), &iter, FILE_COLUMN_COLOR, color_set, -1);
-}
-
-static void vflist_move_cursor(ViewFile *vf, GtkTreeIter *iter)
-{
-	GtkTreeModel *store;
-	GtkTreePath *tpath;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-
-	tpath = gtk_tree_model_get_path(store, iter);
-	gtk_tree_view_set_cursor(GTK_TREE_VIEW(vf->listview), tpath, NULL, FALSE);
-	gtk_tree_path_free(tpath);
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- * dnd
- *-----------------------------------------------------------------------------
- */
-
-static void vflist_dnd_get(GtkWidget *widget, GdkDragContext *context,
-			   GtkSelectionData *selection_data, guint info,
-			   guint time, gpointer data)
-{
-	ViewFile *vf = data;
-	GList *list = NULL;
-
-	if (!VFLIST(vf)->click_fd) return;
-
-	if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
-		{
-		list = vf_selection_get_list(vf);
-		}
-	else
-		{
-		list = g_list_append(NULL, file_data_ref(VFLIST(vf)->click_fd));
-		}
-
-	if (!list) return;
-	uri_selection_data_set_uris_from_filelist(selection_data, list);
-	filelist_free(list);
-}
-
-static void vflist_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vflist_color_set(vf, VFLIST(vf)->click_fd, TRUE);
-
-	if (VFLIST(vf)->thumbs_enabled &&
-	    VFLIST(vf)->click_fd && VFLIST(vf)->click_fd->thumb_pixbuf)
-		{
-		guint items;
-
-		if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
-			items = vf_selection_count(vf, NULL);
-		else
-			items = 1;
-
-		dnd_set_drag_icon(widget, context, VFLIST(vf)->click_fd->thumb_pixbuf, items);
-		}
-}
-
-static void vflist_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
-
-	if (gdk_drag_context_get_selected_action(context) == GDK_ACTION_MOVE)
-		{
-		vf_refresh(vf);
-		}
-}
-
-static void vflist_drag_data_received(GtkWidget *entry_widget, GdkDragContext *context,
-				      int x, int y, GtkSelectionData *selection,
-				      guint info, guint time, gpointer data)
-{
-	ViewFile *vf = data;
-
-	if (info == TARGET_TEXT_PLAIN) {
-		FileData *fd = vflist_find_data_by_coord(vf, x, y, NULL);
-
-		if (fd) {
-			/* Add keywords to file */
-			gchar *str = (gchar *) gtk_selection_data_get_text(selection);
-			GList *kw_list = string_to_keywords_list(str);
-
-			metadata_append_list(fd, KEYWORD_KEY, kw_list);
-			string_list_free(kw_list);
-			g_free(str);
-		}
-	}
-}
-
-void vflist_dnd_init(ViewFile *vf)
-{
-	gtk_drag_source_set(vf->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
-			    dnd_file_drag_types, dnd_file_drag_types_count,
-			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-	gtk_drag_dest_set(vf->listview, GTK_DEST_DEFAULT_ALL,
-			    dnd_file_drag_types, dnd_file_drag_types_count,
-			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-
-	g_signal_connect(G_OBJECT(vf->listview), "drag_data_get",
-			 G_CALLBACK(vflist_dnd_get), vf);
-	g_signal_connect(G_OBJECT(vf->listview), "drag_begin",
-			 G_CALLBACK(vflist_dnd_begin), vf);
-	g_signal_connect(G_OBJECT(vf->listview), "drag_end",
-			 G_CALLBACK(vflist_dnd_end), vf);
-	g_signal_connect(G_OBJECT(vf->listview), "drag_data_received",
-			 G_CALLBACK(vflist_drag_data_received), vf);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * pop-up menu
- *-----------------------------------------------------------------------------
- */
-
-GList *vflist_selection_get_one(ViewFile *vf, FileData *fd)
-{
-	GList *list = g_list_append(NULL, file_data_ref(fd));
-
-	if (fd->sidecar_files)
-		{
-		/* check if the row is expanded */
-		GtkTreeModel *store;
-		GtkTreeIter iter;
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		if (vflist_find_row(vf, fd, &iter) >= 0)
-			{
-			GtkTreePath *tpath;
-
-			tpath = gtk_tree_model_get_path(store, &iter);
-			if (!gtk_tree_view_row_expanded(GTK_TREE_VIEW(vf->listview), tpath))
-				{
-				/* unexpanded - add whole group */
-				GList *work = fd->sidecar_files;
-				while (work)
-					{
-					FileData *sfd = work->data;
-					list = g_list_prepend(list, file_data_ref(sfd));
-					work = work->next;
-					}
-				}
-			gtk_tree_path_free(tpath);
-			}
-		list = g_list_reverse(list);
-		}
-
-	return list;
-}
-
-GList *vflist_pop_menu_file_list(ViewFile *vf)
-{
-	if (!VFLIST(vf)->click_fd) return NULL;
-
-	if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
-		{
-		return vf_selection_get_list(vf);
-		}
-	return vflist_selection_get_one(vf, VFLIST(vf)->click_fd);
-}
-
-
-void vflist_pop_menu_view_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	if (vflist_row_is_selected(vf, VFLIST(vf)->click_fd))
-		{
-		GList *list;
-
-		list = vf_selection_get_list(vf);
-		view_window_new_from_list(list);
-		filelist_free(list);
-		}
-	else
-		{
-		view_window_new(VFLIST(vf)->click_fd);
-		}
-}
-
-void vflist_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-	GList *list;
-
-	list = vf_pop_menu_file_list(vf);
-	if (options->file_ops.enable_in_place_rename &&
-	    list && !list->next && VFLIST(vf)->click_fd)
-		{
-		GtkTreeModel *store;
-		GtkTreeIter iter;
-
-		filelist_free(list);
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		if (vflist_find_row(vf, VFLIST(vf)->click_fd, &iter) >= 0)
-			{
-			GtkTreePath *tpath;
-
-			tpath = gtk_tree_model_get_path(store, &iter);
-			tree_edit_by_path(GTK_TREE_VIEW(vf->listview), tpath,
-					  FILE_VIEW_COLUMN_FORMATTED, VFLIST(vf)->click_fd->name,
-					  vflist_row_rename_cb, vf);
-			gtk_tree_path_free(tpath);
-			}
-		return;
-		}
-
-	file_util_rename(NULL, list, vf->listview);
-}
-
-void vflist_pop_menu_thumbs_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
-	if (vf->layout)
-		{
-		layout_thumb_set(vf->layout, !VFLIST(vf)->thumbs_enabled);
-		}
-	else
-		{
-		vflist_thumb_set(vf, !VFLIST(vf)->thumbs_enabled);
-		}
-}
-
-void vflist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
-	vf_refresh(vf);
-	gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
-}
-
-void vflist_popup_destroy_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-	vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
-	VFLIST(vf)->click_fd = NULL;
-	vf->popup = NULL;
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- * callbacks
- *-----------------------------------------------------------------------------
- */
-
-static gboolean vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data)
-{
-	ViewFile *vf = data;
-	gchar *new_path;
-
-	if (!new || !new[0]) return FALSE;
-
-	new_path = g_build_filename(vf->dir_fd->path, new, NULL);
-
-	if (strchr(new, G_DIR_SEPARATOR) != NULL)
-		{
-		gchar *text = g_strdup_printf(_("Invalid file name:\n%s"), new);
-		file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, vf->listview);
-		g_free(text);
-		}
-	else
-		{
-		gchar *old_path = g_build_filename(vf->dir_fd->path, old, NULL);
-		FileData *fd = file_data_new_group(old_path); /* get the fd from cache */
-		file_util_rename_simple(fd, new_path, vf->listview);
-		file_data_unref(fd);
-		g_free(old_path);
-		}
-
-	g_free(new_path);
-
-	return FALSE;
-}
-
-static void vflist_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreeModel *store;
-	GtkTreeIter iter;
-	GtkTreePath *tpath;
-	gint cw, ch;
-
-	if (vflist_find_row(vf, VFLIST(vf)->click_fd, &iter) < 0) return;
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	tpath = gtk_tree_model_get_path(store, &iter);
-	tree_view_get_cell_clamped(GTK_TREE_VIEW(vf->listview), tpath, FILE_COLUMN_NAME - 1, TRUE, x, y, &cw, &ch);
-	gtk_tree_path_free(tpath);
-	*y += ch;
-	popup_menu_position_clamp(menu, x, y, 0);
-}
-
-gboolean vflist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreePath *tpath;
-
-	if (event->keyval != GDK_KEY_Menu) return FALSE;
-
-	gtk_tree_view_get_cursor(GTK_TREE_VIEW(vf->listview), &tpath, NULL);
-	if (tpath)
-		{
-		GtkTreeModel *store;
-		GtkTreeIter iter;
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &VFLIST(vf)->click_fd, -1);
-		gtk_tree_path_free(tpath);
-		}
-	else
-		{
-		VFLIST(vf)->click_fd = NULL;
-		}
-
-	vf->popup = vf_pop_menu(vf);
-	gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, vflist_menu_position_cb, vf, 0, GDK_CURRENT_TIME);
-
-	return TRUE;
-}
-
-gboolean vflist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreePath *tpath;
-	GtkTreeIter iter;
-	FileData *fd = NULL;
-	GtkTreeViewColumn *column;
-
-	vf->clicked_mark = 0;
-
-	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
-					  &tpath, &column, NULL, NULL))
-		{
-		GtkTreeModel *store;
-		gint col_idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_store_idx"));
-
-		if (bevent->button == MOUSE_BUTTON_LEFT &&
-		    col_idx >= FILE_COLUMN_MARKS && col_idx <= FILE_COLUMN_MARKS_LAST)
-			return FALSE;
-
-		if (col_idx >= FILE_COLUMN_MARKS && col_idx <= FILE_COLUMN_MARKS_LAST)
-			vf->clicked_mark = 1 + (col_idx - FILE_COLUMN_MARKS);
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
-
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
-		gtk_tree_path_free(tpath);
-		}
-
-	VFLIST(vf)->click_fd = fd;
-
-	if (bevent->button == MOUSE_BUTTON_RIGHT)
-		{
-		vf->popup = vf_pop_menu(vf);
-		gtk_menu_popup(GTK_MENU(vf->popup), NULL, NULL, NULL, NULL,
-				bevent->button, bevent->time);
-		return TRUE;
-		}
-
-	if (!fd) return FALSE;
-
-	if (bevent->button == MOUSE_BUTTON_MIDDLE)
-		{
-		if (!vflist_row_is_selected(vf, fd))
-			{
-			vflist_color_set(vf, fd, TRUE);
-			}
-		return TRUE;
-		}
-
-
-	if (bevent->button == MOUSE_BUTTON_LEFT && bevent->type == GDK_BUTTON_PRESS &&
-	    !(bevent->state & GDK_SHIFT_MASK ) &&
-	    !(bevent->state & GDK_CONTROL_MASK ) &&
-	    vflist_row_is_selected(vf, fd))
-		{
-		GtkTreeSelection *selection;
-
-		gtk_widget_grab_focus(widget);
-
-
-		/* returning FALSE and further processing of the event is needed for
-		   correct operation of the expander, to show the sidecar files.
-		   It however resets the selection of multiple files. With this condition
-		   it should work for both cases */
-		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
-		return (gtk_tree_selection_count_selected_rows(selection) > 1);
-		}
-
-	if (bevent->button == MOUSE_BUTTON_LEFT && bevent->type == GDK_2BUTTON_PRESS)
-		{
-		if (vf->layout) layout_image_full_screen_start(vf->layout);
-		}
-
-	return FALSE;
-}
-
-gboolean vflist_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreePath *tpath;
-	GtkTreeIter iter;
-	FileData *fd = NULL;
-
-	if (bevent->button == MOUSE_BUTTON_MIDDLE)
-		{
-		vflist_color_set(vf, VFLIST(vf)->click_fd, FALSE);
-		}
-
-	if (bevent->button != MOUSE_BUTTON_LEFT && bevent->button != MOUSE_BUTTON_MIDDLE)
-		{
-		return TRUE;
-		}
-
-	if ((bevent->x != 0 || bevent->y != 0) &&
-	    gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
-					  &tpath, NULL, NULL, NULL))
-		{
-		GtkTreeModel *store;
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
-		gtk_tree_path_free(tpath);
-		}
-
-	if (bevent->button == MOUSE_BUTTON_MIDDLE)
-		{
-		if (fd && VFLIST(vf)->click_fd == fd)
-			{
-			GtkTreeSelection *selection;
-
-			selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
-			if (vflist_row_is_selected(vf, fd))
-				{
-				gtk_tree_selection_unselect_iter(selection, &iter);
-				}
-			else
-				{
-				gtk_tree_selection_select_iter(selection, &iter);
-				}
-			}
-		return TRUE;
-		}
-
-	if (fd && VFLIST(vf)->click_fd == fd &&
-	    !(bevent->state & GDK_SHIFT_MASK ) &&
-	    !(bevent->state & GDK_CONTROL_MASK ) &&
-	    vflist_row_is_selected(vf, fd))
-		{
-		GtkTreeSelection *selection;
-
-		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
-		gtk_tree_selection_unselect_all(selection);
-		gtk_tree_selection_select_iter(selection, &iter);
-		vflist_move_cursor(vf, &iter);
-		}
-
-	return FALSE;
-}
-
-static void vflist_select_image(ViewFile *vf, FileData *sel_fd)
-{
-	FileData *read_ahead_fd = NULL;
-	gint row;
-	FileData *cur_fd;
-
-	if (!sel_fd) return;
-
-	cur_fd = layout_image_get_fd(vf->layout);
-	if (sel_fd == cur_fd) return; /* no change */
-
-	row = g_list_index(vf->list, sel_fd);
-	// FIXME sidecar data
-
-	if (sel_fd && options->image.enable_read_ahead && row >= 0)
-		{
-		if (row > g_list_index(vf->list, cur_fd) &&
-		    (guint) (row + 1) < vf_count(vf, NULL))
-			{
-			read_ahead_fd = vf_index_get_data(vf, row + 1);
-			}
-		else if (row > 0)
-			{
-			read_ahead_fd = vf_index_get_data(vf, row - 1);
-			}
-		}
-
-	layout_image_set_with_ahead(vf->layout, sel_fd, read_ahead_fd);
-}
-
-static gboolean vflist_select_idle_cb(gpointer data)
-{
-	ViewFile *vf = data;
-
-	if (!vf->layout)
-		{
-		VFLIST(vf)->select_idle_id = 0;
-		return FALSE;
-		}
-
-	vf_send_update(vf);
-
-	if (VFLIST(vf)->select_fd)
-		{
-		vflist_select_image(vf, VFLIST(vf)->select_fd);
-		VFLIST(vf)->select_fd = NULL;
-		}
-
-	VFLIST(vf)->select_idle_id = 0;
-	return FALSE;
-}
-
-static void vflist_select_idle_cancel(ViewFile *vf)
-{
-	if (VFLIST(vf)->select_idle_id)
-		{
-		g_source_remove(VFLIST(vf)->select_idle_id);
-		VFLIST(vf)->select_idle_id = 0;
-		}
-}
-
-static gboolean vflist_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath,
-				 gboolean path_currently_selected, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreeIter iter;
-
-	if (!path_currently_selected &&
-	    gtk_tree_model_get_iter(store, &iter, tpath))
-		{
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &VFLIST(vf)->select_fd, -1);
-		}
-	else
-		{
-		VFLIST(vf)->select_fd = NULL;
-		}
-
-	if (vf->layout &&
-	    !VFLIST(vf)->select_idle_id)
-		{
-		VFLIST(vf)->select_idle_id = g_idle_add(vflist_select_idle_cb, vf);
-		}
-
-	return TRUE;
-}
-
-static void vflist_expand_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data)
-{
-	ViewFile *vf = data;
-	vflist_set_expanded(vf, iter, TRUE);
-}
-
-static void vflist_collapse_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data)
-{
-	ViewFile *vf = data;
-	vflist_set_expanded(vf, iter, FALSE);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * misc
- *-----------------------------------------------------------------------------
- */
-
-
-static gchar* vflist_get_formatted(ViewFile *vf, const gchar *name, const gchar *sidecars, const gchar *size, const gchar *time, gboolean expanded)
- {
-	gboolean multiline = vflist_is_multiline(vf);
-	gchar *text;
-
-	if (multiline)
-		{
-		text = g_strdup_printf("%s %s\n%s\n%s", name, expanded ? "" : sidecars, size, time);
-		}
-	else
-		{
-		text = g_strdup_printf("%s %s", name, expanded ? "" : sidecars);
-		}
-	return text;
-}
-
-static void vflist_set_expanded(ViewFile *vf, GtkTreeIter *iter, gboolean expanded)
-{
-	GtkTreeStore *store;
-	gchar *name;
-	gchar *sidecars;
-	gchar *size;
-	gchar *time;
-	gchar *formatted;
-
-	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
-
-	gtk_tree_model_get(GTK_TREE_MODEL(store), iter,
-					FILE_COLUMN_NAME, &name,
-					FILE_COLUMN_SIDECARS, &sidecars,
-					FILE_COLUMN_SIZE, &size,
-					FILE_COLUMN_DATE, &time,
-					-1);
-	formatted = vflist_get_formatted(vf, name, sidecars, size, time, expanded);
-
-	gtk_tree_store_set(store, iter, FILE_COLUMN_FORMATTED, formatted,
-					FILE_COLUMN_EXPANDED, expanded,
-					-1);
-	g_free(time);
-	g_free(size);
-	g_free(sidecars);
-	g_free(name);
-	g_free(formatted);
-}
-
-static void vflist_setup_iter(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *iter, FileData *fd)
-{
-	gchar *size;
-	gchar *sidecars = NULL;
-	gchar *name;
-	const gchar *time = text_from_time(fd->date);
-	gchar *link = islink(fd->path) ? GQ_LINK_STR : "";
-	const gchar *disabled_grouping;
-	gchar *formatted;
-	gboolean expanded = FALSE;
-
-	if (fd->sidecar_files) /* expanded has no effect on files without sidecars */
-		{
-		gtk_tree_model_get(GTK_TREE_MODEL(store), iter, FILE_COLUMN_EXPANDED, &expanded, -1);
-		}
-
-	sidecars = file_data_sc_list_to_string(fd);
-
-	disabled_grouping = fd->disable_grouping ? _(" [NO GROUPING]") : "";
-	name = g_strdup_printf("%s%s%s", link, fd->name, disabled_grouping);
-	size = text_from_size(fd->size);
-
-	formatted = vflist_get_formatted(vf, name, sidecars, size, time, expanded);
-
-	gtk_tree_store_set(store, iter, FILE_COLUMN_POINTER, fd,
-					FILE_COLUMN_VERSION, fd->version,
-					FILE_COLUMN_THUMB, fd->thumb_pixbuf,
-					FILE_COLUMN_FORMATTED, formatted,
-					FILE_COLUMN_SIDECARS, sidecars,
-					FILE_COLUMN_NAME, name,
-					FILE_COLUMN_SIZE, size,
-					FILE_COLUMN_DATE, time,
-#define STORE_SET_IS_SLOW 1
-#if STORE_SET_IS_SLOW
-/* this is 3x faster on a directory with 20000 files */
-					FILE_COLUMN_MARKS + 0, file_data_get_mark(fd, 0),
-					FILE_COLUMN_MARKS + 1, file_data_get_mark(fd, 1),
-					FILE_COLUMN_MARKS + 2, file_data_get_mark(fd, 2),
-					FILE_COLUMN_MARKS + 3, file_data_get_mark(fd, 3),
-					FILE_COLUMN_MARKS + 4, file_data_get_mark(fd, 4),
-					FILE_COLUMN_MARKS + 5, file_data_get_mark(fd, 5),
-#if FILEDATA_MARKS_SIZE != 6
-#error this needs to be updated
-#endif
-#endif
-					FILE_COLUMN_COLOR, FALSE, -1);
-
-#if !STORE_SET_IS_SLOW
-	{
-	gint i;
-	for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
-		gtk_tree_store_set(store, iter, FILE_COLUMN_MARKS + i, file_data_get_mark(fd, i), -1);
-	}
-#endif
-	g_free(size);
-	g_free(sidecars);
-	g_free(name);
-	g_free(formatted);
-}
-
-static void vflist_setup_iter_recursive(ViewFile *vf, GtkTreeStore *store, GtkTreeIter *parent_iter, GList *list, GList *selected, gboolean force)
-{
-	GList *work;
-	GtkTreeIter iter;
-	gboolean valid;
-	gint num_ordered = 0;
-	gint num_prepended = 0;
-
-	valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(store), &iter, parent_iter);
-
-	work = list;
-	while (work)
-		{
-		gint match;
-		FileData *fd = work->data;
-		gboolean done = FALSE;
-
-		while (!done)
-			{
-			FileData *old_fd = NULL;
-			gint old_version = 0;
-
-			if (valid)
-				{
-				gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
-						   FILE_COLUMN_POINTER, &old_fd,
-						   FILE_COLUMN_VERSION, &old_version,
-						   -1);
-
-				if (fd == old_fd)
-					{
-					match = 0;
-					}
-				else
-					{
-					if (parent_iter)
-						match = filelist_sort_compare_filedata_full(fd, old_fd, SORT_NAME, TRUE); /* always sort sidecars by name */
-					else
-						match = filelist_sort_compare_filedata_full(fd, old_fd, vf->sort_method, vf->sort_ascend);
-
-					if (match == 0) g_warning("multiple fd for the same path");
-					}
-
-				}
-			else
-				{
-				match = -1;
-				}
-
-			if (match < 0)
-				{
-				GtkTreeIter new;
-
-				if (valid)
-					{
-					num_ordered++;
-					gtk_tree_store_insert_before(store, &new, parent_iter, &iter);
-					}
-				else
-					{
-					/*
-					    here should be used gtk_tree_store_append, but this function seems to be O(n)
-					    and it seems to be much faster to add new entries to the beginning and reorder later
-					*/
-					num_prepended++;
-					gtk_tree_store_prepend(store, &new, parent_iter);
-					}
-
-				vflist_setup_iter(vf, store, &new, file_data_ref(fd));
-				vflist_setup_iter_recursive(vf, store, &new, fd->sidecar_files, selected, force);
-
-				if (g_list_find(selected, fd))
-					{
-					/* renamed files - the same fd appears at different position - select it again*/
-					GtkTreeSelection *selection;
-					selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-					gtk_tree_selection_select_iter(selection, &new);
-					}
-
-				done = TRUE;
-				}
-			else if (match > 0)
-				{
-				file_data_unref(old_fd);
-				valid = gtk_tree_store_remove(store, &iter);
-				}
-			else
-				{
-				num_ordered++;
-				if (fd->version != old_version || force)
-					{
-					vflist_setup_iter(vf, store, &iter, fd);
-					vflist_setup_iter_recursive(vf, store, &iter, fd->sidecar_files, selected, force);
-					}
-
-				if (valid) valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
-
-				done = TRUE;
-				}
-			}
-		work = work->next;
-		}
-
-	while (valid)
-		{
-		FileData *old_fd;
-		gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1);
-		file_data_unref(old_fd);
-
-		valid = gtk_tree_store_remove(store, &iter);
-		}
-
-	/* move the prepended entries to the correct position */
-	if (num_prepended)
-		{
-		gint i;
-		gint num_total = num_prepended + num_ordered;
-		gint *new_order = g_malloc(num_total * sizeof(gint));
-
-		for (i = 0; i < num_total; i++)
-			{
-			if (i < num_ordered)
-				new_order[i] = num_prepended + i;
-			else
-				new_order[i] = num_total - 1 - i;
-			}
-		gtk_tree_store_reorder(store, parent_iter, new_order);
-
-		g_free(new_order);
-		}
-}
-
-void vflist_sort_set(ViewFile *vf, SortType type, gboolean ascend)
-{
-	gint i;
-	GHashTable *fd_idx_hash = g_hash_table_new(NULL, NULL);
-	gint *new_order;
-	GtkTreeStore *store;
-	GList *work;
-
-	if (vf->sort_method == type && vf->sort_ascend == ascend) return;
-	if (!vf->list) return;
-
-	work = vf->list;
-	i = 0;
-	while (work)
-		{
-		FileData *fd = work->data;
-		g_hash_table_insert(fd_idx_hash, fd, GINT_TO_POINTER(i));
-		i++;
-		work = work->next;
-		}
-
-	vf->sort_method = type;
-	vf->sort_ascend = ascend;
-
-	vf->list = filelist_sort(vf->list, vf->sort_method, vf->sort_ascend);
-
-	new_order = g_malloc(i * sizeof(gint));
-
-	work = vf->list;
-	i = 0;
-	while (work)
-		{
-		FileData *fd = work->data;
-		new_order[i] = GPOINTER_TO_INT(g_hash_table_lookup(fd_idx_hash, fd));
-		i++;
-		work = work->next;
-		}
-
-	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
-	gtk_tree_store_reorder(store, NULL, new_order);
-
-	g_free(new_order);
-	g_hash_table_destroy(fd_idx_hash);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * thumb updates
- *-----------------------------------------------------------------------------
- */
-
-
-void vflist_thumb_progress_count(GList *list, gint *count, gint *done)
-{
-	GList *work = list;
-	while (work)
-		{
-		FileData *fd = work->data;
-		work = work->next;
-
-		if (fd->thumb_pixbuf) (*done)++;
-
-		if (fd->sidecar_files)
-			{
-			vflist_thumb_progress_count(fd->sidecar_files, count, done);
-			}
-		(*count)++;
-		}
-}
-
-void vflist_set_thumb_fd(ViewFile *vf, FileData *fd)
-{
-	GtkTreeStore *store;
-	GtkTreeIter iter;
-
-	if (!fd || vflist_find_row(vf, fd, &iter) < 0) return;
-
-	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
-	gtk_tree_store_set(store, &iter, FILE_COLUMN_THUMB, fd->thumb_pixbuf, -1);
-}
-
-FileData *vflist_thumb_next_fd(ViewFile *vf)
-{
-	GtkTreePath *tpath;
-	FileData *fd = NULL;
-
-	/* first check the visible files */
-
-	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), 0, 0, &tpath, NULL, NULL, NULL))
-		{
-		GtkTreeModel *store;
-		GtkTreeIter iter;
-		gboolean valid = TRUE;
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_path_free(tpath);
-
-		while (!fd && valid && tree_view_row_get_visibility(GTK_TREE_VIEW(vf->listview), &iter, FALSE) == 0)
-			{
-			FileData *nfd;
-
-			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &nfd, -1);
-
-			if (!nfd->thumb_pixbuf) fd = nfd;
-
-			valid = gtk_tree_model_iter_next(store, &iter);
-			}
-		}
-
-	/* then find first undone */
-
-	if (!fd)
-		{
-		GList *work = vf->list;
-		while (work && !fd)
-			{
-			FileData *fd_p = work->data;
-			if (!fd_p->thumb_pixbuf)
-				fd = fd_p;
-			else
-				{
-				GList *work2 = fd_p->sidecar_files;
-
-				while (work2 && !fd)
-					{
-					fd_p = work2->data;
-					if (!fd_p->thumb_pixbuf) fd = fd_p;
-					work2 = work2->next;
-					}
-				}
-			work = work->next;
-			}
-		}
-
-	return fd;
-}
-
-
-void vflist_thumb_reset_all(ViewFile *vf)
-{
-	GList *work = vf->list;
-	while (work)
-		{
-		FileData *fd = work->data;
-		if (fd->thumb_pixbuf)
-			{
-			g_object_unref(fd->thumb_pixbuf);
-			fd->thumb_pixbuf = NULL;
-			}
-		work = work->next;
-		}
-}
-
-/*
- *-----------------------------------------------------------------------------
- * row stuff
- *-----------------------------------------------------------------------------
- */
-
-FileData *vflist_index_get_data(ViewFile *vf, gint row)
-{
-	return g_list_nth_data(vf->list, row);
-}
-
-gint vflist_index_by_fd(ViewFile *vf, FileData *fd)
-{
-	gint p = 0;
-	GList *work, *work2;
-
-	work = vf->list;
-	while (work)
-		{
-		FileData *list_fd = work->data;
-		if (list_fd == fd) return p;
-
-		work2 = list_fd->sidecar_files;
-		while (work2)
-			{
-			/* FIXME: return the same index also for sidecars
-			   it is sufficient for next/prev navigation but it should be rewritten
-			   without using indexes at all
-			*/
-			FileData *sidecar_fd = work2->data;
-			if (sidecar_fd == fd) return p;
-			work2 = work2->next;
-			}
-
-		work = work->next;
-		p++;
-		}
-
-	return -1;
-}
-
-guint vflist_count(ViewFile *vf, gint64 *bytes)
-{
-	if (bytes)
-		{
-		gint64 b = 0;
-		GList *work;
-
-		work = vf->list;
-		while (work)
-			{
-			FileData *fd = work->data;
-			work = work->next;
-			b += fd->size;
-			}
-
-		*bytes = b;
-		}
-
-	return g_list_length(vf->list);
-}
-
-GList *vflist_get_list(ViewFile *vf)
-{
-	GList *list = NULL;
-	GList *work;
-
-	work = vf->list;
-	while (work)
-		{
-		FileData *fd = work->data;
-		work = work->next;
-
-		list = g_list_prepend(list, file_data_ref(fd));
-		}
-
-	return g_list_reverse(list);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * selections
- *-----------------------------------------------------------------------------
- */
-
-static gboolean vflist_row_is_selected(ViewFile *vf, FileData *fd)
-{
-	GtkTreeModel *store;
-	GtkTreeSelection *selection;
-	GList *slist;
-	GList *work;
-	gboolean found = FALSE;
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	slist = gtk_tree_selection_get_selected_rows(selection, &store);
-	work = slist;
-	while (!found && work)
-		{
-		GtkTreePath *tpath = work->data;
-		FileData *fd_n;
-		GtkTreeIter iter;
-
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1);
-		if (fd_n == fd) found = TRUE;
-		work = work->next;
-		}
-	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
-	g_list_free(slist);
-
-	return found;
-}
-
-gboolean vflist_index_is_selected(ViewFile *vf, gint row)
-{
-	FileData *fd;
-
-	fd = vf_index_get_data(vf, row);
-	return vflist_row_is_selected(vf, fd);
-}
-
-guint vflist_selection_count(ViewFile *vf, gint64 *bytes)
-{
-	GtkTreeModel *store;
-	GtkTreeSelection *selection;
-	GList *slist;
-	guint count;
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	slist = gtk_tree_selection_get_selected_rows(selection, &store);
-
-	if (bytes)
-		{
-		gint64 b = 0;
-		GList *work;
-
-		work = slist;
-		while (work)
-			{
-			GtkTreePath *tpath = work->data;
-			GtkTreeIter iter;
-			FileData *fd;
-
-			gtk_tree_model_get_iter(store, &iter, tpath);
-			gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
-			b += fd->size;
-
-			work = work->next;
-			}
-
-		*bytes = b;
-		}
-
-	count = g_list_length(slist);
-	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
-	g_list_free(slist);
-
-	return count;
-}
-
-GList *vflist_selection_get_list(ViewFile *vf)
-{
-	GtkTreeModel *store;
-	GtkTreeSelection *selection;
-	GList *slist;
-	GList *list = NULL;
-	GList *work;
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	slist = gtk_tree_selection_get_selected_rows(selection, &store);
-	work = slist;
-	while (work)
-		{
-		GtkTreePath *tpath = work->data;
-		FileData *fd;
-		GtkTreeIter iter;
-
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
-
-		list = g_list_prepend(list, file_data_ref(fd));
-
-		if (!fd->parent && !gtk_tree_view_row_expanded(GTK_TREE_VIEW(vf->listview), tpath))
-			{
-			/* unexpanded - add whole group */
-			GList *work2 = fd->sidecar_files;
-			while (work2)
-				{
-				FileData *sfd = work2->data;
-				list = g_list_prepend(list, file_data_ref(sfd));
-				work2 = work2->next;
-				}
-			}
-
-		work = work->next;
-		}
-	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
-	g_list_free(slist);
-
-	return g_list_reverse(list);
-}
-
-GList *vflist_selection_get_list_by_index(ViewFile *vf)
-{
-	GtkTreeModel *store;
-	GtkTreeSelection *selection;
-	GList *slist;
-	GList *list = NULL;
-	GList *work;
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	slist = gtk_tree_selection_get_selected_rows(selection, &store);
-	work = slist;
-	while (work)
-		{
-		GtkTreePath *tpath = work->data;
-		FileData *fd;
-		GtkTreeIter iter;
-
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
-
-		list = g_list_prepend(list, GINT_TO_POINTER(g_list_index(vf->list, fd)));
-
-		work = work->next;
-		}
-	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
-	g_list_free(slist);
-
-	return g_list_reverse(list);
-}
-
-void vflist_select_all(ViewFile *vf)
-{
-	GtkTreeSelection *selection;
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_selection_select_all(selection);
-
-	VFLIST(vf)->select_fd = NULL;
-}
-
-void vflist_select_none(ViewFile *vf)
-{
-	GtkTreeSelection *selection;
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_selection_unselect_all(selection);
-}
-
-static gboolean tree_model_iter_prev(GtkTreeModel *store, GtkTreeIter *iter)
-{
-	GtkTreePath *tpath;
-	gboolean result;
-
-	tpath = gtk_tree_model_get_path(store, iter);
-	result = gtk_tree_path_prev(tpath);
-	if (result)
-		gtk_tree_model_get_iter(store, iter, tpath);
-
-	gtk_tree_path_free(tpath);
-
-	return result;
-}
-
-static gboolean tree_model_get_iter_last(GtkTreeModel *store, GtkTreeIter *iter)
-{
-	if (!gtk_tree_model_get_iter_first(store, iter))
-		return FALSE;
-
-	while (TRUE)
-		{
-		GtkTreeIter next = *iter;
-
-		if (gtk_tree_model_iter_next(store, &next))
-			*iter = next;
-		else
-			break;
-		}
-
-	return TRUE;
-}
-
-void vflist_select_invert(ViewFile *vf)
-{
-	GtkTreeIter iter;
-	GtkTreeSelection *selection;
-	GtkTreeModel *store;
-	gboolean valid;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-
-	/* Backward iteration prevents scrolling to the end of the list,
-	 * it scrolls to the first selected row instead. */
-	valid = tree_model_get_iter_last(store, &iter);
-
-	while (valid)
-		{
-		gboolean selected = gtk_tree_selection_iter_is_selected(selection, &iter);
-
-		if (selected)
-			gtk_tree_selection_unselect_iter(selection, &iter);
-		else
-			gtk_tree_selection_select_iter(selection, &iter);
-
-		valid = tree_model_iter_prev(store, &iter);
-		}
-}
-
-void vflist_select_by_fd(ViewFile *vf, FileData *fd)
-{
-	GtkTreeIter iter;
-
-	if (vflist_find_row(vf, fd, &iter) < 0) return;
-
-	tree_view_row_make_visible(GTK_TREE_VIEW(vf->listview), &iter, TRUE);
-
-	if (!vflist_row_is_selected(vf, fd))
-		{
-		GtkTreeSelection *selection;
-		GtkTreeModel *store;
-		GtkTreePath *tpath;
-
-		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-		gtk_tree_selection_unselect_all(selection);
-		gtk_tree_selection_select_iter(selection, &iter);
-		vflist_move_cursor(vf, &iter);
-
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-		tpath = gtk_tree_model_get_path(store, &iter);
-		gtk_tree_view_set_cursor(GTK_TREE_VIEW(vf->listview), tpath, NULL, FALSE);
-		gtk_tree_path_free(tpath);
-		}
-}
-
-static void vflist_select_closest(ViewFile *vf, FileData *sel_fd)
-{
-	GList *work;
-	FileData *fd = NULL;
-
-	if (sel_fd->parent) sel_fd = sel_fd->parent;
-	work = vf->list;
-
-	while (work)
-		{
-		gint match;
-		fd = work->data;
-		work = work->next;
-
-		match = filelist_sort_compare_filedata_full(fd, sel_fd, vf->sort_method, vf->sort_ascend);
-
-		if (match >= 0) break;
-		}
-
-	if (fd) vflist_select_by_fd(vf, fd);
-
-}
-
-void vflist_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
-{
-	GtkTreeModel *store;
-	GtkTreeIter iter;
-	GtkTreeSelection *selection;
-	gboolean valid;
-	gint n = mark - 1;
-
-	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-
-	valid = gtk_tree_model_get_iter_first(store, &iter);
-	while (valid)
-		{
-		FileData *fd;
-		gboolean mark_val, selected;
-		gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, -1);
-
-		mark_val = file_data_get_mark(fd, n);
-		selected = gtk_tree_selection_iter_is_selected(selection, &iter);
-
-		switch (mode)
-			{
-			case MTS_MODE_SET: selected = mark_val;
-				break;
-			case MTS_MODE_OR: selected = mark_val || selected;
-				break;
-			case MTS_MODE_AND: selected = mark_val && selected;
-				break;
-			case MTS_MODE_MINUS: selected = !mark_val && selected;
-				break;
-			}
-
-		if (selected)
-			gtk_tree_selection_select_iter(selection, &iter);
-		else
-			gtk_tree_selection_unselect_iter(selection, &iter);
-
-		valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
-		}
-}
-
-void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
-{
-	GtkTreeModel *store;
-	GtkTreeSelection *selection;
-	GList *slist;
-	GList *work;
-	gint n = mark - 1;
-
-	g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	slist = gtk_tree_selection_get_selected_rows(selection, &store);
-	work = slist;
-	while (work)
-		{
-		GtkTreePath *tpath = work->data;
-		FileData *fd;
-		GtkTreeIter iter;
-
-		gtk_tree_model_get_iter(store, &iter, tpath);
-		gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
-
-		/* the change has a very limited range and the standard notification would trigger
-		   complete re-read of the directory - try to do only minimal update instead */
-		file_data_unregister_notify_func(vf_notify_cb, vf); /* we don't need the notification */
-
-		switch (mode)
-			{
-			case STM_MODE_SET: file_data_set_mark(fd, n, 1);
-				break;
-			case STM_MODE_RESET: file_data_set_mark(fd, n, 0);
-				break;
-			case STM_MODE_TOGGLE: file_data_set_mark(fd, n, !file_data_get_mark(fd, n));
-				break;
-			}
-
-		if (!file_data_filter_marks(fd, vf_marks_get_filter(vf))) /* file no longer matches the filter -> remove it */
-			{
-			vf_refresh_idle(vf);
-			}
-		else
-			{
-			/* mark functions can have various side effects - update all columns to be sure */
-			vflist_setup_iter(vf, GTK_TREE_STORE(store), &iter, fd);
-			/* mark functions can change sidecars too */
-			vflist_setup_iter_recursive(vf, GTK_TREE_STORE(store), &iter, fd->sidecar_files, NULL, FALSE);
-			}
-
-
-		file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
-
-		work = work->next;
-		}
-	g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
-	g_list_free(slist);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * core (population)
- *-----------------------------------------------------------------------------
- */
-
-static void vflist_listview_set_columns(GtkWidget *listview, gboolean thumb, gboolean multiline)
-{
-	GtkTreeViewColumn *column;
-	GtkCellRenderer *cell;
-	GList *list;
-
-	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_THUMB);
-	if (!column) return;
-
-	gtk_tree_view_column_set_fixed_width(column, options->thumbnails.max_width + 4);
-
-	list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
-	if (!list) return;
-	cell = list->data;
-	g_list_free(list);
-
-	g_object_set(G_OBJECT(cell), "height", options->thumbnails.max_height, NULL);
-	gtk_tree_view_column_set_visible(column, thumb);
-
-	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_FORMATTED);
-	if (!column) return;
-	gtk_tree_view_set_expander_column(GTK_TREE_VIEW(listview), column);
-
-	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_SIZE);
-	if (!column) return;
-	gtk_tree_view_column_set_visible(column, !multiline);
-
-	column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_VIEW_COLUMN_DATE);
-	if (!column) return;
-	gtk_tree_view_column_set_visible(column, !multiline);
-}
-
-static gboolean vflist_is_multiline(ViewFile *vf)
-{
-	return (VFLIST(vf)->thumbs_enabled && options->thumbnails.max_height >= 48);
-}
-
-
-static void vflist_populate_view(ViewFile *vf, gboolean force)
-{
-	GtkTreeStore *store;
-	GList *selected;
-
-	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
-
-	vf_thumb_stop(vf);
-
-	if (!vf->list)
-		{
-		vflist_store_clear(vf, FALSE);
-		vf_send_update(vf);
-		return;
-		}
-
-	vflist_listview_set_columns(vf->listview, VFLIST(vf)->thumbs_enabled, vflist_is_multiline(vf));
-
-	selected = vflist_selection_get_list(vf);
-
-	vflist_setup_iter_recursive(vf, store, NULL, vf->list, selected, force);
-
-	if (selected && vflist_selection_count(vf, NULL) == 0)
-		{
-		/* all selected files disappeared */
-		vflist_select_closest(vf, selected->data);
-		}
-
-	filelist_free(selected);
-
-	vf_send_update(vf);
-	vf_thumb_update(vf);
-}
-
-gboolean vflist_refresh(ViewFile *vf)
-{
-	GList *old_list;
-	gboolean ret = TRUE;
-
-	old_list = vf->list;
-	vf->list = NULL;
-
-	DEBUG_1("%s vflist_refresh: read dir", get_exec_time());
-	if (vf->dir_fd)
-		{
-		file_data_unregister_notify_func(vf_notify_cb, vf); /* we don't need the notification of changes detected by filelist_read */
-
-		ret = filelist_read(vf->dir_fd, &vf->list, NULL);
-
-		if (vf->marks_enabled)
-		        {
-		        // When marks are enabled, lock FileDatas so that we don't end up re-parsing XML
-		        // each time a mark is changed.
-		        file_data_lock_list(vf->list);
-		        }
-	        else
-			{
-			// FIXME: only do this when needed (aka when we just switched from
-			// FIXME: marks-enabled to marks-disabled)
-			file_data_unlock_list(vf->list);
-			}
-
-		vf->list = file_data_filter_marks_list(vf->list, vf_marks_get_filter(vf));
-		file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
-
-		DEBUG_1("%s vflist_refresh: sort", get_exec_time());
-		vf->list = filelist_sort(vf->list, vf->sort_method, vf->sort_ascend);
-		}
-
-	DEBUG_1("%s vflist_refresh: populate view", get_exec_time());
-
-	vflist_populate_view(vf, FALSE);
-
-	DEBUG_1("%s vflist_refresh: free filelist", get_exec_time());
-
-	filelist_free(old_list);
-	DEBUG_1("%s vflist_refresh: done", get_exec_time());
-
-	return ret;
-}
-
-
-
-/* this overrides the low default of a GtkCellRenderer from 100 to CELL_HEIGHT_OVERRIDE, something sane for our purposes */
-
-#define CELL_HEIGHT_OVERRIDE 512
-
-static void cell_renderer_height_override(GtkCellRenderer *renderer)
-{
-	GParamSpec *spec;
-
-	spec = g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(renderer)), "height");
-	if (spec && G_IS_PARAM_SPEC_INT(spec))
-		{
-		GParamSpecInt *spec_int;
-
-		spec_int = G_PARAM_SPEC_INT(spec);
-		if (spec_int->maximum < CELL_HEIGHT_OVERRIDE) spec_int->maximum = CELL_HEIGHT_OVERRIDE;
-		}
-}
-
-static GdkColor *vflist_listview_color_shifted(GtkWidget *widget)
-{
-	static GdkColor color;
-	static GtkWidget *done = NULL;
-
-	if (done != widget)
-		{
-		GtkStyle *style;
-
-		style = gtk_widget_get_style(widget);
-		memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
-		shift_color(&color, -1, 0);
-		done = widget;
-		}
-
-	return &color;
-}
-
-static void vflist_listview_color_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
-				     GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
-{
-	ViewFile *vf = data;
-	gboolean set;
-
-	gtk_tree_model_get(tree_model, iter, FILE_COLUMN_COLOR, &set, -1);
-	g_object_set(G_OBJECT(cell),
-		     "cell-background-gdk", vflist_listview_color_shifted(vf->listview),
-		     "cell-background-set", set, NULL);
-}
-
-static void vflist_listview_add_column(ViewFile *vf, gint n, const gchar *title, gboolean image, gboolean right_justify, gboolean expand)
-{
-	GtkTreeViewColumn *column;
-	GtkCellRenderer *renderer;
-
-	column = gtk_tree_view_column_new();
-	gtk_tree_view_column_set_title(column, title);
-	gtk_tree_view_column_set_min_width(column, 4);
-
-	if (!image)
-		{
-		gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
-		renderer = gtk_cell_renderer_text_new();
-		if (right_justify)
-			{
-			g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
-			}
-		gtk_tree_view_column_pack_start(column, renderer, TRUE);
-		gtk_tree_view_column_add_attribute(column, renderer, "text", n);
-		if (expand)
-			gtk_tree_view_column_set_expand(column, TRUE);
-		}
-	else
-		{
-		gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
-		renderer = gtk_cell_renderer_pixbuf_new();
-		cell_renderer_height_override(renderer);
-		gtk_tree_view_column_pack_start(column, renderer, TRUE);
-		gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", n);
-		}
-
-	gtk_tree_view_column_set_cell_data_func(column, renderer, vflist_listview_color_cb, vf, NULL);
-	g_object_set_data(G_OBJECT(column), "column_store_idx", GUINT_TO_POINTER(n));
-	g_object_set_data(G_OBJECT(renderer), "column_store_idx", GUINT_TO_POINTER(n));
-
-	gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column);
-}
-
-static void vflist_listview_mark_toggled_cb(GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
-{
-	ViewFile *vf = data;
-	GtkTreeStore *store;
-	GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
-	GtkTreeIter iter;
-	FileData *fd;
-	gboolean marked;
-	guint col_idx;
-
-	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview)));
-	if (!path || !gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
-		return;
-
-	col_idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column_store_idx"));
-
-	g_assert(col_idx >= FILE_COLUMN_MARKS && col_idx <= FILE_COLUMN_MARKS_LAST);
-
-	gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, col_idx, &marked, -1);
-	marked = !marked;
-
-	/* the change has a very limited range and the standard notification would trigger
-	   complete re-read of the directory - try to do only minimal update instead */
-	file_data_unregister_notify_func(vf_notify_cb, vf);
-	file_data_set_mark(fd, col_idx - FILE_COLUMN_MARKS, marked);
-	if (!file_data_filter_marks(fd, vf_marks_get_filter(vf))) /* file no longer matches the filter -> remove it */
-		{
-		vf_refresh_idle(vf);
-		}
-	else
-		{
-		/* mark functions can have various side effects - update all columns to be sure */
-		vflist_setup_iter(vf, GTK_TREE_STORE(store), &iter, fd);
-		/* mark functions can change sidecars too */
-		vflist_setup_iter_recursive(vf, GTK_TREE_STORE(store), &iter, fd->sidecar_files, NULL, FALSE);
-		}
-	file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
-
-	gtk_tree_path_free(path);
-}
-
-static void vflist_listview_add_column_toggle(ViewFile *vf, gint n, const gchar *title)
-{
-	GtkTreeViewColumn *column;
-	GtkCellRenderer *renderer;
-
-	renderer = gtk_cell_renderer_toggle_new();
-	column = gtk_tree_view_column_new_with_attributes(title, renderer, "active", n, NULL);
-
-	gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
-	g_object_set_data(G_OBJECT(column), "column_store_idx", GUINT_TO_POINTER(n));
-	g_object_set_data(G_OBJECT(renderer), "column_store_idx", GUINT_TO_POINTER(n));
-
-	gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column);
-	gtk_tree_view_column_set_fixed_width(column, 22);
-	gtk_tree_view_column_set_visible(column, vf->marks_enabled);
-
-
-	g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vflist_listview_mark_toggled_cb), vf);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * base
- *-----------------------------------------------------------------------------
- */
-
-gboolean vflist_set_fd(ViewFile *vf, FileData *dir_fd)
-{
-	gboolean ret;
-	if (!dir_fd) return FALSE;
-	if (vf->dir_fd == dir_fd) return TRUE;
-
-	file_data_unref(vf->dir_fd);
-	vf->dir_fd = file_data_ref(dir_fd);
-
-	/* force complete reload */
-	vflist_store_clear(vf, TRUE);
-
-	filelist_free(vf->list);
-	vf->list = NULL;
-
-	ret = vf_refresh(vf);
-	gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
-	return ret;
-}
-
-void vflist_destroy_cb(GtkWidget *widget, gpointer data)
-{
-	ViewFile *vf = data;
-
-	file_data_unregister_notify_func(vf_notify_cb, vf);
-
-	vflist_select_idle_cancel(vf);
-	vf_refresh_idle_cancel(vf);
-	vf_thumb_stop(vf);
-
-	filelist_free(vf->list);
-}
-
-ViewFile *vflist_new(ViewFile *vf, FileData *dir_fd)
-{
-	GtkTreeStore *store;
-	GtkTreeSelection *selection;
-	GType flist_types[FILE_COLUMN_COUNT];
-	gint i;
-	gint column;
-
-	vf->info = g_new0(ViewFileInfoList, 1);
-
-	flist_types[FILE_COLUMN_POINTER] = G_TYPE_POINTER;
-	flist_types[FILE_COLUMN_VERSION] = G_TYPE_INT;
-	flist_types[FILE_COLUMN_THUMB] = GDK_TYPE_PIXBUF;
-	flist_types[FILE_COLUMN_FORMATTED] = G_TYPE_STRING;
-	flist_types[FILE_COLUMN_NAME] = G_TYPE_STRING;
-	flist_types[FILE_COLUMN_SIDECARS] = G_TYPE_STRING;
-	flist_types[FILE_COLUMN_SIZE] = G_TYPE_STRING;
-	flist_types[FILE_COLUMN_DATE] = G_TYPE_STRING;
-	flist_types[FILE_COLUMN_EXPANDED] = G_TYPE_BOOLEAN;
-	flist_types[FILE_COLUMN_COLOR] = G_TYPE_BOOLEAN;
-	for (i = FILE_COLUMN_MARKS; i < FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE; i++)
-		flist_types[i] = G_TYPE_BOOLEAN;
-
-	store = gtk_tree_store_newv(FILE_COLUMN_COUNT, flist_types);
-
-	vf->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
-	g_object_unref(store);
-
-	g_signal_connect(G_OBJECT(vf->listview), "row-expanded",
-			 G_CALLBACK(vflist_expand_cb), vf);
-
-	g_signal_connect(G_OBJECT(vf->listview), "row-collapsed",
-			 G_CALLBACK(vflist_collapse_cb), vf);
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
-	gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE);
-	gtk_tree_selection_set_select_function(selection, vflist_select_cb, vf, NULL);
-
-	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vf->listview), FALSE);
-	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vf->listview), FALSE);
-
-	column = 0;
-
-	for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
-		{
-		vflist_listview_add_column_toggle(vf, i + FILE_COLUMN_MARKS, "");
-		g_assert(column == FILE_VIEW_COLUMN_MARKS + i);
-		column++;
-		}
-
-	vflist_listview_add_column(vf, FILE_COLUMN_THUMB, "", TRUE, FALSE, FALSE);
-	g_assert(column == FILE_VIEW_COLUMN_THUMB);
-	column++;
-
-	vflist_listview_add_column(vf, FILE_COLUMN_FORMATTED, _("Name"), FALSE, FALSE, TRUE);
-	g_assert(column == FILE_VIEW_COLUMN_FORMATTED);
-	column++;
-
-	vflist_listview_add_column(vf, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE, FALSE);
-	g_assert(column == FILE_VIEW_COLUMN_SIZE);
-	column++;
-
-	vflist_listview_add_column(vf, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE, FALSE);
-	g_assert(column == FILE_VIEW_COLUMN_DATE);
-	column++;
-
-	file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
-	return vf;
-}
-
-void vflist_thumb_set(ViewFile *vf, gboolean enable)
-{
-	if (VFLIST(vf)->thumbs_enabled == enable) return;
-
-	VFLIST(vf)->thumbs_enabled = enable;
-
-	/* vflist_populate_view is better than vf_refresh:
-	   - no need to re-read the directory
-	   - force update because the formatted string has changed
-	*/
-	if (vf->layout)
-		{
-		vflist_populate_view(vf, TRUE);
-		gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
-		}
-}
-
-void vflist_marks_set(ViewFile *vf, gboolean enable)
-{
-	GList *columns, *work;
-
-	columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(vf->listview));
-
-	work = columns;
-	while (work)
-		{
-		GtkTreeViewColumn *column = work->data;
-		gint col_idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_store_idx"));
-		work = work->next;
-
-		if (col_idx <= FILE_COLUMN_MARKS_LAST && col_idx >= FILE_COLUMN_MARKS)
-			gtk_tree_view_column_set_visible(column, enable);
-		}
-
-	if (enable)
-		{
-		// Previously disabled, which means that vf->list is complete
-		file_data_lock_list(vf->list);
-		}
-	else
-		{
-		// Previously enabled, which means that vf->list is incomplete
-		}
-
-	g_list_free(columns);
-}
-
-/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/view_file_list.h	Wed Jan 11 22:00:49 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2004 John Ellis
- * Copyright (C) 2008 - 2016 The Geeqie Team
- *
- * Author: John Ellis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef VIEW_FILE_LIST_H
-#define VIEW_FILE_LIST_H
-
-
-#include "filedata.h"
-
-gboolean vflist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data);
-gboolean vflist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-gboolean vflist_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-
-void vflist_dnd_init(ViewFile *vf);
-
-void vflist_destroy_cb(GtkWidget *widget, gpointer data);
-ViewFile *vflist_new(ViewFile *vf, FileData *dir_fd);
-
-gboolean vflist_set_fd(ViewFile *vf, FileData *dir_fd);
-gboolean vflist_refresh(ViewFile *vf);
-
-void vflist_thumb_set(ViewFile *vf, gboolean enable);
-void vflist_marks_set(ViewFile *vf, gboolean enable);
-void vflist_sort_set(ViewFile *vf, SortType type, gboolean ascend);
-
-GList *vflist_selection_get_one(ViewFile *vf, FileData *fd);
-GList *vflist_pop_menu_file_list(ViewFile *vf);
-void vflist_pop_menu_view_cb(GtkWidget *widget, gpointer data);
-void vflist_pop_menu_rename_cb(GtkWidget *widget, gpointer data);
-void vflist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data);
-void vflist_popup_destroy_cb(GtkWidget *widget, gpointer data);
-void vflist_pop_menu_thumbs_cb(GtkWidget *widget, gpointer data);
-
-FileData *vflist_index_get_data(ViewFile *vf, gint row);
-gint vflist_index_by_fd(ViewFile *vf, FileData *fd);
-guint vflist_count(ViewFile *vf, gint64 *bytes);
-GList *vflist_get_list(ViewFile *vf);
-
-gboolean vflist_index_is_selected(ViewFile *vf, gint row);
-guint vflist_selection_count(ViewFile *vf, gint64 *bytes);
-GList *vflist_selection_get_list(ViewFile *vf);
-GList *vflist_selection_get_list_by_index(ViewFile *vf);
-
-void vflist_select_all(ViewFile *vf);
-void vflist_select_none(ViewFile *vf);
-void vflist_select_invert(ViewFile *vf);
-void vflist_select_by_fd(ViewFile *vf, FileData *fd);
-
-void vflist_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode);
-void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode);
-
-void vflist_color_set(ViewFile *vf, FileData *fd, gboolean color_set);
-
-void vflist_thumb_progress_count(GList *list, gint *count, gint *done);
-void vflist_set_thumb_fd(ViewFile *vf, FileData *fd);
-FileData *vflist_thumb_next_fd(ViewFile *vf);
-void vflist_thumb_reset_all(ViewFile *vf);
-
-#endif
-/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/window.c	Wed Jan 11 22:00:49 2017 +0000
+++ b/src/window.c	Sat Jul 08 10:32:34 2017 +0100
@@ -257,7 +257,7 @@
 		return;
 		}
 
-	path = g_build_filename(GQ_HELPDIR, "README", NULL);
+	path = g_build_filename(GQ_HELPDIR, "README.md", NULL);
 	help_window = help_window_new(_("Help"), "help", path, key);
 	g_free(path);