Blob Blame History Raw
diff -x .bzr -uNr terminator-1.91/.bzrignore python3/.bzrignore
--- terminator-1.91/.bzrignore	1969-12-31 19:00:00.000000000 -0500
+++ python3/.bzrignore	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,7 @@
+*.pyc
+terminatorlib/*.pyc
+.project
+.pydevproject
+terminatorlib/meliae
+_trial_temp
+terminatorc
diff -x .bzr -uNr terminator-1.91/debian/changelog python3/debian/changelog
--- terminator-1.91/debian/changelog	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/changelog	2019-10-21 22:58:46.937140000 -0400
@@ -0,0 +1,368 @@
+terminator (1.92) trusty; urgency=medium
+
+  * Temporary upstream version for python3 port -- 1.92
+
+ -- Roman Kovtyukh <HelloDearGrandma@gmail.com>  Tue, 27 Aug 2019 07:43:00 +0100
+
+terminator (1.91) trusty; urgency=medium
+
+  * New upstream release of 1.91
+
+ -- Steve Boddy <stephen.j.boddy@gmail.com>  Sun, 26 Feb 2017 17:17:00 +0100
+
+terminator (1.90) trusty; urgency=medium
+
+  * Initial GTK3 version packaging
+
+ -- Steve Boddy <stephen.j.boddy@gmail.com>  Thu, 27 Oct 2016 14:06:00 +0100
+
+terminator (0.98~ppa8) wily; urgency=medium
+
+  * No-change upload for wily
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Mon, 21 Sep 2015 22:09:34 -0700
+
+terminator (0.98~ppa7) vivid; urgency=medium
+
+  * No-change upload for vivid
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Mon, 21 Sep 2015 22:08:58 -0700
+
+terminator (0.98~ppa6) trusty; urgency=medium
+
+  * copyright: Change upstream maintainer to Stephen Boddy
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Sun, 20 Sep 2015 14:21:38 -0700
+
+terminator (0.98) precise; urgency=medium
+
+  * New upstream release of 0.98.  Remaining changes:
+    + Add missing dependency on psutil to check for IBus running.
+    + Workaround debian compression of font files.
+    + Add terminator.wrapper to fix blurry/incorrect icons in task switchers.
+  * Sync up with Debian packaging
+    + Update homepage
+    + Revise copyright file
+    + Use canonical URIs for Vcs-* fields
+    + Update regular expression in watch
+    + Bump Standards-Version to 3.9.5 (no changes).
+    + Migrate from cdbs to dh.
+    + Add python-dbus to Depends.
+    + Bump Standards Version to 3.9.4.
+    + Bump debhelper version to 9.
+    + Bump compat level 5 to 9.
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Sat, 19 Sep 2015 18:41:57 -0700
+
+terminator (0.97~ppa3) saucy; urgency=low
+
+  * No-change upload for saucy
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Apr 2013 10:10:49 +0100
+
+terminator (0.97~ppa2) raring; urgency=low
+
+  * No-change upload for raring
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Apr 2013 10:09:08 +0100
+
+terminator (0.97~ppa1) quantal; urgency=low
+
+  * No-change upload for quantal
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Apr 2013 10:08:19 +0100
+
+terminator (0.97) precise; urgency=low
+
+  * New upstream release of 0.97
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Apr 2013 08:54:00 +0100
+
+terminator (0.96ppa6) oneiric; urgency=low
+
+  * No-change rebuild for oneiric PPA
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 28 Sep 2011 09:31:37 +0100
+
+terminator (0.96ppa5) lucid; urgency=low
+
+  * No-change rebuild for lucid PPA
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 28 Sep 2011 09:31:09 +0100
+
+terminator (0.96ppa4) maverick; urgency=low
+
+  * No-change rebuild for maverick PPA
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 28 Sep 2011 09:30:25 +0100
+
+terminator (0.96ppa3) natty; urgency=low
+
+  * Update packaging to include remotinator
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 28 Sep 2011 09:24:02 +0100
+
+terminator (0.96ppa2) natty; urgency=low
+
+  * No-change rebuild for natty
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 23 Sep 2011 22:02:58 +0100
+
+terminator (0.96ppa1) maverick; urgency=low
+
+  * No-change rebuild for maverick
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 23 Sep 2011 22:02:02 +0100
+
+terminator (0.96) lucid; urgency=low
+
+  * New upstream release of 0.96
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 23 Sep 2011 21:44:38 +0100
+
+terminator (0.95ppa2) karmic; urgency=low
+
+  * No-change rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 24 Aug 2010 22:24:59 +0100
+
+terminator (0.95ppa1) maverick; urgency=low
+
+  * No-change rebuild for maverick
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 24 Aug 2010 22:24:20 +0100
+
+terminator (0.95) lucid; urgency=low
+
+  * New upstream release of 0.95
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 24 Aug 2010 21:42:51 +0100
+
+terminator (0.94) lucid; urgency=low
+
+  * New upstream release of 0.94
+
+ -- Chris Jones <cmsj@tenshu.net>  Sun, 04 Jul 2010 18:48:52 +0100
+
+terminator (0.93ppa2) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Thu, 15 Apr 2010 21:16:00 +0100
+
+terminator (0.93ppa1) lucid; urgency=low
+
+  * New upstream release of 0.93
+
+ -- Chris Jones <cmsj@tenshu.net>  Thu, 15 Apr 2010 21:15:18 +0100
+
+terminator (0.92ppa2) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 07 Apr 2010 22:42:51 +0100
+
+terminator (0.92ppa1) lucid; urgency=low
+
+  * Nochange rebuild for lucid
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 07 Apr 2010 22:41:19 +0100
+
+terminator (0.92) lucid; urgency=low
+
+  * New upstream release of 0.92
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 07 Apr 2010 21:36:56 +0100
+
+terminator (0.91ppa4) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 31 Mar 2010 22:09:52 +0100
+
+terminator (0.91ppa3) lucid; urgency=low
+
+  * Drop in one more fix
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 31 Mar 2010 22:09:16 +0100
+
+terminator (0.91ppa2) lucid; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 31 Mar 2010 10:58:13 +0100
+
+terminator (0.91ppa1) lucid; urgency=low
+
+  * New upstream release of 0.91
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 31 Mar 2010 10:55:33 +0100
+
+terminator (0.90ppa3) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Mar 2010 23:56:37 +0100
+
+terminator (0.90ppa2) lucid; urgency=low
+
+  * Fix a stupid release bug
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Mar 2010 23:55:39 +0100
+
+terminator (0.90ppa1) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Mar 2010 23:04:32 +0100
+
+terminator (0.90) lucid; urgency=low
+
+  * Upstream release of 0.90
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 30 Mar 2010 22:51:21 +0100
+
+terminator (0.90-beta3ppa1) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Mon, 15 Mar 2010 20:19:10 +0000
+
+terminator (0.90-beta3) lucid; urgency=low
+
+  * Third upstream pre-release
+
+ -- Chris Jones <cmsj@tenshu.net>  Mon, 15 Mar 2010 20:17:53 +0000
+
+terminator (0.90-beta2ppa1) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 09 Feb 2010 21:46:24 +0000
+
+terminator (0.90-beta2) lucid; urgency=low
+
+  * Second upstream pre-release
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 09 Feb 2010 21:45:12 +0000
+
+terminator (0.90-beta1ppa1) karmic; urgency=low
+
+  * Nochange rebuild for karmic
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 05 Feb 2010 00:23:39 +0000
+
+terminator (0.90-beta1) lucid; urgency=low
+
+  * New upstream pre-release
+
+ -- Chris Jones <cmsj@tenshu.net>  Tue, 05 Jan 2010 09:56:27 +0000
+
+terminator (0.14) karmic; urgency=low
+
+  *  New upstream release
+
+ -- Chris Jones <cmsj@tenshu.net>  Thu, 03 Dec 2009 12:54:57 +0000
+
+terminator (0.13) karmic; urgency=low
+
+  *  New upstream release
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 29 May 2009 21:51:09 +0200
+
+terminator (0.12) intrepid; urgency=low
+
+  *  New upstream release
+
+ -- Chris Jones <cmsj@tenshu.net>  Thu, 15 Jan 2009 00:20:34 +0000
+
+terminator (0.11) intrepid; urgency=low
+
+  *  New upstream release.
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 19 Sep 2008 18:28:54 +0100
+
+terminator (0.10) hardy; urgency=low
+
+  *  New upstream release.
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 27 Aug 2008 01:34:27 +0100
+
+terminator (0.9) hardy; urgency=low
+
+  * New upstream release
+
+ -- Chris Jones <cmsj@tenshu.net>  Mon, 07 Jul 2008 22:56:35 +0100
+
+terminator (0.9~rc3) hardy; urgency=low
+
+  * Soyuz hates me.
+
+ -- Chris Jones <cmsj@tenshu.net>  Sun, 06 Jul 2008 17:13:10 +0100
+
+terminator (0.9~rc2) hardy; urgency=low
+
+  * Second and hopefully last release candidate for Terminator 0.9
+
+ -- Chris Jones <cmsj@tenshu.net>  Sun, 06 Jul 2008 15:40:02 +0100
+
+terminator (0.9~rc1-0) hardy; urgency=low
+
+  * First release candidate for 0.9
+
+ -- Chris Jones <cmsj@tenshu.net>  Thu, 03 Jul 2008 23:19:09 +0100
+
+terminator (0.9~beta4-0) hardy; urgency=low
+
+  *  Improve the previous fix
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 20 Jun 2008 11:28:44 +0100
+
+terminator (0.9~beta3-0) hardy; urgency=low
+
+  * New beta build to fix LP #241563
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 20 Jun 2008 11:03:25 +0100
+
+terminator (0.9~beta2-0) hardy; urgency=low
+
+  * Add some more debugging to spawn_child to track down bug 241563
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 20 Jun 2008 09:39:38 +0100
+
+terminator (0.9~beta1-0.1) hardy; urgency=low
+
+  * New beta snapshot
+
+ -- Chris Jones <cmsj@tenshu.net>  Thu, 19 Jun 2008 11:38:11 +0100
+
+terminator (0.9~beta1-0) hardy; urgency=low
+
+  * New upstream release.
+
+ -- Nicolas Valcárcel <nvalcarcel@ubuntu.com>  Wed, 18 Jun 2008 11:24:22 -0500
+
+terminator (0.8.1-0ubuntu1) hardy; urgency=low
+
+  * New upstream release
+
+ -- Chris Jones <cmsj@tenshu.net>  Sun, 17 Feb 2008 01:45:37 +0000
+
+terminator (0.8-0ubuntu1) hardy; urgency=low
+
+  * New upstream release
+
+ -- Chris Jones <cmsj@tenshu.net>  Thu, 14 Feb 2008 00:19:33 +0000
+
+terminator (0.7.1-0ubuntu1) hardy; urgency=low
+
+  * New upstream release
+
+ -- Chris Jones <cmsj@tenshu.net>  Fri, 08 Feb 2008 00:34:27 +0000
+
+terminator (0.7-0ubuntu1) hardy; urgency=low
+
+  * Packaging work for initial inclusion in Ubuntu. (LP: #180692)
+
+ -- Chris Jones <cmsj@tenshu.net>  Wed, 02 Jan 2008 22:50:18 +0000
+
diff -x .bzr -uNr terminator-1.91/debian/compat python3/debian/compat
--- terminator-1.91/debian/compat	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/compat	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1 @@
+9
diff -x .bzr -uNr terminator-1.91/debian/control python3/debian/control
--- terminator-1.91/debian/control	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/control	2019-10-21 22:58:46.937140000 -0400
@@ -0,0 +1,44 @@
+Source: terminator
+Section: misc
+Priority: optional
+Maintainer: Nicolas Valcárcel Scerpella <nvalcarcel@gmail.com>
+Uploaders: Rudy Godoy Guillén <rudy@debian.org>,
+ Python Applications Packaging Team <python-apps-team@lists.alioth.debian.org>,
+ Julián Moreno Patiño <julian@debian.org>
+Build-Depends: debhelper (>=11~),
+               intltool,
+               dh-python,
+               python3-all,
+               python3-gi-cairo,
+               gir1.2-gtk-3.0,
+               gir1.2-vte-2.91,
+               python3-configobj
+X-Python-Version: >= 3.2
+Standards-Version: 4.1.4
+Vcs-Svn: svn://anonscm.debian.org/python-apps/packages/terminator/trunk/
+Vcs-Browser: http://anonscm.debian.org/viewvc/python-apps/packages/terminator/trunk/
+Homepage: http://gnometerminator.blogspot.com/p/introduction.html
+
+Package: terminator
+Architecture: all
+Depends: gconf2,
+ gir1.2-gconf-2.0,
+ gir1.2-keybinder-3.0,
+ libdbus-1-3,
+ libgtk-3-0,
+ libnotify4,
+ gir1.2-vte-2.91,
+ python3-psutil,
+ python3-gi-cairo,
+ python3-configobj,
+ ${misc:Depends},
+ ${python3:Depends}
+Provides: x-terminal-emulator
+Recommends: xdg-utils
+Description: multiple GNOME terminals in one window
+ Terminator is a little project to produce an efficient way of
+ filling a large area of screen space with terminals.
+ .
+ The user can have multiple terminals in one window and use
+ key bindings to switch between them. See the manpage for
+ details.
diff -x .bzr -uNr terminator-1.91/debian/copyright python3/debian/copyright
--- terminator-1.91/debian/copyright	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/copyright	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,48 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: terminator
+Upstream-Contact: Stephen Boddy <stephen.j.boddy@googlemail.com>
+Source: https://launchpad.net/terminator/+download
+
+Files: *
+Copyright: Chris Jones <cmsj@tenshu.net> and others
+ 2006-2011 Chris Jones <cmsj@tenshu.net>
+ 2008 Thomas Hurst <tom@hur.st>
+ 2010 Julien Nicoulaud <julien.nicoulaud@gmail.com>
+ 2006-2010 Emmanuel Bretelle chantra@debuntu.org
+ 2005-2010 Michael Foord, Mark Andrews, Nicola Larosa
+License: GPL-2.0
+
+Files: po/*
+Copyright: 2008-2011 Rosetta Contributors and Canonical Ltd
+ 2007 Nicolas Valcárcel <nvalcarcel@ubuntu-pe.org>
+ 2008 Cris Grada <krig@tiscali.it>
+ 2010 Vytautas Bačiulis <info@infosoft.lt>
+ 2008 Thomas Meire <blackskad@gmail.com>
+ 2009 Lucian Adrian Grijincu <lucian.grijincu@gmail.com>
+License: GPL-2.0
+
+Files: doc/terminator_config.5
+Copyright: 2008 Nicolas Valcarcel <nvalcarcel@ubuntu.com>
+License: GPL-2.0
+
+Files: debian/*
+Copyright: 2007 Chris Jones <cmsj@tenshu.net>
+ 2008-2012 Nicolas Valcárcel Scerpella <nvalcarcel@gmail.com>
+ 2012-2014 Julián Moreno Patiño <julian@debian.org>
+License: GPL-2.0
+
+License: GPL-2.0
+ 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, version
+ 2 of the License.
+ .
+ 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.
+ .
+ On Debian systems, the full text of the GNU General Public
+ License version 2 can be found in the file
+ `/usr/share/common-licenses/GPL-2'
diff -x .bzr -uNr terminator-1.91/debian/docs python3/debian/docs
--- terminator-1.91/debian/docs	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/docs	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1 @@
+README
diff -x .bzr -uNr terminator-1.91/debian/README.source python3/debian/README.source
--- terminator-1.91/debian/README.source	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/README.source	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,4 @@
+This package uses CDBS simple patchsys. dpkg-source -x does produce source
+ready for building with dpkg-buildpackage. It does not procude source ready
+for editing. To edit or update a patch, use cdbs-edit-patch.
+See cdbs-edit-patch(1) manual page for details.
diff -x .bzr -uNr terminator-1.91/debian/rules python3/debian/rules
--- terminator-1.91/debian/rules	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/rules	2019-10-21 22:58:46.937140000 -0400
@@ -0,0 +1,25 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+#export DH_VERBOSE=1
+
+%:
+	dh $@ --with python3 --buildsystem=pybuild
+
+override_dh_auto_install:
+	python3 setup.py \
+	--without-icon-cache \
+	install \
+	--install-lib=usr/share/terminator/ \
+	--install-data=usr/ \
+	--install-scripts=usr/share/terminator/ \
+	--root=$(CURDIR)/debian/terminator/ \
+	--no-compile -O0
+
+override_dh_installchangelogs:
+	dh_installchangelogs ChangeLog
+
+override_dh_clean:
+	rm -rf build/
+	rm -f data/terminator.desktop
+	rm -f po/.intltool-merge-cache
+	find . -name '*.pyc' -delete
diff -x .bzr -uNr terminator-1.91/debian/source/format python3/debian/source/format
--- terminator-1.91/debian/source/format	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/source/format	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1 @@
+3.0 (quilt)
diff -x .bzr -uNr terminator-1.91/debian/terminator.links python3/debian/terminator.links
--- terminator-1.91/debian/terminator.links	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/terminator.links	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1 @@
+/usr/share/terminator/terminator /usr/bin/terminator
diff -x .bzr -uNr terminator-1.91/debian/terminator.postinst python3/debian/terminator.postinst
--- terminator-1.91/debian/terminator.postinst	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/terminator.postinst	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "configure" ]; then
+        # Ensure the old alternative is removed
+        update-alternatives --remove terminator /usr/bin/terminator || true
+        update-alternatives --remove x-terminal-emulator /usr/bin/terminator
+
+        # Add an alternative for x-terminal-emulator
+        update-alternatives --install /usr/bin/x-terminal-emulator \
+                x-terminal-emulator /usr/bin/terminator.wrapper 50 \
+                --slave /usr/share/man/man1/x-terminal-emulator.1.gz \
+                x-terminal-emulator.1.gz /usr/share/man/man1/terminator.1.gz
+fi
+
+#DEBHELPER#
diff -x .bzr -uNr terminator-1.91/debian/terminator.preinst python3/debian/terminator.preinst
--- terminator-1.91/debian/terminator.preinst	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/terminator.preinst	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = upgrade ] && dpkg --compare-versions "$2" lt 0.13+ds1; then
+	pycentral pkgremove terminator 
+fi
+
+#DEBHELPER#
diff -x .bzr -uNr terminator-1.91/debian/terminator.prerm python3/debian/terminator.prerm
--- terminator-1.91/debian/terminator.prerm	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/terminator.prerm	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = remove ]; then
+        update-alternatives --remove terminator /usr/bin/terminator || true
+        update-alternatives --remove x-terminal-emulator /usr/bin/terminator
+        update-alternatives --remove terminator.wrapper /usr/bin/terminator.wrapper || true
+        update-alternatives --remove x-terminal-emulator /usr/bin/terminator.wrapper
+fi
+
+#DEBHELPER#
diff -x .bzr -uNr terminator-1.91/debian/watch python3/debian/watch
--- terminator-1.91/debian/watch	1969-12-31 19:00:00.000000000 -0500
+++ python3/debian/watch	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,3 @@
+version=3
+opts=dversionmangle=s/\+ds\d+$// \
+http://launchpad.net/terminator/+download .*/terminator[:?_|-](.+)\.tar\.gz
diff -x .bzr -uNr terminator-1.91/doc/terminator.1 python3/doc/terminator.1
--- terminator-1.91/doc/terminator.1	2017-02-26 12:45:29.000000000 -0500
+++ python3/doc/terminator.1	2019-08-19 19:25:15.963479000 -0400
@@ -61,9 +61,6 @@
 .B \-r, \-\-role=ROLE
 Set a custom WM_WINDOW_ROLE property on the window
 .TP
-.B \-c, \-\-classname=CLASSNAME
-Set a custom name (WM_CLASS) property on the window
-.TP
 .B \-l, \-\-layout=LAYOUT
 Start Terminator with a specific layout. The argument here is the name
 of a saved layout.
diff -x .bzr -uNr terminator-1.91/INSTALL python3/INSTALL
--- terminator-1.91/INSTALL	2017-02-26 12:45:29.000000000 -0500
+++ python3/INSTALL	2019-10-21 22:58:46.937140000 -0400
@@ -7,9 +7,9 @@
 If you don't have this option, please make sure you satisfy Terminator's
 dependencies yourself:
 
- * Python 2.5+, 2.6 recommended:
+ * Python 3.2+, 3.7 recommended:
      Debian/Ubuntu: python
-     FreeBSD: lang/python26
+     FreeBSD: lang/python37
 
  * Python VTE bindings:
      Debian/Ubuntu: python-vte
diff -x .bzr -uNr terminator-1.91/MANIFEST.in python3/MANIFEST.in
--- terminator-1.91/MANIFEST.in	1969-12-31 19:00:00.000000000 -0500
+++ python3/MANIFEST.in	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,7 @@
+include AUTHORS ChangeLog COPYING INSTALL README remotinator setup.py terminator terminator.wrapper run_tests
+recursive-include data *
+recursive-include doc *
+recursive-include po *
+recursive-include terminatorlib *.py *.glade *.css
+recursive-include tests *.py
+
diff -x .bzr -uNr terminator-1.91/PKG-INFO python3/PKG-INFO
--- terminator-1.91/PKG-INFO	2017-02-28 17:10:08.000000000 -0500
+++ python3/PKG-INFO	1969-12-31 19:00:00.000000000 -0500
@@ -1,10 +0,0 @@
-Metadata-Version: 1.0
-Name: terminator
-Version: 1.91
-Summary: Terminator, the robot future of terminals
-Home-page: https://gnometerminator.blogspot.com/p/introduction.html
-Author: Chris Jones
-Author-email: cmsj@tenshu.net
-License: GNU GPL v2
-Description: UNKNOWN
-Platform: UNKNOWN
diff -x .bzr -uNr terminator-1.91/po/af.po python3/po/af.po
--- terminator-1.91/po/af.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/af.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: af\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ar.po python3/po/ar.po
--- terminator-1.91/po/ar.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ar.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ar\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ast.po python3/po/ast.po
--- terminator-1.91/po/ast.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ast.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ast\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/az.po python3/po/az.po
--- terminator-1.91/po/az.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/az.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: az\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/be.po python3/po/be.po
--- terminator-1.91/po/be.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/be.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
diff -x .bzr -uNr terminator-1.91/po/bg.po python3/po/bg.po
--- terminator-1.91/po/bg.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/bg.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: bg\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/bn.po python3/po/bn.po
--- terminator-1.91/po/bn.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/bn.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: bn\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/bs.po python3/po/bs.po
--- terminator-1.91/po/bs.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/bs.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: bs\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ca.po python3/po/ca.po
--- terminator-1.91/po/ca.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ca.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ca\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ca@valencia.po python3/po/ca@valencia.po
--- terminator-1.91/po/ca@valencia.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ca@valencia.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ca\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ckb.po python3/po/ckb.po
--- terminator-1.91/po/ckb.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ckb.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/cs.po python3/po/cs.po
--- terminator-1.91/po/cs.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/cs.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,44 +8,44 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2015-08-05 12:32+0000\n"
-"Last-Translator: Zdeněk Kopš <zdenekkops@gmail.com>\n"
+"PO-Revision-Date: 2017-06-09 21:25+0000\n"
+"Last-Translator: Petr Kubánek <petr@kubanek.net>\n"
 "Language-Team: Czech <cs@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: cs\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
 msgid "Open a new window"
-msgstr ""
+msgstr "Otevřít nové okno"
 
 #: ../remotinator.py:39
 msgid "Open a new tab"
-msgstr ""
+msgstr "Otevřít nový panel"
 
 #: ../remotinator.py:40
 msgid "Split the current terminal horizontally"
-msgstr ""
+msgstr "Rozdělit horizontálně"
 
 #: ../remotinator.py:41
 msgid "Split the current terminal vertically"
-msgstr ""
+msgstr "Rozdělit vertikálně"
 
 #: ../remotinator.py:42
 msgid "Get a list of all terminals"
-msgstr ""
+msgstr "Zobrazit seznam všech terminálů"
 
 #: ../remotinator.py:43
 msgid "Get the UUID of a parent window"
-msgstr ""
+msgstr "Získat UUID hlavního okna"
 
 #: ../remotinator.py:44
 msgid "Get the title of a parent window"
-msgstr ""
+msgstr "Získat název hlavního okna"
 
 #: ../remotinator.py:45
 msgid "Get the UUID of a parent tab"
diff -x .bzr -uNr terminator-1.91/po/da.po python3/po/da.po
--- terminator-1.91/po/da.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/da.po	2019-08-19 19:25:15.963479000 -0400
@@ -9,13 +9,13 @@
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
 "PO-Revision-Date: 2015-08-05 12:32+0000\n"
-"Last-Translator: Aputsiaĸ Niels Janussen <aj@isit.gl>\n"
+"Last-Translator: Aputsiak Niels Janussen <aj@isit.gl>\n"
 "Language-Team: Danish <da@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: da\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/de.po python3/po/de.po
--- terminator-1.91/po/de.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/de.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,14 +8,14 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2017-02-21 03:11+0000\n"
-"Last-Translator: vulpecula <Unknown>\n"
+"PO-Revision-Date: 2017-04-14 08:55+0000\n"
+"Last-Translator: Stephan Woidowski <Unknown>\n"
 "Language-Team: German <de@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-22 06:09+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: de\n"
 
 #. Command         uuid req.    Description
@@ -76,7 +76,7 @@
 
 #: ../remotinator.py:66
 msgid "Terminal UUID for when not in env var TERMINATOR_UUID"
-msgstr ""
+msgstr "Terminal UUID falls nicht in ev var TERMINATOR_UUID"
 
 #: ../data/terminator.desktop.in.h:1 ../data/terminator.appdata.xml.in.h:1
 #: ../terminatorlib/plugins/activitywatch.py:84
@@ -1203,6 +1203,11 @@
 "users. If you have any suggestions, please file wishlist bugs! (see left for "
 "the Development link)"
 msgstr ""
+"Das Ziel dieses Projekts ist es, ein nützliches Werkzeug zur Einrichtung von "
+"Terminals zu schaffen. Es ist von Programmen wie gnome-multi-term, "
+"quadkonsole, usw. inspiriert, wo der Hauptfokus auf das Arrangieren von "
+"Terminals in Gittern (Tabs sind die meist verbreitete Methode, die "
+"Terminator ebenfalls unterstützt."
 
 #: ../terminatorlib/preferences.glade.h:153
 msgid "The Manual"
diff -x .bzr -uNr terminator-1.91/po/el.po python3/po/el.po
--- terminator-1.91/po/el.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/el.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: el\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/en_AU.po python3/po/en_AU.po
--- terminator-1.91/po/en_AU.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/en_AU.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,46 +14,46 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
 msgid "Open a new window"
-msgstr ""
+msgstr "Open a new window"
 
 #: ../remotinator.py:39
 msgid "Open a new tab"
-msgstr ""
+msgstr "Open a new tab"
 
 #: ../remotinator.py:40
 msgid "Split the current terminal horizontally"
-msgstr ""
+msgstr "Split the current terminal horizontally"
 
 #: ../remotinator.py:41
 msgid "Split the current terminal vertically"
-msgstr ""
+msgstr "Split the current terminal vertically"
 
 #: ../remotinator.py:42
 msgid "Get a list of all terminals"
-msgstr ""
+msgstr "Get a list of all terminals"
 
 #: ../remotinator.py:43
 msgid "Get the UUID of a parent window"
-msgstr ""
+msgstr "Get the UUID of a parent window"
 
 #: ../remotinator.py:44
 msgid "Get the title of a parent window"
-msgstr ""
+msgstr "Get the title of a parent window"
 
 #: ../remotinator.py:45
 msgid "Get the UUID of a parent tab"
-msgstr ""
+msgstr "Get the UUID of a parent tab"
 
 #: ../remotinator.py:46
 msgid "Get the title of a parent tab"
-msgstr ""
+msgstr "Get the title of a parent tab"
 
 #: ../remotinator.py:63
 #, python-format
@@ -62,16 +62,21 @@
 "\n"
 "%s"
 msgstr ""
+"Run one of the following Terminator DBus commands:\n"
+"\n"
+"%s"
 
 #: ../remotinator.py:64
 msgid ""
 "* These entries require either TERMINATOR_UUID environment var,\n"
 "  or the --uuid option must be used."
 msgstr ""
+"* These entries require either TERMINATOR_UUID environment var,\n"
+"  or the --uuid option must be used."
 
 #: ../remotinator.py:66
 msgid "Terminal UUID for when not in env var TERMINATOR_UUID"
-msgstr ""
+msgstr "Terminal UUID for when not in env var TERMINATOR_UUID"
 
 #: ../data/terminator.desktop.in.h:1 ../data/terminator.appdata.xml.in.h:1
 #: ../terminatorlib/plugins/activitywatch.py:84
@@ -87,7 +92,7 @@
 #: ../data/terminator.appdata.xml.in.h:3
 #: ../terminatorlib/preferences.glade.h:149
 msgid "The robot future of terminals"
-msgstr ""
+msgstr "The robot future of terminals"
 
 #: ../data/terminator.appdata.xml.in.h:4
 msgid ""
@@ -96,6 +101,10 @@
 "terminals in grids (tabs is the most common default method, which Terminator "
 "also supports)."
 msgstr ""
+"A power-user tool for arranging terminals. It is inspired by programs such "
+"as gnome-multi-term, quadkonsole, etc. in that the main focus is arranging "
+"terminals in grids (tabs is the most common default method, which Terminator "
+"also supports)."
 
 #: ../data/terminator.appdata.xml.in.h:5
 msgid ""
@@ -104,50 +113,54 @@
 "out in different directions with useful features for sysadmins and other "
 "users."
 msgstr ""
+"Much of the behavior of Terminator is based on GNOME Terminal, and we are "
+"adding more features from that as time goes by, but we also want to extend "
+"out in different directions with useful features for sysadmins and other "
+"users."
 
 #: ../data/terminator.appdata.xml.in.h:6
 msgid "Some highlights:"
-msgstr ""
+msgstr "Some highlights:"
 
 #: ../data/terminator.appdata.xml.in.h:7
 msgid "Arrange terminals in a grid"
-msgstr ""
+msgstr "Arrange terminals in a grid"
 
 #: ../data/terminator.appdata.xml.in.h:8
 msgid "Tabs"
-msgstr ""
+msgstr "Tabs"
 
 #: ../data/terminator.appdata.xml.in.h:9
 msgid "Drag and drop re-ordering of terminals"
-msgstr ""
+msgstr "Drag and drop re-ordering of terminals"
 
 #: ../data/terminator.appdata.xml.in.h:10
 msgid "Lots of keyboard shortcuts"
-msgstr ""
+msgstr "Lots of keyboard shortcuts"
 
 #: ../data/terminator.appdata.xml.in.h:11
 msgid "Save multiple layouts and profiles via GUI preferences editor"
-msgstr ""
+msgstr "Save multiple layouts and profiles via GUI preferences editor"
 
 #: ../data/terminator.appdata.xml.in.h:12
 msgid "Simultaneous typing to arbitrary groups of terminals"
-msgstr ""
+msgstr "Simultaneous typing to arbitrary groups of terminals"
 
 #: ../data/terminator.appdata.xml.in.h:13
 msgid "And lots more..."
-msgstr ""
+msgstr "And lots more..."
 
 #: ../data/terminator.appdata.xml.in.h:14
 msgid "The main window showing the application in action"
-msgstr ""
+msgstr "The main window showing the application in action"
 
 #: ../data/terminator.appdata.xml.in.h:15
 msgid "Getting a little crazy with the terminals"
-msgstr ""
+msgstr "Getting a little crazy with the terminals"
 
 #: ../data/terminator.appdata.xml.in.h:16
 msgid "The preferences window where you can change the defaults"
-msgstr ""
+msgstr "The preferences window where you can change the defaults"
 
 #: ../terminatorlib/container.py:163
 msgid "Close?"
@@ -323,16 +336,16 @@
 
 #: ../terminatorlib/layoutlauncher.glade.h:1
 msgid "Terminator Layout Launcher"
-msgstr ""
+msgstr "Terminator Layout Launcher"
 
 #: ../terminatorlib/layoutlauncher.glade.h:2
 #: ../terminatorlib/preferences.glade.h:135
 msgid "Layout"
-msgstr ""
+msgstr "Layout"
 
 #: ../terminatorlib/layoutlauncher.glade.h:3
 msgid "Launch"
-msgstr ""
+msgstr "Launch"
 
 #: ../terminatorlib/notebook.py:353
 msgid "tab"
@@ -348,7 +361,7 @@
 
 #: ../terminatorlib/optionparse.py:52
 msgid "Maximize the window"
-msgstr ""
+msgstr "Maximize the window"
 
 #: ../terminatorlib/optionparse.py:54
 msgid "Make the window fill the screen"
@@ -404,11 +417,11 @@
 
 #: ../terminatorlib/optionparse.py:89
 msgid "Launch with the given layout"
-msgstr ""
+msgstr "Launch with the given layout"
 
 #: ../terminatorlib/optionparse.py:91
 msgid "Select a layout from a list"
-msgstr ""
+msgstr "Select a layout from a list"
 
 #: ../terminatorlib/optionparse.py:93
 msgid "Use a different profile as the default"
@@ -440,25 +453,25 @@
 
 #: ../terminatorlib/plugins/activitywatch.py:55
 msgid "Watch for _activity"
-msgstr ""
+msgstr "Watch for _activity"
 
 #: ../terminatorlib/plugins/activitywatch.py:84
 #, python-format
 msgid "Activity in: %s"
-msgstr ""
+msgstr "Activity in: %s"
 
 #: ../terminatorlib/plugins/activitywatch.py:121
 msgid "Watch for _silence"
-msgstr ""
+msgstr "Watch for _silence"
 
 #: ../terminatorlib/plugins/activitywatch.py:163
 #, python-format
 msgid "Silence in: %s"
-msgstr ""
+msgstr "Silence in: %s"
 
 #: ../terminatorlib/plugins/custom_commands.py:61
 msgid "_Custom Commands"
-msgstr ""
+msgstr "_Custom Commands"
 
 #. VERIFY FOR GTK3: is this ever false?
 #: ../terminatorlib/plugins/custom_commands.py:67
@@ -484,22 +497,22 @@
 
 #: ../terminatorlib/plugins/custom_commands.py:152
 msgid "Enabled"
-msgstr ""
+msgstr "Enabled"
 
 #: ../terminatorlib/plugins/custom_commands.py:156
 #: ../terminatorlib/preferences.glade.h:137
 msgid "Name"
-msgstr ""
+msgstr "Name"
 
 #: ../terminatorlib/plugins/custom_commands.py:160
 #: ../terminatorlib/preferences.glade.h:103
 msgid "Command"
-msgstr ""
+msgstr "Command"
 
 #: ../terminatorlib/plugins/custom_commands.py:174
 #: ../terminatorlib/preferences.glade.h:37
 msgid "Top"
-msgstr ""
+msgstr "Top"
 
 #: ../terminatorlib/plugins/custom_commands.py:180
 msgid "Up"
@@ -559,23 +572,23 @@
 
 #: ../terminatorlib/plugins/logger.py:34
 msgid "Start _Logger"
-msgstr ""
+msgstr "Start _Logger"
 
 #: ../terminatorlib/plugins/logger.py:37
 msgid "Stop _Logger"
-msgstr ""
+msgstr "Stop _Logger"
 
 #: ../terminatorlib/plugins/logger.py:67
 msgid "Save Log File As"
-msgstr ""
+msgstr "Save Log File As"
 
 #: ../terminatorlib/plugins/terminalshot.py:29
 msgid "Terminal _screenshot"
-msgstr ""
+msgstr "Terminal _screenshot"
 
 #: ../terminatorlib/plugins/terminalshot.py:38
 msgid "Save image"
-msgstr ""
+msgstr "Save image"
 
 #: ../terminatorlib/preferences.glade.h:1
 msgid "Automatic"
@@ -600,7 +613,7 @@
 
 #: ../terminatorlib/preferences.glade.h:6
 msgid "Group"
-msgstr ""
+msgstr "Group"
 
 #: ../terminatorlib/preferences.glade.h:7
 msgid "None"
@@ -628,7 +641,7 @@
 
 #: ../terminatorlib/preferences.glade.h:13
 msgid "Gray on black"
-msgstr ""
+msgstr "Gray on black"
 
 #: ../terminatorlib/preferences.glade.h:14
 msgid "Green on black"
@@ -648,11 +661,11 @@
 
 #: ../terminatorlib/preferences.glade.h:18
 msgid "Solarized light"
-msgstr ""
+msgstr "Solarized light"
 
 #: ../terminatorlib/preferences.glade.h:19
 msgid "Solarized dark"
-msgstr ""
+msgstr "Solarized dark"
 
 #: ../terminatorlib/preferences.glade.h:20
 msgid "Gruvbox light"
@@ -676,7 +689,7 @@
 
 #: ../terminatorlib/preferences.glade.h:25
 msgid "I-Beam"
-msgstr ""
+msgstr "I-Beam"
 
 #: ../terminatorlib/preferences.glade.h:26
 msgid "GNOME Default"
@@ -704,131 +717,131 @@
 
 #: ../terminatorlib/preferences.glade.h:32
 msgid "Rxvt"
-msgstr ""
+msgstr "Rxvt"
 
 #: ../terminatorlib/preferences.glade.h:33
 msgid "Solarized"
-msgstr ""
+msgstr "Solarized"
 
 #: ../terminatorlib/preferences.glade.h:34
 msgid "On the left side"
-msgstr ""
+msgstr "On the left side"
 
 #: ../terminatorlib/preferences.glade.h:35
 msgid "On the right side"
-msgstr ""
+msgstr "On the right side"
 
 #: ../terminatorlib/preferences.glade.h:36
 msgid "Disabled"
-msgstr ""
+msgstr "Disabled"
 
 #: ../terminatorlib/preferences.glade.h:38
 msgid "Bottom"
-msgstr ""
+msgstr "Bottom"
 
 #: ../terminatorlib/preferences.glade.h:39
 msgid "Left"
-msgstr ""
+msgstr "Left"
 
 #: ../terminatorlib/preferences.glade.h:40
 msgid "Right"
-msgstr ""
+msgstr "Right"
 
 #: ../terminatorlib/preferences.glade.h:41
 msgid "Hidden"
-msgstr ""
+msgstr "Hidden"
 
 #: ../terminatorlib/preferences.glade.h:42
 msgid "Normal"
-msgstr ""
+msgstr "Normal"
 
 #: ../terminatorlib/preferences.glade.h:43
 msgid "Maximised"
-msgstr ""
+msgstr "Maximized"
 
 #: ../terminatorlib/preferences.glade.h:44
 msgid "Fullscreen"
-msgstr ""
+msgstr "Fullscreen"
 
 #: ../terminatorlib/preferences.glade.h:45
 msgid "Terminator Preferences"
-msgstr ""
+msgstr "Terminator Preferences"
 
 #: ../terminatorlib/preferences.glade.h:46
 msgid "<b>Behavior</b>"
-msgstr ""
+msgstr "<b>Behavior</b>"
 
 #: ../terminatorlib/preferences.glade.h:47
 msgid "Window state:"
-msgstr ""
+msgstr "Window state:"
 
 #: ../terminatorlib/preferences.glade.h:48
 msgid "Always on top"
-msgstr ""
+msgstr "Always on top"
 
 #: ../terminatorlib/preferences.glade.h:49
 msgid "Show on all workspaces"
-msgstr ""
+msgstr "Show on all workspaces"
 
 #: ../terminatorlib/preferences.glade.h:50
 msgid "Hide on lose focus"
-msgstr ""
+msgstr "Hide on lose focus"
 
 #: ../terminatorlib/preferences.glade.h:51
 msgid "Hide from taskbar"
-msgstr ""
+msgstr "Hide from taskbar"
 
 #: ../terminatorlib/preferences.glade.h:52
 msgid "Window geometry hints"
-msgstr ""
+msgstr "Window geometry hints"
 
 #: ../terminatorlib/preferences.glade.h:53
 msgid "DBus server"
-msgstr ""
+msgstr "DBus server"
 
 #: ../terminatorlib/preferences.glade.h:54
 msgid "Mouse focus:"
-msgstr ""
+msgstr "Mouse focus:"
 
 #: ../terminatorlib/preferences.glade.h:55
 msgid "Broadcast default:"
-msgstr ""
+msgstr "Broadcast default:"
 
 #: ../terminatorlib/preferences.glade.h:56
 msgid "PuTTY style paste"
-msgstr ""
+msgstr "PuTTY style paste"
 
 #: ../terminatorlib/preferences.glade.h:57
 msgid "Smart copy"
-msgstr ""
+msgstr "Smart copy"
 
 #: ../terminatorlib/preferences.glade.h:58
 msgid "Re-use profiles for new terminals"
-msgstr ""
+msgstr "Re-use profiles for new terminals"
 
 #: ../terminatorlib/preferences.glade.h:59
 msgid "Use custom URL handler"
-msgstr ""
+msgstr "Use custom URL handler"
 
 #: ../terminatorlib/preferences.glade.h:60
 msgid "Custom URL handler:"
-msgstr ""
+msgstr "Custom URL handler:"
 
 #: ../terminatorlib/preferences.glade.h:61
 msgid "<b>Appearance</b>"
-msgstr ""
+msgstr "<b>Appearance</b>"
 
 #: ../terminatorlib/preferences.glade.h:62
 msgid "Window borders"
-msgstr ""
+msgstr "Window borders"
 
 #: ../terminatorlib/preferences.glade.h:63
 msgid "Unfocused terminal font brightness:"
-msgstr ""
+msgstr "Unfocused terminal font brightness:"
 
 #: ../terminatorlib/preferences.glade.h:64
 msgid "Terminal separator size:"
-msgstr ""
+msgstr "Terminal separator size:"
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
@@ -836,19 +849,19 @@
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
-msgstr ""
+msgstr "Tab position:"
 
 #: ../terminatorlib/preferences.glade.h:67
 msgid "Tabs homogeneous"
-msgstr ""
+msgstr "Tabs homogeneous"
 
 #: ../terminatorlib/preferences.glade.h:68
 msgid "Tabs scroll buttons"
-msgstr ""
+msgstr "Tabs scroll buttons"
 
 #: ../terminatorlib/preferences.glade.h:69
 msgid "<b>Terminal Titlebar</b>"
-msgstr ""
+msgstr "<b>Terminal Titlebar</b>"
 
 #: ../terminatorlib/preferences.glade.h:70
 msgid "Font color:"
@@ -860,7 +873,7 @@
 
 #: ../terminatorlib/preferences.glade.h:72
 msgid "Focused"
-msgstr ""
+msgstr "Focused"
 
 #: ../terminatorlib/preferences.glade.h:73
 msgid "Inactive"
@@ -868,7 +881,7 @@
 
 #: ../terminatorlib/preferences.glade.h:74
 msgid "Receiving"
-msgstr ""
+msgstr "Receiving"
 
 #: ../terminatorlib/preferences.glade.h:75
 msgid "Hide size from title"
@@ -1786,3 +1799,6 @@
 #~ msgstr ""
 #~ "This %s has several terminals open. Closing the %s will also close all "
 #~ "terminals within it."
+
+#~ msgid "default"
+#~ msgstr "default"
diff -x .bzr -uNr terminator-1.91/po/en_CA.po python3/po/en_CA.po
--- terminator-1.91/po/en_CA.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/en_CA.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/en_GB.po python3/po/en_GB.po
--- terminator-1.91/po/en_GB.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/en_GB.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,14 +8,14 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2017-01-16 04:13+0000\n"
-"Last-Translator: Stephen Boddy <Unknown>\n"
+"PO-Revision-Date: 2017-08-30 11:23+0000\n"
+"Last-Translator: Marcin Sedlak <fdmarcin@gmail.com>\n"
 "Language-Team: English (United Kingdom) <en_GB@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-31 05:34+0000\n"
+"X-Generator: Launchpad (build 18446)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
@@ -849,7 +849,7 @@
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
-msgstr "Extra Styling (Theme dependant)"
+msgstr "Extra Styling (Theme dependent)"
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
diff -x .bzr -uNr terminator-1.91/po/eo.po python3/po/eo.po
--- terminator-1.91/po/eo.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/eo.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: eo\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/es.po python3/po/es.po
--- terminator-1.91/po/es.po	2017-02-28 17:07:22.000000000 -0500
+++ python3/po/es.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,14 +8,14 @@
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2017-02-25 12:49+0000\n"
-"Last-Translator: Carlos Duque Guasch <Unknown>\n"
+"PO-Revision-Date: 2017-03-08 17:35+0000\n"
+"Last-Translator: dmouse <dmousex@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-27 05:52+0000\n"
-"X-Generator: Launchpad (build 18328)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
@@ -862,11 +862,11 @@
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
-msgstr ""
+msgstr "Estilizado extra (depende del tema)"
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
-msgstr "Posición pestaña"
+msgstr "Posición de pestaña:"
 
 #: ../terminatorlib/preferences.glade.h:67
 msgid "Tabs homogeneous"
diff -x .bzr -uNr terminator-1.91/po/et.po python3/po/et.po
--- terminator-1.91/po/et.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/et.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: et\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/eu.po python3/po/eu.po
--- terminator-1.91/po/eu.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/eu.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: eu\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/fa.po python3/po/fa.po
--- terminator-1.91/po/fa.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/fa.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: fa\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/fi.po python3/po/fi.po
--- terminator-1.91/po/fi.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/fi.po	2019-08-19 19:25:15.963479000 -0400
@@ -16,8 +16,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: fi\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/fo.po python3/po/fo.po
--- terminator-1.91/po/fo.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/fo.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: fo\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/fr.po python3/po/fr.po
--- terminator-1.91/po/fr.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/fr.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-22 06:09+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: fr\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/fy.po python3/po/fy.po
--- terminator-1.91/po/fy.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/fy.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ga.po python3/po/ga.po
--- terminator-1.91/po/ga.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ga.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ga\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/gl.po python3/po/gl.po
--- terminator-1.91/po/gl.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/gl.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: gl\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/he.po python3/po/he.po
--- terminator-1.91/po/he.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/he.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: he\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/hi.po python3/po/hi.po
--- terminator-1.91/po/hi.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/hi.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: hi\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/hr.po python3/po/hr.po
--- terminator-1.91/po/hr.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/hr.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: hr\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/hu.po python3/po/hu.po
--- terminator-1.91/po/hu.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/hu.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: hu\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/hy.po python3/po/hy.po
--- terminator-1.91/po/hy.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/hy.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: hy\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ia.po python3/po/ia.po
--- terminator-1.91/po/ia.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ia.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
diff -x .bzr -uNr terminator-1.91/po/id.po python3/po/id.po
--- terminator-1.91/po/id.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/id.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: id\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/is.po python3/po/is.po
--- terminator-1.91/po/is.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/is.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: is\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/it.po python3/po/it.po
--- terminator-1.91/po/it.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/it.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ro\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ja.po python3/po/ja.po
--- terminator-1.91/po/ja.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ja.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ja\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/jv.po python3/po/jv.po
--- terminator-1.91/po/jv.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/jv.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: jv\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ka.po python3/po/ka.po
--- terminator-1.91/po/ka.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ka.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ka\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/kk.po python3/po/kk.po
--- terminator-1.91/po/kk.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/kk.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: kk\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ko.po python3/po/ko.po
--- terminator-1.91/po/ko.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ko.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,14 +8,14 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2015-08-05 12:40+0000\n"
-"Last-Translator: Seunghyo Chun <seunghyo.chun@gmail.com>\n"
+"PO-Revision-Date: 2017-04-18 08:11+0000\n"
+"Last-Translator: Seonghun Lim <Unknown>\n"
 "Language-Team: Korean <ko@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ko\n"
 
 #. Command         uuid req.    Description
@@ -87,7 +87,7 @@
 #: ../data/terminator.appdata.xml.in.h:3
 #: ../terminatorlib/preferences.glade.h:149
 msgid "The robot future of terminals"
-msgstr ""
+msgstr "터미널이 지배하는 미래 세상"
 
 #: ../data/terminator.appdata.xml.in.h:4
 msgid ""
@@ -111,7 +111,7 @@
 
 #: ../data/terminator.appdata.xml.in.h:7
 msgid "Arrange terminals in a grid"
-msgstr ""
+msgstr "터미널들을 격자처럼 배열"
 
 #: ../data/terminator.appdata.xml.in.h:8
 msgid "Tabs"
@@ -119,19 +119,19 @@
 
 #: ../data/terminator.appdata.xml.in.h:9
 msgid "Drag and drop re-ordering of terminals"
-msgstr ""
+msgstr "끌어놓기로 터미널 순서 조정"
 
 #: ../data/terminator.appdata.xml.in.h:10
 msgid "Lots of keyboard shortcuts"
-msgstr ""
+msgstr "수많은 키보드 바로가기"
 
 #: ../data/terminator.appdata.xml.in.h:11
 msgid "Save multiple layouts and profiles via GUI preferences editor"
-msgstr ""
+msgstr "GUI 설정 편집기로 여러 터미널 배치와 프로파일 저장"
 
 #: ../data/terminator.appdata.xml.in.h:12
 msgid "Simultaneous typing to arbitrary groups of terminals"
-msgstr ""
+msgstr "원하는 터미널들에 동시 키 입력"
 
 #: ../data/terminator.appdata.xml.in.h:13
 msgid "And lots more..."
@@ -165,13 +165,13 @@
 msgid ""
 "This window has several terminals open. Closing the window will also close "
 "all terminals within it."
-msgstr ""
+msgstr "이 창에는 터미널이 여러 개 열려 있습니다. 창을 닫으면 그 안의 모든 터미널이 닫히게 됩니다."
 
 #: ../terminatorlib/container.py:178
 msgid ""
 "This tab has several terminals open. Closing the tab will also close all "
 "terminals within it."
-msgstr ""
+msgstr "이 탭에는 터미널이 여러 개 열려 있습니다. 탭을 닫으면 그 안의 모든 터미널이 닫히게 됩니다."
 
 #: ../terminatorlib/container.py:198
 msgid "Do not show this message next time"
@@ -438,21 +438,21 @@
 
 #: ../terminatorlib/plugins/activitywatch.py:55
 msgid "Watch for _activity"
-msgstr ""
+msgstr "활동 감시(_A)"
 
 #: ../terminatorlib/plugins/activitywatch.py:84
 #, python-format
 msgid "Activity in: %s"
-msgstr ""
+msgstr "활동 탐지: %s"
 
 #: ../terminatorlib/plugins/activitywatch.py:121
 msgid "Watch for _silence"
-msgstr ""
+msgstr "정지 감시(_S)"
 
 #: ../terminatorlib/plugins/activitywatch.py:163
 #, python-format
 msgid "Silence in: %s"
-msgstr ""
+msgstr "정지 탐지: %s"
 
 #: ../terminatorlib/plugins/custom_commands.py:61
 msgid "_Custom Commands"
@@ -473,16 +473,16 @@
 #: ../terminatorlib/plugins/logger.py:22
 #: ../terminatorlib/plugins/terminalshot.py:21
 msgid "_Cancel"
-msgstr ""
+msgstr "취소(_C)"
 
 #: ../terminatorlib/plugins/custom_commands.py:125
 #: ../terminatorlib/plugins/custom_commands.py:274
 msgid "_OK"
-msgstr ""
+msgstr "확인(_O)"
 
 #: ../terminatorlib/plugins/custom_commands.py:152
 msgid "Enabled"
-msgstr "사용함"
+msgstr "사용"
 
 #: ../terminatorlib/plugins/custom_commands.py:156
 #: ../terminatorlib/preferences.glade.h:137
@@ -492,36 +492,36 @@
 #: ../terminatorlib/plugins/custom_commands.py:160
 #: ../terminatorlib/preferences.glade.h:103
 msgid "Command"
-msgstr "명령어"
+msgstr "명령"
 
 #: ../terminatorlib/plugins/custom_commands.py:174
 #: ../terminatorlib/preferences.glade.h:37
 msgid "Top"
-msgstr "상단"
+msgstr "처음으로"
 
 #: ../terminatorlib/plugins/custom_commands.py:180
 msgid "Up"
-msgstr ""
+msgstr "위로"
 
 #: ../terminatorlib/plugins/custom_commands.py:186
 msgid "Down"
-msgstr ""
+msgstr "아래로"
 
 #: ../terminatorlib/plugins/custom_commands.py:192
 msgid "Last"
-msgstr ""
+msgstr "끝으로"
 
 #: ../terminatorlib/plugins/custom_commands.py:198
 msgid "New"
-msgstr ""
+msgstr "신규"
 
 #: ../terminatorlib/plugins/custom_commands.py:203
 msgid "Edit"
-msgstr ""
+msgstr "편집"
 
 #: ../terminatorlib/plugins/custom_commands.py:209
 msgid "Delete"
-msgstr ""
+msgstr "삭제"
 
 #: ../terminatorlib/plugins/custom_commands.py:269
 msgid "New Command"
@@ -553,11 +553,11 @@
 #: ../terminatorlib/plugins/logger.py:23
 #: ../terminatorlib/plugins/terminalshot.py:22
 msgid "_Save"
-msgstr ""
+msgstr "저장(_S)"
 
 #: ../terminatorlib/plugins/logger.py:34
 msgid "Start _Logger"
-msgstr "로거 시자"
+msgstr "로거 시작"
 
 #: ../terminatorlib/plugins/logger.py:37
 msgid "Stop _Logger"
@@ -569,7 +569,7 @@
 
 #: ../terminatorlib/plugins/terminalshot.py:29
 msgid "Terminal _screenshot"
-msgstr ""
+msgstr "터미널 스크린샷(_S)"
 
 #: ../terminatorlib/plugins/terminalshot.py:38
 msgid "Save image"
@@ -581,7 +581,7 @@
 
 #: ../terminatorlib/preferences.glade.h:2
 msgid "Control-H"
-msgstr "<Control-H>"
+msgstr "Control-H"
 
 #: ../terminatorlib/preferences.glade.h:3
 msgid "ASCII DEL"
@@ -654,11 +654,11 @@
 
 #: ../terminatorlib/preferences.glade.h:20
 msgid "Gruvbox light"
-msgstr ""
+msgstr "그루브박스 밝음"
 
 #: ../terminatorlib/preferences.glade.h:21
 msgid "Gruvbox dark"
-msgstr ""
+msgstr "그루브박스 어두움"
 
 #: ../terminatorlib/preferences.glade.h:22
 msgid "Custom"
@@ -666,7 +666,7 @@
 
 #: ../terminatorlib/preferences.glade.h:23
 msgid "Block"
-msgstr "차단"
+msgstr "네모"
 
 #: ../terminatorlib/preferences.glade.h:24
 msgid "Underline"
@@ -738,7 +738,7 @@
 
 #: ../terminatorlib/preferences.glade.h:42
 msgid "Normal"
-msgstr "표준"
+msgstr "기본"
 
 #: ../terminatorlib/preferences.glade.h:43
 msgid "Maximised"
@@ -754,11 +754,11 @@
 
 #: ../terminatorlib/preferences.glade.h:46
 msgid "<b>Behavior</b>"
-msgstr "<b>동작</b>"
+msgstr "<b>동작 방식</b>"
 
 #: ../terminatorlib/preferences.glade.h:47
 msgid "Window state:"
-msgstr ""
+msgstr "창 상태:"
 
 #: ../terminatorlib/preferences.glade.h:48
 msgid "Always on top"
@@ -766,7 +766,7 @@
 
 #: ../terminatorlib/preferences.glade.h:49
 msgid "Show on all workspaces"
-msgstr "모든 워크스페이스 보기"
+msgstr "모든 작업 공간 보기"
 
 #: ../terminatorlib/preferences.glade.h:50
 msgid "Hide on lose focus"
@@ -786,19 +786,19 @@
 
 #: ../terminatorlib/preferences.glade.h:54
 msgid "Mouse focus:"
-msgstr ""
+msgstr "마우스 활성화:"
 
 #: ../terminatorlib/preferences.glade.h:55
 msgid "Broadcast default:"
-msgstr ""
+msgstr "동시 입력 기본:"
 
 #: ../terminatorlib/preferences.glade.h:56
 msgid "PuTTY style paste"
-msgstr ""
+msgstr "PuTTY 방식 붙여넣기"
 
 #: ../terminatorlib/preferences.glade.h:57
 msgid "Smart copy"
-msgstr ""
+msgstr "똑똑한 복사"
 
 #: ../terminatorlib/preferences.glade.h:58
 msgid "Re-use profiles for new terminals"
@@ -810,11 +810,11 @@
 
 #: ../terminatorlib/preferences.glade.h:60
 msgid "Custom URL handler:"
-msgstr ""
+msgstr "사용자 URL 연결 프로그램:"
 
 #: ../terminatorlib/preferences.glade.h:61
 msgid "<b>Appearance</b>"
-msgstr ""
+msgstr "<b>모양</b>"
 
 #: ../terminatorlib/preferences.glade.h:62
 msgid "Window borders"
@@ -822,59 +822,59 @@
 
 #: ../terminatorlib/preferences.glade.h:63
 msgid "Unfocused terminal font brightness:"
-msgstr ""
+msgstr "비활성 터미널 폰트 밝기:"
 
 #: ../terminatorlib/preferences.glade.h:64
 msgid "Terminal separator size:"
-msgstr ""
+msgstr "터미널 구분자 두께:"
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
-msgstr ""
+msgstr "추가 스타일 적용 (테마에 따라 다름)"
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
-msgstr ""
+msgstr "탭 위치:"
 
 #: ../terminatorlib/preferences.glade.h:67
 msgid "Tabs homogeneous"
-msgstr ""
+msgstr "탭들을 균일하게"
 
 #: ../terminatorlib/preferences.glade.h:68
 msgid "Tabs scroll buttons"
-msgstr ""
+msgstr "탭 스크롤 버튼"
 
 #: ../terminatorlib/preferences.glade.h:69
 msgid "<b>Terminal Titlebar</b>"
-msgstr ""
+msgstr "<b>터미널 제목</b>"
 
 #: ../terminatorlib/preferences.glade.h:70
 msgid "Font color:"
-msgstr ""
+msgstr "글자색:"
 
 #: ../terminatorlib/preferences.glade.h:71
 msgid "Background:"
-msgstr ""
+msgstr "배경:"
 
 #: ../terminatorlib/preferences.glade.h:72
 msgid "Focused"
-msgstr ""
+msgstr "활성"
 
 #: ../terminatorlib/preferences.glade.h:73
 msgid "Inactive"
-msgstr ""
+msgstr "비활성"
 
 #: ../terminatorlib/preferences.glade.h:74
 msgid "Receiving"
-msgstr ""
+msgstr "수신 중"
 
 #: ../terminatorlib/preferences.glade.h:75
 msgid "Hide size from title"
-msgstr ""
+msgstr "제목에 크기 감추기"
 
 #: ../terminatorlib/preferences.glade.h:76
 msgid "_Use the system font"
-msgstr ""
+msgstr "시스템 글꼴 사용"
 
 #: ../terminatorlib/preferences.glade.h:77
 msgid "_Font:"
@@ -882,7 +882,7 @@
 
 #: ../terminatorlib/preferences.glade.h:78
 msgid "Choose A Titlebar Font"
-msgstr ""
+msgstr "제목 글꼴 선택"
 
 #: ../terminatorlib/preferences.glade.h:79
 msgid "Global"
@@ -906,7 +906,7 @@
 
 #: ../terminatorlib/preferences.glade.h:84
 msgid "Show titlebar"
-msgstr "타이틀바 보이기"
+msgstr "제목 보이기"
 
 #: ../terminatorlib/preferences.glade.h:85
 msgid "Copy on selection"
@@ -914,7 +914,7 @@
 
 #: ../terminatorlib/preferences.glade.h:86
 msgid "Rewrap on resize"
-msgstr ""
+msgstr "크기 변경시 줄바꿈 조정"
 
 #: ../terminatorlib/preferences.glade.h:87
 msgid "Select-by-_word characters:"
@@ -926,19 +926,19 @@
 
 #: ../terminatorlib/preferences.glade.h:89
 msgid "_Shape:"
-msgstr ""
+msgstr "모양:"
 
 #: ../terminatorlib/preferences.glade.h:90
 msgid "Color:"
-msgstr ""
+msgstr "색상:"
 
 #: ../terminatorlib/preferences.glade.h:91
 msgid "Blink"
-msgstr ""
+msgstr "깜박이기"
 
 #: ../terminatorlib/preferences.glade.h:92
 msgid "Foreground"
-msgstr ""
+msgstr "글자색"
 
 #: ../terminatorlib/preferences.glade.h:93
 msgid "<b>Terminal bell</b>"
@@ -946,11 +946,11 @@
 
 #: ../terminatorlib/preferences.glade.h:94
 msgid "Titlebar icon"
-msgstr "타이틀바 아이콘"
+msgstr "제목 아이콘"
 
 #: ../terminatorlib/preferences.glade.h:95
 msgid "Visual flash"
-msgstr "화면 깜빡 거림"
+msgstr "화면 깜빡거림"
 
 #: ../terminatorlib/preferences.glade.h:96
 msgid "Audible beep"
@@ -958,7 +958,7 @@
 
 #: ../terminatorlib/preferences.glade.h:97
 msgid "Window list flash"
-msgstr "창 목록 반짝임"
+msgstr "창 목록 깜빡거림"
 
 #: ../terminatorlib/preferences.glade.h:98
 msgid "General"
@@ -990,7 +990,7 @@
 
 #: ../terminatorlib/preferences.glade.h:106
 msgid "Built-in sche_mes:"
-msgstr "내장 색상(_M):"
+msgstr "내장 색상표(_M):"
 
 #: ../terminatorlib/preferences.glade.h:107
 msgid "_Text color:"
@@ -1030,11 +1030,11 @@
 
 #: ../terminatorlib/preferences.glade.h:116
 msgid "_Transparent background"
-msgstr "투명한 배경 효과"
+msgstr "투명 배경"
 
 #: ../terminatorlib/preferences.glade.h:117
 msgid "S_hade transparent background:"
-msgstr ""
+msgstr "투명 배경에 그림자:"
 
 #: ../terminatorlib/preferences.glade.h:118
 msgid "<small><i>None</i></small>"
@@ -1046,7 +1046,7 @@
 
 #: ../terminatorlib/preferences.glade.h:120
 msgid "Background"
-msgstr "배경색"
+msgstr "배경"
 
 #: ../terminatorlib/preferences.glade.h:121
 msgid "_Scrollbar is:"
@@ -1096,7 +1096,7 @@
 
 #: ../terminatorlib/preferences.glade.h:131
 msgid "Encoding:"
-msgstr ""
+msgstr "인코딩:"
 
 #: ../terminatorlib/preferences.glade.h:132
 msgid "_Reset Compatibility Options to Defaults"
@@ -1113,19 +1113,19 @@
 
 #: ../terminatorlib/preferences.glade.h:136
 msgid "Type"
-msgstr ""
+msgstr "유형"
 
 #: ../terminatorlib/preferences.glade.h:138
 msgid "Profile:"
-msgstr ""
+msgstr "프로파일:"
 
 #: ../terminatorlib/preferences.glade.h:139
 msgid "Custom command:"
-msgstr ""
+msgstr "사용자 지정 명령:"
 
 #: ../terminatorlib/preferences.glade.h:140
 msgid "Working directory:"
-msgstr ""
+msgstr "작업 디렉터리:"
 
 #: ../terminatorlib/preferences.glade.h:141
 msgid "Layouts"
@@ -1133,11 +1133,11 @@
 
 #: ../terminatorlib/preferences.glade.h:142
 msgid "Action"
-msgstr ""
+msgstr "동작"
 
 #: ../terminatorlib/preferences.glade.h:143
 msgid "Keybinding"
-msgstr ""
+msgstr "단축키"
 
 #: ../terminatorlib/preferences.glade.h:144
 msgid "Keybindings"
@@ -1145,7 +1145,7 @@
 
 #: ../terminatorlib/preferences.glade.h:145
 msgid "Plugin"
-msgstr ""
+msgstr "플러그인"
 
 #: ../terminatorlib/preferences.glade.h:146
 msgid "This plugin has no configuration options"
@@ -1171,7 +1171,7 @@
 
 #: ../terminatorlib/preferences.glade.h:153
 msgid "The Manual"
-msgstr ""
+msgstr "설명서"
 
 #: ../terminatorlib/preferences.glade.h:154
 msgid ""
@@ -1183,254 +1183,260 @@
 "<a href=\"https://bugs.launchpad.net/terminator\">Bugs / Enhancements</a>\n"
 "<a href=\"https://translations.launchpad.net/terminator\">Translations</a>"
 msgstr ""
+"<a "
+"href=\"http://gnometerminator.blogspot.com/p/introduction.html\">홈페이지</a>\n"
+"<a href=\"http://gnometerminator.blogspot.com/\">블로그 / 뉴스</a>\n"
+"<a href=\"https://launchpad.net/terminator\">개발</a>\n"
+"<a href=\"https://bugs.launchpad.net/terminator\">버그 / 개선 사항</a>\n"
+"<a href=\"https://translations.launchpad.net/terminator\">번역</a>"
 
 #: ../terminatorlib/preferences.glade.h:159
 msgid "About"
-msgstr ""
+msgstr "소개"
 
 #: ../terminatorlib/prefseditor.py:96
 msgid "Increase font size"
-msgstr ""
+msgstr "글꼴 크기 키우기"
 
 #: ../terminatorlib/prefseditor.py:97
 msgid "Decrease font size"
-msgstr ""
+msgstr "글꼴 크기 줄이기"
 
 #: ../terminatorlib/prefseditor.py:98
 msgid "Restore original font size"
-msgstr ""
+msgstr "원래 글꼴 크기로 돌아가기"
 
 #: ../terminatorlib/prefseditor.py:99
 msgid "Create a new tab"
-msgstr ""
+msgstr "새 탭 열기"
 
 #: ../terminatorlib/prefseditor.py:100 ../terminatorlib/prefseditor.py:102
 msgid "Focus the next terminal"
-msgstr ""
+msgstr "다음 터미널로"
 
 #: ../terminatorlib/prefseditor.py:101 ../terminatorlib/prefseditor.py:103
 msgid "Focus the previous terminal"
-msgstr ""
+msgstr "이전 터미널로"
 
 #: ../terminatorlib/prefseditor.py:104
 msgid "Focus the terminal above"
-msgstr ""
+msgstr "위쪽 터미널로"
 
 #: ../terminatorlib/prefseditor.py:105
 msgid "Focus the terminal below"
-msgstr ""
+msgstr "아래쪽 터미널로"
 
 #: ../terminatorlib/prefseditor.py:106
 msgid "Focus the terminal left"
-msgstr ""
+msgstr "왼쪽 터미널로"
 
 #: ../terminatorlib/prefseditor.py:107
 msgid "Focus the terminal right"
-msgstr ""
+msgstr "오른쪽 터미널로"
 
 #: ../terminatorlib/prefseditor.py:108
 msgid "Rotate terminals clockwise"
-msgstr ""
+msgstr "터미널들을 시계 방향으로 회전"
 
 #: ../terminatorlib/prefseditor.py:109
 msgid "Rotate terminals counter-clockwise"
-msgstr ""
+msgstr "터미널들을 시계 반대 방향으로 회전"
 
 #: ../terminatorlib/prefseditor.py:110
 msgid "Split horizontally"
-msgstr ""
+msgstr "상하로 나누기"
 
 #: ../terminatorlib/prefseditor.py:111
 msgid "Split vertically"
-msgstr ""
+msgstr "좌우로 나누기"
 
 #: ../terminatorlib/prefseditor.py:112
 msgid "Close terminal"
-msgstr ""
+msgstr "터미널 닫기"
 
 #: ../terminatorlib/prefseditor.py:113
 msgid "Copy selected text"
-msgstr ""
+msgstr "선택한 텍스트 복사"
 
 #: ../terminatorlib/prefseditor.py:114
 msgid "Paste clipboard"
-msgstr ""
+msgstr "클립보드 붙여넣기"
 
 #: ../terminatorlib/prefseditor.py:115
 msgid "Show/Hide the scrollbar"
-msgstr ""
+msgstr "스크롤바 보이기/감추기"
 
 #: ../terminatorlib/prefseditor.py:116
 msgid "Search terminal scrollback"
-msgstr ""
+msgstr "터미널 스크롤에서 검색"
 
 #: ../terminatorlib/prefseditor.py:117
 msgid "Scroll upwards one page"
-msgstr ""
+msgstr "위로 한 페이지 스크롤"
 
 #: ../terminatorlib/prefseditor.py:118
 msgid "Scroll downwards one page"
-msgstr ""
+msgstr "아래로 한 페이지 스크롤"
 
 #: ../terminatorlib/prefseditor.py:119
 msgid "Scroll upwards half a page"
-msgstr ""
+msgstr "위로 반 페이지 스크롤"
 
 #: ../terminatorlib/prefseditor.py:120
 msgid "Scroll downwards half a page"
-msgstr ""
+msgstr "아래로 반 페이지 스크롤"
 
 #: ../terminatorlib/prefseditor.py:121
 msgid "Scroll upwards one line"
-msgstr ""
+msgstr "위로 한 줄 스크롤"
 
 #: ../terminatorlib/prefseditor.py:122
 msgid "Scroll downwards one line"
-msgstr ""
+msgstr "아래로 한 줄 스크롤"
 
 #: ../terminatorlib/prefseditor.py:123
 msgid "Close window"
-msgstr ""
+msgstr "창 닫기"
 
 #: ../terminatorlib/prefseditor.py:124
 msgid "Resize the terminal up"
-msgstr ""
+msgstr "위로 터미널 크기 조정"
 
 #: ../terminatorlib/prefseditor.py:125
 msgid "Resize the terminal down"
-msgstr ""
+msgstr "아래로 터미널 크기 조정"
 
 #: ../terminatorlib/prefseditor.py:126
 msgid "Resize the terminal left"
-msgstr ""
+msgstr "왼쪽으로 터미널 크기 조정"
 
 #: ../terminatorlib/prefseditor.py:127
 msgid "Resize the terminal right"
-msgstr ""
+msgstr "오른쪽으로 터미널 크기 조정"
 
 #: ../terminatorlib/prefseditor.py:128
 msgid "Move the tab right"
-msgstr ""
+msgstr "탭을 오른쪽으로 이동"
 
 #: ../terminatorlib/prefseditor.py:129
 msgid "Move the tab left"
-msgstr ""
+msgstr "탭을 왼쪽으로 이동"
 
 #: ../terminatorlib/prefseditor.py:130
 msgid "Maximize terminal"
-msgstr ""
+msgstr "터미널 최대화"
 
 #: ../terminatorlib/prefseditor.py:131
 msgid "Zoom terminal"
-msgstr ""
+msgstr "터미널 확대"
 
 #: ../terminatorlib/prefseditor.py:132
 msgid "Switch to the next tab"
-msgstr ""
+msgstr "다음 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:133
 msgid "Switch to the previous tab"
-msgstr ""
+msgstr "이전 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:134
 msgid "Switch to the first tab"
-msgstr ""
+msgstr "첫 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:135
 msgid "Switch to the second tab"
-msgstr ""
+msgstr "두 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:136
 msgid "Switch to the third tab"
-msgstr ""
+msgstr "세 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:137
 msgid "Switch to the fourth tab"
-msgstr ""
+msgstr "네 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:138
 msgid "Switch to the fifth tab"
-msgstr ""
+msgstr "다섯 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:139
 msgid "Switch to the sixth tab"
-msgstr ""
+msgstr "여섯 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:140
 msgid "Switch to the seventh tab"
-msgstr ""
+msgstr "일곱 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:141
 msgid "Switch to the eighth tab"
-msgstr ""
+msgstr "여덟 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:142
 msgid "Switch to the ninth tab"
-msgstr ""
+msgstr "아홉 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:143
 msgid "Switch to the tenth tab"
-msgstr ""
+msgstr "열 번째 탭으로 이동"
 
 #: ../terminatorlib/prefseditor.py:144
 msgid "Toggle fullscreen"
-msgstr ""
+msgstr "전체화면 전환"
 
 #: ../terminatorlib/prefseditor.py:145
 msgid "Reset the terminal"
-msgstr ""
+msgstr "터미널 초기화"
 
 #: ../terminatorlib/prefseditor.py:146
 msgid "Reset and clear the terminal"
-msgstr ""
+msgstr "터미널 초기화 및 비우기"
 
 #: ../terminatorlib/prefseditor.py:147
 msgid "Toggle window visibility"
-msgstr ""
+msgstr "창 보이기 전환"
 
 #: ../terminatorlib/prefseditor.py:148
 msgid "Group all terminals"
-msgstr ""
+msgstr "모든 터미널을 그룹 지정"
 
 #: ../terminatorlib/prefseditor.py:149
 msgid "Group/Ungroup all terminals"
-msgstr ""
+msgstr "모든 터미널을 그룹 지정/해제"
 
 #: ../terminatorlib/prefseditor.py:150
 msgid "Ungroup all terminals"
-msgstr ""
+msgstr "모든 터미널을 그룹 해제"
 
 #: ../terminatorlib/prefseditor.py:151
 msgid "Group terminals in tab"
-msgstr ""
+msgstr "탭 내의 터미널들을 그룹 지정"
 
 #: ../terminatorlib/prefseditor.py:152
 msgid "Group/Ungroup terminals in tab"
-msgstr ""
+msgstr "탭 내의 터미널들을 그룹 지정/해제"
 
 #: ../terminatorlib/prefseditor.py:153
 msgid "Ungroup terminals in tab"
-msgstr ""
+msgstr "탭 내의 터미널들을 그룹 해제"
 
 #: ../terminatorlib/prefseditor.py:154
 msgid "Create a new window"
-msgstr ""
+msgstr "새 창 만들기"
 
 #: ../terminatorlib/prefseditor.py:155
 msgid "Spawn a new Terminator process"
-msgstr ""
+msgstr "새로운 터미네이터 프로세스 생성"
 
 #: ../terminatorlib/prefseditor.py:156
 msgid "Don't broadcast key presses"
-msgstr ""
+msgstr "동시 입력 하지 않기"
 
 #: ../terminatorlib/prefseditor.py:157
 msgid "Broadcast key presses to group"
-msgstr ""
+msgstr "그룹에 동시 입력"
 
 #: ../terminatorlib/prefseditor.py:158
 msgid "Broadcast key events to all"
-msgstr ""
+msgstr "전체에 동시 입력"
 
 #: ../terminatorlib/prefseditor.py:159
 msgid "Insert terminal number"
@@ -1442,31 +1448,31 @@
 
 #: ../terminatorlib/prefseditor.py:161
 msgid "Edit window title"
-msgstr ""
+msgstr "창 제목 편집"
 
 #: ../terminatorlib/prefseditor.py:162
 msgid "Edit terminal title"
-msgstr ""
+msgstr "터미널 제목 편집"
 
 #: ../terminatorlib/prefseditor.py:163
 msgid "Edit tab title"
-msgstr ""
+msgstr "탭 제목 편집"
 
 #: ../terminatorlib/prefseditor.py:164
 msgid "Open layout launcher window"
-msgstr ""
+msgstr "레이아웃 런처 창 열기"
 
 #: ../terminatorlib/prefseditor.py:165
 msgid "Switch to next profile"
-msgstr ""
+msgstr "다음 프로파일로"
 
 #: ../terminatorlib/prefseditor.py:166
 msgid "Switch to previous profile"
-msgstr ""
+msgstr "이전 프로파일로"
 
 #: ../terminatorlib/prefseditor.py:167
 msgid "Open the manual"
-msgstr ""
+msgstr "설명서 열기"
 
 #: ../terminatorlib/prefseditor.py:1136 ../terminatorlib/prefseditor.py:1141
 msgid "New Profile"
@@ -1498,7 +1504,7 @@
 #. Wrap checkbox
 #: ../terminatorlib/searchbar.py:85
 msgid "Wrap"
-msgstr ""
+msgstr "줄바꿈"
 
 #: ../terminatorlib/searchbar.py:144
 msgid "Searching scrollback"
@@ -1506,27 +1512,27 @@
 
 #: ../terminatorlib/searchbar.py:162 ../terminatorlib/searchbar.py:188
 msgid "No more results"
-msgstr "결과가 더 없음"
+msgstr "결과 더 없음"
 
 #: ../terminatorlib/searchbar.py:203
 msgid "Found at row"
-msgstr "찾은 위치"
+msgstr "행 번호"
 
 #: ../terminatorlib/terminal_popup_menu.py:59
 msgid "_Send email to..."
-msgstr "이메일 보내기(_S)..."
+msgstr "이메일 전송(_S)..."
 
 #: ../terminatorlib/terminal_popup_menu.py:60
 msgid "_Copy email address"
-msgstr "이메일 주소 복사하기(_C)"
+msgstr "이메일 주소 복사(_C)"
 
 #: ../terminatorlib/terminal_popup_menu.py:62
 msgid "Ca_ll VoIP address"
-msgstr "VoIP 주소로 전화하기(_L)"
+msgstr "VoIP 주소로 전화(_L)"
 
 #: ../terminatorlib/terminal_popup_menu.py:63
 msgid "_Copy VoIP address"
-msgstr "VoIP 주소 복사하기(_C)"
+msgstr "VoIP 주소 복사(_C)"
 
 #: ../terminatorlib/terminal_popup_menu.py:84
 msgid "_Open link"
@@ -1534,15 +1540,15 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:86
 msgid "_Copy address"
-msgstr "주소 복사하기(_C)"
+msgstr "주소 복사(_C)"
 
 #: ../terminatorlib/terminal_popup_menu.py:102
 msgid "_Copy"
-msgstr ""
+msgstr "복사(_C)"
 
 #: ../terminatorlib/terminal_popup_menu.py:107
 msgid "_Paste"
-msgstr ""
+msgstr "붙여넣기(_P)"
 
 #: ../terminatorlib/terminal_popup_menu.py:114
 msgid "Split H_orizontally"
@@ -1562,7 +1568,7 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:147
 msgid "_Close"
-msgstr ""
+msgstr "닫기(_C)"
 
 #: ../terminatorlib/terminal_popup_menu.py:156
 msgid "_Zoom terminal"
@@ -1570,11 +1576,11 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:161
 msgid "Ma_ximize terminal"
-msgstr ""
+msgstr "터미널 최대화(_X)"
 
 #: ../terminatorlib/terminal_popup_menu.py:168
 msgid "_Restore all terminals"
-msgstr "모든 터미널 복원하기(_R)"
+msgstr "전체 터미널 복원(_R)"
 
 #: ../terminatorlib/terminal_popup_menu.py:175
 msgid "Grouping"
@@ -1602,11 +1608,11 @@
 
 #: ../terminatorlib/terminal.py:433
 msgid "N_ew group..."
-msgstr ""
+msgstr "새 그룹(_E)"
 
 #: ../terminatorlib/terminal.py:439
 msgid "_None"
-msgstr ""
+msgstr "소속 없음"
 
 #: ../terminatorlib/terminal.py:459
 #, python-format
@@ -1615,11 +1621,11 @@
 
 #: ../terminatorlib/terminal.py:464
 msgid "G_roup all in tab"
-msgstr "탭 안의 모두를 그룹으로 묶기(_G)"
+msgstr "탭 안의 모두를 그룹으로(_G)"
 
 #: ../terminatorlib/terminal.py:469
 msgid "Ungro_up all in tab"
-msgstr ""
+msgstr "탭 안의 모두를 그룹 해제(_U)"
 
 #: ../terminatorlib/terminal.py:474
 msgid "Remove all groups"
@@ -1632,31 +1638,31 @@
 
 #: ../terminatorlib/terminal.py:491
 msgid "Broadcast _all"
-msgstr ""
+msgstr "전체에게 동시 입력(_A)"
 
 #: ../terminatorlib/terminal.py:492
 msgid "Broadcast _group"
-msgstr ""
+msgstr "그룹에 동시 입력(_G)"
 
 #: ../terminatorlib/terminal.py:493
 msgid "Broadcast _off"
-msgstr ""
+msgstr "동시 입력 끄기(_O)"
 
 #: ../terminatorlib/terminal.py:509
 msgid "_Split to this group"
-msgstr ""
+msgstr "나눌 때 이 그룹으로(_S)"
 
 #: ../terminatorlib/terminal.py:514
 msgid "Auto_clean groups"
-msgstr ""
+msgstr "빈 그룹 자동 제거(_C)"
 
 #: ../terminatorlib/terminal.py:521
 msgid "_Insert terminal number"
-msgstr ""
+msgstr "터미널 번호 붙여넣기(_I)"
 
 #: ../terminatorlib/terminal.py:525
 msgid "Insert _padded terminal number"
-msgstr ""
+msgstr "0으로 채운 터미널 번호 붙여넣기(_P)"
 
 #: ../terminatorlib/terminal.py:1394
 msgid "Unable to find a shell"
@@ -1672,103 +1678,103 @@
 
 #: ../terminatorlib/terminal.py:1856
 msgid "Enter a new title for the Terminator window..."
-msgstr "터미네이터 윈도우 타이틀바의 새 이름을 입력하시요"
+msgstr "터미네이터 창의 새 제목을 입력하세요..."
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Alpha"
-msgstr ""
+msgstr "비둘기"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Beta"
-msgstr ""
+msgstr "오리"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Gamma"
-msgstr ""
+msgstr "까치"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Delta"
-msgstr ""
+msgstr "독수리"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Epsilon"
-msgstr ""
+msgstr "갈매기"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Zeta"
-msgstr ""
+msgstr "메추라기"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Eta"
-msgstr ""
+msgstr "두루미"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Theta"
-msgstr ""
+msgstr "제비"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Iota"
-msgstr ""
+msgstr "까마귀"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Kappa"
-msgstr ""
+msgstr "뻐꾸기"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Lambda"
-msgstr ""
+msgstr "꿩"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Mu"
-msgstr ""
+msgstr "닭"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Nu"
-msgstr ""
+msgstr "고니"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Xi"
-msgstr ""
+msgstr "기러기"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Omicron"
-msgstr ""
+msgstr "논병아리"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Pi"
-msgstr ""
+msgstr "딱다구리"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Rho"
-msgstr ""
+msgstr "올빼미"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Sigma"
-msgstr ""
+msgstr "부엉이"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Tau"
-msgstr ""
+msgstr "느시"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Upsilon"
-msgstr ""
+msgstr "뜸부기"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Phi"
-msgstr ""
+msgstr "따오기"
 
 #: ../terminatorlib/titlebar.py:257
 msgid "Chi"
-msgstr ""
+msgstr "직박구리"
 
 #: ../terminatorlib/titlebar.py:257
 msgid "Psi"
-msgstr ""
+msgstr "지빠귀"
 
 #: ../terminatorlib/titlebar.py:257
 msgid "Omega"
-msgstr ""
+msgstr "곤줄박이"
 
 #: ../terminatorlib/window.py:276
 msgid "window"
diff -x .bzr -uNr terminator-1.91/po/ku.po python3/po/ku.po
--- terminator-1.91/po/ku.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ku.po	2019-08-19 19:25:15.963479000 -0400
@@ -9,13 +9,13 @@
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
 "PO-Revision-Date: 2017-02-12 23:32+0000\n"
-"Last-Translator: Rokar <Unknown>\n"
+"Last-Translator: Rokar ✌ <Unknown>\n"
 "Language-Team: Kurdish <ku@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-13 06:00+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
diff -x .bzr -uNr terminator-1.91/po/la.po python3/po/la.po
--- terminator-1.91/po/la.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/la.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: la\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/lt.po python3/po/lt.po
--- terminator-1.91/po/lt.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/lt.po	2019-08-19 19:25:15.963479000 -0400
@@ -15,8 +15,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: lt\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/lv.po python3/po/lv.po
--- terminator-1.91/po/lv.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/lv.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: lv\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/mk.po python3/po/mk.po
--- terminator-1.91/po/mk.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/mk.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: mk\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ml.po python3/po/ml.po
--- terminator-1.91/po/ml.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ml.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ml\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/mr.po python3/po/mr.po
--- terminator-1.91/po/mr.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/mr.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: mr\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ms.po python3/po/ms.po
--- terminator-1.91/po/ms.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ms.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ms\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/nb.po python3/po/nb.po
--- terminator-1.91/po/nb.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/nb.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: nb\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/nl.po python3/po/nl.po
--- terminator-1.91/po/nl.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/nl.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/nn.po python3/po/nn.po
--- terminator-1.91/po/nn.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/nn.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: nn\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/oc.po python3/po/oc.po
--- terminator-1.91/po/oc.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/oc.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/pl.po python3/po/pl.po
--- terminator-1.91/po/pl.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/pl.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,24 +8,24 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2016-12-17 14:42+0000\n"
-"Last-Translator: m4sk1n <Unknown>\n"
+"PO-Revision-Date: 2017-08-30 11:34+0000\n"
+"Last-Translator: Marcin Sedlak <fdmarcin@gmail.com>\n"
 "Language-Team: Polish <pl@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-31 05:34+0000\n"
+"X-Generator: Launchpad (build 18446)\n"
 "Language: pl\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
 msgid "Open a new window"
-msgstr "Otwiera nowe okno programu"
+msgstr "Otwórz nowe okno"
 
 #: ../remotinator.py:39
 msgid "Open a new tab"
-msgstr "Otwiera nową kartę"
+msgstr "Otwórz nową kartę"
 
 #: ../remotinator.py:40
 msgid "Split the current terminal horizontally"
@@ -41,19 +41,19 @@
 
 #: ../remotinator.py:43
 msgid "Get the UUID of a parent window"
-msgstr ""
+msgstr "Dziedziczenie UUID okna nadrzędnego"
 
 #: ../remotinator.py:44
 msgid "Get the title of a parent window"
-msgstr ""
+msgstr "Dziedziczenie tytułu okna nadrzędnego"
 
 #: ../remotinator.py:45
 msgid "Get the UUID of a parent tab"
-msgstr ""
+msgstr "Dziedziczenie UUID karty nadrzędnej"
 
 #: ../remotinator.py:46
 msgid "Get the title of a parent tab"
-msgstr ""
+msgstr "Dziedziczenie tytułu karty nadrzędnej"
 
 #: ../remotinator.py:63
 #, python-format
@@ -829,7 +829,7 @@
 
 #: ../terminatorlib/preferences.glade.h:63
 msgid "Unfocused terminal font brightness:"
-msgstr ""
+msgstr "Jasność czcionki nieaktywnego terminala"
 
 #: ../terminatorlib/preferences.glade.h:64
 msgid "Terminal separator size:"
@@ -837,7 +837,7 @@
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
-msgstr ""
+msgstr "Dodatkowe stylowanie (zależne od motywu)"
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
@@ -865,7 +865,7 @@
 
 #: ../terminatorlib/preferences.glade.h:72
 msgid "Focused"
-msgstr ""
+msgstr "Aktywny"
 
 #: ../terminatorlib/preferences.glade.h:73
 msgid "Inactive"
@@ -949,7 +949,7 @@
 
 #: ../terminatorlib/preferences.glade.h:93
 msgid "<b>Terminal bell</b>"
-msgstr "<b>Dzwonek termianala</b>"
+msgstr "<b>Dzwonek terminala</b>"
 
 #: ../terminatorlib/preferences.glade.h:94
 msgid "Titlebar icon"
@@ -1245,11 +1245,11 @@
 
 #: ../terminatorlib/prefseditor.py:108
 msgid "Rotate terminals clockwise"
-msgstr ""
+msgstr "Obróć terminale zgodnie z ruchem wskazówek zegara"
 
 #: ../terminatorlib/prefseditor.py:109
 msgid "Rotate terminals counter-clockwise"
-msgstr ""
+msgstr "Obróć terminale przeciwnie do ruchu wskazówek zegara"
 
 #: ../terminatorlib/prefseditor.py:110
 msgid "Split horizontally"
@@ -1309,19 +1309,19 @@
 
 #: ../terminatorlib/prefseditor.py:124
 msgid "Resize the terminal up"
-msgstr ""
+msgstr "Zmień rozmiar terminala w górę"
 
 #: ../terminatorlib/prefseditor.py:125
 msgid "Resize the terminal down"
-msgstr ""
+msgstr "Zmień rozmiar terminala w dół"
 
 #: ../terminatorlib/prefseditor.py:126
 msgid "Resize the terminal left"
-msgstr ""
+msgstr "Zmień rozmiar terminala w lewo"
 
 #: ../terminatorlib/prefseditor.py:127
 msgid "Resize the terminal right"
-msgstr ""
+msgstr "Zmień rozmiar terminala w prawo"
 
 #: ../terminatorlib/prefseditor.py:128
 msgid "Move the tab right"
diff -x .bzr -uNr terminator-1.91/po/POTFILES.in python3/po/POTFILES.in
--- terminator-1.91/po/POTFILES.in	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/POTFILES.in	2019-08-19 19:25:15.963479000 -0400
@@ -7,9 +7,6 @@
 data/terminator.desktop.in
 data/terminator.appdata.xml.in
 terminatorlib/borg.py
-terminatorlib/configobj/configobj.py
-terminatorlib/configobj/__init__.py
-terminatorlib/configobj/validate.py
 terminatorlib/config.py
 terminatorlib/container.py
 terminatorlib/cwd.py
diff -x .bzr -uNr terminator-1.91/po/pt_BR.po python3/po/pt_BR.po
--- terminator-1.91/po/pt_BR.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/pt_BR.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,14 +8,14 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2015-08-05 12:40+0000\n"
-"Last-Translator: Fábio Nogueira <fnogueira@protonmail.com>\n"
+"PO-Revision-Date: 2017-03-02 15:55+0000\n"
+"Last-Translator: raphael <Unknown>\n"
 "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: pt_BR\n"
 
 #. Command         uuid req.    Description
@@ -178,12 +178,16 @@
 "This window has several terminals open. Closing the window will also close "
 "all terminals within it."
 msgstr ""
+"Esta janela tem vários terminais abertos. Fechando a janela também irá "
+"fechar todos os terminais dentro dele."
 
 #: ../terminatorlib/container.py:178
 msgid ""
 "This tab has several terminals open. Closing the tab will also close all "
 "terminals within it."
 msgstr ""
+"Esta guia tem vários terminais abertos. Fechando a guia também irá fechar "
+"todos os terminais dentro dela."
 
 #: ../terminatorlib/container.py:198
 msgid "Do not show this message next time"
@@ -489,12 +493,12 @@
 #: ../terminatorlib/plugins/logger.py:22
 #: ../terminatorlib/plugins/terminalshot.py:21
 msgid "_Cancel"
-msgstr ""
+msgstr "_Cancelar"
 
 #: ../terminatorlib/plugins/custom_commands.py:125
 #: ../terminatorlib/plugins/custom_commands.py:274
 msgid "_OK"
-msgstr ""
+msgstr "Certo"
 
 #: ../terminatorlib/plugins/custom_commands.py:152
 msgid "Enabled"
@@ -517,27 +521,27 @@
 
 #: ../terminatorlib/plugins/custom_commands.py:180
 msgid "Up"
-msgstr ""
+msgstr "Acima"
 
 #: ../terminatorlib/plugins/custom_commands.py:186
 msgid "Down"
-msgstr ""
+msgstr "Abaixo"
 
 #: ../terminatorlib/plugins/custom_commands.py:192
 msgid "Last"
-msgstr ""
+msgstr "Último"
 
 #: ../terminatorlib/plugins/custom_commands.py:198
 msgid "New"
-msgstr ""
+msgstr "Novo"
 
 #: ../terminatorlib/plugins/custom_commands.py:203
 msgid "Edit"
-msgstr ""
+msgstr "Editar"
 
 #: ../terminatorlib/plugins/custom_commands.py:209
 msgid "Delete"
-msgstr ""
+msgstr "Deletar"
 
 #: ../terminatorlib/plugins/custom_commands.py:269
 msgid "New Command"
@@ -569,7 +573,7 @@
 #: ../terminatorlib/plugins/logger.py:23
 #: ../terminatorlib/plugins/terminalshot.py:22
 msgid "_Save"
-msgstr ""
+msgstr "_Salvar"
 
 #: ../terminatorlib/plugins/logger.py:34
 msgid "Start _Logger"
@@ -581,11 +585,11 @@
 
 #: ../terminatorlib/plugins/logger.py:67
 msgid "Save Log File As"
-msgstr "Salvar Log Como Arquivo"
+msgstr "Salvar Arquivo de Log Como"
 
 #: ../terminatorlib/plugins/terminalshot.py:29
 msgid "Terminal _screenshot"
-msgstr "Terminal _imagem da tela"
+msgstr "Terminal _captura da tela"
 
 #: ../terminatorlib/plugins/terminalshot.py:38
 msgid "Save image"
@@ -662,7 +666,7 @@
 
 #: ../terminatorlib/preferences.glade.h:18
 msgid "Solarized light"
-msgstr "Solarizado leve"
+msgstr "Solarizado claro"
 
 #: ../terminatorlib/preferences.glade.h:19
 msgid "Solarized dark"
@@ -670,15 +674,15 @@
 
 #: ../terminatorlib/preferences.glade.h:20
 msgid "Gruvbox light"
-msgstr ""
+msgstr "Caixa de fundo iluminada"
 
 #: ../terminatorlib/preferences.glade.h:21
 msgid "Gruvbox dark"
-msgstr ""
+msgstr "Caixa de fundo escura"
 
 #: ../terminatorlib/preferences.glade.h:22
 msgid "Custom"
-msgstr "Personalizar"
+msgstr "Personalizado"
 
 #: ../terminatorlib/preferences.glade.h:23
 msgid "Block"
@@ -758,7 +762,7 @@
 
 #: ../terminatorlib/preferences.glade.h:43
 msgid "Maximised"
-msgstr "Maximizar"
+msgstr "Maximizado"
 
 #: ../terminatorlib/preferences.glade.h:44
 msgid "Fullscreen"
@@ -846,7 +850,7 @@
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
-msgstr ""
+msgstr "Estilização extra"
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
@@ -930,7 +934,7 @@
 
 #: ../terminatorlib/preferences.glade.h:86
 msgid "Rewrap on resize"
-msgstr ""
+msgstr "Organizar ao redimencionar"
 
 #: ../terminatorlib/preferences.glade.h:87
 msgid "Select-by-_word characters:"
@@ -954,7 +958,7 @@
 
 #: ../terminatorlib/preferences.glade.h:92
 msgid "Foreground"
-msgstr ""
+msgstr "Primeiro plano"
 
 #: ../terminatorlib/preferences.glade.h:93
 msgid "<b>Terminal bell</b>"
@@ -1050,7 +1054,7 @@
 
 #: ../terminatorlib/preferences.glade.h:117
 msgid "S_hade transparent background:"
-msgstr ""
+msgstr "S_ombrear fundo transparente"
 
 #: ../terminatorlib/preferences.glade.h:118
 msgid "<small><i>None</i></small>"
@@ -1114,7 +1118,7 @@
 
 #: ../terminatorlib/preferences.glade.h:131
 msgid "Encoding:"
-msgstr ""
+msgstr "Codificação"
 
 #: ../terminatorlib/preferences.glade.h:132
 msgid "_Reset Compatibility Options to Defaults"
@@ -1211,6 +1215,13 @@
 "<a href=\"https://bugs.launchpad.net/terminator\">Bugs / Enhancements</a>\n"
 "<a href=\"https://translations.launchpad.net/terminator\">Translations</a>"
 msgstr ""
+"<a "
+"href=\"http://gnometerminator.blogspot.com/p/introduction.html\">Homepage</a>"
+"\n"
+"<a href=\"http://gnometerminator.blogspot.com/\">Blog / News</a>\n"
+"<a href=\"https://launchpad.net/terminator\">Development</a>\n"
+"<a href=\"https://bugs.launchpad.net/terminator\">Bugs / Enhancements</a>\n"
+"<a href=\"https://translations.launchpad.net/terminator\">Translations</a>"
 
 #: ../terminatorlib/preferences.glade.h:159
 msgid "About"
@@ -1338,11 +1349,11 @@
 
 #: ../terminatorlib/prefseditor.py:128
 msgid "Move the tab right"
-msgstr "Mover aba para direita"
+msgstr "Mover aba para a direita"
 
 #: ../terminatorlib/prefseditor.py:129
 msgid "Move the tab left"
-msgstr "Mover aba para esqueda"
+msgstr "Mover aba para a esquerda"
 
 #: ../terminatorlib/prefseditor.py:130
 msgid "Maximize terminal"
@@ -1566,11 +1577,11 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:102
 msgid "_Copy"
-msgstr ""
+msgstr "_Copiar"
 
 #: ../terminatorlib/terminal_popup_menu.py:107
 msgid "_Paste"
-msgstr ""
+msgstr "_Colar"
 
 #: ../terminatorlib/terminal_popup_menu.py:114
 msgid "Split H_orizontally"
@@ -1590,7 +1601,7 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:147
 msgid "_Close"
-msgstr ""
+msgstr "_Fechar"
 
 #: ../terminatorlib/terminal_popup_menu.py:156
 msgid "_Zoom terminal"
diff -x .bzr -uNr terminator-1.91/po/pt.po python3/po/pt.po
--- terminator-1.91/po/pt.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/pt.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,24 +8,24 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2015-08-05 12:41+0000\n"
-"Last-Translator: Stephen Boddy <Unknown>\n"
+"PO-Revision-Date: 2017-03-05 23:10+0000\n"
+"Last-Translator: Sérgio Marques <Unknown>\n"
 "Language-Team: Portuguese <pt@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: pt_PT\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
 msgid "Open a new window"
-msgstr "Abrir uma nova janela"
+msgstr "Abrir nova janela"
 
 #: ../remotinator.py:39
 msgid "Open a new tab"
-msgstr "Abrir um novo separador"
+msgstr "Abrir novo separador"
 
 #: ../remotinator.py:40
 msgid "Split the current terminal horizontally"
@@ -37,23 +37,23 @@
 
 #: ../remotinator.py:42
 msgid "Get a list of all terminals"
-msgstr "Obter uma lista de todos os terminais"
+msgstr "Obter a lista de todos os terminais"
 
 #: ../remotinator.py:43
 msgid "Get the UUID of a parent window"
-msgstr "Obter o UUID da janela fonte"
+msgstr "Obter o UUID da janela superior"
 
 #: ../remotinator.py:44
 msgid "Get the title of a parent window"
-msgstr "Obter o titulo de uma janela fonte"
+msgstr "Obter o título da janela superior"
 
 #: ../remotinator.py:45
 msgid "Get the UUID of a parent tab"
-msgstr "Obter o UUID de um separador fonte"
+msgstr "Obter o UUID do separador superior"
 
 #: ../remotinator.py:46
 msgid "Get the title of a parent tab"
-msgstr "Obter o titulo de um separador fonte"
+msgstr "Obter o título do separador superior"
 
 #: ../remotinator.py:63
 #, python-format
@@ -62,16 +62,21 @@
 "\n"
 "%s"
 msgstr ""
+"Execute um dos seguintes comandos DBus do Terminator:\n"
+"\n"
+"%s"
 
 #: ../remotinator.py:64
 msgid ""
 "* These entries require either TERMINATOR_UUID environment var,\n"
 "  or the --uuid option must be used."
 msgstr ""
+"* Estas entradas requerem a variável de ambiente TERMINATOR_UUID\n"
+"   ou a utilização da opção --uuid."
 
 #: ../remotinator.py:66
 msgid "Terminal UUID for when not in env var TERMINATOR_UUID"
-msgstr ""
+msgstr "UUID do terminal se não existir a variável TERMINATOR_UUID"
 
 #: ../data/terminator.desktop.in.h:1 ../data/terminator.appdata.xml.in.h:1
 #: ../terminatorlib/plugins/activitywatch.py:84
@@ -82,7 +87,7 @@
 
 #: ../data/terminator.desktop.in.h:2 ../data/terminator.appdata.xml.in.h:2
 msgid "Multiple terminals in one window"
-msgstr "Terminais múltiplos numa janela"
+msgstr "Vários terminais por janela"
 
 #: ../data/terminator.appdata.xml.in.h:3
 #: ../terminatorlib/preferences.glade.h:149
@@ -96,6 +101,10 @@
 "terminals in grids (tabs is the most common default method, which Terminator "
 "also supports)."
 msgstr ""
+"Uma ferramenta poderosíssima para arranjar terminais. Tem como inspiração  "
+"programas como gnome-multi-term, quadkonsole e similares. O seu principal "
+"foco é o arranjo de terminais em grelha (o método mais usual são os "
+"separados, que também são suportados pelos Terminator)."
 
 #: ../data/terminator.appdata.xml.in.h:5
 msgid ""
@@ -104,6 +113,10 @@
 "out in different directions with useful features for sysadmins and other "
 "users."
 msgstr ""
+"Grande parte do comportamento baseia-se no terminal GNOME, mas adicionámos "
+"diversas funcionalidades com o passar do tempo e também pretendemos expandir "
+"a sua versatilidade, disponibilizando diversas opções para administradores "
+"de sistemas e outros utilizadores avançados."
 
 #: ../data/terminator.appdata.xml.in.h:6
 msgid "Some highlights:"
@@ -111,7 +124,7 @@
 
 #: ../data/terminator.appdata.xml.in.h:7
 msgid "Arrange terminals in a grid"
-msgstr "Ordenar os terminais em grelha"
+msgstr "Disposição de terminais em grelha"
 
 #: ../data/terminator.appdata.xml.in.h:8
 msgid "Tabs"
@@ -128,12 +141,11 @@
 #: ../data/terminator.appdata.xml.in.h:11
 msgid "Save multiple layouts and profiles via GUI preferences editor"
 msgstr ""
-"Guardar múltiplos layouts e perfis através da interface gráfica editor de "
-"preferências"
+"Guardar múltiplas disposições e perfis através do editor de preferências"
 
 #: ../data/terminator.appdata.xml.in.h:12
 msgid "Simultaneous typing to arbitrary groups of terminals"
-msgstr "Escrever para vários grupos de terminais simultaneamente"
+msgstr "Digitação para vários grupos de terminais em simultâneo"
 
 #: ../data/terminator.appdata.xml.in.h:13
 msgid "And lots more..."
@@ -141,15 +153,16 @@
 
 #: ../data/terminator.appdata.xml.in.h:14
 msgid "The main window showing the application in action"
-msgstr "A janela principal que mostra a aplicação em acção"
+msgstr "A janela principal que mostra a aplicação em ação"
 
 #: ../data/terminator.appdata.xml.in.h:15
 msgid "Getting a little crazy with the terminals"
-msgstr ""
+msgstr "A loucura de diversos terminais"
 
 #: ../data/terminator.appdata.xml.in.h:16
 msgid "The preferences window where you can change the defaults"
-msgstr "A janela de preferências onde podes modificar os valores por omissão"
+msgstr ""
+"A janela de preferências na qual se pode alterar as definições padrão"
 
 #: ../terminatorlib/container.py:163
 msgid "Close?"
@@ -168,16 +181,20 @@
 "This window has several terminals open. Closing the window will also close "
 "all terminals within it."
 msgstr ""
+"Esta janela possui diversos terminais abertos. Se a fechar, todos os "
+"terminais serão fechados."
 
 #: ../terminatorlib/container.py:178
 msgid ""
 "This tab has several terminals open. Closing the tab will also close all "
 "terminals within it."
 msgstr ""
+"Este separador possui diversos terminais abertos. Se o fechar, todos os "
+"terminais serão fechados."
 
 #: ../terminatorlib/container.py:198
 msgid "Do not show this message next time"
-msgstr "Não mostrar esta mensagem outra vez"
+msgstr "Não mostrar novamente a mensagem"
 
 #: ../terminatorlib/encoding.py:35
 msgid "Current Locale"
@@ -192,11 +209,11 @@
 #: ../terminatorlib/encoding.py:37 ../terminatorlib/encoding.py:69
 #: ../terminatorlib/encoding.py:81 ../terminatorlib/encoding.py:100
 msgid "Central European"
-msgstr "Europeu Central"
+msgstr "Europa Central"
 
 #: ../terminatorlib/encoding.py:38
 msgid "South European"
-msgstr "Europeu do Sul"
+msgstr "Europa do Sul"
 
 #: ../terminatorlib/encoding.py:39 ../terminatorlib/encoding.py:47
 #: ../terminatorlib/encoding.py:107
@@ -222,7 +239,7 @@
 
 #: ../terminatorlib/encoding.py:43
 msgid "Hebrew Visual"
-msgstr "Hebraico Visual"
+msgstr "Hebraico visual"
 
 #: ../terminatorlib/encoding.py:44 ../terminatorlib/encoding.py:72
 #: ../terminatorlib/encoding.py:89 ../terminatorlib/encoding.py:105
@@ -296,7 +313,7 @@
 
 #: ../terminatorlib/encoding.py:84
 msgid "Hindi"
-msgstr "Hindi"
+msgstr "Hindu"
 
 #: ../terminatorlib/encoding.py:85
 msgid "Persian"
@@ -330,11 +347,11 @@
 #: ../terminatorlib/layoutlauncher.glade.h:2
 #: ../terminatorlib/preferences.glade.h:135
 msgid "Layout"
-msgstr ""
+msgstr "Disposição"
 
 #: ../terminatorlib/layoutlauncher.glade.h:3
 msgid "Launch"
-msgstr ""
+msgstr "Iniciar"
 
 #: ../terminatorlib/notebook.py:353
 msgid "tab"
@@ -350,11 +367,11 @@
 
 #: ../terminatorlib/optionparse.py:52
 msgid "Maximize the window"
-msgstr ""
+msgstr "Maximizar janela"
 
 #: ../terminatorlib/optionparse.py:54
 msgid "Make the window fill the screen"
-msgstr "Ajustar a janela ao ecrã"
+msgstr "Ajustar janela ao ecrã"
 
 #: ../terminatorlib/optionparse.py:56
 msgid "Disable window borders"
@@ -406,11 +423,11 @@
 
 #: ../terminatorlib/optionparse.py:89
 msgid "Launch with the given layout"
-msgstr ""
+msgstr "Iniciar com a disposição indicada"
 
 #: ../terminatorlib/optionparse.py:91
 msgid "Select a layout from a list"
-msgstr ""
+msgstr "Selecione uma disposição da lista"
 
 #: ../terminatorlib/optionparse.py:93
 msgid "Use a different profile as the default"
@@ -426,11 +443,11 @@
 
 #: ../terminatorlib/optionparse.py:99
 msgid "Comma separated list of classes to limit debugging to"
-msgstr "Classes separadas por vírgulas para limitar a depuração a"
+msgstr "Classes, separadas por vírgulas, para limitar a depuração a"
 
 #: ../terminatorlib/optionparse.py:101
 msgid "Comma separated list of methods to limit debugging to"
-msgstr "Métodos separados por vírgulas para limitar a depuração a"
+msgstr "Métodos, separados por vírgula,s para limitar a depuração a"
 
 #: ../terminatorlib/optionparse.py:103
 msgid "If Terminator is already running, just open a new tab"
@@ -442,25 +459,25 @@
 
 #: ../terminatorlib/plugins/activitywatch.py:55
 msgid "Watch for _activity"
-msgstr ""
+msgstr "Monitorizar _atividade"
 
 #: ../terminatorlib/plugins/activitywatch.py:84
 #, python-format
 msgid "Activity in: %s"
-msgstr ""
+msgstr "Atividade em: %s"
 
 #: ../terminatorlib/plugins/activitywatch.py:121
 msgid "Watch for _silence"
-msgstr ""
+msgstr "Monitorizar _silêncio"
 
 #: ../terminatorlib/plugins/activitywatch.py:163
 #, python-format
 msgid "Silence in: %s"
-msgstr ""
+msgstr "Silêncio em: %s"
 
 #: ../terminatorlib/plugins/custom_commands.py:61
 msgid "_Custom Commands"
-msgstr ""
+msgstr "_Comandos personalizados"
 
 #. VERIFY FOR GTK3: is this ever false?
 #: ../terminatorlib/plugins/custom_commands.py:67
@@ -477,21 +494,21 @@
 #: ../terminatorlib/plugins/logger.py:22
 #: ../terminatorlib/plugins/terminalshot.py:21
 msgid "_Cancel"
-msgstr ""
+msgstr "_Cancelar"
 
 #: ../terminatorlib/plugins/custom_commands.py:125
 #: ../terminatorlib/plugins/custom_commands.py:274
 msgid "_OK"
-msgstr ""
+msgstr "_OK"
 
 #: ../terminatorlib/plugins/custom_commands.py:152
 msgid "Enabled"
-msgstr ""
+msgstr "Ativo"
 
 #: ../terminatorlib/plugins/custom_commands.py:156
 #: ../terminatorlib/preferences.glade.h:137
 msgid "Name"
-msgstr ""
+msgstr "Nome"
 
 #: ../terminatorlib/plugins/custom_commands.py:160
 #: ../terminatorlib/preferences.glade.h:103
@@ -505,27 +522,27 @@
 
 #: ../terminatorlib/plugins/custom_commands.py:180
 msgid "Up"
-msgstr ""
+msgstr "Subir"
 
 #: ../terminatorlib/plugins/custom_commands.py:186
 msgid "Down"
-msgstr ""
+msgstr "Descer"
 
 #: ../terminatorlib/plugins/custom_commands.py:192
 msgid "Last"
-msgstr ""
+msgstr "Último"
 
 #: ../terminatorlib/plugins/custom_commands.py:198
 msgid "New"
-msgstr ""
+msgstr "Novo"
 
 #: ../terminatorlib/plugins/custom_commands.py:203
 msgid "Edit"
-msgstr ""
+msgstr "Editar"
 
 #: ../terminatorlib/plugins/custom_commands.py:209
 msgid "Delete"
-msgstr ""
+msgstr "Apagar"
 
 #: ../terminatorlib/plugins/custom_commands.py:269
 msgid "New Command"
@@ -533,7 +550,7 @@
 
 #: ../terminatorlib/plugins/custom_commands.py:280
 msgid "Enabled:"
-msgstr "Ativado:"
+msgstr "Ativo:"
 
 #: ../terminatorlib/plugins/custom_commands.py:286
 msgid "Name:"
@@ -546,7 +563,7 @@
 #: ../terminatorlib/plugins/custom_commands.py:315
 #: ../terminatorlib/plugins/custom_commands.py:425
 msgid "You need to define a name and command"
-msgstr "Precisa de definir o nome e o comando"
+msgstr "Tem que definir o nome e o comando"
 
 #: ../terminatorlib/plugins/custom_commands.py:332
 #: ../terminatorlib/plugins/custom_commands.py:444
@@ -557,27 +574,27 @@
 #: ../terminatorlib/plugins/logger.py:23
 #: ../terminatorlib/plugins/terminalshot.py:22
 msgid "_Save"
-msgstr ""
+msgstr "_Guardar"
 
 #: ../terminatorlib/plugins/logger.py:34
 msgid "Start _Logger"
-msgstr ""
+msgstr "Iniciar _logger"
 
 #: ../terminatorlib/plugins/logger.py:37
 msgid "Stop _Logger"
-msgstr ""
+msgstr "Parar _logger"
 
 #: ../terminatorlib/plugins/logger.py:67
 msgid "Save Log File As"
-msgstr ""
+msgstr "Guardar ficheiro como"
 
 #: ../terminatorlib/plugins/terminalshot.py:29
 msgid "Terminal _screenshot"
-msgstr ""
+msgstr "_Captura de ecrã"
 
 #: ../terminatorlib/plugins/terminalshot.py:38
 msgid "Save image"
-msgstr ""
+msgstr "Guardar imagem"
 
 #: ../terminatorlib/preferences.glade.h:1
 msgid "Automatic"
@@ -589,11 +606,11 @@
 
 #: ../terminatorlib/preferences.glade.h:3
 msgid "ASCII DEL"
-msgstr "DEL ASCII"
+msgstr "ASCII DEL"
 
 #: ../terminatorlib/preferences.glade.h:4
 msgid "Escape sequence"
-msgstr "Sequência de Escape"
+msgstr "Sequência de escape"
 
 #. FIXME: Why isn't this being done by Terminator() ?
 #: ../terminatorlib/preferences.glade.h:5 ../terminatorlib/window.py:704
@@ -602,7 +619,7 @@
 
 #: ../terminatorlib/preferences.glade.h:6
 msgid "Group"
-msgstr ""
+msgstr "Agrupar"
 
 #: ../terminatorlib/preferences.glade.h:7
 msgid "None"
@@ -630,7 +647,7 @@
 
 #: ../terminatorlib/preferences.glade.h:13
 msgid "Gray on black"
-msgstr ""
+msgstr "Cinzento sobre preto"
 
 #: ../terminatorlib/preferences.glade.h:14
 msgid "Green on black"
@@ -650,19 +667,19 @@
 
 #: ../terminatorlib/preferences.glade.h:18
 msgid "Solarized light"
-msgstr ""
+msgstr "Solar claro"
 
 #: ../terminatorlib/preferences.glade.h:19
 msgid "Solarized dark"
-msgstr ""
+msgstr "Solar escuro"
 
 #: ../terminatorlib/preferences.glade.h:20
 msgid "Gruvbox light"
-msgstr ""
+msgstr "Gruvbox claro"
 
 #: ../terminatorlib/preferences.glade.h:21
 msgid "Gruvbox dark"
-msgstr ""
+msgstr "Gruvbox escuro"
 
 #: ../terminatorlib/preferences.glade.h:22
 msgid "Custom"
@@ -710,7 +727,7 @@
 
 #: ../terminatorlib/preferences.glade.h:33
 msgid "Solarized"
-msgstr ""
+msgstr "Solar"
 
 #: ../terminatorlib/preferences.glade.h:34
 msgid "On the left side"
@@ -758,11 +775,11 @@
 
 #: ../terminatorlib/preferences.glade.h:46
 msgid "<b>Behavior</b>"
-msgstr ""
+msgstr "<b>Comportamento</b>"
 
 #: ../terminatorlib/preferences.glade.h:47
 msgid "Window state:"
-msgstr ""
+msgstr "Estado da janela:"
 
 #: ../terminatorlib/preferences.glade.h:48
 msgid "Always on top"
@@ -790,19 +807,19 @@
 
 #: ../terminatorlib/preferences.glade.h:54
 msgid "Mouse focus:"
-msgstr ""
+msgstr "Foco do rato:"
 
 #: ../terminatorlib/preferences.glade.h:55
 msgid "Broadcast default:"
-msgstr ""
+msgstr "Padrão de difusão:"
 
 #: ../terminatorlib/preferences.glade.h:56
 msgid "PuTTY style paste"
-msgstr ""
+msgstr "Estilo PuTTY"
 
 #: ../terminatorlib/preferences.glade.h:57
 msgid "Smart copy"
-msgstr ""
+msgstr "Cópia inteligente"
 
 #: ../terminatorlib/preferences.glade.h:58
 msgid "Re-use profiles for new terminals"
@@ -814,11 +831,11 @@
 
 #: ../terminatorlib/preferences.glade.h:60
 msgid "Custom URL handler:"
-msgstr ""
+msgstr "Gestor personalizado:"
 
 #: ../terminatorlib/preferences.glade.h:61
 msgid "<b>Appearance</b>"
-msgstr ""
+msgstr "<b>Aparência</b>"
 
 #: ../terminatorlib/preferences.glade.h:62
 msgid "Window borders"
@@ -826,31 +843,31 @@
 
 #: ../terminatorlib/preferences.glade.h:63
 msgid "Unfocused terminal font brightness:"
-msgstr ""
+msgstr "Brilho do tipo de letra em terminais não focados:"
 
 #: ../terminatorlib/preferences.glade.h:64
 msgid "Terminal separator size:"
-msgstr ""
+msgstr "Tamanho do separador:"
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
-msgstr ""
+msgstr "Estilização extra (conforme o tema)"
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
-msgstr ""
+msgstr "Posição do separador:"
 
 #: ../terminatorlib/preferences.glade.h:67
 msgid "Tabs homogeneous"
-msgstr ""
+msgstr "Separadores homogéneos"
 
 #: ../terminatorlib/preferences.glade.h:68
 msgid "Tabs scroll buttons"
-msgstr ""
+msgstr "Botões de deslocação dos separadores"
 
 #: ../terminatorlib/preferences.glade.h:69
 msgid "<b>Terminal Titlebar</b>"
-msgstr ""
+msgstr "<b>Barra de título do terminal</b>"
 
 #: ../terminatorlib/preferences.glade.h:70
 msgid "Font color:"
@@ -858,7 +875,7 @@
 
 #: ../terminatorlib/preferences.glade.h:71
 msgid "Background:"
-msgstr ""
+msgstr "Fundo:"
 
 #: ../terminatorlib/preferences.glade.h:72
 msgid "Focused"
@@ -866,19 +883,19 @@
 
 #: ../terminatorlib/preferences.glade.h:73
 msgid "Inactive"
-msgstr ""
+msgstr "Inativo"
 
 #: ../terminatorlib/preferences.glade.h:74
 msgid "Receiving"
-msgstr ""
+msgstr "A receber"
 
 #: ../terminatorlib/preferences.glade.h:75
 msgid "Hide size from title"
-msgstr ""
+msgstr "Ocultar tamanho do título"
 
 #: ../terminatorlib/preferences.glade.h:76
 msgid "_Use the system font"
-msgstr ""
+msgstr "_Usar tipo de letra do sistema"
 
 #: ../terminatorlib/preferences.glade.h:77
 msgid "_Font:"
@@ -886,7 +903,7 @@
 
 #: ../terminatorlib/preferences.glade.h:78
 msgid "Choose A Titlebar Font"
-msgstr ""
+msgstr "Escolha o tipo de letra para o título"
 
 #: ../terminatorlib/preferences.glade.h:79
 msgid "Global"
@@ -898,7 +915,7 @@
 
 #: ../terminatorlib/preferences.glade.h:81
 msgid "_Use the system fixed width font"
-msgstr "_Utilizar tipo de letra de largura fixa do sistema"
+msgstr "_Usar tipo de letra de largura fixa do sistema"
 
 #: ../terminatorlib/preferences.glade.h:82
 msgid "Choose A Terminal Font"
@@ -918,11 +935,11 @@
 
 #: ../terminatorlib/preferences.glade.h:86
 msgid "Rewrap on resize"
-msgstr ""
+msgstr "Moldar ao redimensionar"
 
 #: ../terminatorlib/preferences.glade.h:87
 msgid "Select-by-_word characters:"
-msgstr "Seleccionar _caracteres da palavra:"
+msgstr "Selecionar _caracteres da palavra:"
 
 #: ../terminatorlib/preferences.glade.h:88
 msgid "<b>Cursor</b>"
@@ -930,19 +947,19 @@
 
 #: ../terminatorlib/preferences.glade.h:89
 msgid "_Shape:"
-msgstr ""
+msgstr "_Forma:"
 
 #: ../terminatorlib/preferences.glade.h:90
 msgid "Color:"
-msgstr ""
+msgstr "Cor:"
 
 #: ../terminatorlib/preferences.glade.h:91
 msgid "Blink"
-msgstr ""
+msgstr "Intermitente"
 
 #: ../terminatorlib/preferences.glade.h:92
 msgid "Foreground"
-msgstr ""
+msgstr "Principal"
 
 #: ../terminatorlib/preferences.glade.h:93
 msgid "<b>Terminal bell</b>"
@@ -974,7 +991,7 @@
 
 #: ../terminatorlib/preferences.glade.h:100
 msgid "Ru_n a custom command instead of my shell"
-msgstr "_Executar um comando personalizado em vez da minha consola"
+msgstr "Executar um coma_ndo personalizado em vez da minha consola"
 
 #: ../terminatorlib/preferences.glade.h:101
 msgid "Custom co_mmand:"
@@ -982,7 +999,7 @@
 
 #: ../terminatorlib/preferences.glade.h:102
 msgid "When command _exits:"
-msgstr "Ao sair do _comando"
+msgstr "Ao sair do _comando:"
 
 #: ../terminatorlib/preferences.glade.h:104
 msgid "<b>Foreground and Background</b>"
@@ -990,7 +1007,7 @@
 
 #: ../terminatorlib/preferences.glade.h:105
 msgid "_Use colors from system theme"
-msgstr "_Utilizar cores do tema do sistema"
+msgstr "_Usar cores do tema do sistema"
 
 #: ../terminatorlib/preferences.glade.h:106
 msgid "Built-in sche_mes:"
@@ -1058,11 +1075,11 @@
 
 #: ../terminatorlib/preferences.glade.h:122
 msgid "Scroll on _output"
-msgstr "Deslocar na _saída de"
+msgstr "Desl_ocar na saída de"
 
 #: ../terminatorlib/preferences.glade.h:123
 msgid "Scroll on _keystroke"
-msgstr "Deslocar ao premir o _teclado"
+msgstr "Deslocar ao premir a _tecla"
 
 #: ../terminatorlib/preferences.glade.h:124
 msgid "Infinite Scrollback"
@@ -1070,7 +1087,7 @@
 
 #: ../terminatorlib/preferences.glade.h:125
 msgid "Scroll_back:"
-msgstr "Deslocamento para _trás:"
+msgstr "Deslocação para _trás:"
 
 #: ../terminatorlib/preferences.glade.h:126
 msgid "lines"
@@ -1078,7 +1095,7 @@
 
 #: ../terminatorlib/preferences.glade.h:127
 msgid "Scrolling"
-msgstr "Deslocamento"
+msgstr "Deslocação"
 
 #: ../terminatorlib/preferences.glade.h:128
 msgid ""
@@ -1102,7 +1119,7 @@
 
 #: ../terminatorlib/preferences.glade.h:131
 msgid "Encoding:"
-msgstr ""
+msgstr "Codificação:"
 
 #: ../terminatorlib/preferences.glade.h:132
 msgid "_Reset Compatibility Options to Defaults"
@@ -1119,11 +1136,11 @@
 
 #: ../terminatorlib/preferences.glade.h:136
 msgid "Type"
-msgstr ""
+msgstr "Tipo"
 
 #: ../terminatorlib/preferences.glade.h:138
 msgid "Profile:"
-msgstr ""
+msgstr "Perfil:"
 
 #: ../terminatorlib/preferences.glade.h:139
 msgid "Custom command:"
@@ -1131,27 +1148,27 @@
 
 #: ../terminatorlib/preferences.glade.h:140
 msgid "Working directory:"
-msgstr ""
+msgstr "Diretório de trabalho:"
 
 #: ../terminatorlib/preferences.glade.h:141
 msgid "Layouts"
-msgstr "Esquemas"
+msgstr "Disposições"
 
 #: ../terminatorlib/preferences.glade.h:142
 msgid "Action"
-msgstr ""
+msgstr "Ação"
 
 #: ../terminatorlib/preferences.glade.h:143
 msgid "Keybinding"
-msgstr ""
+msgstr "Associação de tecla"
 
 #: ../terminatorlib/preferences.glade.h:144
 msgid "Keybindings"
-msgstr "Teclas de atalho"
+msgstr "Associação de teclas"
 
 #: ../terminatorlib/preferences.glade.h:145
 msgid "Plugin"
-msgstr ""
+msgstr "Plugin"
 
 #: ../terminatorlib/preferences.glade.h:146
 msgid "This plugin has no configuration options"
@@ -1189,254 +1206,260 @@
 "<a href=\"https://bugs.launchpad.net/terminator\">Bugs / Enhancements</a>\n"
 "<a href=\"https://translations.launchpad.net/terminator\">Translations</a>"
 msgstr ""
+"<a href=\"http://gnometerminator.blogspot.com/p/introduction.html\">Página "
+"web</a>\n"
+"<a href=\"http://gnometerminator.blogspot.com/\">Blog/Novidades</a>\n"
+"<a href=\"https://launchpad.net/terminator\">Desenvolvimento</a>\n"
+"<a href=\"https://bugs.launchpad.net/terminator\">Erros/Funcionalidades</a>\n"
+"<a href=\"https://translations.launchpad.net/terminator\">Tradução</a>"
 
 #: ../terminatorlib/preferences.glade.h:159
 msgid "About"
-msgstr ""
+msgstr "Acerca"
 
 #: ../terminatorlib/prefseditor.py:96
 msgid "Increase font size"
-msgstr ""
+msgstr "Aumentar tamanho do tipo de letra"
 
 #: ../terminatorlib/prefseditor.py:97
 msgid "Decrease font size"
-msgstr ""
+msgstr "Diminuir tamanho do tipo de letra"
 
 #: ../terminatorlib/prefseditor.py:98
 msgid "Restore original font size"
-msgstr ""
+msgstr "restaurar tamanho padrão"
 
 #: ../terminatorlib/prefseditor.py:99
 msgid "Create a new tab"
-msgstr ""
+msgstr "Criar novo separador"
 
 #: ../terminatorlib/prefseditor.py:100 ../terminatorlib/prefseditor.py:102
 msgid "Focus the next terminal"
-msgstr ""
+msgstr "Focar o terminal seguinte"
 
 #: ../terminatorlib/prefseditor.py:101 ../terminatorlib/prefseditor.py:103
 msgid "Focus the previous terminal"
-msgstr ""
+msgstr "Focar o terminal anterior"
 
 #: ../terminatorlib/prefseditor.py:104
 msgid "Focus the terminal above"
-msgstr ""
+msgstr "Focar o terminal acima"
 
 #: ../terminatorlib/prefseditor.py:105
 msgid "Focus the terminal below"
-msgstr ""
+msgstr "Focar o terminal abaixo"
 
 #: ../terminatorlib/prefseditor.py:106
 msgid "Focus the terminal left"
-msgstr ""
+msgstr "Focar o terminal à esquerda"
 
 #: ../terminatorlib/prefseditor.py:107
 msgid "Focus the terminal right"
-msgstr ""
+msgstr "Focar o terminal à direita"
 
 #: ../terminatorlib/prefseditor.py:108
 msgid "Rotate terminals clockwise"
-msgstr ""
+msgstr "Rodar terminais para a direita"
 
 #: ../terminatorlib/prefseditor.py:109
 msgid "Rotate terminals counter-clockwise"
-msgstr ""
+msgstr "Rodar terminais para a esquerda"
 
 #: ../terminatorlib/prefseditor.py:110
 msgid "Split horizontally"
-msgstr ""
+msgstr "Dividir horizontalmente"
 
 #: ../terminatorlib/prefseditor.py:111
 msgid "Split vertically"
-msgstr ""
+msgstr "Dividir verticalmente"
 
 #: ../terminatorlib/prefseditor.py:112
 msgid "Close terminal"
-msgstr ""
+msgstr "Fechar terminal"
 
 #: ../terminatorlib/prefseditor.py:113
 msgid "Copy selected text"
-msgstr ""
+msgstr "Copiar texto selecionado"
 
 #: ../terminatorlib/prefseditor.py:114
 msgid "Paste clipboard"
-msgstr ""
+msgstr "Colar da área de transferência"
 
 #: ../terminatorlib/prefseditor.py:115
 msgid "Show/Hide the scrollbar"
-msgstr ""
+msgstr "Mostrar/ocultar barra de deslocação"
 
 #: ../terminatorlib/prefseditor.py:116
 msgid "Search terminal scrollback"
-msgstr ""
+msgstr "Pesquisar para trás"
 
 #: ../terminatorlib/prefseditor.py:117
 msgid "Scroll upwards one page"
-msgstr ""
+msgstr "Deslocar para uma página acima"
 
 #: ../terminatorlib/prefseditor.py:118
 msgid "Scroll downwards one page"
-msgstr ""
+msgstr "Deslocar para uma página abaixo"
 
 #: ../terminatorlib/prefseditor.py:119
 msgid "Scroll upwards half a page"
-msgstr ""
+msgstr "Deslocar para meia página acima"
 
 #: ../terminatorlib/prefseditor.py:120
 msgid "Scroll downwards half a page"
-msgstr ""
+msgstr "Deslocar para meia página abaixo"
 
 #: ../terminatorlib/prefseditor.py:121
 msgid "Scroll upwards one line"
-msgstr ""
+msgstr "Deslocar para uma linha acima"
 
 #: ../terminatorlib/prefseditor.py:122
 msgid "Scroll downwards one line"
-msgstr ""
+msgstr "Deslocar para uma linha abaixo"
 
 #: ../terminatorlib/prefseditor.py:123
 msgid "Close window"
-msgstr ""
+msgstr "Fechar janela"
 
 #: ../terminatorlib/prefseditor.py:124
 msgid "Resize the terminal up"
-msgstr ""
+msgstr "Redimensionar terminal para cima"
 
 #: ../terminatorlib/prefseditor.py:125
 msgid "Resize the terminal down"
-msgstr ""
+msgstr "Redimensionar terminal para baixo"
 
 #: ../terminatorlib/prefseditor.py:126
 msgid "Resize the terminal left"
-msgstr ""
+msgstr "Redimensionar terminal para a esquerda"
 
 #: ../terminatorlib/prefseditor.py:127
 msgid "Resize the terminal right"
-msgstr ""
+msgstr "Redimensionar terminal para a direita"
 
 #: ../terminatorlib/prefseditor.py:128
 msgid "Move the tab right"
-msgstr ""
+msgstr "Mover separador para a direita"
 
 #: ../terminatorlib/prefseditor.py:129
 msgid "Move the tab left"
-msgstr ""
+msgstr "Mover separador para a esquerda"
 
 #: ../terminatorlib/prefseditor.py:130
 msgid "Maximize terminal"
-msgstr ""
+msgstr "Maximizar terminal"
 
 #: ../terminatorlib/prefseditor.py:131
 msgid "Zoom terminal"
-msgstr ""
+msgstr "Ampliar terminal"
 
 #: ../terminatorlib/prefseditor.py:132
 msgid "Switch to the next tab"
-msgstr ""
+msgstr "Trocar para o separador seguinte"
 
 #: ../terminatorlib/prefseditor.py:133
 msgid "Switch to the previous tab"
-msgstr ""
+msgstr "Trocar para o separador anterior"
 
 #: ../terminatorlib/prefseditor.py:134
 msgid "Switch to the first tab"
-msgstr ""
+msgstr "Trocar para o primeiro separador"
 
 #: ../terminatorlib/prefseditor.py:135
 msgid "Switch to the second tab"
-msgstr ""
+msgstr "Trocar para o segundo separador"
 
 #: ../terminatorlib/prefseditor.py:136
 msgid "Switch to the third tab"
-msgstr ""
+msgstr "Trocar para o terceiro separador"
 
 #: ../terminatorlib/prefseditor.py:137
 msgid "Switch to the fourth tab"
-msgstr ""
+msgstr "Trocar para o quarto separador"
 
 #: ../terminatorlib/prefseditor.py:138
 msgid "Switch to the fifth tab"
-msgstr ""
+msgstr "Trocar para o quinto separador"
 
 #: ../terminatorlib/prefseditor.py:139
 msgid "Switch to the sixth tab"
-msgstr ""
+msgstr "Trocar para o sexto separador"
 
 #: ../terminatorlib/prefseditor.py:140
 msgid "Switch to the seventh tab"
-msgstr ""
+msgstr "Trocar para o sétimo separador"
 
 #: ../terminatorlib/prefseditor.py:141
 msgid "Switch to the eighth tab"
-msgstr ""
+msgstr "Trocar para o oitavo separador"
 
 #: ../terminatorlib/prefseditor.py:142
 msgid "Switch to the ninth tab"
-msgstr ""
+msgstr "Trocar para o nono separador"
 
 #: ../terminatorlib/prefseditor.py:143
 msgid "Switch to the tenth tab"
-msgstr ""
+msgstr "Trocar para o décimo separador"
 
 #: ../terminatorlib/prefseditor.py:144
 msgid "Toggle fullscreen"
-msgstr ""
+msgstr "Alternar ecrã completo"
 
 #: ../terminatorlib/prefseditor.py:145
 msgid "Reset the terminal"
-msgstr ""
+msgstr "Repor terminal"
 
 #: ../terminatorlib/prefseditor.py:146
 msgid "Reset and clear the terminal"
-msgstr ""
+msgstr "Repor e limpar o terminal"
 
 #: ../terminatorlib/prefseditor.py:147
 msgid "Toggle window visibility"
-msgstr ""
+msgstr "Alternar visibilidade da janela"
 
 #: ../terminatorlib/prefseditor.py:148
 msgid "Group all terminals"
-msgstr ""
+msgstr "Agrupar terminais"
 
 #: ../terminatorlib/prefseditor.py:149
 msgid "Group/Ungroup all terminals"
-msgstr ""
+msgstr "Agrupar/desagrupar terminais"
 
 #: ../terminatorlib/prefseditor.py:150
 msgid "Ungroup all terminals"
-msgstr ""
+msgstr "Deagrupar todos os terminais"
 
 #: ../terminatorlib/prefseditor.py:151
 msgid "Group terminals in tab"
-msgstr ""
+msgstr "Agrupar terminais para um separador"
 
 #: ../terminatorlib/prefseditor.py:152
 msgid "Group/Ungroup terminals in tab"
-msgstr ""
+msgstr "Agrupar/desagrupar terminais para um separador"
 
 #: ../terminatorlib/prefseditor.py:153
 msgid "Ungroup terminals in tab"
-msgstr ""
+msgstr "Desagrupar terminais do separador"
 
 #: ../terminatorlib/prefseditor.py:154
 msgid "Create a new window"
-msgstr ""
+msgstr "Criar nova janela"
 
 #: ../terminatorlib/prefseditor.py:155
 msgid "Spawn a new Terminator process"
-msgstr ""
+msgstr "Expandir novo processo terminator"
 
 #: ../terminatorlib/prefseditor.py:156
 msgid "Don't broadcast key presses"
-msgstr ""
+msgstr "Não difundir pressões de teclas"
 
 #: ../terminatorlib/prefseditor.py:157
 msgid "Broadcast key presses to group"
-msgstr ""
+msgstr "Difundir pressões de teclas para o grupo"
 
 #: ../terminatorlib/prefseditor.py:158
 msgid "Broadcast key events to all"
-msgstr ""
+msgstr "Difundir eventos de teclas para tudo"
 
 #: ../terminatorlib/prefseditor.py:159
 msgid "Insert terminal number"
@@ -1448,15 +1471,15 @@
 
 #: ../terminatorlib/prefseditor.py:161
 msgid "Edit window title"
-msgstr ""
+msgstr "Editar título da janela"
 
 #: ../terminatorlib/prefseditor.py:162
 msgid "Edit terminal title"
-msgstr ""
+msgstr "Editar título do terminal"
 
 #: ../terminatorlib/prefseditor.py:163
 msgid "Edit tab title"
-msgstr ""
+msgstr "Editar título do separador"
 
 #: ../terminatorlib/prefseditor.py:164
 msgid "Open layout launcher window"
@@ -1464,15 +1487,15 @@
 
 #: ../terminatorlib/prefseditor.py:165
 msgid "Switch to next profile"
-msgstr ""
+msgstr "Trocar para o perfil seguinte"
 
 #: ../terminatorlib/prefseditor.py:166
 msgid "Switch to previous profile"
-msgstr ""
+msgstr "Trocar para o perfil anterior"
 
 #: ../terminatorlib/prefseditor.py:167
 msgid "Open the manual"
-msgstr ""
+msgstr "Abrir o manual"
 
 #: ../terminatorlib/prefseditor.py:1136 ../terminatorlib/prefseditor.py:1141
 msgid "New Profile"
@@ -1504,11 +1527,11 @@
 #. Wrap checkbox
 #: ../terminatorlib/searchbar.py:85
 msgid "Wrap"
-msgstr ""
+msgstr "Moldar"
 
 #: ../terminatorlib/searchbar.py:144
 msgid "Searching scrollback"
-msgstr "Pesquisando deslocamentos anteriores"
+msgstr "Pesquisar deslocações anteriores"
 
 #: ../terminatorlib/searchbar.py:162 ../terminatorlib/searchbar.py:188
 msgid "No more results"
@@ -1524,7 +1547,7 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:60
 msgid "_Copy email address"
-msgstr "_Copiar endereço eletrónico"
+msgstr "_Copiar endereço de e-mail"
 
 #: ../terminatorlib/terminal_popup_menu.py:62
 msgid "Ca_ll VoIP address"
@@ -1544,11 +1567,11 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:102
 msgid "_Copy"
-msgstr ""
+msgstr "_Copiar"
 
 #: ../terminatorlib/terminal_popup_menu.py:107
 msgid "_Paste"
-msgstr ""
+msgstr "Co_lar"
 
 #: ../terminatorlib/terminal_popup_menu.py:114
 msgid "Split H_orizontally"
@@ -1568,7 +1591,7 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:147
 msgid "_Close"
-msgstr ""
+msgstr "Fe_char"
 
 #: ../terminatorlib/terminal_popup_menu.py:156
 msgid "_Zoom terminal"
@@ -1576,7 +1599,7 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:161
 msgid "Ma_ximize terminal"
-msgstr ""
+msgstr "Ma_ximizar terminal"
 
 #: ../terminatorlib/terminal_popup_menu.py:168
 msgid "_Restore all terminals"
@@ -1596,7 +1619,7 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:254
 msgid "Default"
-msgstr "Omissão"
+msgstr "Padrão"
 
 #: ../terminatorlib/terminal_popup_menu.py:257
 msgid "User defined"
@@ -1608,11 +1631,11 @@
 
 #: ../terminatorlib/terminal.py:433
 msgid "N_ew group..."
-msgstr ""
+msgstr "N_ovo grupo..."
 
 #: ../terminatorlib/terminal.py:439
 msgid "_None"
-msgstr ""
+msgstr "_Nenhum"
 
 #: ../terminatorlib/terminal.py:459
 #, python-format
@@ -1625,7 +1648,7 @@
 
 #: ../terminatorlib/terminal.py:469
 msgid "Ungro_up all in tab"
-msgstr ""
+msgstr "Desagr_upar tudo no separador"
 
 #: ../terminatorlib/terminal.py:474
 msgid "Remove all groups"
@@ -1638,27 +1661,27 @@
 
 #: ../terminatorlib/terminal.py:491
 msgid "Broadcast _all"
-msgstr ""
+msgstr "Difubdir tod_as"
 
 #: ../terminatorlib/terminal.py:492
 msgid "Broadcast _group"
-msgstr ""
+msgstr "Difundir _grupo"
 
 #: ../terminatorlib/terminal.py:493
 msgid "Broadcast _off"
-msgstr ""
+msgstr "Difusã_o desativada"
 
 #: ../terminatorlib/terminal.py:509
 msgid "_Split to this group"
-msgstr ""
+msgstr "_Separar este grupo"
 
 #: ../terminatorlib/terminal.py:514
 msgid "Auto_clean groups"
-msgstr ""
+msgstr "Limpar grupos automati_camente"
 
 #: ../terminatorlib/terminal.py:521
 msgid "_Insert terminal number"
-msgstr ""
+msgstr "_Inserir número do terminal"
 
 #: ../terminatorlib/terminal.py:525
 msgid "Insert _padded terminal number"
@@ -1678,103 +1701,103 @@
 
 #: ../terminatorlib/terminal.py:1856
 msgid "Enter a new title for the Terminator window..."
-msgstr "Introduza o novo título para a janela Terminator..."
+msgstr "Digite o novo título para a janela Terminator..."
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Alpha"
-msgstr ""
+msgstr "Alfa"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Beta"
-msgstr ""
+msgstr "Beta"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Gamma"
-msgstr ""
+msgstr "Gama"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Delta"
-msgstr ""
+msgstr "Delta"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Epsilon"
-msgstr ""
+msgstr "Ípsilon"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Zeta"
-msgstr ""
+msgstr "Zeta"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Eta"
-msgstr ""
+msgstr "Eta"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Theta"
-msgstr ""
+msgstr "Teta"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Iota"
-msgstr ""
+msgstr "Iota"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Kappa"
-msgstr ""
+msgstr "Capa"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Lambda"
-msgstr ""
+msgstr "Lambda"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Mu"
-msgstr ""
+msgstr "Mu"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Nu"
-msgstr ""
+msgstr "Nu"
 
 #: ../terminatorlib/titlebar.py:255
 msgid "Xi"
-msgstr ""
+msgstr "Xi"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Omicron"
-msgstr ""
+msgstr "Ómicron"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Pi"
-msgstr ""
+msgstr "Pi"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Rho"
-msgstr ""
+msgstr "Ró"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Sigma"
-msgstr ""
+msgstr "Sigma"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Tau"
-msgstr ""
+msgstr "Tau"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Upsilon"
-msgstr ""
+msgstr "Upsilon"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Phi"
-msgstr ""
+msgstr "Fi"
 
 #: ../terminatorlib/titlebar.py:257
 msgid "Chi"
-msgstr ""
+msgstr "Chi"
 
 #: ../terminatorlib/titlebar.py:257
 msgid "Psi"
-msgstr ""
+msgstr "Psi"
 
 #: ../terminatorlib/titlebar.py:257
 msgid "Omega"
-msgstr ""
+msgstr "Ómega"
 
 #: ../terminatorlib/window.py:276
 msgid "window"
diff -x .bzr -uNr terminator-1.91/po/ro.po python3/po/ro.po
--- terminator-1.91/po/ro.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ro.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ro\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ru.po python3/po/ru.po
--- terminator-1.91/po/ru.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ru.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,14 +8,14 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2015-08-05 12:41+0000\n"
-"Last-Translator: Stephen Boddy <Unknown>\n"
+"PO-Revision-Date: 2017-04-03 11:49+0000\n"
+"Last-Translator: Pavel Ivanov <Unknown>\n"
 "Language-Team: Russian <ru@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ru\n"
 
 #. Command         uuid req.    Description
@@ -92,7 +92,7 @@
 #: ../data/terminator.appdata.xml.in.h:3
 #: ../terminatorlib/preferences.glade.h:149
 msgid "The robot future of terminals"
-msgstr ""
+msgstr "Технологии будущего для терминалов"
 
 #: ../data/terminator.appdata.xml.in.h:4
 msgid ""
@@ -182,12 +182,16 @@
 "This window has several terminals open. Closing the window will also close "
 "all terminals within it."
 msgstr ""
+"Это окно имеет несколько запущенных терминалов. Закрытие окна повлечет за "
+"собой так же и их закрытие."
 
 #: ../terminatorlib/container.py:178
 msgid ""
 "This tab has several terminals open. Closing the tab will also close all "
 "terminals within it."
 msgstr ""
+"Эта вкладка имеет несколько запущенных терминалов. Ее закрытие повлечет за "
+"собой так же и их закрытие."
 
 #: ../terminatorlib/container.py:198
 msgid "Do not show this message next time"
@@ -344,7 +348,7 @@
 #: ../terminatorlib/layoutlauncher.glade.h:2
 #: ../terminatorlib/preferences.glade.h:135
 msgid "Layout"
-msgstr ""
+msgstr "Компоновка"
 
 #: ../terminatorlib/layoutlauncher.glade.h:3
 msgid "Launch"
@@ -422,11 +426,11 @@
 
 #: ../terminatorlib/optionparse.py:89
 msgid "Launch with the given layout"
-msgstr ""
+msgstr "Запуск с заданной компоновкой элементов"
 
 #: ../terminatorlib/optionparse.py:91
 msgid "Select a layout from a list"
-msgstr ""
+msgstr "Выбор компоновки из списка"
 
 #: ../terminatorlib/optionparse.py:93
 msgid "Use a different profile as the default"
@@ -494,7 +498,7 @@
 #: ../terminatorlib/plugins/logger.py:22
 #: ../terminatorlib/plugins/terminalshot.py:21
 msgid "_Cancel"
-msgstr ""
+msgstr "О_тменить"
 
 #: ../terminatorlib/plugins/custom_commands.py:125
 #: ../terminatorlib/plugins/custom_commands.py:274
@@ -522,7 +526,7 @@
 
 #: ../terminatorlib/plugins/custom_commands.py:180
 msgid "Up"
-msgstr ""
+msgstr "Выше"
 
 #: ../terminatorlib/plugins/custom_commands.py:186
 msgid "Down"
@@ -530,19 +534,19 @@
 
 #: ../terminatorlib/plugins/custom_commands.py:192
 msgid "Last"
-msgstr ""
+msgstr "Последний"
 
 #: ../terminatorlib/plugins/custom_commands.py:198
 msgid "New"
-msgstr ""
+msgstr "Новый"
 
 #: ../terminatorlib/plugins/custom_commands.py:203
 msgid "Edit"
-msgstr ""
+msgstr "Редактировать"
 
 #: ../terminatorlib/plugins/custom_commands.py:209
 msgid "Delete"
-msgstr ""
+msgstr "Удалить"
 
 #: ../terminatorlib/plugins/custom_commands.py:269
 msgid "New Command"
@@ -574,7 +578,7 @@
 #: ../terminatorlib/plugins/logger.py:23
 #: ../terminatorlib/plugins/terminalshot.py:22
 msgid "_Save"
-msgstr ""
+msgstr "Сохранит_ь"
 
 #: ../terminatorlib/plugins/logger.py:34
 msgid "Start _Logger"
@@ -667,19 +671,19 @@
 
 #: ../terminatorlib/preferences.glade.h:18
 msgid "Solarized light"
-msgstr ""
+msgstr "Solarized светлая"
 
 #: ../terminatorlib/preferences.glade.h:19
 msgid "Solarized dark"
-msgstr ""
+msgstr "Solarized тёмная"
 
 #: ../terminatorlib/preferences.glade.h:20
 msgid "Gruvbox light"
-msgstr ""
+msgstr "Gruvbox светлая"
 
 #: ../terminatorlib/preferences.glade.h:21
 msgid "Gruvbox dark"
-msgstr ""
+msgstr "Gruvbox темная"
 
 #: ../terminatorlib/preferences.glade.h:22
 msgid "Custom"
@@ -727,7 +731,7 @@
 
 #: ../terminatorlib/preferences.glade.h:33
 msgid "Solarized"
-msgstr ""
+msgstr "Solarized"
 
 #: ../terminatorlib/preferences.glade.h:34
 msgid "On the left side"
@@ -807,7 +811,7 @@
 
 #: ../terminatorlib/preferences.glade.h:54
 msgid "Mouse focus:"
-msgstr ""
+msgstr "Позиция мыши:"
 
 #: ../terminatorlib/preferences.glade.h:55
 msgid "Broadcast default:"
@@ -819,7 +823,7 @@
 
 #: ../terminatorlib/preferences.glade.h:57
 msgid "Smart copy"
-msgstr ""
+msgstr "\"Умное\" копирование"
 
 #: ../terminatorlib/preferences.glade.h:58
 msgid "Re-use profiles for new terminals"
@@ -831,7 +835,7 @@
 
 #: ../terminatorlib/preferences.glade.h:60
 msgid "Custom URL handler:"
-msgstr ""
+msgstr "Произвольный URL механизм:"
 
 #: ../terminatorlib/preferences.glade.h:61
 msgid "<b>Appearance</b>"
@@ -843,7 +847,7 @@
 
 #: ../terminatorlib/preferences.glade.h:63
 msgid "Unfocused terminal font brightness:"
-msgstr ""
+msgstr "Яркость шрифта для терминала вне фокуса:"
 
 #: ../terminatorlib/preferences.glade.h:64
 msgid "Terminal separator size:"
@@ -851,7 +855,7 @@
 
 #: ../terminatorlib/preferences.glade.h:65
 msgid "Extra Styling (Theme dependant)"
-msgstr ""
+msgstr "Экстра Дизайн (зависит от темы)"
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
@@ -859,15 +863,15 @@
 
 #: ../terminatorlib/preferences.glade.h:67
 msgid "Tabs homogeneous"
-msgstr ""
+msgstr "Идентичные вкладки"
 
 #: ../terminatorlib/preferences.glade.h:68
 msgid "Tabs scroll buttons"
-msgstr ""
+msgstr "Кнопки переключения вкладок"
 
 #: ../terminatorlib/preferences.glade.h:69
 msgid "<b>Terminal Titlebar</b>"
-msgstr ""
+msgstr "<b>Название терминала</b>"
 
 #: ../terminatorlib/preferences.glade.h:70
 msgid "Font color:"
@@ -935,7 +939,7 @@
 
 #: ../terminatorlib/preferences.glade.h:86
 msgid "Rewrap on resize"
-msgstr ""
+msgstr "Перерисовать при масштабировании"
 
 #: ../terminatorlib/preferences.glade.h:87
 msgid "Select-by-_word characters:"
@@ -959,7 +963,7 @@
 
 #: ../terminatorlib/preferences.glade.h:92
 msgid "Foreground"
-msgstr ""
+msgstr "Передний План"
 
 #: ../terminatorlib/preferences.glade.h:93
 msgid "<b>Terminal bell</b>"
@@ -1055,7 +1059,7 @@
 
 #: ../terminatorlib/preferences.glade.h:117
 msgid "S_hade transparent background:"
-msgstr ""
+msgstr "Затенять прозрачный фон:"
 
 #: ../terminatorlib/preferences.glade.h:118
 msgid "<small><i>None</i></small>"
@@ -1119,7 +1123,7 @@
 
 #: ../terminatorlib/preferences.glade.h:131
 msgid "Encoding:"
-msgstr ""
+msgstr "Кодировка:"
 
 #: ../terminatorlib/preferences.glade.h:132
 msgid "_Reset Compatibility Options to Defaults"
@@ -1191,6 +1195,17 @@
 "users. If you have any suggestions, please file wishlist bugs! (see left for "
 "the Development link)"
 msgstr ""
+"Задачей данного проекта является создание удобного инструмента для "
+"совмещения терминалов. Вдохновленный такими программами как gnome-multi-"
+"term, quadkonsole и подобных, он прежде всего нацелен собирать терминалы в "
+"сетки (которые в свою очередь могут разноситься по вкладкам, которые, кстати "
+"Terminator так же поддерживает).\n"
+"\n"
+"Большая часть функционала заимствована из GNOME Terminal и мы со временем "
+"добавляем больше разных плюшек оттуда. Но хотелось бы как-то еще расширить "
+"его возможности для сисадминов и прочих пользователей. Если у вас есть какие-"
+"либо предложения, пожалуйста озвучьте их на багтрекере (wishlist bugs)! (см. "
+"сайт разработчиков)"
 
 #: ../terminatorlib/preferences.glade.h:153
 msgid "The Manual"
@@ -1206,6 +1221,14 @@
 "<a href=\"https://bugs.launchpad.net/terminator\">Bugs / Enhancements</a>\n"
 "<a href=\"https://translations.launchpad.net/terminator\">Translations</a>"
 msgstr ""
+"<a "
+"href=\"http://gnometerminator.blogspot.com/p/introduction.html\">Главная</a>"
+"\n"
+"<a href=\"http://gnometerminator.blogspot.com/\">Блог / Новости</a>\n"
+"<a href=\"https://launchpad.net/terminator\">Разработка</a>\n"
+"<a href=\"https://bugs.launchpad.net/terminator\">Баги / "
+"Совершенствование</a>\n"
+"<a href=\"https://translations.launchpad.net/terminator\">Переводы</a>"
 
 #: ../terminatorlib/preferences.glade.h:159
 msgid "About"
@@ -1241,15 +1264,15 @@
 
 #: ../terminatorlib/prefseditor.py:105
 msgid "Focus the terminal below"
-msgstr ""
+msgstr "Сделать активным терминал ниже"
 
 #: ../terminatorlib/prefseditor.py:106
 msgid "Focus the terminal left"
-msgstr ""
+msgstr "Сделать активным терминал слева"
 
 #: ../terminatorlib/prefseditor.py:107
 msgid "Focus the terminal right"
-msgstr ""
+msgstr "Сделать активным терминал справа"
 
 #: ../terminatorlib/prefseditor.py:108
 msgid "Rotate terminals clockwise"
@@ -1289,27 +1312,27 @@
 
 #: ../terminatorlib/prefseditor.py:117
 msgid "Scroll upwards one page"
-msgstr ""
+msgstr "Прокрутить вверх на страницу"
 
 #: ../terminatorlib/prefseditor.py:118
 msgid "Scroll downwards one page"
-msgstr ""
+msgstr "Прокрутить вниз на страницу"
 
 #: ../terminatorlib/prefseditor.py:119
 msgid "Scroll upwards half a page"
-msgstr ""
+msgstr "Прокрутить вверх на полстраницы"
 
 #: ../terminatorlib/prefseditor.py:120
 msgid "Scroll downwards half a page"
-msgstr ""
+msgstr "Прокрутить вниз на полстраницы"
 
 #: ../terminatorlib/prefseditor.py:121
 msgid "Scroll upwards one line"
-msgstr ""
+msgstr "Прокрутить вверх на строку"
 
 #: ../terminatorlib/prefseditor.py:122
 msgid "Scroll downwards one line"
-msgstr ""
+msgstr "Прокрутить вниз на строку"
 
 #: ../terminatorlib/prefseditor.py:123
 msgid "Close window"
@@ -1317,19 +1340,19 @@
 
 #: ../terminatorlib/prefseditor.py:124
 msgid "Resize the terminal up"
-msgstr ""
+msgstr "Изменить размер терминала сверху"
 
 #: ../terminatorlib/prefseditor.py:125
 msgid "Resize the terminal down"
-msgstr ""
+msgstr "Изменить размер терминала снизу"
 
 #: ../terminatorlib/prefseditor.py:126
 msgid "Resize the terminal left"
-msgstr ""
+msgstr "Изменить размер терминала слева"
 
 #: ../terminatorlib/prefseditor.py:127
 msgid "Resize the terminal right"
-msgstr ""
+msgstr "Изменить размер терминала справа"
 
 #: ../terminatorlib/prefseditor.py:128
 msgid "Move the tab right"
@@ -1409,7 +1432,7 @@
 
 #: ../terminatorlib/prefseditor.py:147
 msgid "Toggle window visibility"
-msgstr ""
+msgstr "Показать/Скрыть окно"
 
 #: ../terminatorlib/prefseditor.py:148
 msgid "Group all terminals"
@@ -1417,7 +1440,7 @@
 
 #: ../terminatorlib/prefseditor.py:149
 msgid "Group/Ungroup all terminals"
-msgstr ""
+msgstr "Группировать/разрознить все терминалы"
 
 #: ../terminatorlib/prefseditor.py:150
 msgid "Ungroup all terminals"
@@ -1429,7 +1452,7 @@
 
 #: ../terminatorlib/prefseditor.py:152
 msgid "Group/Ungroup terminals in tab"
-msgstr ""
+msgstr "Группировать/разрознить терминалы во вкладке"
 
 #: ../terminatorlib/prefseditor.py:153
 msgid "Ungroup terminals in tab"
@@ -1441,19 +1464,19 @@
 
 #: ../terminatorlib/prefseditor.py:155
 msgid "Spawn a new Terminator process"
-msgstr ""
+msgstr "Создать новый процесс Terminator'а"
 
 #: ../terminatorlib/prefseditor.py:156
 msgid "Don't broadcast key presses"
-msgstr ""
+msgstr "Не транслировать нажатия клавиш"
 
 #: ../terminatorlib/prefseditor.py:157
 msgid "Broadcast key presses to group"
-msgstr ""
+msgstr "Транслировать нажатия клавиш в группу терминалов"
 
 #: ../terminatorlib/prefseditor.py:158
 msgid "Broadcast key events to all"
-msgstr ""
+msgstr "Транслировать нажатия клавиш во все терминалы"
 
 #: ../terminatorlib/prefseditor.py:159
 msgid "Insert terminal number"
@@ -1469,11 +1492,11 @@
 
 #: ../terminatorlib/prefseditor.py:162
 msgid "Edit terminal title"
-msgstr ""
+msgstr "Изменить наименование терминала"
 
 #: ../terminatorlib/prefseditor.py:163
 msgid "Edit tab title"
-msgstr ""
+msgstr "Изменить наименование вкладки"
 
 #: ../terminatorlib/prefseditor.py:164
 msgid "Open layout launcher window"
@@ -1561,11 +1584,11 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:102
 msgid "_Copy"
-msgstr ""
+msgstr "Копировать"
 
 #: ../terminatorlib/terminal_popup_menu.py:107
 msgid "_Paste"
-msgstr ""
+msgstr "Вст_авить"
 
 #: ../terminatorlib/terminal_popup_menu.py:114
 msgid "Split H_orizontally"
@@ -1585,7 +1608,7 @@
 
 #: ../terminatorlib/terminal_popup_menu.py:147
 msgid "_Close"
-msgstr ""
+msgstr "За_крыть"
 
 #: ../terminatorlib/terminal_popup_menu.py:156
 msgid "_Zoom terminal"
@@ -1629,7 +1652,7 @@
 
 #: ../terminatorlib/terminal.py:439
 msgid "_None"
-msgstr ""
+msgstr "_Ничего"
 
 #: ../terminatorlib/terminal.py:459
 #, python-format
@@ -1642,7 +1665,7 @@
 
 #: ../terminatorlib/terminal.py:469
 msgid "Ungro_up all in tab"
-msgstr ""
+msgstr "Раз_рознить терминалы во вкладке"
 
 #: ../terminatorlib/terminal.py:474
 msgid "Remove all groups"
@@ -1655,27 +1678,27 @@
 
 #: ../terminatorlib/terminal.py:491
 msgid "Broadcast _all"
-msgstr ""
+msgstr "Транслировать все_м"
 
 #: ../terminatorlib/terminal.py:492
 msgid "Broadcast _group"
-msgstr ""
+msgstr "Транслировать гру_ппе"
 
 #: ../terminatorlib/terminal.py:493
 msgid "Broadcast _off"
-msgstr ""
+msgstr "Откл_ючить трансляцию"
 
 #: ../terminatorlib/terminal.py:509
 msgid "_Split to this group"
-msgstr ""
+msgstr "Поделить на _эту группу"
 
 #: ../terminatorlib/terminal.py:514
 msgid "Auto_clean groups"
-msgstr ""
+msgstr "Автос_тирание у групп"
 
 #: ../terminatorlib/terminal.py:521
 msgid "_Insert terminal number"
-msgstr ""
+msgstr "_Добавить номер терминала"
 
 #: ../terminatorlib/terminal.py:525
 msgid "Insert _padded terminal number"
diff -x .bzr -uNr terminator-1.91/po/ru_RU.po python3/po/ru_RU.po
--- terminator-1.91/po/ru_RU.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ru_RU.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/si.po python3/po/si.po
--- terminator-1.91/po/si.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/si.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/sk.po python3/po/sk.po
--- terminator-1.91/po/sk.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/sk.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: sk\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/sl.po python3/po/sl.po
--- terminator-1.91/po/sl.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/sl.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: sl\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/sq.po python3/po/sq.po
--- terminator-1.91/po/sq.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/sq.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:01+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:12+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: sq\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/sr.po python3/po/sr.po
--- terminator-1.91/po/sr.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/sr.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:02+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: sr\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/su.po python3/po/su.po
--- terminator-1.91/po/su.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/su.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: su\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/sv.po python3/po/sv.po
--- terminator-1.91/po/sv.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/sv.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,52 +8,52 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2015-08-05 12:42+0000\n"
-"Last-Translator: Mikael Hiort af Ornäs <lakritslemmel@hotmail.com>\n"
+"PO-Revision-Date: 2017-05-11 09:52+0000\n"
+"Last-Translator: Jonatan Nyberg <Unknown>\n"
 "Language-Team: Swedish <sv@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: sv\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
 msgid "Open a new window"
-msgstr ""
+msgstr "Öppna ett nytt fönster"
 
 #: ../remotinator.py:39
 msgid "Open a new tab"
-msgstr ""
+msgstr "Öppna en ny flik"
 
 #: ../remotinator.py:40
 msgid "Split the current terminal horizontally"
-msgstr ""
+msgstr "Dela den nuvarande terminalen horisontellt"
 
 #: ../remotinator.py:41
 msgid "Split the current terminal vertically"
-msgstr ""
+msgstr "Dela den nuvarande terminalen vertikalt"
 
 #: ../remotinator.py:42
 msgid "Get a list of all terminals"
-msgstr ""
+msgstr "Få en lista över alla terminaler"
 
 #: ../remotinator.py:43
 msgid "Get the UUID of a parent window"
-msgstr ""
+msgstr "Få UUID av ett överfönster"
 
 #: ../remotinator.py:44
 msgid "Get the title of a parent window"
-msgstr ""
+msgstr "Få titeln på ett överfönster"
 
 #: ../remotinator.py:45
 msgid "Get the UUID of a parent tab"
-msgstr ""
+msgstr "Hämta UUID för en överflik"
 
 #: ../remotinator.py:46
 msgid "Get the title of a parent tab"
-msgstr ""
+msgstr "Hämta titeln på en överflik"
 
 #: ../remotinator.py:63
 #, python-format
@@ -62,6 +62,9 @@
 "\n"
 "%s"
 msgstr ""
+"Kör en av följande Terminator DBus-kommandon:\n"
+"\n"
+"%s"
 
 #: ../remotinator.py:64
 msgid ""
@@ -87,7 +90,7 @@
 #: ../data/terminator.appdata.xml.in.h:3
 #: ../terminatorlib/preferences.glade.h:149
 msgid "The robot future of terminals"
-msgstr ""
+msgstr "Robot-framtid för terminaler"
 
 #: ../data/terminator.appdata.xml.in.h:4
 msgid ""
@@ -96,6 +99,10 @@
 "terminals in grids (tabs is the most common default method, which Terminator "
 "also supports)."
 msgstr ""
+"Ett kraftverktyg för att ordna terminaler. Det är inspirerat av program som "
+"gnome-multi-term, quadkonsole, o.s.v. i det att huvudfokus är att ordna "
+"terminaler i rutnät (flikar är den vanligaste standardmetoden, vilka "
+"Terminator också stöder)."
 
 #: ../data/terminator.appdata.xml.in.h:5
 msgid ""
@@ -104,42 +111,46 @@
 "out in different directions with useful features for sysadmins and other "
 "users."
 msgstr ""
+"Mycket av beteendet hos Terminator bygger på GNOME Terminal, och vi lägger "
+"till fler funktioner från det medan tiden går, men vi vill också utöka i "
+"olika riktningar med användbara funktioner för sysadmins och andra användare."
 
 #: ../data/terminator.appdata.xml.in.h:6
 msgid "Some highlights:"
-msgstr ""
+msgstr "Några höjdpunkter:"
 
 #: ../data/terminator.appdata.xml.in.h:7
 msgid "Arrange terminals in a grid"
-msgstr ""
+msgstr "Arrangera terminaler i ett rutnät"
 
 #: ../data/terminator.appdata.xml.in.h:8
 msgid "Tabs"
-msgstr ""
+msgstr "Flikar"
 
 #: ../data/terminator.appdata.xml.in.h:9
 msgid "Drag and drop re-ordering of terminals"
-msgstr ""
+msgstr "Dra och släpp omordning av terminaler"
 
 #: ../data/terminator.appdata.xml.in.h:10
 msgid "Lots of keyboard shortcuts"
-msgstr ""
+msgstr "Massor av kortkommandon"
 
 #: ../data/terminator.appdata.xml.in.h:11
 msgid "Save multiple layouts and profiles via GUI preferences editor"
 msgstr ""
+"Spara flera utformningar och profiler via GUI-inställningsredigeraren"
 
 #: ../data/terminator.appdata.xml.in.h:12
 msgid "Simultaneous typing to arbitrary groups of terminals"
-msgstr ""
+msgstr "Samtidigt skrivning till godtyckliga grupper av terminaler"
 
 #: ../data/terminator.appdata.xml.in.h:13
 msgid "And lots more..."
-msgstr ""
+msgstr "Och mycket mer..."
 
 #: ../data/terminator.appdata.xml.in.h:14
 msgid "The main window showing the application in action"
-msgstr ""
+msgstr "Huvudfönstret visar programmet i verkan"
 
 #: ../data/terminator.appdata.xml.in.h:15
 msgid "Getting a little crazy with the terminals"
@@ -328,11 +339,11 @@
 #: ../terminatorlib/layoutlauncher.glade.h:2
 #: ../terminatorlib/preferences.glade.h:135
 msgid "Layout"
-msgstr ""
+msgstr "Utformning"
 
 #: ../terminatorlib/layoutlauncher.glade.h:3
 msgid "Launch"
-msgstr ""
+msgstr "Starta"
 
 #: ../terminatorlib/notebook.py:353
 msgid "tab"
@@ -348,7 +359,7 @@
 
 #: ../terminatorlib/optionparse.py:52
 msgid "Maximize the window"
-msgstr ""
+msgstr "Maximera fönstret"
 
 #: ../terminatorlib/optionparse.py:54
 msgid "Make the window fill the screen"
@@ -492,7 +503,7 @@
 #: ../terminatorlib/plugins/custom_commands.py:156
 #: ../terminatorlib/preferences.glade.h:137
 msgid "Name"
-msgstr ""
+msgstr "Namn"
 
 #: ../terminatorlib/plugins/custom_commands.py:160
 #: ../terminatorlib/preferences.glade.h:103
@@ -578,7 +589,7 @@
 
 #: ../terminatorlib/plugins/terminalshot.py:38
 msgid "Save image"
-msgstr ""
+msgstr "Spara bild"
 
 #: ../terminatorlib/preferences.glade.h:1
 msgid "Automatic"
@@ -603,7 +614,7 @@
 
 #: ../terminatorlib/preferences.glade.h:6
 msgid "Group"
-msgstr ""
+msgstr "Grupp"
 
 #: ../terminatorlib/preferences.glade.h:7
 msgid "None"
@@ -631,7 +642,7 @@
 
 #: ../terminatorlib/preferences.glade.h:13
 msgid "Gray on black"
-msgstr ""
+msgstr "Grått på svart"
 
 #: ../terminatorlib/preferences.glade.h:14
 msgid "Green on black"
@@ -759,7 +770,7 @@
 
 #: ../terminatorlib/preferences.glade.h:46
 msgid "<b>Behavior</b>"
-msgstr ""
+msgstr "<b>Beteende</b>"
 
 #: ../terminatorlib/preferences.glade.h:47
 msgid "Window state:"
@@ -819,7 +830,7 @@
 
 #: ../terminatorlib/preferences.glade.h:61
 msgid "<b>Appearance</b>"
-msgstr ""
+msgstr "<b>Utseende</b>"
 
 #: ../terminatorlib/preferences.glade.h:62
 msgid "Window borders"
@@ -839,7 +850,7 @@
 
 #: ../terminatorlib/preferences.glade.h:66
 msgid "Tab position:"
-msgstr ""
+msgstr "Flikplacering:"
 
 #: ../terminatorlib/preferences.glade.h:67
 msgid "Tabs homogeneous"
@@ -859,7 +870,7 @@
 
 #: ../terminatorlib/preferences.glade.h:71
 msgid "Background:"
-msgstr ""
+msgstr "Bakgrund:"
 
 #: ../terminatorlib/preferences.glade.h:72
 msgid "Focused"
@@ -867,7 +878,7 @@
 
 #: ../terminatorlib/preferences.glade.h:73
 msgid "Inactive"
-msgstr ""
+msgstr "Inaktiv"
 
 #: ../terminatorlib/preferences.glade.h:74
 msgid "Receiving"
@@ -935,11 +946,11 @@
 
 #: ../terminatorlib/preferences.glade.h:90
 msgid "Color:"
-msgstr ""
+msgstr "Färg:"
 
 #: ../terminatorlib/preferences.glade.h:91
 msgid "Blink"
-msgstr ""
+msgstr "Blinka"
 
 #: ../terminatorlib/preferences.glade.h:92
 msgid "Foreground"
@@ -1120,11 +1131,11 @@
 
 #: ../terminatorlib/preferences.glade.h:136
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 #: ../terminatorlib/preferences.glade.h:138
 msgid "Profile:"
-msgstr ""
+msgstr "Profil:"
 
 #: ../terminatorlib/preferences.glade.h:139
 msgid "Custom command:"
@@ -1132,7 +1143,7 @@
 
 #: ../terminatorlib/preferences.glade.h:140
 msgid "Working directory:"
-msgstr ""
+msgstr "Arbetskatalog:"
 
 #: ../terminatorlib/preferences.glade.h:141
 msgid "Layouts"
@@ -1152,7 +1163,7 @@
 
 #: ../terminatorlib/preferences.glade.h:145
 msgid "Plugin"
-msgstr ""
+msgstr "Insticksmodul"
 
 #: ../terminatorlib/preferences.glade.h:146
 msgid "This plugin has no configuration options"
@@ -1193,15 +1204,15 @@
 
 #: ../terminatorlib/preferences.glade.h:159
 msgid "About"
-msgstr ""
+msgstr "Om"
 
 #: ../terminatorlib/prefseditor.py:96
 msgid "Increase font size"
-msgstr ""
+msgstr "Öka teckenstorlek"
 
 #: ../terminatorlib/prefseditor.py:97
 msgid "Decrease font size"
-msgstr ""
+msgstr "Minska teckenstorlek"
 
 #: ../terminatorlib/prefseditor.py:98
 msgid "Restore original font size"
@@ -1209,7 +1220,7 @@
 
 #: ../terminatorlib/prefseditor.py:99
 msgid "Create a new tab"
-msgstr ""
+msgstr "Skapa en ny flik"
 
 #: ../terminatorlib/prefseditor.py:100 ../terminatorlib/prefseditor.py:102
 msgid "Focus the next terminal"
@@ -1257,11 +1268,11 @@
 
 #: ../terminatorlib/prefseditor.py:113
 msgid "Copy selected text"
-msgstr ""
+msgstr "Kopiera markerad text"
 
 #: ../terminatorlib/prefseditor.py:114
 msgid "Paste clipboard"
-msgstr ""
+msgstr "Klistra in urklipp"
 
 #: ../terminatorlib/prefseditor.py:115
 msgid "Show/Hide the scrollbar"
@@ -1297,7 +1308,7 @@
 
 #: ../terminatorlib/prefseditor.py:123
 msgid "Close window"
-msgstr ""
+msgstr "Stäng fönstret"
 
 #: ../terminatorlib/prefseditor.py:124
 msgid "Resize the terminal up"
@@ -1333,11 +1344,11 @@
 
 #: ../terminatorlib/prefseditor.py:132
 msgid "Switch to the next tab"
-msgstr ""
+msgstr "Växla till nästa flik"
 
 #: ../terminatorlib/prefseditor.py:133
 msgid "Switch to the previous tab"
-msgstr ""
+msgstr "Växla till föregående flik"
 
 #: ../terminatorlib/prefseditor.py:134
 msgid "Switch to the first tab"
@@ -1381,7 +1392,7 @@
 
 #: ../terminatorlib/prefseditor.py:144
 msgid "Toggle fullscreen"
-msgstr ""
+msgstr "Växla helskärmsläge"
 
 #: ../terminatorlib/prefseditor.py:145
 msgid "Reset the terminal"
@@ -1421,7 +1432,7 @@
 
 #: ../terminatorlib/prefseditor.py:154
 msgid "Create a new window"
-msgstr ""
+msgstr "Skapa ett nytt fönster"
 
 #: ../terminatorlib/prefseditor.py:155
 msgid "Spawn a new Terminator process"
@@ -1473,7 +1484,7 @@
 
 #: ../terminatorlib/prefseditor.py:167
 msgid "Open the manual"
-msgstr ""
+msgstr "Öppna handboken"
 
 #: ../terminatorlib/prefseditor.py:1136 ../terminatorlib/prefseditor.py:1141
 msgid "New Profile"
@@ -1683,19 +1694,19 @@
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Alpha"
-msgstr ""
+msgstr "Alfa"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Beta"
-msgstr ""
+msgstr "Beta"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Delta"
-msgstr ""
+msgstr "Delta"
 
 #: ../terminatorlib/titlebar.py:254
 msgid "Epsilon"
@@ -1743,7 +1754,7 @@
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Pi"
-msgstr ""
+msgstr "Pi"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Rho"
@@ -1751,7 +1762,7 @@
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Sigma"
-msgstr ""
+msgstr "Sigma"
 
 #: ../terminatorlib/titlebar.py:256
 msgid "Tau"
@@ -1775,7 +1786,7 @@
 
 #: ../terminatorlib/titlebar.py:257
 msgid "Omega"
-msgstr ""
+msgstr "Omega"
 
 #: ../terminatorlib/window.py:276
 msgid "window"
diff -x .bzr -uNr terminator-1.91/po/ta.po python3/po/ta.po
--- terminator-1.91/po/ta.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ta.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ta\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/te.po python3/po/te.po
--- terminator-1.91/po/te.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/te.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: te\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/th.po python3/po/th.po
--- terminator-1.91/po/th.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/th.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: th\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/tr.po python3/po/tr.po
--- terminator-1.91/po/tr.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/tr.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: tr\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/tyv.po python3/po/tyv.po
--- terminator-1.91/po/tyv.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/tyv.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/ug.po python3/po/ug.po
--- terminator-1.91/po/ug.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ug.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
diff -x .bzr -uNr terminator-1.91/po/uk.po python3/po/uk.po
--- terminator-1.91/po/uk.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/uk.po	2019-08-19 19:25:15.963479000 -0400
@@ -8,52 +8,52 @@
 "Project-Id-Version: terminator\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-12 16:51+0100\n"
-"PO-Revision-Date: 2015-08-05 12:42+0000\n"
-"Last-Translator: Roman Koshkin <mar2008m@rambler.ru>\n"
+"PO-Revision-Date: 2017-06-15 12:47+0000\n"
+"Last-Translator: Rostyslav Gaitkulov <Unknown>\n"
 "Language-Team: Ukrainian <uk@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: uk\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
 msgid "Open a new window"
-msgstr ""
+msgstr "Відкрити нове вікно"
 
 #: ../remotinator.py:39
 msgid "Open a new tab"
-msgstr ""
+msgstr "Відкрити нову вкладку"
 
 #: ../remotinator.py:40
 msgid "Split the current terminal horizontally"
-msgstr ""
+msgstr "Розділити поточний термінал по горизонталі"
 
 #: ../remotinator.py:41
 msgid "Split the current terminal vertically"
-msgstr ""
+msgstr "Розділити поточний термінал по вертикалі"
 
 #: ../remotinator.py:42
 msgid "Get a list of all terminals"
-msgstr ""
+msgstr "Вивести список усіх терміналів"
 
 #: ../remotinator.py:43
 msgid "Get the UUID of a parent window"
-msgstr ""
+msgstr "Вивести UUID батьківського вікна"
 
 #: ../remotinator.py:44
 msgid "Get the title of a parent window"
-msgstr ""
+msgstr "Вивести заголовок батьківського вікна"
 
 #: ../remotinator.py:45
 msgid "Get the UUID of a parent tab"
-msgstr ""
+msgstr "Вивести UUID батьківської вкладки"
 
 #: ../remotinator.py:46
 msgid "Get the title of a parent tab"
-msgstr ""
+msgstr "Вивести заголовок батьківської вкладки"
 
 #: ../remotinator.py:63
 #, python-format
@@ -62,6 +62,9 @@
 "\n"
 "%s"
 msgstr ""
+"Виконати одну з наступних команд DBus:\n"
+"\n"
+"%s"
 
 #: ../remotinator.py:64
 msgid ""
diff -x .bzr -uNr terminator-1.91/po/ur.po python3/po/ur.po
--- terminator-1.91/po/ur.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/ur.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: ur\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/vi.po python3/po/vi.po
--- terminator-1.91/po/vi.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/vi.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: vi\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/wa.po python3/po/wa.po
--- terminator-1.91/po/wa.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/wa.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 
 #. Command         uuid req.    Description
 #: ../remotinator.py:38
diff -x .bzr -uNr terminator-1.91/po/zh_CN.po python3/po/zh_CN.po
--- terminator-1.91/po/zh_CN.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/zh_CN.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/zh_HK.po python3/po/zh_HK.po
--- terminator-1.91/po/zh_HK.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/zh_HK.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: zh_HK\n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/po/zh_TW.po python3/po/zh_TW.po
--- terminator-1.91/po/zh_TW.po	2017-02-26 12:45:29.000000000 -0500
+++ python3/po/zh_TW.po	2019-08-19 19:25:15.963479000 -0400
@@ -14,8 +14,8 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2017-02-09 06:03+0000\n"
-"X-Generator: Launchpad (build 18326)\n"
+"X-Launchpad-Export-Date: 2017-08-02 06:13+0000\n"
+"X-Generator: Launchpad (build 18441)\n"
 "Language: \n"
 
 #. Command         uuid req.    Description
diff -x .bzr -uNr terminator-1.91/RELEASING python3/RELEASING
--- terminator-1.91/RELEASING	1969-12-31 19:00:00.000000000 -0500
+++ python3/RELEASING	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,41 @@
+Here are the steps to follow to create a new terminator release:
+
+1.  Ensure there are no local, uncommitted/unpushed modifications.
+
+    $ bzr status
+
+2.  Verify the code passes checks and tests
+
+    $ python setup.py test
+    $ python setup.py check
+
+3.  Update version number.  Edit terminatorlib/version.py and set the
+    version number.  Also edit terminator.spec and set it there. Edit
+    the debian/changelog to add new version. Update the Changelog
+    file if not already up-to-date.
+
+4.  Create the source distribution package
+
+    $ python setup.py sdist
+
+5.  Sign the tarball
+
+    $ gpg -u bryce@bryceharrington.org --armor --output
+      terminator-0.98.tar.gz.asc --detach-sig terminator-0.98.tar.gz
+
+6.  Upload to Launchpad
+
+    + Create the appropriate Milestone
+    + Create a matching Release
+    + Upload the tarball and gpg signature to the Release
+
+7.  Tag the release in trunk
+
+    $ bzr tag 0.98
+    $ bzr push
+
+8.  Post announcements
+
+    + Write a blog post
+    + Create an Announcement on the Launchpad page.
+      Include a link to the blog post URL
diff -x .bzr -uNr terminator-1.91/remotinator python3/remotinator
--- terminator-1.91/remotinator	2017-02-26 12:45:29.000000000 -0500
+++ python3/remotinator	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    remotinator - send commands to Terminator via DBus
 #    Copyright (C) 2006-2010  cmsj@tenshu.net
 #
@@ -51,7 +51,7 @@
 
     command_desc=''
     for command in sorted(COMMANDS.keys()):
-        command_desc += "  %-*s  %s %s\n" % (max([len(x) for x in COMMANDS.keys()]),
+        command_desc += "  %-*s  %s %s\n" % (max([len(x) for x in list(COMMANDS.keys())]),
                                              command,
                                              COMMANDS[command][0] and '*' or ' ',
                                              COMMANDS[command][1])
diff -x .bzr -uNr terminator-1.91/setup.py python3/setup.py
--- terminator-1.91/setup.py	2017-02-28 17:09:52.000000000 -0500
+++ python3/setup.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 
 from distutils.core import setup
 from distutils.dist import Distribution
@@ -53,9 +53,9 @@
           try:
             rc = subprocess.call(['msgfmt', '-o', mo, po])
             if rc != 0:
-              raise Warning, "msgfmt returned %d" % rc
-          except Exception, e:
-            error("Building gettext files failed.  Try setup.py --without-gettext [build|install]")
+              raise Warning("msgfmt returned %d" % rc)
+          except Exception as e:
+            error("Building gettext files failed. Ensure you have gettext installed. Alternatively, try setup.py --without-gettext [build|install]")
             error("Error: %s" % str(e))
             sys.exit(1)
 
@@ -63,14 +63,23 @@
       INTLTOOL_MERGE='intltool-merge'
       desktop_in='data/terminator.desktop.in'
       desktop_data='data/terminator.desktop'
-      os.system ("C_ALL=C " + INTLTOOL_MERGE + " -d -u -c " + TOP_BUILDDIR +
+      rc = os.system ("C_ALL=C " + INTLTOOL_MERGE + " -d -u -c " + TOP_BUILDDIR +
                  "/po/.intltool-merge-cache " + TOP_BUILDDIR + "/po " +
                  desktop_in + " " + desktop_data)
+      if rc != 0:
+        # run the desktop_in through a command to strip the "_" characters
+        with open(desktop_in) as file_in, open(desktop_data, 'w') as file_data:
+          [file_data.write(line.lstrip('_')) for line in file_in]
+
       appdata_in='data/terminator.appdata.xml.in'
       appdata_data='data/terminator.appdata.xml'
-      os.system ("C_ALL=C " + INTLTOOL_MERGE + " -x -u -c " + TOP_BUILDDIR +
+      rc = os.system ("C_ALL=C " + INTLTOOL_MERGE + " -x -u -c " + TOP_BUILDDIR +
                  "/po/.intltool-merge-cache " + TOP_BUILDDIR + "/po " +
                  appdata_in + " " + appdata_data)
+      if rc != 0:
+        # run the appdata_in through a command to strip the "_" characters
+        with open(appdata_in) as file_in, open(appdata_data, 'w') as file_data:
+          [file_data.write(line.replace('<_','<').replace('</_','</')) for line in file_in]
 
 class Uninstall(Command):
   description = "Attempt an uninstall from an install --record file"
@@ -95,7 +104,7 @@
             raise DistutilsFileError("Pass manifest with --manifest=file")
         f = open(self.manifest)
         files = [file.strip() for file in f]
-      except IOError, e:
+      except IOError as e:
         raise DistutilsFileError("unable to open install manifest: %s", str(e))
     finally:
       if f:
@@ -107,7 +116,7 @@
         if not self.dry_run:
           try:
             os.unlink(file)
-          except OSError, e:
+          except OSError as e:
             warn("could not delete: %s" % repr(file))
       elif not os.path.isdir(file):
         info("skipping %s" % repr(file))
@@ -124,7 +133,7 @@
           if not self.dry_run:
             try:
               os.rmdir(dir)
-            except OSError, e:
+            except OSError as e:
               warn("could not remove directory: %s" % str(e))
         else:
           info("skipping empty directory %s" % repr(dir))
@@ -143,7 +152,7 @@
     info("running gtk-update-icon-cache")
     try:
       subprocess.call(["gtk-update-icon-cache", "-q", "-f", "-t", os.path.join(self.install_dir, "share/icons/hicolor")])
-    except Exception, e:
+    except Exception as e:
       warn("updating the GTK icon cache failed: %s" % str(e))
 
   def _find_mo_files (self):
@@ -220,10 +229,9 @@
                   ('share/icons/HighContrast/16x16/actions', glob.glob('data/icons/HighContrast/16x16/actions/*.png')),
                   ('share/icons/HighContrast/16x16/status', glob.glob('data/icons/HighContrast/16x16/status/*.png')),
                  ],
-      packages=['terminatorlib', 'terminatorlib.configobj',
-      'terminatorlib.plugins'],
+      packages=['terminatorlib', 'terminatorlib.plugins'],
       package_data={'terminatorlib': ['preferences.glade', 'layoutlauncher.glade']},
       cmdclass={'build': BuildData, 'install_data': InstallData, 'uninstall': Uninstall, 'test':Test},
-      distclass=TerminatorDist
+      distclass=TerminatorDist,
      )
 
diff -x .bzr -uNr terminator-1.91/terminator python3/terminator
--- terminator-1.91/terminator	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminator	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    Terminator - multiple gnome terminals in one window
 #    Copyright (C) 2006-2010  cmsj@tenshu.net
 #
@@ -92,7 +92,7 @@
                 if OPTIONS.working_directory is None:
                     OPTIONS.working_directory = ORIGCWD
                 optionslist = {}
-                for opt, val in OPTIONS.__dict__.items():
+                for opt, val in list(OPTIONS.__dict__.items()):
                     if type(val) == type([]):
                         val = ' '.join(val)
                     if val == True:
@@ -120,12 +120,12 @@
         try:
             dbg('Creating a terminal with layout: %s' % OPTIONS.layout)
             TERMINATOR.create_layout(OPTIONS.layout)
-        except (KeyError,ValueError), ex:
+        except (KeyError,ValueError) as ex:
             err('layout creation failed, creating a window ("%s")' % ex)
             TERMINATOR.new_window()
         TERMINATOR.layout_done()
 
-    if OPTIONS.debug >= 2:
+    if OPTIONS.debug and OPTIONS.debug >= 2:
         import terminatorlib.debugserver as debugserver
         # pylint: disable-msg=W0611
         import threading
diff -x .bzr -uNr terminator-1.91/terminatorlib/borg.py python3/terminatorlib/borg.py
--- terminator-1.91/terminatorlib/borg.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/borg.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """borg.py - We are the borg. Resistance is futile.
@@ -9,14 +9,13 @@
 specific licencing terms.
 """
 
-from util import dbg
+from .util import dbg
 
 # pylint: disable-msg=R0903
-# pylint: disable-msg=R0921
 class Borg:
     """Definition of a class that can never be duplicated. Correct usage is
     thus:
-        
+
     >>> from borg import Borg
     >>> class foo(Borg):
     ...     # All attributes on a borg class *must* = None
@@ -29,13 +28,13 @@
     ...
     >>> bar = foo()
     >>> bar.prepare_attributes()
-    
+
     The important thing to note is that all attributes of borg classes *must* be
     declared as being None. If you attempt to use static class attributes you
     will get unpredicted behaviour. Instead, prepare_attributes() must be called
     which will then see the attributes in the shared state, and initialise them
     if necessary."""
-    __shared_state = {} 
+    __shared_state = {}
 
     def __init__(self, borgtype=None):
         """Class initialiser. Overwrite our class dictionary with the shared
@@ -43,7 +42,7 @@
         type."""
         if borgtype is None:
             raise TypeError('Borg::__init__: You must pass a borgtype')
-        if not self.__shared_state.has_key(borgtype):
+        if borgtype not in self.__shared_state:
             dbg('Borg::__init__: Preparing borg state for %s' % borgtype)
             self.__shared_state[borgtype] = {}
         self.__dict__ = self.__shared_state[borgtype]
diff -x .bzr -uNr terminator-1.91/terminatorlib/configobj/configobj.py python3/terminatorlib/configobj/configobj.py
--- terminator-1.91/terminatorlib/configobj/configobj.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/configobj/configobj.py	1969-12-31 19:00:00.000000000 -0500
@@ -1,2474 +0,0 @@
-# configobj.py
-# A config file reader/writer that supports nested sections in config files.
-# Copyright (C) 2005-2010 Michael Foord, Nicola Larosa
-# E-mail: fuzzyman AT voidspace DOT org DOT uk
-#         nico AT tekNico DOT net
-
-# ConfigObj 4
-# http://www.voidspace.org.uk/python/configobj.html
-
-# Released subject to the BSD License
-# Please see http://www.voidspace.org.uk/python/license.shtml
-
-# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml
-# For information about bugfixes, updates and support, please join the
-# ConfigObj mailing list:
-# http://lists.sourceforge.net/lists/listinfo/configobj-develop
-# Comments, suggestions and bug reports welcome.
-
-from __future__ import generators
-
-import os
-import re
-import sys
-
-from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF16_BE, BOM_UTF16_LE
-
-
-# imported lazily to avoid startup performance hit if it isn't used
-compiler = None
-
-# A dictionary mapping BOM to
-# the encoding to decode with, and what to set the
-# encoding attribute to.
-BOMS = {
-    BOM_UTF8: ('utf_8', None),
-    BOM_UTF16_BE: ('utf16_be', 'utf_16'),
-    BOM_UTF16_LE: ('utf16_le', 'utf_16'),
-    BOM_UTF16: ('utf_16', 'utf_16'),
-    }
-# All legal variants of the BOM codecs.
-# TODO: the list of aliases is not meant to be exhaustive, is there a
-#   better way ?
-BOM_LIST = {
-    'utf_16': 'utf_16',
-    'u16': 'utf_16',
-    'utf16': 'utf_16',
-    'utf-16': 'utf_16',
-    'utf16_be': 'utf16_be',
-    'utf_16_be': 'utf16_be',
-    'utf-16be': 'utf16_be',
-    'utf16_le': 'utf16_le',
-    'utf_16_le': 'utf16_le',
-    'utf-16le': 'utf16_le',
-    'utf_8': 'utf_8',
-    'u8': 'utf_8',
-    'utf': 'utf_8',
-    'utf8': 'utf_8',
-    'utf-8': 'utf_8',
-    }
-
-# Map of encodings to the BOM to write.
-BOM_SET = {
-    'utf_8': BOM_UTF8,
-    'utf_16': BOM_UTF16,
-    'utf16_be': BOM_UTF16_BE,
-    'utf16_le': BOM_UTF16_LE,
-    None: BOM_UTF8
-    }
-
-
-def match_utf8(encoding):
-    return BOM_LIST.get(encoding.lower()) == 'utf_8'
-
-
-# Quote strings used for writing values
-squot = "'%s'"
-dquot = '"%s"'
-noquot = "%s"
-wspace_plus = ' \r\n\v\t\'"'
-tsquot = '"""%s"""'
-tdquot = "'''%s'''"
-
-# Sentinel for use in getattr calls to replace hasattr
-MISSING = object()
-
-__version__ = '4.7.2'
-
-try:
-    any
-except NameError:
-    def any(iterable):
-        for entry in iterable:
-            if entry:
-                return True
-        return False
-
-
-__all__ = (
-    '__version__',
-    'DEFAULT_INDENT_TYPE',
-    'DEFAULT_INTERPOLATION',
-    'ConfigObjError',
-    'NestingError',
-    'ParseError',
-    'DuplicateError',
-    'ConfigspecError',
-    'ConfigObj',
-    'SimpleVal',
-    'InterpolationError',
-    'InterpolationLoopError',
-    'MissingInterpolationOption',
-    'RepeatSectionError',
-    'ReloadError',
-    'UnreprError',
-    'UnknownType',
-    'flatten_errors',
-    'get_extra_values'
-)
-
-DEFAULT_INTERPOLATION = 'configparser'
-DEFAULT_INDENT_TYPE = '    '
-MAX_INTERPOL_DEPTH = 10
-
-OPTION_DEFAULTS = {
-    'interpolation': True,
-    'raise_errors': False,
-    'list_values': True,
-    'create_empty': False,
-    'file_error': False,
-    'configspec': None,
-    'stringify': True,
-    # option may be set to one of ('', ' ', '\t')
-    'indent_type': None,
-    'encoding': None,
-    'default_encoding': None,
-    'unrepr': False,
-    'write_empty_values': False,
-}
-
-
-
-def getObj(s):
-    global compiler
-    if compiler is None:
-        import compiler
-    s = "a=" + s
-    p = compiler.parse(s)
-    return p.getChildren()[1].getChildren()[0].getChildren()[1]
-
-
-class UnknownType(Exception):
-    pass
-
-
-class Builder(object):
-    
-    def build(self, o):
-        m = getattr(self, 'build_' + o.__class__.__name__, None)
-        if m is None:
-            raise UnknownType(o.__class__.__name__)
-        return m(o)
-    
-    def build_List(self, o):
-        return map(self.build, o.getChildren())
-    
-    def build_Const(self, o):
-        return o.value
-    
-    def build_Dict(self, o):
-        d = {}
-        i = iter(map(self.build, o.getChildren()))
-        for el in i:
-            d[el] = i.next()
-        return d
-    
-    def build_Tuple(self, o):
-        return tuple(self.build_List(o))
-    
-    def build_Name(self, o):
-        if o.name == 'None':
-            return None
-        if o.name == 'True':
-            return True
-        if o.name == 'False':
-            return False
-        
-        # An undefined Name
-        raise UnknownType('Undefined Name')
-    
-    def build_Add(self, o):
-        real, imag = map(self.build_Const, o.getChildren())
-        try:
-            real = float(real)
-        except TypeError:
-            raise UnknownType('Add')
-        if not isinstance(imag, complex) or imag.real != 0.0:
-            raise UnknownType('Add')
-        return real+imag
-    
-    def build_Getattr(self, o):
-        parent = self.build(o.expr)
-        return getattr(parent, o.attrname)
-    
-    def build_UnarySub(self, o):
-        return -self.build_Const(o.getChildren()[0])
-    
-    def build_UnaryAdd(self, o):
-        return self.build_Const(o.getChildren()[0])
-
-
-_builder = Builder()
-
-
-def unrepr(s):
-    if not s:
-        return s
-    return _builder.build(getObj(s))
-
-
-
-class ConfigObjError(SyntaxError):
-    """
-    This is the base class for all errors that ConfigObj raises.
-    It is a subclass of SyntaxError.
-    """
-    def __init__(self, message='', line_number=None, line=''):
-        self.line = line
-        self.line_number = line_number
-        SyntaxError.__init__(self, message)
-
-
-class NestingError(ConfigObjError):
-    """
-    This error indicates a level of nesting that doesn't match.
-    """
-
-
-class ParseError(ConfigObjError):
-    """
-    This error indicates that a line is badly written.
-    It is neither a valid ``key = value`` line,
-    nor a valid section marker line.
-    """
-
-
-class ReloadError(IOError):
-    """
-    A 'reload' operation failed.
-    This exception is a subclass of ``IOError``.
-    """
-    def __init__(self):
-        IOError.__init__(self, 'reload failed, filename is not set.')
-
-
-class DuplicateError(ConfigObjError):
-    """
-    The keyword or section specified already exists.
-    """
-
-
-class ConfigspecError(ConfigObjError):
-    """
-    An error occured whilst parsing a configspec.
-    """
-
-
-class InterpolationError(ConfigObjError):
-    """Base class for the two interpolation errors."""
-
-
-class InterpolationLoopError(InterpolationError):
-    """Maximum interpolation depth exceeded in string interpolation."""
-
-    def __init__(self, option):
-        InterpolationError.__init__(
-            self,
-            'interpolation loop detected in value "%s".' % option)
-
-
-class RepeatSectionError(ConfigObjError):
-    """
-    This error indicates additional sections in a section with a
-    ``__many__`` (repeated) section.
-    """
-
-
-class MissingInterpolationOption(InterpolationError):
-    """A value specified for interpolation was missing."""
-    def __init__(self, option):
-        msg = 'missing option "%s" in interpolation.' % option
-        InterpolationError.__init__(self, msg)
-
-
-class UnreprError(ConfigObjError):
-    """An error parsing in unrepr mode."""
-
-
-
-class InterpolationEngine(object):
-    """
-    A helper class to help perform string interpolation.
-
-    This class is an abstract base class; its descendants perform
-    the actual work.
-    """
-
-    # compiled regexp to use in self.interpolate()
-    _KEYCRE = re.compile(r"%\(([^)]*)\)s")
-    _cookie = '%'
-
-    def __init__(self, section):
-        # the Section instance that "owns" this engine
-        self.section = section
-
-
-    def interpolate(self, key, value):
-        # short-cut
-        if not self._cookie in value:
-            return value
-        
-        def recursive_interpolate(key, value, section, backtrail):
-            """The function that does the actual work.
-
-            ``value``: the string we're trying to interpolate.
-            ``section``: the section in which that string was found
-            ``backtrail``: a dict to keep track of where we've been,
-            to detect and prevent infinite recursion loops
-
-            This is similar to a depth-first-search algorithm.
-            """
-            # Have we been here already?
-            if (key, section.name) in backtrail:
-                # Yes - infinite loop detected
-                raise InterpolationLoopError(key)
-            # Place a marker on our backtrail so we won't come back here again
-            backtrail[(key, section.name)] = 1
-
-            # Now start the actual work
-            match = self._KEYCRE.search(value)
-            while match:
-                # The actual parsing of the match is implementation-dependent,
-                # so delegate to our helper function
-                k, v, s = self._parse_match(match)
-                if k is None:
-                    # That's the signal that no further interpolation is needed
-                    replacement = v
-                else:
-                    # Further interpolation may be needed to obtain final value
-                    replacement = recursive_interpolate(k, v, s, backtrail)
-                # Replace the matched string with its final value
-                start, end = match.span()
-                value = ''.join((value[:start], replacement, value[end:]))
-                new_search_start = start + len(replacement)
-                # Pick up the next interpolation key, if any, for next time
-                # through the while loop
-                match = self._KEYCRE.search(value, new_search_start)
-
-            # Now safe to come back here again; remove marker from backtrail
-            del backtrail[(key, section.name)]
-
-            return value
-
-        # Back in interpolate(), all we have to do is kick off the recursive
-        # function with appropriate starting values
-        value = recursive_interpolate(key, value, self.section, {})
-        return value
-
-
-    def _fetch(self, key):
-        """Helper function to fetch values from owning section.
-
-        Returns a 2-tuple: the value, and the section where it was found.
-        """
-        # switch off interpolation before we try and fetch anything !
-        save_interp = self.section.main.interpolation
-        self.section.main.interpolation = False
-
-        # Start at section that "owns" this InterpolationEngine
-        current_section = self.section
-        while True:
-            # try the current section first
-            val = current_section.get(key)
-            if val is not None and not isinstance(val, Section):
-                break
-            # try "DEFAULT" next
-            val = current_section.get('DEFAULT', {}).get(key)
-            if val is not None and not isinstance(val, Section):
-                break
-            # move up to parent and try again
-            # top-level's parent is itself
-            if current_section.parent is current_section:
-                # reached top level, time to give up
-                break
-            current_section = current_section.parent
-
-        # restore interpolation to previous value before returning
-        self.section.main.interpolation = save_interp
-        if val is None:
-            raise MissingInterpolationOption(key)
-        return val, current_section
-
-
-    def _parse_match(self, match):
-        """Implementation-dependent helper function.
-
-        Will be passed a match object corresponding to the interpolation
-        key we just found (e.g., "%(foo)s" or "$foo"). Should look up that
-        key in the appropriate config file section (using the ``_fetch()``
-        helper function) and return a 3-tuple: (key, value, section)
-
-        ``key`` is the name of the key we're looking for
-        ``value`` is the value found for that key
-        ``section`` is a reference to the section where it was found
-
-        ``key`` and ``section`` should be None if no further
-        interpolation should be performed on the resulting value
-        (e.g., if we interpolated "$$" and returned "$").
-        """
-        raise NotImplementedError()
-    
-
-
-class ConfigParserInterpolation(InterpolationEngine):
-    """Behaves like ConfigParser."""
-    _cookie = '%'
-    _KEYCRE = re.compile(r"%\(([^)]*)\)s")
-
-    def _parse_match(self, match):
-        key = match.group(1)
-        value, section = self._fetch(key)
-        return key, value, section
-
-
-
-class TemplateInterpolation(InterpolationEngine):
-    """Behaves like string.Template."""
-    _cookie = '$'
-    _delimiter = '$'
-    _KEYCRE = re.compile(r"""
-        \$(?:
-          (?P<escaped>\$)              |   # Two $ signs
-          (?P<named>[_a-z][_a-z0-9]*)  |   # $name format
-          {(?P<braced>[^}]*)}              # ${name} format
-        )
-        """, re.IGNORECASE | re.VERBOSE)
-
-    def _parse_match(self, match):
-        # Valid name (in or out of braces): fetch value from section
-        key = match.group('named') or match.group('braced')
-        if key is not None:
-            value, section = self._fetch(key)
-            return key, value, section
-        # Escaped delimiter (e.g., $$): return single delimiter
-        if match.group('escaped') is not None:
-            # Return None for key and section to indicate it's time to stop
-            return None, self._delimiter, None
-        # Anything else: ignore completely, just return it unchanged
-        return None, match.group(), None
-
-
-interpolation_engines = {
-    'configparser': ConfigParserInterpolation,
-    'template': TemplateInterpolation,
-}
-
-
-def __newobj__(cls, *args):
-    # Hack for pickle
-    return cls.__new__(cls, *args) 
-
-class Section(dict):
-    """
-    A dictionary-like object that represents a section in a config file.
-    
-    It does string interpolation if the 'interpolation' attribute
-    of the 'main' object is set to True.
-    
-    Interpolation is tried first from this object, then from the 'DEFAULT'
-    section of this object, next from the parent and its 'DEFAULT' section,
-    and so on until the main object is reached.
-    
-    A Section will behave like an ordered dictionary - following the
-    order of the ``scalars`` and ``sections`` attributes.
-    You can use this to change the order of members.
-    
-    Iteration follows the order: scalars, then sections.
-    """
-
-    
-    def __setstate__(self, state):
-        dict.update(self, state[0])
-        self.__dict__.update(state[1])
-
-    def __reduce__(self):
-        state = (dict(self), self.__dict__)
-        return (__newobj__, (self.__class__,), state)
-    
-    
-    def __init__(self, parent, depth, main, indict=None, name=None):
-        """
-        * parent is the section above
-        * depth is the depth level of this section
-        * main is the main ConfigObj
-        * indict is a dictionary to initialise the section with
-        """
-        if indict is None:
-            indict = {}
-        dict.__init__(self)
-        # used for nesting level *and* interpolation
-        self.parent = parent
-        # used for the interpolation attribute
-        self.main = main
-        # level of nesting depth of this Section
-        self.depth = depth
-        # purely for information
-        self.name = name
-        #
-        self._initialise()
-        # we do this explicitly so that __setitem__ is used properly
-        # (rather than just passing to ``dict.__init__``)
-        for entry, value in indict.iteritems():
-            self[entry] = value
-            
-            
-    def _initialise(self):
-        # the sequence of scalar values in this Section
-        self.scalars = []
-        # the sequence of sections in this Section
-        self.sections = []
-        # for comments :-)
-        self.comments = {}
-        self.inline_comments = {}
-        # the configspec
-        self.configspec = None
-        # for defaults
-        self.defaults = []
-        self.default_values = {}
-        self.extra_values = []
-        self._created = False
-
-
-    def _interpolate(self, key, value):
-        try:
-            # do we already have an interpolation engine?
-            engine = self._interpolation_engine
-        except AttributeError:
-            # not yet: first time running _interpolate(), so pick the engine
-            name = self.main.interpolation
-            if name == True:  # note that "if name:" would be incorrect here
-                # backwards-compatibility: interpolation=True means use default
-                name = DEFAULT_INTERPOLATION
-            name = name.lower()  # so that "Template", "template", etc. all work
-            class_ = interpolation_engines.get(name, None)
-            if class_ is None:
-                # invalid value for self.main.interpolation
-                self.main.interpolation = False
-                return value
-            else:
-                # save reference to engine so we don't have to do this again
-                engine = self._interpolation_engine = class_(self)
-        # let the engine do the actual work
-        return engine.interpolate(key, value)
-
-
-    def __getitem__(self, key):
-        """Fetch the item and do string interpolation."""
-        val = dict.__getitem__(self, key)
-        if self.main.interpolation: 
-            if isinstance(val, basestring):
-                return self._interpolate(key, val)
-            if isinstance(val, list):
-                def _check(entry):
-                    if isinstance(entry, basestring):
-                        return self._interpolate(key, entry)
-                    return entry
-                new = [_check(entry) for entry in val]
-                if new != val:
-                    return new
-        return val
-
-
-    def __setitem__(self, key, value, unrepr=False):
-        """
-        Correctly set a value.
-        
-        Making dictionary values Section instances.
-        (We have to special case 'Section' instances - which are also dicts)
-        
-        Keys must be strings.
-        Values need only be strings (or lists of strings) if
-        ``main.stringify`` is set.
-        
-        ``unrepr`` must be set when setting a value to a dictionary, without
-        creating a new sub-section.
-        """
-        if not isinstance(key, basestring):
-            raise ValueError('The key "%s" is not a string.' % key)
-        
-        # add the comment
-        if key not in self.comments:
-            self.comments[key] = []
-            self.inline_comments[key] = ''
-        # remove the entry from defaults
-        if key in self.defaults:
-            self.defaults.remove(key)
-        #
-        if isinstance(value, Section):
-            if key not in self:
-                self.sections.append(key)
-            dict.__setitem__(self, key, value)
-        elif isinstance(value, dict) and not unrepr:
-            # First create the new depth level,
-            # then create the section
-            if key not in self:
-                self.sections.append(key)
-            new_depth = self.depth + 1
-            dict.__setitem__(
-                self,
-                key,
-                Section(
-                    self,
-                    new_depth,
-                    self.main,
-                    indict=value,
-                    name=key))
-        else:
-            if key not in self:
-                self.scalars.append(key)
-            if not self.main.stringify:
-                if isinstance(value, basestring):
-                    pass
-                elif isinstance(value, (list, tuple)):
-                    for entry in value:
-                        if not isinstance(entry, basestring):
-                            raise TypeError('Value is not a string "%s".' % entry)
-                else:
-                    raise TypeError('Value is not a string "%s".' % value)
-            dict.__setitem__(self, key, value)
-
-
-    def __delitem__(self, key):
-        """Remove items from the sequence when deleting."""
-        dict. __delitem__(self, key)
-        if key in self.scalars:
-            self.scalars.remove(key)
-        else:
-            self.sections.remove(key)
-        del self.comments[key]
-        del self.inline_comments[key]
-
-
-    def get(self, key, default=None):
-        """A version of ``get`` that doesn't bypass string interpolation."""
-        try:
-            return self[key]
-        except KeyError:
-            return default
-
-
-    def update(self, indict):
-        """
-        A version of update that uses our ``__setitem__``.
-        """
-        for entry in indict:
-            self[entry] = indict[entry]
-
-
-    def pop(self, key, default=MISSING):
-        """
-        'D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
-        If key is not found, d is returned if given, otherwise KeyError is raised'
-        """
-        try:
-            val = self[key]
-        except KeyError:
-            if default is MISSING:
-                raise
-            val = default
-        else:
-            del self[key]
-        return val
-
-
-    def popitem(self):
-        """Pops the first (key,val)"""
-        sequence = (self.scalars + self.sections)
-        if not sequence:
-            raise KeyError(": 'popitem(): dictionary is empty'")
-        key = sequence[0]
-        val =  self[key]
-        del self[key]
-        return key, val
-
-
-    def clear(self):
-        """
-        A version of clear that also affects scalars/sections
-        Also clears comments and configspec.
-        
-        Leaves other attributes alone :
-            depth/main/parent are not affected
-        """
-        dict.clear(self)
-        self.scalars = []
-        self.sections = []
-        self.comments = {}
-        self.inline_comments = {}
-        self.configspec = None
-        self.defaults = []
-        self.extra_values = []
-
-
-    def setdefault(self, key, default=None):
-        """A version of setdefault that sets sequence if appropriate."""
-        try:
-            return self[key]
-        except KeyError:
-            self[key] = default
-            return self[key]
-
-
-    def items(self):
-        """D.items() -> list of D's (key, value) pairs, as 2-tuples"""
-        return zip((self.scalars + self.sections), self.values())
-
-
-    def keys(self):
-        """D.keys() -> list of D's keys"""
-        return (self.scalars + self.sections)
-
-
-    def values(self):
-        """D.values() -> list of D's values"""
-        return [self[key] for key in (self.scalars + self.sections)]
-
-
-    def iteritems(self):
-        """D.iteritems() -> an iterator over the (key, value) items of D"""
-        return iter(self.items())
-
-
-    def iterkeys(self):
-        """D.iterkeys() -> an iterator over the keys of D"""
-        return iter((self.scalars + self.sections))
-
-    __iter__ = iterkeys
-
-
-    def itervalues(self):
-        """D.itervalues() -> an iterator over the values of D"""
-        return iter(self.values())
-
-
-    def __repr__(self):
-        """x.__repr__() <==> repr(x)"""
-        def _getval(key):
-            try:
-                return self[key]
-            except MissingInterpolationOption:
-                return dict.__getitem__(self, key)
-        return '{%s}' % ', '.join([('%s: %s' % (repr(key), repr(_getval(key))))
-            for key in (self.scalars + self.sections)])
-
-    __str__ = __repr__
-    __str__.__doc__ = "x.__str__() <==> str(x)"
-
-
-    # Extra methods - not in a normal dictionary
-
-    def dict(self):
-        """
-        Return a deepcopy of self as a dictionary.
-        
-        All members that are ``Section`` instances are recursively turned to
-        ordinary dictionaries - by calling their ``dict`` method.
-        
-        >>> n = a.dict()
-        >>> n == a
-        1
-        >>> n is a
-        0
-        """
-        newdict = {}
-        for entry in self:
-            this_entry = self[entry]
-            if isinstance(this_entry, Section):
-                this_entry = this_entry.dict()
-            elif isinstance(this_entry, list):
-                # create a copy rather than a reference
-                this_entry = list(this_entry)
-            elif isinstance(this_entry, tuple):
-                # create a copy rather than a reference
-                this_entry = tuple(this_entry)
-            newdict[entry] = this_entry
-        return newdict
-
-
-    def merge(self, indict):
-        """
-        A recursive update - useful for merging config files.
-        
-        >>> a = '''[section1]
-        ...     option1 = True
-        ...     [[subsection]]
-        ...     more_options = False
-        ...     # end of file'''.splitlines()
-        >>> b = '''# File is user.ini
-        ...     [section1]
-        ...     option1 = False
-        ...     # end of file'''.splitlines()
-        >>> c1 = ConfigObj(b)
-        >>> c2 = ConfigObj(a)
-        >>> c2.merge(c1)
-        >>> c2
-        ConfigObj({'section1': {'option1': 'False', 'subsection': {'more_options': 'False'}}})
-        """
-        for key, val in indict.items():
-            if (key in self and isinstance(self[key], dict) and
-                                isinstance(val, dict)):
-                self[key].merge(val)
-            else:   
-                self[key] = val
-
-
-    def rename(self, oldkey, newkey):
-        """
-        Change a keyname to another, without changing position in sequence.
-        
-        Implemented so that transformations can be made on keys,
-        as well as on values. (used by encode and decode)
-        
-        Also renames comments.
-        """
-        if oldkey in self.scalars:
-            the_list = self.scalars
-        elif oldkey in self.sections:
-            the_list = self.sections
-        else:
-            raise KeyError('Key "%s" not found.' % oldkey)
-        pos = the_list.index(oldkey)
-        #
-        val = self[oldkey]
-        dict.__delitem__(self, oldkey)
-        dict.__setitem__(self, newkey, val)
-        the_list.remove(oldkey)
-        the_list.insert(pos, newkey)
-        comm = self.comments[oldkey]
-        inline_comment = self.inline_comments[oldkey]
-        del self.comments[oldkey]
-        del self.inline_comments[oldkey]
-        self.comments[newkey] = comm
-        self.inline_comments[newkey] = inline_comment
-
-
-    def walk(self, function, raise_errors=True,
-            call_on_sections=False, **keywargs):
-        """
-        Walk every member and call a function on the keyword and value.
-        
-        Return a dictionary of the return values
-        
-        If the function raises an exception, raise the errror
-        unless ``raise_errors=False``, in which case set the return value to
-        ``False``.
-        
-        Any unrecognised keyword arguments you pass to walk, will be pased on
-        to the function you pass in.
-        
-        Note: if ``call_on_sections`` is ``True`` then - on encountering a
-        subsection, *first* the function is called for the *whole* subsection,
-        and then recurses into it's members. This means your function must be
-        able to handle strings, dictionaries and lists. This allows you
-        to change the key of subsections as well as for ordinary members. The
-        return value when called on the whole subsection has to be discarded.
-        
-        See  the encode and decode methods for examples, including functions.
-        
-        .. admonition:: caution
-        
-            You can use ``walk`` to transform the names of members of a section
-            but you mustn't add or delete members.
-        
-        >>> config = '''[XXXXsection]
-        ... XXXXkey = XXXXvalue'''.splitlines()
-        >>> cfg = ConfigObj(config)
-        >>> cfg
-        ConfigObj({'XXXXsection': {'XXXXkey': 'XXXXvalue'}})
-        >>> def transform(section, key):
-        ...     val = section[key]
-        ...     newkey = key.replace('XXXX', 'CLIENT1')
-        ...     section.rename(key, newkey)
-        ...     if isinstance(val, (tuple, list, dict)):
-        ...         pass
-        ...     else:
-        ...         val = val.replace('XXXX', 'CLIENT1')
-        ...         section[newkey] = val
-        >>> cfg.walk(transform, call_on_sections=True)
-        {'CLIENT1section': {'CLIENT1key': None}}
-        >>> cfg
-        ConfigObj({'CLIENT1section': {'CLIENT1key': 'CLIENT1value'}})
-        """
-        out = {}
-        # scalars first
-        for i in range(len(self.scalars)):
-            entry = self.scalars[i]
-            try:
-                val = function(self, entry, **keywargs)
-                # bound again in case name has changed
-                entry = self.scalars[i]
-                out[entry] = val
-            except Exception:
-                if raise_errors:
-                    raise
-                else:
-                    entry = self.scalars[i]
-                    out[entry] = False
-        # then sections
-        for i in range(len(self.sections)):
-            entry = self.sections[i]
-            if call_on_sections:
-                try:
-                    function(self, entry, **keywargs)
-                except Exception:
-                    if raise_errors:
-                        raise
-                    else:
-                        entry = self.sections[i]
-                        out[entry] = False
-                # bound again in case name has changed
-                entry = self.sections[i]
-            # previous result is discarded
-            out[entry] = self[entry].walk(
-                function,
-                raise_errors=raise_errors,
-                call_on_sections=call_on_sections,
-                **keywargs)
-        return out
-
-
-    def as_bool(self, key):
-        """
-        Accepts a key as input. The corresponding value must be a string or
-        the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to
-        retain compatibility with Python 2.2.
-        
-        If the string is one of  ``True``, ``On``, ``Yes``, or ``1`` it returns 
-        ``True``.
-        
-        If the string is one of  ``False``, ``Off``, ``No``, or ``0`` it returns 
-        ``False``.
-        
-        ``as_bool`` is not case sensitive.
-        
-        Any other input will raise a ``ValueError``.
-        
-        >>> a = ConfigObj()
-        >>> a['a'] = 'fish'
-        >>> a.as_bool('a')
-        Traceback (most recent call last):
-        ValueError: Value "fish" is neither True nor False
-        >>> a['b'] = 'True'
-        >>> a.as_bool('b')
-        1
-        >>> a['b'] = 'off'
-        >>> a.as_bool('b')
-        0
-        """
-        val = self[key]
-        if val == True:
-            return True
-        elif val == False:
-            return False
-        else:
-            try:
-                if not isinstance(val, basestring):
-                    # TODO: Why do we raise a KeyError here?
-                    raise KeyError()
-                else:
-                    return self.main._bools[val.lower()]
-            except KeyError:
-                raise ValueError('Value "%s" is neither True nor False' % val)
-
-
-    def as_int(self, key):
-        """
-        A convenience method which coerces the specified value to an integer.
-        
-        If the value is an invalid literal for ``int``, a ``ValueError`` will
-        be raised.
-        
-        >>> a = ConfigObj()
-        >>> a['a'] = 'fish'
-        >>> a.as_int('a')
-        Traceback (most recent call last):
-        ValueError: invalid literal for int() with base 10: 'fish'
-        >>> a['b'] = '1'
-        >>> a.as_int('b')
-        1
-        >>> a['b'] = '3.2'
-        >>> a.as_int('b')
-        Traceback (most recent call last):
-        ValueError: invalid literal for int() with base 10: '3.2'
-        """
-        return int(self[key])
-
-
-    def as_float(self, key):
-        """
-        A convenience method which coerces the specified value to a float.
-        
-        If the value is an invalid literal for ``float``, a ``ValueError`` will
-        be raised.
-        
-        >>> a = ConfigObj()
-        >>> a['a'] = 'fish'
-        >>> a.as_float('a')
-        Traceback (most recent call last):
-        ValueError: invalid literal for float(): fish
-        >>> a['b'] = '1'
-        >>> a.as_float('b')
-        1.0
-        >>> a['b'] = '3.2'
-        >>> a.as_float('b')
-        3.2000000000000002
-        """
-        return float(self[key])
-    
-    
-    def as_list(self, key):
-        """
-        A convenience method which fetches the specified value, guaranteeing
-        that it is a list.
-        
-        >>> a = ConfigObj()
-        >>> a['a'] = 1
-        >>> a.as_list('a')
-        [1]
-        >>> a['a'] = (1,)
-        >>> a.as_list('a')
-        [1]
-        >>> a['a'] = [1]
-        >>> a.as_list('a')
-        [1]
-        """
-        result = self[key]
-        if isinstance(result, (tuple, list)):
-            return list(result)
-        return [result]
-        
-
-    def restore_default(self, key):
-        """
-        Restore (and return) default value for the specified key.
-        
-        This method will only work for a ConfigObj that was created
-        with a configspec and has been validated.
-        
-        If there is no default value for this key, ``KeyError`` is raised.
-        """
-        default = self.default_values[key]
-        dict.__setitem__(self, key, default)
-        if key not in self.defaults:
-            self.defaults.append(key)
-        return default
-
-    
-    def restore_defaults(self):
-        """
-        Recursively restore default values to all members
-        that have them.
-        
-        This method will only work for a ConfigObj that was created
-        with a configspec and has been validated.
-        
-        It doesn't delete or modify entries without default values.
-        """
-        for key in self.default_values:
-            self.restore_default(key)
-            
-        for section in self.sections:
-            self[section].restore_defaults()
-
-
-class ConfigObj(Section):
-    """An object to read, create, and write config files."""
-
-    _keyword = re.compile(r'''^ # line start
-        (\s*)                   # indentation
-        (                       # keyword
-            (?:".*?")|          # double quotes
-            (?:'.*?')|          # single quotes
-            (?:[^'"=].*?)       # no quotes
-        )
-        \s*=\s*                 # divider
-        (.*)                    # value (including list values and comments)
-        $   # line end
-        ''',
-        re.VERBOSE)
-
-    _sectionmarker = re.compile(r'''^
-        (\s*)                     # 1: indentation
-        ((?:\[\s*)+)              # 2: section marker open
-        (                         # 3: section name open
-            (?:"\s*\S.*?\s*")|    # at least one non-space with double quotes
-            (?:'\s*\S.*?\s*')|    # at least one non-space with single quotes
-            (?:[^'"\s].*?)        # at least one non-space unquoted
-        )                         # section name close
-        ((?:\s*\])+)              # 4: section marker close
-        \s*(\#.*)?                # 5: optional comment
-        $''',
-        re.VERBOSE)
-
-    # this regexp pulls list values out as a single string
-    # or single values and comments
-    # FIXME: this regex adds a '' to the end of comma terminated lists
-    #   workaround in ``_handle_value``
-    _valueexp = re.compile(r'''^
-        (?:
-            (?:
-                (
-                    (?:
-                        (?:
-                            (?:".*?")|              # double quotes
-                            (?:'.*?')|              # single quotes
-                            (?:[^'",\#][^,\#]*?)    # unquoted
-                        )
-                        \s*,\s*                     # comma
-                    )*      # match all list items ending in a comma (if any)
-                )
-                (
-                    (?:".*?")|                      # double quotes
-                    (?:'.*?')|                      # single quotes
-                    (?:[^'",\#\s][^,]*?)|           # unquoted
-                    (?:(?<!,))                      # Empty value
-                )?          # last item in a list - or string value
-            )|
-            (,)             # alternatively a single comma - empty list
-        )
-        \s*(\#.*)?          # optional comment
-        $''',
-        re.VERBOSE)
-
-    # use findall to get the members of a list value
-    _listvalueexp = re.compile(r'''
-        (
-            (?:".*?")|          # double quotes
-            (?:'.*?')|          # single quotes
-            (?:[^'",\#]?.*?)       # unquoted
-        )
-        \s*,\s*                 # comma
-        ''',
-        re.VERBOSE)
-
-    # this regexp is used for the value
-    # when lists are switched off
-    _nolistvalue = re.compile(r'''^
-        (
-            (?:".*?")|          # double quotes
-            (?:'.*?')|          # single quotes
-            (?:[^'"\#].*?)|     # unquoted
-            (?:)                # Empty value
-        )
-        \s*(\#.*)?              # optional comment
-        $''',
-        re.VERBOSE)
-
-    # regexes for finding triple quoted values on one line
-    _single_line_single = re.compile(r"^'''(.*?)'''\s*(#.*)?$")
-    _single_line_double = re.compile(r'^"""(.*?)"""\s*(#.*)?$')
-    _multi_line_single = re.compile(r"^(.*?)'''\s*(#.*)?$")
-    _multi_line_double = re.compile(r'^(.*?)"""\s*(#.*)?$')
-
-    _triple_quote = {
-        "'''": (_single_line_single, _multi_line_single),
-        '"""': (_single_line_double, _multi_line_double),
-    }
-
-    # Used by the ``istrue`` Section method
-    _bools = {
-        'yes': True, 'no': False,
-        'on': True, 'off': False,
-        '1': True, '0': False,
-        'true': True, 'false': False,
-        }
-
-
-    def __init__(self, infile=None, options=None, configspec=None, encoding=None,
-                 interpolation=True, raise_errors=False, list_values=True,
-                 create_empty=False, file_error=False, stringify=True,
-                 indent_type=None, default_encoding=None, unrepr=False,
-                 write_empty_values=False, _inspec=False):
-        """
-        Parse a config file or create a config file object.
-        """
-        self._inspec = _inspec
-        # init the superclass
-        Section.__init__(self, self, 0, self)
-        
-        infile = infile or []
-        
-        _options = {'configspec': configspec,
-                    'encoding': encoding, 'interpolation': interpolation,
-                    'raise_errors': raise_errors, 'list_values': list_values,
-                    'create_empty': create_empty, 'file_error': file_error,
-                    'stringify': stringify, 'indent_type': indent_type,
-                    'default_encoding': default_encoding, 'unrepr': unrepr,
-                    'write_empty_values': write_empty_values}
-
-        if options is None:
-            options = _options
-        else:
-            import warnings
-            warnings.warn('Passing in an options dictionary to ConfigObj() is '
-                          'deprecated. Use **options instead.',
-                          DeprecationWarning, stacklevel=2)
-            
-            # TODO: check the values too.
-            for entry in options:
-                if entry not in OPTION_DEFAULTS:
-                    raise TypeError('Unrecognised option "%s".' % entry)
-            for entry, value in OPTION_DEFAULTS.items():
-                if entry not in options:
-                    options[entry] = value
-                keyword_value = _options[entry]
-                if value != keyword_value:
-                    options[entry] = keyword_value
-        
-        # XXXX this ignores an explicit list_values = True in combination
-        # with _inspec. The user should *never* do that anyway, but still...
-        if _inspec:
-            options['list_values'] = False
-        
-        self._initialise(options)
-        configspec = options['configspec']
-        self._original_configspec = configspec
-        self._load(infile, configspec)
-        
-        
-    def _load(self, infile, configspec):
-        if isinstance(infile, basestring):
-            self.filename = infile
-            if os.path.isfile(infile):
-                h = open(infile, 'rb')
-                infile = h.read() or []
-                h.close()
-            elif self.file_error:
-                # raise an error if the file doesn't exist
-                raise IOError('Config file not found: "%s".' % self.filename)
-            else:
-                # file doesn't already exist
-                if self.create_empty:
-                    # this is a good test that the filename specified
-                    # isn't impossible - like on a non-existent device
-                    h = open(infile, 'w')
-                    h.write('')
-                    h.close()
-                infile = []
-                
-        elif isinstance(infile, (list, tuple)):
-            infile = list(infile)
-            
-        elif isinstance(infile, dict):
-            # initialise self
-            # the Section class handles creating subsections
-            if isinstance(infile, ConfigObj):
-                # get a copy of our ConfigObj
-                def set_section(in_section, this_section):
-                    for entry in in_section.scalars:
-                        this_section[entry] = in_section[entry]
-                    for section in in_section.sections:
-                        this_section[section] = {}
-                        set_section(in_section[section], this_section[section])
-                set_section(infile, self)
-                
-            else:
-                for entry in infile:
-                    self[entry] = infile[entry]
-            del self._errors
-            
-            if configspec is not None:
-                self._handle_configspec(configspec)
-            else:
-                self.configspec = None
-            return
-        
-        elif getattr(infile, 'read', MISSING) is not MISSING:
-            # This supports file like objects
-            infile = infile.read() or []
-            # needs splitting into lines - but needs doing *after* decoding
-            # in case it's not an 8 bit encoding
-        else:
-            raise TypeError('infile must be a filename, file like object, or list of lines.')
-        
-        if infile:
-            # don't do it for the empty ConfigObj
-            infile = self._handle_bom(infile)
-            # infile is now *always* a list
-            #
-            # Set the newlines attribute (first line ending it finds)
-            # and strip trailing '\n' or '\r' from lines
-            for line in infile:
-                if (not line) or (line[-1] not in ('\r', '\n', '\r\n')):
-                    continue
-                for end in ('\r\n', '\n', '\r'):
-                    if line.endswith(end):
-                        self.newlines = end
-                        break
-                break
-
-            infile = [line.rstrip('\r\n') for line in infile]
-            
-        self._parse(infile)
-        # if we had any errors, now is the time to raise them
-        if self._errors:
-            info = "at line %s." % self._errors[0].line_number
-            if len(self._errors) > 1:
-                msg = "Parsing failed with several errors.\nFirst error %s" % info
-                error = ConfigObjError(msg)
-            else:
-                error = self._errors[0]
-            # set the errors attribute; it's a list of tuples:
-            # (error_type, message, line_number)
-            error.errors = self._errors
-            # set the config attribute
-            error.config = self
-            raise error
-        # delete private attributes
-        del self._errors
-        
-        if configspec is None:
-            self.configspec = None
-        else:
-            self._handle_configspec(configspec)
-    
-    
-    def _initialise(self, options=None):
-        if options is None:
-            options = OPTION_DEFAULTS
-            
-        # initialise a few variables
-        self.filename = None
-        self._errors = []
-        self.raise_errors = options['raise_errors']
-        self.interpolation = options['interpolation']
-        self.list_values = options['list_values']
-        self.create_empty = options['create_empty']
-        self.file_error = options['file_error']
-        self.stringify = options['stringify']
-        self.indent_type = options['indent_type']
-        self.encoding = options['encoding']
-        self.default_encoding = options['default_encoding']
-        self.BOM = False
-        self.newlines = None
-        self.write_empty_values = options['write_empty_values']
-        self.unrepr = options['unrepr']
-        
-        self.initial_comment = []
-        self.final_comment = []
-        self.configspec = None
-        
-        if self._inspec:
-            self.list_values = False
-        
-        # Clear section attributes as well
-        Section._initialise(self)
-        
-        
-    def __repr__(self):
-        def _getval(key):
-            try:
-                return self[key]
-            except MissingInterpolationOption:
-                return dict.__getitem__(self, key)
-        return ('ConfigObj({%s})' % 
-                ', '.join([('%s: %s' % (repr(key), repr(_getval(key)))) 
-                for key in (self.scalars + self.sections)]))
-    
-    
-    def _handle_bom(self, infile):
-        """
-        Handle any BOM, and decode if necessary.
-        
-        If an encoding is specified, that *must* be used - but the BOM should
-        still be removed (and the BOM attribute set).
-        
-        (If the encoding is wrongly specified, then a BOM for an alternative
-        encoding won't be discovered or removed.)
-        
-        If an encoding is not specified, UTF8 or UTF16 BOM will be detected and
-        removed. The BOM attribute will be set. UTF16 will be decoded to
-        unicode.
-        
-        NOTE: This method must not be called with an empty ``infile``.
-        
-        Specifying the *wrong* encoding is likely to cause a
-        ``UnicodeDecodeError``.
-        
-        ``infile`` must always be returned as a list of lines, but may be
-        passed in as a single string.
-        """
-        if ((self.encoding is not None) and
-            (self.encoding.lower() not in BOM_LIST)):
-            # No need to check for a BOM
-            # the encoding specified doesn't have one
-            # just decode
-            return self._decode(infile, self.encoding)
-        
-        if isinstance(infile, (list, tuple)):
-            line = infile[0]
-        else:
-            line = infile
-        if self.encoding is not None:
-            # encoding explicitly supplied
-            # And it could have an associated BOM
-            # TODO: if encoding is just UTF16 - we ought to check for both
-            # TODO: big endian and little endian versions.
-            enc = BOM_LIST[self.encoding.lower()]
-            if enc == 'utf_16':
-                # For UTF16 we try big endian and little endian
-                for BOM, (encoding, final_encoding) in BOMS.items():
-                    if not final_encoding:
-                        # skip UTF8
-                        continue
-                    if infile.startswith(BOM):
-                        ### BOM discovered
-                        ##self.BOM = True
-                        # Don't need to remove BOM
-                        return self._decode(infile, encoding)
-                    
-                # If we get this far, will *probably* raise a DecodeError
-                # As it doesn't appear to start with a BOM
-                return self._decode(infile, self.encoding)
-            
-            # Must be UTF8
-            BOM = BOM_SET[enc]
-            if not line.startswith(BOM):
-                return self._decode(infile, self.encoding)
-            
-            newline = line[len(BOM):]
-            
-            # BOM removed
-            if isinstance(infile, (list, tuple)):
-                infile[0] = newline
-            else:
-                infile = newline
-            self.BOM = True
-            return self._decode(infile, self.encoding)
-        
-        # No encoding specified - so we need to check for UTF8/UTF16
-        for BOM, (encoding, final_encoding) in BOMS.items():
-            if not line.startswith(BOM):
-                continue
-            else:
-                # BOM discovered
-                self.encoding = final_encoding
-                if not final_encoding:
-                    self.BOM = True
-                    # UTF8
-                    # remove BOM
-                    newline = line[len(BOM):]
-                    if isinstance(infile, (list, tuple)):
-                        infile[0] = newline
-                    else:
-                        infile = newline
-                    # UTF8 - don't decode
-                    if isinstance(infile, basestring):
-                        return infile.splitlines(True)
-                    else:
-                        return infile
-                # UTF16 - have to decode
-                return self._decode(infile, encoding)
-            
-        # No BOM discovered and no encoding specified, just return
-        if isinstance(infile, basestring):
-            # infile read from a file will be a single string
-            return infile.splitlines(True)
-        return infile
-
-
-    def _a_to_u(self, aString):
-        """Decode ASCII strings to unicode if a self.encoding is specified."""
-        if self.encoding:
-            return aString.decode('ascii')
-        else:
-            return aString
-
-
-    def _decode(self, infile, encoding):
-        """
-        Decode infile to unicode. Using the specified encoding.
-        
-        if is a string, it also needs converting to a list.
-        """
-        if isinstance(infile, basestring):
-            # can't be unicode
-            # NOTE: Could raise a ``UnicodeDecodeError``
-            return infile.decode(encoding).splitlines(True)
-        for i, line in enumerate(infile):
-            if not isinstance(line, unicode):
-                # NOTE: The isinstance test here handles mixed lists of unicode/string
-                # NOTE: But the decode will break on any non-string values
-                # NOTE: Or could raise a ``UnicodeDecodeError``
-                infile[i] = line.decode(encoding)
-        return infile
-
-
-    def _decode_element(self, line):
-        """Decode element to unicode if necessary."""
-        if not self.encoding:
-            return line
-        if isinstance(line, str) and self.default_encoding:
-            return line.decode(self.default_encoding)
-        return line
-
-
-    def _str(self, value):
-        """
-        Used by ``stringify`` within validate, to turn non-string values
-        into strings.
-        """
-        if not isinstance(value, basestring):
-            return str(value)
-        else:
-            return value
-
-
-    def _parse(self, infile):
-        """Actually parse the config file."""
-        temp_list_values = self.list_values
-        if self.unrepr:
-            self.list_values = False
-            
-        comment_list = []
-        done_start = False
-        this_section = self
-        maxline = len(infile) - 1
-        cur_index = -1
-        reset_comment = False
-        
-        while cur_index < maxline:
-            if reset_comment:
-                comment_list = []
-            cur_index += 1
-            line = infile[cur_index]
-            sline = line.strip()
-            # do we have anything on the line ?
-            if not sline or sline.startswith('#'):
-                reset_comment = False
-                comment_list.append(line)
-                continue
-            
-            if not done_start:
-                # preserve initial comment
-                self.initial_comment = comment_list
-                comment_list = []
-                done_start = True
-                
-            reset_comment = True
-            # first we check if it's a section marker
-            mat = self._sectionmarker.match(line)
-            if mat is not None:
-                # is a section line
-                (indent, sect_open, sect_name, sect_close, comment) = mat.groups()
-                if indent and (self.indent_type is None):
-                    self.indent_type = indent
-                cur_depth = sect_open.count('[')
-                if cur_depth != sect_close.count(']'):
-                    self._handle_error("Cannot compute the section depth at line %s.",
-                                       NestingError, infile, cur_index)
-                    continue
-                
-                if cur_depth < this_section.depth:
-                    # the new section is dropping back to a previous level
-                    try:
-                        parent = self._match_depth(this_section,
-                                                   cur_depth).parent
-                    except SyntaxError:
-                        self._handle_error("Cannot compute nesting level at line %s.",
-                                           NestingError, infile, cur_index)
-                        continue
-                elif cur_depth == this_section.depth:
-                    # the new section is a sibling of the current section
-                    parent = this_section.parent
-                elif cur_depth == this_section.depth + 1:
-                    # the new section is a child the current section
-                    parent = this_section
-                else:
-                    self._handle_error("Section too nested at line %s.",
-                                       NestingError, infile, cur_index)
-                    
-                sect_name = self._unquote(sect_name)
-                if sect_name in parent:
-                    self._handle_error('Duplicate section name at line %s.',
-                                       DuplicateError, infile, cur_index)
-                    continue
-                
-                # create the new section
-                this_section = Section(
-                    parent,
-                    cur_depth,
-                    self,
-                    name=sect_name)
-                parent[sect_name] = this_section
-                parent.inline_comments[sect_name] = comment
-                parent.comments[sect_name] = comment_list
-                continue
-            #
-            # it's not a section marker,
-            # so it should be a valid ``key = value`` line
-            mat = self._keyword.match(line)
-            if mat is None:
-                # it neither matched as a keyword
-                # or a section marker
-                self._handle_error(
-                    'Invalid line at line "%s".',
-                    ParseError, infile, cur_index)
-            else:
-                # is a keyword value
-                # value will include any inline comment
-                (indent, key, value) = mat.groups()
-                if indent and (self.indent_type is None):
-                    self.indent_type = indent
-                # check for a multiline value
-                if value[:3] in ['"""', "'''"]:
-                    try:
-                        value, comment, cur_index = self._multiline(
-                            value, infile, cur_index, maxline)
-                    except SyntaxError:
-                        self._handle_error(
-                            'Parse error in value at line %s.',
-                            ParseError, infile, cur_index)
-                        continue
-                    else:
-                        if self.unrepr:
-                            comment = ''
-                            try:
-                                value = unrepr(value)
-                            except Exception, e:
-                                if type(e) == UnknownType:
-                                    msg = 'Unknown name or type in value at line %s.'
-                                else:
-                                    msg = 'Parse error in value at line %s.'
-                                self._handle_error(msg, UnreprError, infile,
-                                    cur_index)
-                                continue
-                else:
-                    if self.unrepr:
-                        comment = ''
-                        try:
-                            value = unrepr(value)
-                        except Exception, e:
-                            if isinstance(e, UnknownType):
-                                msg = 'Unknown name or type in value at line %s.'
-                            else:
-                                msg = 'Parse error in value at line %s.'
-                            self._handle_error(msg, UnreprError, infile,
-                                cur_index)
-                            continue
-                    else:
-                        # extract comment and lists
-                        try:
-                            (value, comment) = self._handle_value(value)
-                        except SyntaxError:
-                            self._handle_error(
-                                'Parse error in value at line %s.',
-                                ParseError, infile, cur_index)
-                            continue
-                #
-                key = self._unquote(key)
-                if key in this_section:
-                    self._handle_error(
-                        'Duplicate keyword name at line %s.',
-                        DuplicateError, infile, cur_index)
-                    continue
-                # add the key.
-                # we set unrepr because if we have got this far we will never
-                # be creating a new section
-                this_section.__setitem__(key, value, unrepr=True)
-                this_section.inline_comments[key] = comment
-                this_section.comments[key] = comment_list
-                continue
-        #
-        if self.indent_type is None:
-            # no indentation used, set the type accordingly
-            self.indent_type = ''
-
-        # preserve the final comment
-        if not self and not self.initial_comment:
-            self.initial_comment = comment_list
-        elif not reset_comment:
-            self.final_comment = comment_list
-        self.list_values = temp_list_values
-
-
-    def _match_depth(self, sect, depth):
-        """
-        Given a section and a depth level, walk back through the sections
-        parents to see if the depth level matches a previous section.
-        
-        Return a reference to the right section,
-        or raise a SyntaxError.
-        """
-        while depth < sect.depth:
-            if sect is sect.parent:
-                # we've reached the top level already
-                raise SyntaxError()
-            sect = sect.parent
-        if sect.depth == depth:
-            return sect
-        # shouldn't get here
-        raise SyntaxError()
-
-
-    def _handle_error(self, text, ErrorClass, infile, cur_index):
-        """
-        Handle an error according to the error settings.
-        
-        Either raise the error or store it.
-        The error will have occured at ``cur_index``
-        """
-        line = infile[cur_index]
-        cur_index += 1
-        message = text % cur_index
-        error = ErrorClass(message, cur_index, line)
-        if self.raise_errors:
-            # raise the error - parsing stops here
-            raise error
-        # store the error
-        # reraise when parsing has finished
-        self._errors.append(error)
-
-
-    def _unquote(self, value):
-        """Return an unquoted version of a value"""
-        if not value:
-            # should only happen during parsing of lists
-            raise SyntaxError
-        if (value[0] == value[-1]) and (value[0] in ('"', "'")):
-            value = value[1:-1]
-        return value
-
-
-    def _quote(self, value, multiline=True):
-        """
-        Return a safely quoted version of a value.
-        
-        Raise a ConfigObjError if the value cannot be safely quoted.
-        If multiline is ``True`` (default) then use triple quotes
-        if necessary.
-        
-        * Don't quote values that don't need it.
-        * Recursively quote members of a list and return a comma joined list.
-        * Multiline is ``False`` for lists.
-        * Obey list syntax for empty and single member lists.
-        
-        If ``list_values=False`` then the value is only quoted if it contains
-        a ``\\n`` (is multiline) or '#'.
-        
-        If ``write_empty_values`` is set, and the value is an empty string, it
-        won't be quoted.
-        """
-        if multiline and self.write_empty_values and value == '':
-            # Only if multiline is set, so that it is used for values not
-            # keys, and not values that are part of a list
-            return ''
-        
-        if multiline and isinstance(value, (list, tuple)):
-            if not value:
-                return ','
-            elif len(value) == 1:
-                return self._quote(value[0], multiline=False) + ','
-            return ', '.join([self._quote(val, multiline=False)
-                for val in value])
-        if not isinstance(value, basestring):
-            if self.stringify:
-                value = str(value)
-            else:
-                raise TypeError('Value "%s" is not a string.' % value)
-
-        if not value:
-            return '""'
-        
-        no_lists_no_quotes = not self.list_values and '\n' not in value and '#' not in value
-        need_triple = multiline and ((("'" in value) and ('"' in value)) or ('\n' in value ))
-        hash_triple_quote = multiline and not need_triple and ("'" in value) and ('"' in value) and ('#' in value)
-        check_for_single = (no_lists_no_quotes or not need_triple) and not hash_triple_quote
-        
-        if check_for_single:
-            if not self.list_values:
-                # we don't quote if ``list_values=False``
-                quot = noquot
-            # for normal values either single or double quotes will do
-            elif '\n' in value:
-                # will only happen if multiline is off - e.g. '\n' in key
-                raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
-            elif ((value[0] not in wspace_plus) and
-                    (value[-1] not in wspace_plus) and
-                    (',' not in value)):
-                quot = noquot
-            else:
-                quot = self._get_single_quote(value)
-        else:
-            # if value has '\n' or "'" *and* '"', it will need triple quotes
-            quot = self._get_triple_quote(value)
-        
-        if quot == noquot and '#' in value and self.list_values:
-            quot = self._get_single_quote(value)
-                
-        return quot % value
-    
-    
-    def _get_single_quote(self, value):
-        if ("'" in value) and ('"' in value):
-            raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
-        elif '"' in value:
-            quot = squot
-        else:
-            quot = dquot
-        return quot
-    
-    
-    def _get_triple_quote(self, value):
-        if (value.find('"""') != -1) and (value.find("'''") != -1):
-            raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
-        if value.find('"""') == -1:
-            quot = tdquot
-        else:
-            quot = tsquot 
-        return quot
-
-
-    def _handle_value(self, value):
-        """
-        Given a value string, unquote, remove comment,
-        handle lists. (including empty and single member lists)
-        """
-        if self._inspec:
-            # Parsing a configspec so don't handle comments
-            return (value, '')
-        # do we look for lists in values ?
-        if not self.list_values:
-            mat = self._nolistvalue.match(value)
-            if mat is None:
-                raise SyntaxError()
-            # NOTE: we don't unquote here
-            return mat.groups()
-        #
-        mat = self._valueexp.match(value)
-        if mat is None:
-            # the value is badly constructed, probably badly quoted,
-            # or an invalid list
-            raise SyntaxError()
-        (list_values, single, empty_list, comment) = mat.groups()
-        if (list_values == '') and (single is None):
-            # change this if you want to accept empty values
-            raise SyntaxError()
-        # NOTE: note there is no error handling from here if the regex
-        # is wrong: then incorrect values will slip through
-        if empty_list is not None:
-            # the single comma - meaning an empty list
-            return ([], comment)
-        if single is not None:
-            # handle empty values
-            if list_values and not single:
-                # FIXME: the '' is a workaround because our regex now matches
-                #   '' at the end of a list if it has a trailing comma
-                single = None
-            else:
-                single = single or '""'
-                single = self._unquote(single)
-        if list_values == '':
-            # not a list value
-            return (single, comment)
-        the_list = self._listvalueexp.findall(list_values)
-        the_list = [self._unquote(val) for val in the_list]
-        if single is not None:
-            the_list += [single]
-        return (the_list, comment)
-
-
-    def _multiline(self, value, infile, cur_index, maxline):
-        """Extract the value, where we are in a multiline situation."""
-        quot = value[:3]
-        newvalue = value[3:]
-        single_line = self._triple_quote[quot][0]
-        multi_line = self._triple_quote[quot][1]
-        mat = single_line.match(value)
-        if mat is not None:
-            retval = list(mat.groups())
-            retval.append(cur_index)
-            return retval
-        elif newvalue.find(quot) != -1:
-            # somehow the triple quote is missing
-            raise SyntaxError()
-        #
-        while cur_index < maxline:
-            cur_index += 1
-            newvalue += '\n'
-            line = infile[cur_index]
-            if line.find(quot) == -1:
-                newvalue += line
-            else:
-                # end of multiline, process it
-                break
-        else:
-            # we've got to the end of the config, oops...
-            raise SyntaxError()
-        mat = multi_line.match(line)
-        if mat is None:
-            # a badly formed line
-            raise SyntaxError()
-        (value, comment) = mat.groups()
-        return (newvalue + value, comment, cur_index)
-
-
-    def _handle_configspec(self, configspec):
-        """Parse the configspec."""
-        # FIXME: Should we check that the configspec was created with the 
-        #        correct settings ? (i.e. ``list_values=False``)
-        if not isinstance(configspec, ConfigObj):
-            try:
-                configspec = ConfigObj(configspec,
-                                       raise_errors=True,
-                                       file_error=True,
-                                       _inspec=True)
-            except ConfigObjError, e:
-                # FIXME: Should these errors have a reference
-                #        to the already parsed ConfigObj ?
-                raise ConfigspecError('Parsing configspec failed: %s' % e)
-            except IOError, e:
-                raise IOError('Reading configspec failed: %s' % e)
-        
-        self.configspec = configspec
-            
-
-        
-    def _set_configspec(self, section, copy):
-        """
-        Called by validate. Handles setting the configspec on subsections
-        including sections to be validated by __many__
-        """
-        configspec = section.configspec
-        many = configspec.get('__many__')
-        if isinstance(many, dict):
-            for entry in section.sections:
-                if entry not in configspec:
-                    section[entry].configspec = many
-                    
-        for entry in configspec.sections:
-            if entry == '__many__':
-                continue
-            if entry not in section:
-                section[entry] = {}
-                section[entry]._created = True
-                if copy:
-                    # copy comments
-                    section.comments[entry] = configspec.comments.get(entry, [])
-                    section.inline_comments[entry] = configspec.inline_comments.get(entry, '')
-                
-            # Could be a scalar when we expect a section
-            if isinstance(section[entry], Section):
-                section[entry].configspec = configspec[entry]
-                        
-
-    def _write_line(self, indent_string, entry, this_entry, comment):
-        """Write an individual line, for the write method"""
-        # NOTE: the calls to self._quote here handles non-StringType values.
-        if not self.unrepr:
-            val = self._decode_element(self._quote(this_entry))
-        else:
-            val = repr(this_entry)
-        return '%s%s%s%s%s' % (indent_string,
-                               self._decode_element(self._quote(entry, multiline=False)),
-                               self._a_to_u(' = '),
-                               val,
-                               self._decode_element(comment))
-
-
-    def _write_marker(self, indent_string, depth, entry, comment):
-        """Write a section marker line"""
-        return '%s%s%s%s%s' % (indent_string,
-                               self._a_to_u('[' * depth),
-                               self._quote(self._decode_element(entry), multiline=False),
-                               self._a_to_u(']' * depth),
-                               self._decode_element(comment))
-
-
-    def _handle_comment(self, comment):
-        """Deal with a comment."""
-        if not comment:
-            return ''
-        start = self.indent_type
-        if not comment.startswith('#'):
-            start += self._a_to_u(' # ')
-        return (start + comment)
-
-
-    # Public methods
-
-    def write(self, outfile=None, section=None):
-        """
-        Write the current ConfigObj as a file
-        
-        tekNico: FIXME: use StringIO instead of real files
-        
-        >>> filename = a.filename
-        >>> a.filename = 'test.ini'
-        >>> a.write()
-        >>> a.filename = filename
-        >>> a == ConfigObj('test.ini', raise_errors=True)
-        1
-        >>> import os
-        >>> os.remove('test.ini')
-        """
-        if self.indent_type is None:
-            # this can be true if initialised from a dictionary
-            self.indent_type = DEFAULT_INDENT_TYPE
-            
-        out = []
-        cs = self._a_to_u('#')
-        csp = self._a_to_u('# ')
-        if section is None:
-            int_val = self.interpolation
-            self.interpolation = False
-            section = self
-            for line in self.initial_comment:
-                line = self._decode_element(line)
-                stripped_line = line.strip()
-                if stripped_line and not stripped_line.startswith(cs):
-                    line = csp + line
-                out.append(line)
-                
-        indent_string = self.indent_type * section.depth
-
-        # Do a little sorting for convenience
-        section.scalars = sorted(section.scalars)
-        section.sections = sorted(section.sections)
-        if 'default' in section.scalars:
-            # pop it and move to front
-            section.scalars.remove('default')
-            section.scalars.insert(0, 'default')
-        if 'default' in section.sections:
-            section.sections.remove('default')
-            section.sections.insert(0, 'default')
-
-        for entry in (section.scalars + section.sections):
-            if entry in section.defaults:
-                # don't write out default values
-                continue
-            for comment_line in section.comments[entry]:
-                comment_line = self._decode_element(comment_line.lstrip())
-                if comment_line and not comment_line.startswith(cs):
-                    comment_line = csp + comment_line
-                out.append(indent_string + comment_line)
-            this_entry = section[entry]
-            comment = self._handle_comment(section.inline_comments[entry])
-            
-            if isinstance(this_entry, dict):
-                # a section
-                out.append(self._write_marker(
-                    indent_string,
-                    this_entry.depth,
-                    entry,
-                    comment))
-                out.extend(self.write(section=this_entry))
-            else:
-                out.append(self._write_line(
-                    indent_string,
-                    entry,
-                    this_entry,
-                    comment))
-                
-        if section is self:
-            for line in self.final_comment:
-                line = self._decode_element(line)
-                stripped_line = line.strip()
-                if stripped_line and not stripped_line.startswith(cs):
-                    line = csp + line
-                out.append(line)
-            self.interpolation = int_val
-            
-        if section is not self:
-            return out
-        
-        if (self.filename is None) and (outfile is None):
-            # output a list of lines
-            # might need to encode
-            # NOTE: This will *screw* UTF16, each line will start with the BOM
-            if self.encoding:
-                out = [l.encode(self.encoding) for l in out]
-            if (self.BOM and ((self.encoding is None) or
-                (BOM_LIST.get(self.encoding.lower()) == 'utf_8'))):
-                # Add the UTF8 BOM
-                if not out:
-                    out.append('')
-                out[0] = BOM_UTF8 + out[0]
-            return out
-        
-        # Turn the list to a string, joined with correct newlines
-        newline = self.newlines or os.linesep
-        if (getattr(outfile, 'mode', None) is not None and outfile.mode == 'w'
-            and sys.platform == 'win32' and newline == '\r\n'):
-            # Windows specific hack to avoid writing '\r\r\n'
-            newline = '\n'
-        output = self._a_to_u(newline).join(out)
-        if self.encoding:
-            output = output.encode(self.encoding)
-        if self.BOM and ((self.encoding is None) or match_utf8(self.encoding)):
-            # Add the UTF8 BOM
-            output = BOM_UTF8 + output
-            
-        if not output.endswith(newline):
-            output += newline
-        if outfile is not None:
-            outfile.write(output)
-        else:
-            h = open(self.filename, 'wb')
-            h.write(output)
-            h.close()
-
-
-    def validate(self, validator, preserve_errors=False, copy=False,
-                 section=None):
-        """
-        Test the ConfigObj against a configspec.
-        
-        It uses the ``validator`` object from *validate.py*.
-        
-        To run ``validate`` on the current ConfigObj, call: ::
-        
-            test = config.validate(validator)
-        
-        (Normally having previously passed in the configspec when the ConfigObj
-        was created - you can dynamically assign a dictionary of checks to the
-        ``configspec`` attribute of a section though).
-        
-        It returns ``True`` if everything passes, or a dictionary of
-        pass/fails (True/False). If every member of a subsection passes, it
-        will just have the value ``True``. (It also returns ``False`` if all
-        members fail).
-        
-        In addition, it converts the values from strings to their native
-        types if their checks pass (and ``stringify`` is set).
-        
-        If ``preserve_errors`` is ``True`` (``False`` is default) then instead
-        of a marking a fail with a ``False``, it will preserve the actual
-        exception object. This can contain info about the reason for failure.
-        For example the ``VdtValueTooSmallError`` indicates that the value
-        supplied was too small. If a value (or section) is missing it will
-        still be marked as ``False``.
-        
-        You must have the validate module to use ``preserve_errors=True``.
-        
-        You can then use the ``flatten_errors`` function to turn your nested
-        results dictionary into a flattened list of failures - useful for
-        displaying meaningful error messages.
-        """
-        if section is None:
-            if self.configspec is None:
-                raise ValueError('No configspec supplied.')
-            if preserve_errors:
-                # We do this once to remove a top level dependency on the validate module
-                # Which makes importing configobj faster
-                from validate import VdtMissingValue
-                self._vdtMissingValue = VdtMissingValue
-                
-            section = self
-
-            if copy:
-                section.initial_comment = section.configspec.initial_comment
-                section.final_comment = section.configspec.final_comment
-                section.encoding = section.configspec.encoding
-                section.BOM = section.configspec.BOM
-                section.newlines = section.configspec.newlines
-                section.indent_type = section.configspec.indent_type
-            
-        #
-        # section.default_values.clear() #??
-        configspec = section.configspec
-        self._set_configspec(section, copy)
-
-        
-        def validate_entry(entry, spec, val, missing, ret_true, ret_false):
-            section.default_values.pop(entry, None)
-                
-            try:
-                section.default_values[entry] = validator.get_default_value(configspec[entry])
-            except (KeyError, AttributeError, validator.baseErrorClass):
-                # No default, bad default or validator has no 'get_default_value'
-                # (e.g. SimpleVal)
-                pass
-            
-            try:
-                check = validator.check(spec,
-                                        val,
-                                        missing=missing
-                                        )
-            except validator.baseErrorClass, e:
-                if not preserve_errors or isinstance(e, self._vdtMissingValue):
-                    out[entry] = False
-                else:
-                    # preserve the error
-                    out[entry] = e
-                    ret_false = False
-                ret_true = False
-            else:
-                ret_false = False
-                out[entry] = True
-                if self.stringify or missing:
-                    # if we are doing type conversion
-                    # or the value is a supplied default
-                    if not self.stringify:
-                        if isinstance(check, (list, tuple)):
-                            # preserve lists
-                            check = [self._str(item) for item in check]
-                        elif missing and check is None:
-                            # convert the None from a default to a ''
-                            check = ''
-                        else:
-                            check = self._str(check)
-                    if (check != val) or missing:
-                        section[entry] = check
-                if not copy and missing and entry not in section.defaults:
-                    section.defaults.append(entry)
-            return ret_true, ret_false
-        
-        #
-        out = {}
-        ret_true = True
-        ret_false = True
-        
-        unvalidated = [k for k in section.scalars if k not in configspec]
-        incorrect_sections = [k for k in configspec.sections if k in section.scalars]        
-        incorrect_scalars = [k for k in configspec.scalars if k in section.sections]
-        
-        for entry in configspec.scalars:
-            if entry in ('__many__', '___many___'):
-                # reserved names
-                continue
-            if (not entry in section.scalars) or (entry in section.defaults):
-                # missing entries
-                # or entries from defaults
-                missing = True
-                val = None
-                if copy and entry not in section.scalars:
-                    # copy comments
-                    section.comments[entry] = (
-                        configspec.comments.get(entry, []))
-                    section.inline_comments[entry] = (
-                        configspec.inline_comments.get(entry, ''))
-                #
-            else:
-                missing = False
-                val = section[entry]
-            
-            ret_true, ret_false = validate_entry(entry, configspec[entry], val, 
-                                                 missing, ret_true, ret_false)
-        
-        many = None
-        if '__many__' in configspec.scalars:
-            many = configspec['__many__']
-        elif '___many___' in configspec.scalars:
-            many = configspec['___many___']
-        
-        if many is not None:
-            for entry in unvalidated:
-                val = section[entry]
-                ret_true, ret_false = validate_entry(entry, many, val, False,
-                                                     ret_true, ret_false)
-            unvalidated = []
-
-        for entry in incorrect_scalars:
-            ret_true = False
-            if not preserve_errors:
-                out[entry] = False
-            else:
-                ret_false = False
-                msg = 'Value %r was provided as a section' % entry
-                out[entry] = validator.baseErrorClass(msg)
-        for entry in incorrect_sections:
-            ret_true = False
-            if not preserve_errors:
-                out[entry] = False
-            else:
-                ret_false = False
-                msg = 'Section %r was provided as a single value' % entry
-                out[entry] = validator.baseErrorClass(msg)
-                
-        # Missing sections will have been created as empty ones when the
-        # configspec was read.
-        for entry in section.sections:
-            # FIXME: this means DEFAULT is not copied in copy mode
-            if section is self and entry == 'DEFAULT':
-                continue
-            if section[entry].configspec is None:
-                unvalidated.append(entry)
-                continue
-            if copy:
-                section.comments[entry] = configspec.comments.get(entry, [])
-                section.inline_comments[entry] = configspec.inline_comments.get(entry, '')
-            check = self.validate(validator, preserve_errors=preserve_errors, copy=copy, section=section[entry])
-            out[entry] = check
-            if check == False:
-                ret_true = False
-            elif check == True:
-                ret_false = False
-            else:
-                ret_true = False
-        
-        section.extra_values = unvalidated
-        if preserve_errors and not section._created:
-            # If the section wasn't created (i.e. it wasn't missing)
-            # then we can't return False, we need to preserve errors
-            ret_false = False
-        #
-        if ret_false and preserve_errors and out:
-            # If we are preserving errors, but all
-            # the failures are from missing sections / values
-            # then we can return False. Otherwise there is a
-            # real failure that we need to preserve.
-            ret_false = not any(out.values())
-        if ret_true:
-            return True
-        elif ret_false:
-            return False
-        return out
-
-
-    def reset(self):
-        """Clear ConfigObj instance and restore to 'freshly created' state."""
-        self.clear()
-        self._initialise()
-        # FIXME: Should be done by '_initialise', but ConfigObj constructor (and reload)
-        #        requires an empty dictionary
-        self.configspec = None
-        # Just to be sure ;-)
-        self._original_configspec = None
-        
-        
-    def reload(self):
-        """
-        Reload a ConfigObj from file.
-        
-        This method raises a ``ReloadError`` if the ConfigObj doesn't have
-        a filename attribute pointing to a file.
-        """
-        if not isinstance(self.filename, basestring):
-            raise ReloadError()
-
-        filename = self.filename
-        current_options = {}
-        for entry in OPTION_DEFAULTS:
-            if entry == 'configspec':
-                continue
-            current_options[entry] = getattr(self, entry)
-            
-        configspec = self._original_configspec
-        current_options['configspec'] = configspec
-            
-        self.clear()
-        self._initialise(current_options)
-        self._load(filename, configspec)
-        
-
-
-class SimpleVal(object):
-    """
-    A simple validator.
-    Can be used to check that all members expected are present.
-    
-    To use it, provide a configspec with all your members in (the value given
-    will be ignored). Pass an instance of ``SimpleVal`` to the ``validate``
-    method of your ``ConfigObj``. ``validate`` will return ``True`` if all
-    members are present, or a dictionary with True/False meaning
-    present/missing. (Whole missing sections will be replaced with ``False``)
-    """
-    
-    def __init__(self):
-        self.baseErrorClass = ConfigObjError
-    
-    def check(self, check, member, missing=False):
-        """A dummy check method, always returns the value unchanged."""
-        if missing:
-            raise self.baseErrorClass()
-        return member
-
-
-def flatten_errors(cfg, res, levels=None, results=None):
-    """
-    An example function that will turn a nested dictionary of results
-    (as returned by ``ConfigObj.validate``) into a flat list.
-    
-    ``cfg`` is the ConfigObj instance being checked, ``res`` is the results
-    dictionary returned by ``validate``.
-    
-    (This is a recursive function, so you shouldn't use the ``levels`` or
-    ``results`` arguments - they are used by the function.)
-    
-    Returns a list of keys that failed. Each member of the list is a tuple::
-    
-        ([list of sections...], key, result)
-    
-    If ``validate`` was called with ``preserve_errors=False`` (the default)
-    then ``result`` will always be ``False``.
-
-    *list of sections* is a flattened list of sections that the key was found
-    in.
-    
-    If the section was missing (or a section was expected and a scalar provided
-    - or vice-versa) then key will be ``None``.
-    
-    If the value (or section) was missing then ``result`` will be ``False``.
-    
-    If ``validate`` was called with ``preserve_errors=True`` and a value
-    was present, but failed the check, then ``result`` will be the exception
-    object returned. You can use this as a string that describes the failure.
-    
-    For example *The value "3" is of the wrong type*.
-    """
-    if levels is None:
-        # first time called
-        levels = []
-        results = []
-    if res == True:
-        return results
-    if res == False or isinstance(res, Exception):
-        results.append((levels[:], None, res))
-        if levels:
-            levels.pop()
-        return results
-    for (key, val) in res.items():
-        if val == True:
-            continue
-        if isinstance(cfg.get(key), dict):
-            # Go down one level
-            levels.append(key)
-            flatten_errors(cfg[key], val, levels, results)
-            continue
-        results.append((levels[:], key, val))
-    #
-    # Go up one level
-    if levels:
-        levels.pop()
-    #
-    return results
-
-
-def get_extra_values(conf, _prepend=()):
-    """
-    Find all the values and sections not in the configspec from a validated
-    ConfigObj.
-    
-    ``get_extra_values`` returns a list of tuples where each tuple represents
-    either an extra section, or an extra value.
-    
-    The tuples contain two values, a tuple representing the section the value 
-    is in and the name of the extra values. For extra values in the top level
-    section the first member will be an empty tuple. For values in the 'foo'
-    section the first member will be ``('foo',)``. For members in the 'bar'
-    subsection of the 'foo' section the first member will be ``('foo', 'bar')``.
-    
-    NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn't
-    been validated it will return an empty list.
-    """
-    out = []
-    
-    out.extend([(_prepend, name) for name in conf.extra_values])
-    for name in conf.sections:
-        if name not in conf.extra_values:
-            out.extend(get_extra_values(conf[name], _prepend + (name,)))
-    return out
-
-
-"""*A programming language is a medium of expression.* - Paul Graham"""
diff -x .bzr -uNr terminator-1.91/terminatorlib/configobj/validate.py python3/terminatorlib/configobj/validate.py
--- terminator-1.91/terminatorlib/configobj/validate.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/configobj/validate.py	1969-12-31 19:00:00.000000000 -0500
@@ -1,1462 +0,0 @@
-# validate.py
-# A Validator object
-# Copyright (C) 2005-2010 Michael Foord, Mark Andrews, Nicola Larosa
-# E-mail: fuzzyman AT voidspace DOT org DOT uk
-#         mark AT la-la DOT com
-#         nico AT tekNico DOT net
-
-# This software is licensed under the terms of the BSD license.
-# http://www.voidspace.org.uk/python/license.shtml
-# Basically you're free to copy, modify, distribute and relicense it,
-# So long as you keep a copy of the license with it.
-
-# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml
-# For information about bugfixes, updates and support, please join the
-# ConfigObj mailing list:
-# http://lists.sourceforge.net/lists/listinfo/configobj-develop
-# Comments, suggestions and bug reports welcome.
-
-"""
-    The Validator object is used to check that supplied values 
-    conform to a specification.
-    
-    The value can be supplied as a string - e.g. from a config file.
-    In this case the check will also *convert* the value to
-    the required type. This allows you to add validation
-    as a transparent layer to access data stored as strings.
-    The validation checks that the data is correct *and*
-    converts it to the expected type.
-    
-    Some standard checks are provided for basic data types.
-    Additional checks are easy to write. They can be
-    provided when the ``Validator`` is instantiated or
-    added afterwards.
-    
-    The standard functions work with the following basic data types :
-    
-    * integers
-    * floats
-    * booleans
-    * strings
-    * ip_addr
-    
-    plus lists of these datatypes
-    
-    Adding additional checks is done through coding simple functions.
-    
-    The full set of standard checks are : 
-    
-    * 'integer': matches integer values (including negative)
-                 Takes optional 'min' and 'max' arguments : ::
-    
-                   integer()
-                   integer(3, 9)  # any value from 3 to 9
-                   integer(min=0) # any positive value
-                   integer(max=9)
-    
-    * 'float': matches float values
-               Has the same parameters as the integer check.
-    
-    * 'boolean': matches boolean values - ``True`` or ``False``
-                 Acceptable string values for True are :
-                   true, on, yes, 1
-                 Acceptable string values for False are :
-                   false, off, no, 0
-    
-                 Any other value raises an error.
-    
-    * 'ip_addr': matches an Internet Protocol address, v.4, represented
-                 by a dotted-quad string, i.e. '1.2.3.4'.
-    
-    * 'string': matches any string.
-                Takes optional keyword args 'min' and 'max'
-                to specify min and max lengths of the string.
-    
-    * 'list': matches any list.
-              Takes optional keyword args 'min', and 'max' to specify min and
-              max sizes of the list. (Always returns a list.)
-    
-    * 'tuple': matches any tuple.
-              Takes optional keyword args 'min', and 'max' to specify min and
-              max sizes of the tuple. (Always returns a tuple.)
-    
-    * 'int_list': Matches a list of integers.
-                  Takes the same arguments as list.
-    
-    * 'float_list': Matches a list of floats.
-                    Takes the same arguments as list.
-    
-    * 'bool_list': Matches a list of boolean values.
-                   Takes the same arguments as list.
-    
-    * 'ip_addr_list': Matches a list of IP addresses.
-                     Takes the same arguments as list.
-    
-    * 'string_list': Matches a list of strings.
-                     Takes the same arguments as list.
-    
-    * 'mixed_list': Matches a list with different types in 
-                    specific positions. List size must match
-                    the number of arguments.
-    
-                    Each position can be one of :
-                    'integer', 'float', 'ip_addr', 'string', 'boolean'
-    
-                    So to specify a list with two strings followed
-                    by two integers, you write the check as : ::
-    
-                      mixed_list('string', 'string', 'integer', 'integer')
-    
-    * 'pass': This check matches everything ! It never fails
-              and the value is unchanged.
-    
-              It is also the default if no check is specified.
-    
-    * 'option': This check matches any from a list of options.
-                You specify this check with : ::
-    
-                  option('option 1', 'option 2', 'option 3')
-    
-    You can supply a default value (returned if no value is supplied)
-    using the default keyword argument.
-    
-    You specify a list argument for default using a list constructor syntax in
-    the check : ::
-    
-        checkname(arg1, arg2, default=list('val 1', 'val 2', 'val 3'))
-    
-    A badly formatted set of arguments will raise a ``VdtParamError``.
-"""
-
-__version__ = '1.0.1'
-
-
-__all__ = (
-    '__version__',
-    'dottedQuadToNum',
-    'numToDottedQuad',
-    'ValidateError',
-    'VdtUnknownCheckError',
-    'VdtParamError',
-    'VdtTypeError',
-    'VdtValueError',
-    'VdtValueTooSmallError',
-    'VdtValueTooBigError',
-    'VdtValueTooShortError',
-    'VdtValueTooLongError',
-    'VdtMissingValue',
-    'Validator',
-    'is_integer',
-    'is_float',
-    'is_boolean',
-    'is_list',
-    'is_tuple',
-    'is_ip_addr',
-    'is_string',
-    'is_int_list',
-    'is_bool_list',
-    'is_float_list',
-    'is_string_list',
-    'is_ip_addr_list',
-    'is_mixed_list',
-    'is_option',
-)
-
-
-import re
-
-
-_list_arg = re.compile(r'''
-    (?:
-        ([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*list\(
-            (
-                (?:
-                    \s*
-                    (?:
-                        (?:".*?")|              # double quotes
-                        (?:'.*?')|              # single quotes
-                        (?:[^'",\s\)][^,\)]*?)  # unquoted
-                    )
-                    \s*,\s*
-                )*
-                (?:
-                    (?:".*?")|              # double quotes
-                    (?:'.*?')|              # single quotes
-                    (?:[^'",\s\)][^,\)]*?)  # unquoted
-                )?                          # last one
-            )
-        \)
-    )
-''', re.VERBOSE | re.DOTALL)    # two groups
-
-_list_members = re.compile(r'''
-    (
-        (?:".*?")|              # double quotes
-        (?:'.*?')|              # single quotes
-        (?:[^'",\s=][^,=]*?)       # unquoted
-    )
-    (?:
-    (?:\s*,\s*)|(?:\s*$)            # comma
-    )
-''', re.VERBOSE | re.DOTALL)    # one group
-
-_paramstring = r'''
-    (?:
-        (
-            (?:
-                [a-zA-Z_][a-zA-Z0-9_]*\s*=\s*list\(
-                    (?:
-                        \s*
-                        (?:
-                            (?:".*?")|              # double quotes
-                            (?:'.*?')|              # single quotes
-                            (?:[^'",\s\)][^,\)]*?)       # unquoted
-                        )
-                        \s*,\s*
-                    )*
-                    (?:
-                        (?:".*?")|              # double quotes
-                        (?:'.*?')|              # single quotes
-                        (?:[^'",\s\)][^,\)]*?)       # unquoted
-                    )?                              # last one
-                \)
-            )|
-            (?:
-                (?:".*?")|              # double quotes
-                (?:'.*?')|              # single quotes
-                (?:[^'",\s=][^,=]*?)|       # unquoted
-                (?:                         # keyword argument
-                    [a-zA-Z_][a-zA-Z0-9_]*\s*=\s*
-                    (?:
-                        (?:".*?")|              # double quotes
-                        (?:'.*?')|              # single quotes
-                        (?:[^'",\s=][^,=]*?)       # unquoted
-                    )
-                )
-            )
-        )
-        (?:
-            (?:\s*,\s*)|(?:\s*$)            # comma
-        )
-    )
-    '''
-
-_matchstring = '^%s*' % _paramstring
-
-# Python pre 2.2.1 doesn't have bool
-try:
-    bool
-except NameError:
-    def bool(val):
-        """Simple boolean equivalent function. """
-        if val:
-            return 1
-        else:
-            return 0
-
-
-def dottedQuadToNum(ip):
-    """
-    Convert decimal dotted quad string to long integer
-    
-    >>> int(dottedQuadToNum('1 '))
-    1
-    >>> int(dottedQuadToNum(' 1.2'))
-    16777218
-    >>> int(dottedQuadToNum(' 1.2.3 '))
-    16908291
-    >>> int(dottedQuadToNum('1.2.3.4'))
-    16909060
-    >>> dottedQuadToNum('1.2.3. 4')
-    16909060
-    >>> dottedQuadToNum('255.255.255.255')
-    4294967295L
-    >>> dottedQuadToNum('255.255.255.256')
-    Traceback (most recent call last):
-    ValueError: Not a good dotted-quad IP: 255.255.255.256
-    """
-    
-    # import here to avoid it when ip_addr values are not used
-    import socket, struct
-    
-    try:
-        return struct.unpack('!L',
-            socket.inet_aton(ip.strip()))[0]
-    except socket.error:
-        # bug in inet_aton, corrected in Python 2.3
-        if ip.strip() == '255.255.255.255':
-            return 0xFFFFFFFFL
-        else:
-            raise ValueError('Not a good dotted-quad IP: %s' % ip)
-    return
-
-
-def numToDottedQuad(num):
-    """
-    Convert long int to dotted quad string
-    
-    >>> numToDottedQuad(-1L)
-    Traceback (most recent call last):
-    ValueError: Not a good numeric IP: -1
-    >>> numToDottedQuad(1L)
-    '0.0.0.1'
-    >>> numToDottedQuad(16777218L)
-    '1.0.0.2'
-    >>> numToDottedQuad(16908291L)
-    '1.2.0.3'
-    >>> numToDottedQuad(16909060L)
-    '1.2.3.4'
-    >>> numToDottedQuad(4294967295L)
-    '255.255.255.255'
-    >>> numToDottedQuad(4294967296L)
-    Traceback (most recent call last):
-    ValueError: Not a good numeric IP: 4294967296
-    """
-    
-    # import here to avoid it when ip_addr values are not used
-    import socket, struct
-    
-    # no need to intercept here, 4294967295L is fine
-    if num > 4294967295L or num < 0:
-        raise ValueError('Not a good numeric IP: %s' % num)
-    try:
-        return socket.inet_ntoa(
-            struct.pack('!L', long(num)))
-    except (socket.error, struct.error, OverflowError):
-        raise ValueError('Not a good numeric IP: %s' % num)
-
-
-class ValidateError(Exception):
-    """
-    This error indicates that the check failed.
-    It can be the base class for more specific errors.
-    
-    Any check function that fails ought to raise this error.
-    (or a subclass)
-    
-    >>> raise ValidateError
-    Traceback (most recent call last):
-    ValidateError
-    """
-
-
-class VdtMissingValue(ValidateError):
-    """No value was supplied to a check that needed one."""
-
-
-class VdtUnknownCheckError(ValidateError):
-    """An unknown check function was requested"""
-
-    def __init__(self, value):
-        """
-        >>> raise VdtUnknownCheckError('yoda')
-        Traceback (most recent call last):
-        VdtUnknownCheckError: the check "yoda" is unknown.
-        """
-        ValidateError.__init__(self, 'the check "%s" is unknown.' % (value,))
-
-
-class VdtParamError(SyntaxError):
-    """An incorrect parameter was passed"""
-
-    def __init__(self, name, value):
-        """
-        >>> raise VdtParamError('yoda', 'jedi')
-        Traceback (most recent call last):
-        VdtParamError: passed an incorrect value "jedi" for parameter "yoda".
-        """
-        SyntaxError.__init__(self, 'passed an incorrect value "%s" for parameter "%s".' % (value, name))
-
-
-class VdtTypeError(ValidateError):
-    """The value supplied was of the wrong type"""
-
-    def __init__(self, value):
-        """
-        >>> raise VdtTypeError('jedi')
-        Traceback (most recent call last):
-        VdtTypeError: the value "jedi" is of the wrong type.
-        """
-        ValidateError.__init__(self, 'the value "%s" is of the wrong type.' % (value,))
-
-
-class VdtValueError(ValidateError):
-    """The value supplied was of the correct type, but was not an allowed value."""
-    
-    def __init__(self, value):
-        """
-        >>> raise VdtValueError('jedi')
-        Traceback (most recent call last):
-        VdtValueError: the value "jedi" is unacceptable.
-        """
-        ValidateError.__init__(self, 'the value "%s" is unacceptable.' % (value,))
-
-
-class VdtValueTooSmallError(VdtValueError):
-    """The value supplied was of the correct type, but was too small."""
-
-    def __init__(self, value):
-        """
-        >>> raise VdtValueTooSmallError('0')
-        Traceback (most recent call last):
-        VdtValueTooSmallError: the value "0" is too small.
-        """
-        ValidateError.__init__(self, 'the value "%s" is too small.' % (value,))
-
-
-class VdtValueTooBigError(VdtValueError):
-    """The value supplied was of the correct type, but was too big."""
-
-    def __init__(self, value):
-        """
-        >>> raise VdtValueTooBigError('1')
-        Traceback (most recent call last):
-        VdtValueTooBigError: the value "1" is too big.
-        """
-        ValidateError.__init__(self, 'the value "%s" is too big.' % (value,))
-
-
-class VdtValueTooShortError(VdtValueError):
-    """The value supplied was of the correct type, but was too short."""
-
-    def __init__(self, value):
-        """
-        >>> raise VdtValueTooShortError('jed')
-        Traceback (most recent call last):
-        VdtValueTooShortError: the value "jed" is too short.
-        """
-        ValidateError.__init__(
-            self,
-            'the value "%s" is too short.' % (value,))
-
-
-class VdtValueTooLongError(VdtValueError):
-    """The value supplied was of the correct type, but was too long."""
-
-    def __init__(self, value):
-        """
-        >>> raise VdtValueTooLongError('jedie')
-        Traceback (most recent call last):
-        VdtValueTooLongError: the value "jedie" is too long.
-        """
-        ValidateError.__init__(self, 'the value "%s" is too long.' % (value,))
-
-
-class Validator(object):
-    """
-    Validator is an object that allows you to register a set of 'checks'.
-    These checks take input and test that it conforms to the check.
-    
-    This can also involve converting the value from a string into
-    the correct datatype.
-    
-    The ``check`` method takes an input string which configures which
-    check is to be used and applies that check to a supplied value.
-    
-    An example input string would be:
-    'int_range(param1, param2)'
-    
-    You would then provide something like:
-    
-    >>> def int_range_check(value, min, max):
-    ...     # turn min and max from strings to integers
-    ...     min = int(min)
-    ...     max = int(max)
-    ...     # check that value is of the correct type.
-    ...     # possible valid inputs are integers or strings
-    ...     # that represent integers
-    ...     if not isinstance(value, (int, long, basestring)):
-    ...         raise VdtTypeError(value)
-    ...     elif isinstance(value, basestring):
-    ...         # if we are given a string
-    ...         # attempt to convert to an integer
-    ...         try:
-    ...             value = int(value)
-    ...         except ValueError:
-    ...             raise VdtValueError(value)
-    ...     # check the value is between our constraints
-    ...     if not min <= value:
-    ...          raise VdtValueTooSmallError(value)
-    ...     if not value <= max:
-    ...          raise VdtValueTooBigError(value)
-    ...     return value
-    ...
-    >>> fdict = {'int_range': int_range_check}
-    >>> vtr1 = Validator(fdict)
-    >>> vtr1.check('int_range(20, 40)', '30')
-    30
-    >>> vtr1.check('int_range(20, 40)', '60')
-    Traceback (most recent call last):
-    VdtValueTooBigError: the value "60" is too big.
-    
-    New functions can be added with : ::
-    
-    >>> vtr2 = Validator()       
-    >>> vtr2.functions['int_range'] = int_range_check
-    
-    Or by passing in a dictionary of functions when Validator 
-    is instantiated.
-    
-    Your functions *can* use keyword arguments,
-    but the first argument should always be 'value'.
-    
-    If the function doesn't take additional arguments,
-    the parentheses are optional in the check.
-    It can be written with either of : ::
-    
-        keyword = function_name
-        keyword = function_name()
-    
-    The first program to utilise Validator() was Michael Foord's
-    ConfigObj, an alternative to ConfigParser which supports lists and
-    can validate a config file using a config schema.
-    For more details on using Validator with ConfigObj see:
-    http://www.voidspace.org.uk/python/configobj.html
-    """
-
-    # this regex does the initial parsing of the checks
-    _func_re = re.compile(r'(.+?)\((.*)\)', re.DOTALL)
-
-    # this regex takes apart keyword arguments
-    _key_arg = re.compile(r'^([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*(.*)$',  re.DOTALL)
-
-
-    # this regex finds keyword=list(....) type values
-    _list_arg = _list_arg
-
-    # this regex takes individual values out of lists - in one pass
-    _list_members = _list_members
-
-    # These regexes check a set of arguments for validity
-    # and then pull the members out
-    _paramfinder = re.compile(_paramstring, re.VERBOSE | re.DOTALL)
-    _matchfinder = re.compile(_matchstring, re.VERBOSE | re.DOTALL)
-
-
-    def __init__(self, functions=None):
-        """
-        >>> vtri = Validator()
-        """
-        self.functions = {
-            '': self._pass,
-            'integer': is_integer,
-            'float': is_float,
-            'boolean': is_boolean,
-            'ip_addr': is_ip_addr,
-            'string': is_string,
-            'list': is_list,
-            'tuple': is_tuple,
-            'int_list': is_int_list,
-            'float_list': is_float_list,
-            'bool_list': is_bool_list,
-            'ip_addr_list': is_ip_addr_list,
-            'string_list': is_string_list,
-            'mixed_list': is_mixed_list,
-            'pass': self._pass,
-            'option': is_option,
-            'force_list': force_list,
-        }
-        if functions is not None:
-            self.functions.update(functions)
-        # tekNico: for use by ConfigObj
-        self.baseErrorClass = ValidateError
-        self._cache = {}
-
-
-    def check(self, check, value, missing=False):
-        """
-        Usage: check(check, value)
-        
-        Arguments:
-            check: string representing check to apply (including arguments)
-            value: object to be checked
-        
-        Returns value, converted to correct type if necessary
-        
-        If the check fails, raises a ``ValidateError`` subclass.
-        
-        >>> vtor.check('yoda', '')
-        Traceback (most recent call last):
-        VdtUnknownCheckError: the check "yoda" is unknown.
-        >>> vtor.check('yoda()', '')
-        Traceback (most recent call last):
-        VdtUnknownCheckError: the check "yoda" is unknown.
-        
-        >>> vtor.check('string(default="")', '', missing=True)
-        ''
-        """
-        fun_name, fun_args, fun_kwargs, default = self._parse_with_caching(check)
-            
-        if missing:
-            if default is None:
-                # no information needed here - to be handled by caller
-                raise VdtMissingValue()
-            value = self._handle_none(default)
-                
-        if value is None:
-            return None
-        
-        return self._check_value(value, fun_name, fun_args, fun_kwargs)
-
-
-    def _handle_none(self, value):
-        if value == 'None':
-            value = None
-        elif value in ("'None'", '"None"'):
-            # Special case a quoted None
-            value = self._unquote(value)
-        return value
-
-
-    def _parse_with_caching(self, check):
-        if check in self._cache:
-            fun_name, fun_args, fun_kwargs, default = self._cache[check]
-            # We call list and dict below to work with *copies* of the data
-            # rather than the original (which are mutable of course)
-            fun_args = list(fun_args)
-            fun_kwargs = dict(fun_kwargs)
-        else:
-            fun_name, fun_args, fun_kwargs, default = self._parse_check(check)
-            fun_kwargs = dict([(str(key), value) for (key, value) in fun_kwargs.items()])
-            self._cache[check] = fun_name, list(fun_args), dict(fun_kwargs), default
-        return fun_name, fun_args, fun_kwargs, default
-        
-        
-    def _check_value(self, value, fun_name, fun_args, fun_kwargs):
-        try:
-            fun = self.functions[fun_name]
-        except KeyError:
-            raise VdtUnknownCheckError(fun_name)
-        else:
-            return fun(value, *fun_args, **fun_kwargs)
-
-
-    def _parse_check(self, check):
-        fun_match = self._func_re.match(check)
-        if fun_match:
-            fun_name = fun_match.group(1)
-            arg_string = fun_match.group(2)
-            arg_match = self._matchfinder.match(arg_string)
-            if arg_match is None:
-                # Bad syntax
-                raise VdtParamError('Bad syntax in check "%s".' % check)
-            fun_args = []
-            fun_kwargs = {}
-            # pull out args of group 2
-            for arg in self._paramfinder.findall(arg_string):
-                # args may need whitespace removing (before removing quotes)
-                arg = arg.strip()
-                listmatch = self._list_arg.match(arg)
-                if listmatch:
-                    key, val = self._list_handle(listmatch)
-                    fun_kwargs[key] = val
-                    continue
-                keymatch = self._key_arg.match(arg)
-                if keymatch:
-                    val = keymatch.group(2)
-                    if not val in ("'None'", '"None"'):
-                        # Special case a quoted None
-                        val = self._unquote(val)
-                    fun_kwargs[keymatch.group(1)] = val
-                    continue
-                
-                fun_args.append(self._unquote(arg))
-        else:
-            # allows for function names without (args)
-            return check, (), {}, None
-
-        # Default must be deleted if the value is specified too,
-        # otherwise the check function will get a spurious "default" keyword arg
-        try:
-            default = fun_kwargs.pop('default', None)
-        except AttributeError:
-            # Python 2.2 compatibility
-            default = None
-            try:
-                default = fun_kwargs['default']
-                del fun_kwargs['default']
-            except KeyError:
-                pass
-            
-        return fun_name, fun_args, fun_kwargs, default
-
-
-    def _unquote(self, val):
-        """Unquote a value if necessary."""
-        if (len(val) >= 2) and (val[0] in ("'", '"')) and (val[0] == val[-1]):
-            val = val[1:-1]
-        return val
-
-
-    def _list_handle(self, listmatch):
-        """Take apart a ``keyword=list('val, 'val')`` type string."""
-        out = []
-        name = listmatch.group(1)
-        args = listmatch.group(2)
-        for arg in self._list_members.findall(args):
-            out.append(self._unquote(arg))
-        return name, out
-
-
-    def _pass(self, value):
-        """
-        Dummy check that always passes
-        
-        >>> vtor.check('', 0)
-        0
-        >>> vtor.check('', '0')
-        '0'
-        """
-        return value
-    
-    
-    def get_default_value(self, check):
-        """
-        Given a check, return the default value for the check
-        (converted to the right type).
-        
-        If the check doesn't specify a default value then a
-        ``KeyError`` will be raised.
-        """
-        fun_name, fun_args, fun_kwargs, default = self._parse_with_caching(check)
-        if default is None:
-            raise KeyError('Check "%s" has no default value.' % check)
-        value = self._handle_none(default)
-        if value is None:
-            return value
-        return self._check_value(value, fun_name, fun_args, fun_kwargs)
-
-
-def _is_num_param(names, values, to_float=False):
-    """
-    Return numbers from inputs or raise VdtParamError.
-    
-    Lets ``None`` pass through.
-    Pass in keyword argument ``to_float=True`` to
-    use float for the conversion rather than int.
-    
-    >>> _is_num_param(('', ''), (0, 1.0))
-    [0, 1]
-    >>> _is_num_param(('', ''), (0, 1.0), to_float=True)
-    [0.0, 1.0]
-    >>> _is_num_param(('a'), ('a'))
-    Traceback (most recent call last):
-    VdtParamError: passed an incorrect value "a" for parameter "a".
-    """
-    fun = to_float and float or int
-    out_params = []
-    for (name, val) in zip(names, values):
-        if val is None:
-            out_params.append(val)
-        elif isinstance(val, (int, long, float, basestring)):
-            try:
-                out_params.append(fun(val))
-            except ValueError, e:
-                raise VdtParamError(name, val)
-        else:
-            raise VdtParamError(name, val)
-    return out_params
-
-
-# built in checks
-# you can override these by setting the appropriate name
-# in Validator.functions
-# note: if the params are specified wrongly in your input string,
-#       you will also raise errors.
-
-def is_integer(value, min=None, max=None):
-    """
-    A check that tests that a given value is an integer (int, or long)
-    and optionally, between bounds. A negative value is accepted, while
-    a float will fail.
-    
-    If the value is a string, then the conversion is done - if possible.
-    Otherwise a VdtError is raised.
-    
-    >>> vtor.check('integer', '-1')
-    -1
-    >>> vtor.check('integer', '0')
-    0
-    >>> vtor.check('integer', 9)
-    9
-    >>> vtor.check('integer', 'a')
-    Traceback (most recent call last):
-    VdtTypeError: the value "a" is of the wrong type.
-    >>> vtor.check('integer', '2.2')
-    Traceback (most recent call last):
-    VdtTypeError: the value "2.2" is of the wrong type.
-    >>> vtor.check('integer(10)', '20')
-    20
-    >>> vtor.check('integer(max=20)', '15')
-    15
-    >>> vtor.check('integer(10)', '9')
-    Traceback (most recent call last):
-    VdtValueTooSmallError: the value "9" is too small.
-    >>> vtor.check('integer(10)', 9)
-    Traceback (most recent call last):
-    VdtValueTooSmallError: the value "9" is too small.
-    >>> vtor.check('integer(max=20)', '35')
-    Traceback (most recent call last):
-    VdtValueTooBigError: the value "35" is too big.
-    >>> vtor.check('integer(max=20)', 35)
-    Traceback (most recent call last):
-    VdtValueTooBigError: the value "35" is too big.
-    >>> vtor.check('integer(0, 9)', False)
-    0
-    """
-    (min_val, max_val) = _is_num_param(('min', 'max'), (min, max))
-    if not isinstance(value, (int, long, basestring)):
-        raise VdtTypeError(value)
-    if isinstance(value, basestring):
-        # if it's a string - does it represent an integer ?
-        try:
-            value = int(value)
-        except ValueError:
-            raise VdtTypeError(value)
-    if (min_val is not None) and (value < min_val):
-        raise VdtValueTooSmallError(value)
-    if (max_val is not None) and (value > max_val):
-        raise VdtValueTooBigError(value)
-    return value
-
-
-def is_float(value, min=None, max=None):
-    """
-    A check that tests that a given value is a float
-    (an integer will be accepted), and optionally - that it is between bounds.
-    
-    If the value is a string, then the conversion is done - if possible.
-    Otherwise a VdtError is raised.
-    
-    This can accept negative values.
-    
-    >>> vtor.check('float', '2')
-    2.0
-    
-    From now on we multiply the value to avoid comparing decimals
-    
-    >>> vtor.check('float', '-6.8') * 10
-    -68.0
-    >>> vtor.check('float', '12.2') * 10
-    122.0
-    >>> vtor.check('float', 8.4) * 10
-    84.0
-    >>> vtor.check('float', 'a')
-    Traceback (most recent call last):
-    VdtTypeError: the value "a" is of the wrong type.
-    >>> vtor.check('float(10.1)', '10.2') * 10
-    102.0
-    >>> vtor.check('float(max=20.2)', '15.1') * 10
-    151.0
-    >>> vtor.check('float(10.0)', '9.0')
-    Traceback (most recent call last):
-    VdtValueTooSmallError: the value "9.0" is too small.
-    >>> vtor.check('float(max=20.0)', '35.0')
-    Traceback (most recent call last):
-    VdtValueTooBigError: the value "35.0" is too big.
-    """
-    (min_val, max_val) = _is_num_param(
-        ('min', 'max'), (min, max), to_float=True)
-    if not isinstance(value, (int, long, float, basestring)):
-        raise VdtTypeError(value)
-    if not isinstance(value, float):
-        # if it's a string - does it represent a float ?
-        try:
-            value = float(value)
-        except ValueError:
-            raise VdtTypeError(value)
-    if (min_val is not None) and (value < min_val):
-        raise VdtValueTooSmallError(value)
-    if (max_val is not None) and (value > max_val):
-        raise VdtValueTooBigError(value)
-    return value
-
-
-bool_dict = {
-    True: True, 'on': True, '1': True, 'true': True, 'yes': True, 
-    False: False, 'off': False, '0': False, 'false': False, 'no': False,
-}
-
-
-def is_boolean(value):
-    """
-    Check if the value represents a boolean.
-    
-    >>> vtor.check('boolean', 0)
-    0
-    >>> vtor.check('boolean', False)
-    0
-    >>> vtor.check('boolean', '0')
-    0
-    >>> vtor.check('boolean', 'off')
-    0
-    >>> vtor.check('boolean', 'false')
-    0
-    >>> vtor.check('boolean', 'no')
-    0
-    >>> vtor.check('boolean', 'nO')
-    0
-    >>> vtor.check('boolean', 'NO')
-    0
-    >>> vtor.check('boolean', 1)
-    1
-    >>> vtor.check('boolean', True)
-    1
-    >>> vtor.check('boolean', '1')
-    1
-    >>> vtor.check('boolean', 'on')
-    1
-    >>> vtor.check('boolean', 'true')
-    1
-    >>> vtor.check('boolean', 'yes')
-    1
-    >>> vtor.check('boolean', 'Yes')
-    1
-    >>> vtor.check('boolean', 'YES')
-    1
-    >>> vtor.check('boolean', '')
-    Traceback (most recent call last):
-    VdtTypeError: the value "" is of the wrong type.
-    >>> vtor.check('boolean', 'up')
-    Traceback (most recent call last):
-    VdtTypeError: the value "up" is of the wrong type.
-    
-    """
-    if isinstance(value, basestring):
-        try:
-            return bool_dict[value.lower()]
-        except KeyError:
-            raise VdtTypeError(value)
-    # we do an equality test rather than an identity test
-    # this ensures Python 2.2 compatibilty
-    # and allows 0 and 1 to represent True and False
-    if value == False:
-        return False
-    elif value == True:
-        return True
-    else:
-        raise VdtTypeError(value)
-
-
-def is_ip_addr(value):
-    """
-    Check that the supplied value is an Internet Protocol address, v.4,
-    represented by a dotted-quad string, i.e. '1.2.3.4'.
-    
-    >>> vtor.check('ip_addr', '1 ')
-    '1'
-    >>> vtor.check('ip_addr', ' 1.2')
-    '1.2'
-    >>> vtor.check('ip_addr', ' 1.2.3 ')
-    '1.2.3'
-    >>> vtor.check('ip_addr', '1.2.3.4')
-    '1.2.3.4'
-    >>> vtor.check('ip_addr', '0.0.0.0')
-    '0.0.0.0'
-    >>> vtor.check('ip_addr', '255.255.255.255')
-    '255.255.255.255'
-    >>> vtor.check('ip_addr', '255.255.255.256')
-    Traceback (most recent call last):
-    VdtValueError: the value "255.255.255.256" is unacceptable.
-    >>> vtor.check('ip_addr', '1.2.3.4.5')
-    Traceback (most recent call last):
-    VdtValueError: the value "1.2.3.4.5" is unacceptable.
-    >>> vtor.check('ip_addr', 0)
-    Traceback (most recent call last):
-    VdtTypeError: the value "0" is of the wrong type.
-    """
-    if not isinstance(value, basestring):
-        raise VdtTypeError(value)
-    value = value.strip()
-    try:
-        dottedQuadToNum(value)
-    except ValueError:
-        raise VdtValueError(value)
-    return value
-
-
-def is_list(value, min=None, max=None):
-    """
-    Check that the value is a list of values.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    It does no check on list members.
-    
-    >>> vtor.check('list', ())
-    []
-    >>> vtor.check('list', [])
-    []
-    >>> vtor.check('list', (1, 2))
-    [1, 2]
-    >>> vtor.check('list', [1, 2])
-    [1, 2]
-    >>> vtor.check('list(3)', (1, 2))
-    Traceback (most recent call last):
-    VdtValueTooShortError: the value "(1, 2)" is too short.
-    >>> vtor.check('list(max=5)', (1, 2, 3, 4, 5, 6))
-    Traceback (most recent call last):
-    VdtValueTooLongError: the value "(1, 2, 3, 4, 5, 6)" is too long.
-    >>> vtor.check('list(min=3, max=5)', (1, 2, 3, 4))
-    [1, 2, 3, 4]
-    >>> vtor.check('list', 0)
-    Traceback (most recent call last):
-    VdtTypeError: the value "0" is of the wrong type.
-    >>> vtor.check('list', '12')
-    Traceback (most recent call last):
-    VdtTypeError: the value "12" is of the wrong type.
-    """
-    (min_len, max_len) = _is_num_param(('min', 'max'), (min, max))
-    if isinstance(value, basestring):
-        raise VdtTypeError(value)
-    try:
-        num_members = len(value)
-    except TypeError:
-        raise VdtTypeError(value)
-    if min_len is not None and num_members < min_len:
-        raise VdtValueTooShortError(value)
-    if max_len is not None and num_members > max_len:
-        raise VdtValueTooLongError(value)
-    return list(value)
-
-
-def is_tuple(value, min=None, max=None):
-    """
-    Check that the value is a tuple of values.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    It does no check on members.
-    
-    >>> vtor.check('tuple', ())
-    ()
-    >>> vtor.check('tuple', [])
-    ()
-    >>> vtor.check('tuple', (1, 2))
-    (1, 2)
-    >>> vtor.check('tuple', [1, 2])
-    (1, 2)
-    >>> vtor.check('tuple(3)', (1, 2))
-    Traceback (most recent call last):
-    VdtValueTooShortError: the value "(1, 2)" is too short.
-    >>> vtor.check('tuple(max=5)', (1, 2, 3, 4, 5, 6))
-    Traceback (most recent call last):
-    VdtValueTooLongError: the value "(1, 2, 3, 4, 5, 6)" is too long.
-    >>> vtor.check('tuple(min=3, max=5)', (1, 2, 3, 4))
-    (1, 2, 3, 4)
-    >>> vtor.check('tuple', 0)
-    Traceback (most recent call last):
-    VdtTypeError: the value "0" is of the wrong type.
-    >>> vtor.check('tuple', '12')
-    Traceback (most recent call last):
-    VdtTypeError: the value "12" is of the wrong type.
-    """
-    return tuple(is_list(value, min, max))
-
-
-def is_string(value, min=None, max=None):
-    """
-    Check that the supplied value is a string.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    >>> vtor.check('string', '0')
-    '0'
-    >>> vtor.check('string', 0)
-    Traceback (most recent call last):
-    VdtTypeError: the value "0" is of the wrong type.
-    >>> vtor.check('string(2)', '12')
-    '12'
-    >>> vtor.check('string(2)', '1')
-    Traceback (most recent call last):
-    VdtValueTooShortError: the value "1" is too short.
-    >>> vtor.check('string(min=2, max=3)', '123')
-    '123'
-    >>> vtor.check('string(min=2, max=3)', '1234')
-    Traceback (most recent call last):
-    VdtValueTooLongError: the value "1234" is too long.
-    """
-    if not isinstance(value, basestring):
-        raise VdtTypeError(value)
-    (min_len, max_len) = _is_num_param(('min', 'max'), (min, max))
-    try:
-        num_members = len(value)
-    except TypeError:
-        raise VdtTypeError(value)
-    if min_len is not None and num_members < min_len:
-        raise VdtValueTooShortError(value)
-    if max_len is not None and num_members > max_len:
-        raise VdtValueTooLongError(value)
-    return value
-
-
-def is_int_list(value, min=None, max=None):
-    """
-    Check that the value is a list of integers.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    Each list member is checked that it is an integer.
-    
-    >>> vtor.check('int_list', ())
-    []
-    >>> vtor.check('int_list', [])
-    []
-    >>> vtor.check('int_list', (1, 2))
-    [1, 2]
-    >>> vtor.check('int_list', [1, 2])
-    [1, 2]
-    >>> vtor.check('int_list', [1, 'a'])
-    Traceback (most recent call last):
-    VdtTypeError: the value "a" is of the wrong type.
-    """
-    return [is_integer(mem) for mem in is_list(value, min, max)]
-
-
-def is_bool_list(value, min=None, max=None):
-    """
-    Check that the value is a list of booleans.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    Each list member is checked that it is a boolean.
-    
-    >>> vtor.check('bool_list', ())
-    []
-    >>> vtor.check('bool_list', [])
-    []
-    >>> check_res = vtor.check('bool_list', (True, False))
-    >>> check_res == [True, False]
-    1
-    >>> check_res = vtor.check('bool_list', [True, False])
-    >>> check_res == [True, False]
-    1
-    >>> vtor.check('bool_list', [True, 'a'])
-    Traceback (most recent call last):
-    VdtTypeError: the value "a" is of the wrong type.
-    """
-    return [is_boolean(mem) for mem in is_list(value, min, max)]
-
-
-def is_float_list(value, min=None, max=None):
-    """
-    Check that the value is a list of floats.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    Each list member is checked that it is a float.
-    
-    >>> vtor.check('float_list', ())
-    []
-    >>> vtor.check('float_list', [])
-    []
-    >>> vtor.check('float_list', (1, 2.0))
-    [1.0, 2.0]
-    >>> vtor.check('float_list', [1, 2.0])
-    [1.0, 2.0]
-    >>> vtor.check('float_list', [1, 'a'])
-    Traceback (most recent call last):
-    VdtTypeError: the value "a" is of the wrong type.
-    """
-    return [is_float(mem) for mem in is_list(value, min, max)]
-
-
-def is_string_list(value, min=None, max=None):
-    """
-    Check that the value is a list of strings.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    Each list member is checked that it is a string.
-    
-    >>> vtor.check('string_list', ())
-    []
-    >>> vtor.check('string_list', [])
-    []
-    >>> vtor.check('string_list', ('a', 'b'))
-    ['a', 'b']
-    >>> vtor.check('string_list', ['a', 1])
-    Traceback (most recent call last):
-    VdtTypeError: the value "1" is of the wrong type.
-    >>> vtor.check('string_list', 'hello')
-    Traceback (most recent call last):
-    VdtTypeError: the value "hello" is of the wrong type.
-    """
-    if isinstance(value, basestring):
-        raise VdtTypeError(value)
-    return [is_string(mem) for mem in is_list(value, min, max)]
-
-
-def is_ip_addr_list(value, min=None, max=None):
-    """
-    Check that the value is a list of IP addresses.
-    
-    You can optionally specify the minimum and maximum number of members.
-    
-    Each list member is checked that it is an IP address.
-    
-    >>> vtor.check('ip_addr_list', ())
-    []
-    >>> vtor.check('ip_addr_list', [])
-    []
-    >>> vtor.check('ip_addr_list', ('1.2.3.4', '5.6.7.8'))
-    ['1.2.3.4', '5.6.7.8']
-    >>> vtor.check('ip_addr_list', ['a'])
-    Traceback (most recent call last):
-    VdtValueError: the value "a" is unacceptable.
-    """
-    return [is_ip_addr(mem) for mem in is_list(value, min, max)]
-
-
-def force_list(value, min=None, max=None):
-    """
-    Check that a value is a list, coercing strings into
-    a list with one member. Useful where users forget the
-    trailing comma that turns a single value into a list.
-    
-    You can optionally specify the minimum and maximum number of members.
-    A minumum of greater than one will fail if the user only supplies a
-    string.
-    
-    >>> vtor.check('force_list', ())
-    []
-    >>> vtor.check('force_list', [])
-    []
-    >>> vtor.check('force_list', 'hello')
-    ['hello']
-    """
-    if not isinstance(value, (list, tuple)):
-        value = [value]
-    return is_list(value, min, max)
-    
-    
-
-fun_dict = {
-    'integer': is_integer,
-    'float': is_float,
-    'ip_addr': is_ip_addr,
-    'string': is_string,
-    'boolean': is_boolean,
-}
-
-
-def is_mixed_list(value, *args):
-    """
-    Check that the value is a list.
-    Allow specifying the type of each member.
-    Work on lists of specific lengths.
-    
-    You specify each member as a positional argument specifying type
-    
-    Each type should be one of the following strings :
-      'integer', 'float', 'ip_addr', 'string', 'boolean'
-    
-    So you can specify a list of two strings, followed by
-    two integers as :
-    
-      mixed_list('string', 'string', 'integer', 'integer')
-    
-    The length of the list must match the number of positional
-    arguments you supply.
-    
-    >>> mix_str = "mixed_list('integer', 'float', 'ip_addr', 'string', 'boolean')"
-    >>> check_res = vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', True))
-    >>> check_res == [1, 2.0, '1.2.3.4', 'a', True]
-    1
-    >>> check_res = vtor.check(mix_str, ('1', '2.0', '1.2.3.4', 'a', 'True'))
-    >>> check_res == [1, 2.0, '1.2.3.4', 'a', True]
-    1
-    >>> vtor.check(mix_str, ('b', 2.0, '1.2.3.4', 'a', True))
-    Traceback (most recent call last):
-    VdtTypeError: the value "b" is of the wrong type.
-    >>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a'))
-    Traceback (most recent call last):
-    VdtValueTooShortError: the value "(1, 2.0, '1.2.3.4', 'a')" is too short.
-    >>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', 1, 'b'))
-    Traceback (most recent call last):
-    VdtValueTooLongError: the value "(1, 2.0, '1.2.3.4', 'a', 1, 'b')" is too long.
-    >>> vtor.check(mix_str, 0)
-    Traceback (most recent call last):
-    VdtTypeError: the value "0" is of the wrong type.
-    
-    This test requires an elaborate setup, because of a change in error string
-    output from the interpreter between Python 2.2 and 2.3 .
-    
-    >>> res_seq = (
-    ...     'passed an incorrect value "',
-    ...     'yoda',
-    ...     '" for parameter "mixed_list".',
-    ... )
-    >>> res_str = "'".join(res_seq)
-    >>> try:
-    ...     vtor.check('mixed_list("yoda")', ('a'))
-    ... except VdtParamError, err:
-    ...     str(err) == res_str
-    1
-    """
-    try:
-        length = len(value)
-    except TypeError:
-        raise VdtTypeError(value)
-    if length < len(args):
-        raise VdtValueTooShortError(value)
-    elif length > len(args):
-        raise VdtValueTooLongError(value)
-    try:
-        return [fun_dict[arg](val) for arg, val in zip(args, value)]
-    except KeyError, e:
-        raise VdtParamError('mixed_list', e)
-
-
-def is_option(value, *options):
-    """
-    This check matches the value to any of a set of options.
-    
-    >>> vtor.check('option("yoda", "jedi")', 'yoda')
-    'yoda'
-    >>> vtor.check('option("yoda", "jedi")', 'jed')
-    Traceback (most recent call last):
-    VdtValueError: the value "jed" is unacceptable.
-    >>> vtor.check('option("yoda", "jedi")', 0)
-    Traceback (most recent call last):
-    VdtTypeError: the value "0" is of the wrong type.
-    """
-    if not isinstance(value, basestring):
-        raise VdtTypeError(value)
-    if not value in options:
-        raise VdtValueError(value)
-    return value
-
-
-def _test(value, *args, **keywargs):
-    """
-    A function that exists for test purposes.
-    
-    >>> checks = [
-    ...     '3, 6, min=1, max=3, test=list(a, b, c)',
-    ...     '3',
-    ...     '3, 6',
-    ...     '3,',
-    ...     'min=1, test="a b c"',
-    ...     'min=5, test="a, b, c"',
-    ...     'min=1, max=3, test="a, b, c"',
-    ...     'min=-100, test=-99',
-    ...     'min=1, max=3',
-    ...     '3, 6, test="36"',
-    ...     '3, 6, test="a, b, c"',
-    ...     '3, max=3, test=list("a", "b", "c")',
-    ...     '''3, max=3, test=list("'a'", 'b', "x=(c)")''',
-    ...     "test='x=fish(3)'",
-    ...    ]
-    >>> v = Validator({'test': _test})
-    >>> for entry in checks:
-    ...     print v.check(('test(%s)' % entry), 3)
-    (3, ('3', '6'), {'test': ['a', 'b', 'c'], 'max': '3', 'min': '1'})
-    (3, ('3',), {})
-    (3, ('3', '6'), {})
-    (3, ('3',), {})
-    (3, (), {'test': 'a b c', 'min': '1'})
-    (3, (), {'test': 'a, b, c', 'min': '5'})
-    (3, (), {'test': 'a, b, c', 'max': '3', 'min': '1'})
-    (3, (), {'test': '-99', 'min': '-100'})
-    (3, (), {'max': '3', 'min': '1'})
-    (3, ('3', '6'), {'test': '36'})
-    (3, ('3', '6'), {'test': 'a, b, c'})
-    (3, ('3',), {'test': ['a', 'b', 'c'], 'max': '3'})
-    (3, ('3',), {'test': ["'a'", 'b', 'x=(c)'], 'max': '3'})
-    (3, (), {'test': 'x=fish(3)'})
-    
-    >>> v = Validator()
-    >>> v.check('integer(default=6)', '3')
-    3
-    >>> v.check('integer(default=6)', None, True)
-    6
-    >>> v.get_default_value('integer(default=6)')
-    6
-    >>> v.get_default_value('float(default=6)')
-    6.0
-    >>> v.get_default_value('pass(default=None)')
-    >>> v.get_default_value("string(default='None')")
-    'None'
-    >>> v.get_default_value('pass')
-    Traceback (most recent call last):
-    KeyError: 'Check "pass" has no default value.'
-    >>> v.get_default_value('pass(default=list(1, 2, 3, 4))')
-    ['1', '2', '3', '4']
-    
-    >>> v = Validator()
-    >>> v.check("pass(default=None)", None, True)
-    >>> v.check("pass(default='None')", None, True)
-    'None'
-    >>> v.check('pass(default="None")', None, True)
-    'None'
-    >>> v.check('pass(default=list(1, 2, 3, 4))', None, True)
-    ['1', '2', '3', '4']
-    
-    Bug test for unicode arguments
-    >>> v = Validator()
-    >>> v.check(u'string(min=4)', u'test')
-    u'test'
-    
-    >>> v = Validator()
-    >>> v.get_default_value(u'string(min=4, default="1234")')
-    u'1234'
-    >>> v.check(u'string(min=4, default="1234")', u'test')
-    u'test'
-    
-    >>> v = Validator()
-    >>> default = v.get_default_value('string(default=None)')
-    >>> default == None
-    1
-    """
-    return (value, args, keywargs)
-
-
-def _test2():
-    """
-    >>> 
-    >>> v = Validator()
-    >>> v.get_default_value('string(default="#ff00dd")')
-    '#ff00dd'
-    >>> v.get_default_value('integer(default=3) # comment')
-    3
-    """
-
-def _test3():
-    r"""
-    >>> vtor.check('string(default="")', '', missing=True)
-    ''
-    >>> vtor.check('string(default="\n")', '', missing=True)
-    '\n'
-    >>> print vtor.check('string(default="\n")', '', missing=True),
-    <BLANKLINE>
-    >>> vtor.check('string()', '\n')
-    '\n'
-    >>> vtor.check('string(default="\n\n\n")', '', missing=True)
-    '\n\n\n'
-    >>> vtor.check('string()', 'random \n text goes here\n\n')
-    'random \n text goes here\n\n'
-    >>> vtor.check('string(default=" \nrandom text\ngoes \n here\n\n ")',
-    ... '', missing=True)
-    ' \nrandom text\ngoes \n here\n\n '
-    >>> vtor.check("string(default='\n\n\n')", '', missing=True)
-    '\n\n\n'
-    >>> vtor.check("option('\n','a','b',default='\n')", '', missing=True)
-    '\n'
-    >>> vtor.check("string_list()", ['foo', '\n', 'bar'])
-    ['foo', '\n', 'bar']
-    >>> vtor.check("string_list(default=list('\n'))", '', missing=True)
-    ['\n']
-    """
-    
-    
-if __name__ == '__main__':
-    # run the code tests in doctest format
-    import sys
-    import doctest
-    m = sys.modules.get('__main__')
-    globs = m.__dict__.copy()
-    globs.update({
-        'vtor': Validator(),
-    })
-    doctest.testmod(m, globs=globs)
diff -x .bzr -uNr terminator-1.91/terminatorlib/config.py python3/terminatorlib/config.py
--- terminator-1.91/terminatorlib/config.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/config.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    TerminatorConfig - layered config classes
 #    Copyright (C) 2006-2010  cmsj@tenshu.net
 #
@@ -74,10 +74,10 @@
 import platform
 import os
 from copy import copy
-from configobj.configobj import ConfigObj, flatten_errors
-from configobj.validate import Validator
-from borg import Borg
-from util import dbg, err, DEBUG, get_config_dir, dict_diff
+from configobj import ConfigObj, flatten_errors
+from validate import Validator
+from .borg import Borg
+from .util import dbg, err, DEBUG, get_config_dir, dict_diff
 
 from gi.repository import Gio
 
@@ -298,7 +298,7 @@
             profile = options.profile
         dbg('Config::set_profile: Changing profile to %s' % profile)
         self.profile = profile
-        if not self.base.profiles.has_key(profile):
+        if profile not in self.base.profiles:
             dbg('Config::set_profile: %s does not exist, creating' % profile)
             self.base.profiles[profile] = copy(DEFAULTS['profiles']['default'])
 
@@ -313,7 +313,7 @@
             # remove a profile
             err('Config::del_profile: Deleting in-use profile %s.' % profile)
             self.set_profile('default')
-        if self.base.profiles.has_key(profile):
+        if profile in self.base.profiles:
             del(self.base.profiles[profile])
         options = self.options_get()
         if options and options.profile == profile:
@@ -322,7 +322,7 @@
 
     def rename_profile(self, profile, newname):
         """Rename a profile"""
-        if self.base.profiles.has_key(profile):
+        if profile in self.base.profiles:
             self.base.profiles[newname] = self.base.profiles[profile]
             del(self.base.profiles[profile])
             if profile == self.profile:
@@ -330,7 +330,7 @@
 
     def list_profiles(self):
         """List all configured profiles"""
-        return(self.base.profiles.keys())
+        return(list(self.base.profiles.keys()))
 
     def add_layout(self, name, layout):
         """Add a new layout"""
@@ -342,18 +342,18 @@
 
     def del_layout(self, layout):
         """Delete a layout"""
-        if self.base.layouts.has_key(layout):
+        if layout in self.base.layouts:
             del(self.base.layouts[layout])
 
     def rename_layout(self, layout, newname):
         """Rename a layout"""
-        if self.base.layouts.has_key(layout):
+        if layout in self.base.layouts:
             self.base.layouts[newname] = self.base.layouts[layout]
             del(self.base.layouts[layout])
 
     def list_layouts(self):
         """List all configured layouts"""
-        return(self.base.layouts.keys())
+        return(list(self.base.layouts.keys()))
 
     def connect_gsetting_callbacks(self):
         """Get system settings and create callbacks for changes"""
@@ -416,7 +416,7 @@
         self.system_mono_font = None
         # Need to trigger a reconfigure to change active terminals immediately
         if "Terminator" not in globals():
-            from terminator import Terminator
+            from .terminator import Terminator
         Terminator().reconfigure()
 
     def save(self):
@@ -490,7 +490,7 @@
         Borg.__init__(self, self.__class__.__name__)
 
         self.prepare_attributes()
-        import optionparse
+        from . import optionparse
         self.command_line_options = optionparse.options
         self.load()
 
@@ -585,7 +585,7 @@
 
         configspec = ConfigObj(configspecdata)
         if DEBUG == True:
-            configspec.write(open('/tmp/terminator_configspec_debug.txt', 'w'))
+            configspec.write(open('/tmp/terminator_configspec_debug.txt', 'wb'))
         return(configspec)
 
     def load(self):
@@ -604,7 +604,7 @@
         dbg('looking for config file: %s' % filename)
         try:
             configfile = open(filename, 'r')
-        except Exception, ex:
+        except Exception as ex:
             if not self.whined:
                 err('ConfigBase::load: Unable to open %s (%s)' % (filename, ex))
                 self.whined = True
@@ -617,7 +617,7 @@
             parser = ConfigObj(configfile, configspec=configspec)
             validator = Validator()
             result = parser.validate(validator, preserve_errors=True)
-        except Exception, ex:
+        except Exception as ex:
             err('Unable to load configuration: %s' % ex)
             return
 
@@ -637,12 +637,12 @@
             if section_name == 'profiles':
                 for profile in parser[section_name]:
                     dbg('ConfigBase::load: Processing profile: %s' % profile)
-                    if not section.has_key(section_name):
+                    if section_name not in section:
                         # FIXME: Should this be outside the loop?
                         section[profile] = copy(DEFAULTS['profiles']['default'])
                     section[profile].update(parser[section_name][profile])
             elif section_name == 'plugins':
-                if not parser.has_key(section_name):
+                if section_name not in parser:
                     continue
                 for part in parser[section_name]:
                     dbg('ConfigBase::load: Processing %s: %s' % (section_name,
@@ -657,7 +657,7 @@
                            continue
                     section[layout] = parser[section_name][layout]
             elif section_name == 'keybindings':
-                if not parser.has_key(section_name):
+                if section_name not in parser:
                     continue
                 for part in parser[section_name]:
                     dbg('ConfigBase::load: Processing %s: %s' % (section_name,
@@ -669,7 +669,7 @@
             else:
                 try:
                     section.update(parser[section_name])
-                except KeyError, ex:
+                except KeyError as ex:
                     dbg('ConfigBase::load: skipping missing section %s' %
                             section_name)
 
@@ -711,21 +711,21 @@
         if not os.path.isdir(config_dir):
             os.makedirs(config_dir)
         try:
-            parser.write(open(self.command_line_options.config, 'w'))
-        except Exception, ex:
+            parser.write(open(self.command_line_options.config, 'wb'))
+        except Exception as ex:
             err('ConfigBase::save: Unable to save config: %s' % ex)
 
     def get_item(self, key, profile='default', plugin=None, default=None):
         """Look up a configuration item"""
-        if not self.profiles.has_key(profile):
+        if profile not in self.profiles:
             # Hitting this generally implies a bug
             profile = 'default'
 
-        if self.global_config.has_key(key):
+        if key in self.global_config:
             dbg('ConfigBase::get_item: %s found in globals: %s' %
                     (key, self.global_config[key]))
             return(self.global_config[key])
-        elif self.profiles[profile].has_key(key):
+        elif key in self.profiles[profile]:
             dbg('ConfigBase::get_item: %s found in profile %s: %s' % (
                     key, profile, self.profiles[profile][key]))
             return(self.profiles[profile][key])
@@ -745,14 +745,14 @@
         dbg('ConfigBase::set_item: Setting %s=%s (profile=%s, plugin=%s)' %
                 (key, value, profile, plugin))
 
-        if self.global_config.has_key(key):
+        if key in self.global_config:
             self.global_config[key] = value
-        elif self.profiles[profile].has_key(key):
+        elif key in self.profiles[profile]:
             self.profiles[profile][key] = value
         elif key == 'keybindings':
             self.keybindings = value
         elif plugin is not None:
-            if not self.plugins.has_key(plugin):
+            if plugin not in self.plugins:
                 self.plugins[plugin] = {}
             self.plugins[plugin][key] = value
         else:
@@ -762,7 +762,7 @@
 
     def get_plugin(self, plugin):
         """Return a whole tree for a plugin"""
-        if self.plugins.has_key(plugin):
+        if plugin in self.plugins:
             return(self.plugins[plugin])
 
     def set_plugin(self, plugin, tree):
@@ -797,7 +797,7 @@
 
     def get_layout(self, layout):
         """Return a layout"""
-        if self.layouts.has_key(layout):
+        if layout in self.layouts:
             return(self.layouts[layout])
         else:
             err('layout does not exist: %s' % layout)
diff -x .bzr -uNr terminator-1.91/terminatorlib/container.py python3/terminatorlib/container.py
--- terminator-1.91/terminatorlib/container.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/container.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """container.py - classes necessary to contain Terminal widgets"""
@@ -6,13 +6,12 @@
 from gi.repository import GObject
 from gi.repository import Gtk
 
-from factory import Factory
-from config import Config
-from util import dbg, err
-from translation import _
-from signalman import Signalman
+from .factory import Factory
+from .config import Config
+from .util import dbg, err
+from .translation import _
+from .signalman import Signalman
 
-# pylint: disable-msg=R0921
 class Container(object):
     """Base class for Terminator Containers"""
 
@@ -38,7 +37,7 @@
                 dbg('Container:: skipping signal %s for %s, already exists' % (
                         signal['name'], widget))
             else:
-                dbg('Container:: registering signal for %s on %s' % 
+                dbg('Container:: registering signal for %s on %s' %
                         (signal['name'], widget))
                 try:
                     GObject.signal_new(signal['name'],
@@ -156,19 +155,19 @@
 
     def construct_confirm_close(self, window, reqtype):
         """Create a confirmation dialog for closing things"""
-        
+
         # skip this dialog if applicable
         if self.config['suppress_multiple_term_dialog']:
             return Gtk.ResponseType.ACCEPT
-        
+
         dialog = Gtk.Dialog(_('Close?'), window, Gtk.DialogFlags.MODAL)
         dialog.set_resizable(False)
-    
+
         dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT)
         c_all = dialog.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.ACCEPT)
         c_all.get_children()[0].get_children()[0].get_children()[1].set_label(
                 _('Close _Terminals'))
-    
+
         primary = Gtk.Label(label=_('<big><b>Close multiple terminals?</b></big>'))
         primary.set_use_markup(True)
         primary.set_alignment(0, 0.5)
@@ -182,15 +181,15 @@
             label_text = ''
         secondary = Gtk.Label(label=label_text)
         secondary.set_line_wrap(True)
-                    
+
         labels = Gtk.VBox()
         labels.pack_start(primary, False, False, 6)
         labels.pack_start(secondary, False, False, 6)
-    
+
         image = Gtk.Image.new_from_stock(Gtk.STOCK_DIALOG_WARNING,
                                          Gtk.IconSize.DIALOG)
         image.set_alignment(0.5, 0)
-    
+
         box = Gtk.HBox()
         box.pack_start(image, False, False, 6)
         box.pack_start(labels, False, False, 6)
@@ -198,18 +197,18 @@
 
         checkbox = Gtk.CheckButton(_("Do not show this message next time"))
         dialog.vbox.pack_end(checkbox, True, True, 0)
-    
+
         dialog.show_all()
 
         result = dialog.run()
-        
+
         # set configuration
         self.config.base.reload()
         self.config['suppress_multiple_term_dialog'] = checkbox.get_active()
         self.config.save()
 
         dialog.destroy()
-                
+
         return(result)
 
     def propagate_title_change(self, widget, title):
@@ -264,13 +263,13 @@
             if hasattr(position, '__iter__'):
                 position = ':'.join([str(x) for x in position])
             layout['position'] = position
-        
+
         if hasattr(self, 'ismaximised'):
             layout['maximised'] = self.ismaximised
-        
+
         if hasattr(self, 'isfullscreen'):
             layout['fullscreen'] = self.isfullscreen
-        
+
         if hasattr(self, 'ratio'):
             layout['ratio'] = self.ratio
 
@@ -283,7 +282,7 @@
         if mytype == 'Notebook':
             labels = []
             last_active_term = []
-            for tabnum in xrange(0, self.get_n_pages()):
+            for tabnum in range(0, self.get_n_pages()):
                 page = self.get_nth_page(tabnum)
                 label = self.get_tab_label(page)
                 labels.append(label.get_custom_label())
diff -x .bzr -uNr terminator-1.91/terminatorlib/cwd.py python3/terminatorlib/cwd.py
--- terminator-1.91/terminatorlib/cwd.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/cwd.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """cwd.py - function necessary to get the cwd for a given pid on various OSes
@@ -15,7 +15,7 @@
 import platform
 import os
 import pwd
-from util import dbg, err
+from .util import dbg, err
 
 try:
     import psutil
@@ -46,7 +46,7 @@
         func = linux_get_pid_cwd
     elif system == 'FreeBSD':
         try:
-            import freebsd
+            from . import freebsd
             func = freebsd.get_process_cwd
             dbg('Using FreeBSD get_pid_cwd')
         except (OSError, NotImplementedError, ImportError):
@@ -66,7 +66,7 @@
     insert it into, e.g. /proc/%s/cwd"""
     try:
         cwd = os.path.realpath(path % pid)
-    except Exception, ex:
+    except Exception as ex:
         err('Unable to get cwd for PID %s: %s' % (pid, ex))
         cwd = '/'
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/debugserver.py python3/terminatorlib/debugserver.py
--- terminator-1.91/terminatorlib/debugserver.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/debugserver.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #
 # Copyright (c) 2008, Thomas Hurst <tom@hur.st>
 #
@@ -10,7 +10,7 @@
 
 import socket
 import threading
-import SocketServer
+import socketserver
 import code
 import sys
 import readline
@@ -22,7 +22,7 @@
   return
   dbg(msg)
 
-class PythonConsoleServer(SocketServer.BaseRequestHandler):
+class PythonConsoleServer(socketserver.BaseRequestHandler):
   env = None
   def setup(self):
     dbg('debugserver: connect from %s' % str(self.client_address))
@@ -165,7 +165,7 @@
 
 def spawn(env):
   PythonConsoleServer.env = env
-  tcpserver = SocketServer.TCPServer(('127.0.0.1', 0), PythonConsoleServer)
+  tcpserver = socketserver.TCPServer(('127.0.0.1', 0), PythonConsoleServer)
   dbg("debugserver: listening on %s" % str(tcpserver.server_address))
   debugserver = threading.Thread(target=tcpserver.serve_forever, name="DebugServer")
   debugserver.setDaemon(True)
diff -x .bzr -uNr terminator-1.91/terminatorlib/editablelabel.py python3/terminatorlib/editablelabel.py
--- terminator-1.91/terminatorlib/editablelabel.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/editablelabel.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab
 #
 # Copyright (c) 2009, Emmanuel Bretelle <chantra@debuntu.org>
diff -x .bzr -uNr terminator-1.91/terminatorlib/encoding.py python3/terminatorlib/encoding.py
--- terminator-1.91/terminatorlib/encoding.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/encoding.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    TerminatorEncoding - charset encoding classes
 #    Copyright (C) 2006-2010  chantra@debuntu.org
 #
@@ -23,7 +23,7 @@
  and src/encoding.c
 """
 
-from translation import _
+from .translation import _
 
 #pylint: disable-msg=R0903
 class TerminatorEncoding:
diff -x .bzr -uNr terminator-1.91/terminatorlib/factory.py python3/terminatorlib/factory.py
--- terminator-1.91/terminatorlib/factory.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/factory.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """factory.py - Maker of objects
@@ -19,8 +19,8 @@
 
 """
 
-from borg import Borg
-from util import dbg, err, inject_uuid
+from .borg import Borg
+from .util import dbg, err, inject_uuid
 
 # pylint: disable-msg=R0201
 # pylint: disable-msg=W0613
@@ -33,7 +33,7 @@
              'Notebook': 'notebook',
              'Container': 'container',
              'Window': 'window'}
-    types_keys = types.keys()
+    types_keys = list(types.keys())
     instance_types = {}
     instance_types_keys = []
 
@@ -97,26 +97,26 @@
 
     def make_window(self, **kwargs):
         """Make a Window"""
-        import window
+        from . import window
         return(window.Window(**kwargs))
 
     def make_terminal(self, **kwargs):
         """Make a Terminal"""
-        import terminal
+        from . import terminal
         return(terminal.Terminal())
 
     def make_hpaned(self, **kwargs):
         """Make an HPaned"""
-        import paned
+        from . import paned
         return(paned.HPaned())
 
     def make_vpaned(self, **kwargs):
         """Make a VPaned"""
-        import paned
+        from . import paned
         return(paned.VPaned())
 
     def make_notebook(self, **kwargs):
         """Make a Notebook"""
-        import notebook
+        from . import notebook
         return(notebook.Notebook(kwargs['window']))
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/freebsd.py python3/terminatorlib/freebsd.py
--- terminator-1.91/terminatorlib/freebsd.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/freebsd.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #
 # Copyright (c) 2008, Thomas Hurst <tom@hur.st>
 #
@@ -50,11 +50,11 @@
 ver = c_uint(0)
 
 if (libc.sysctlbyname('kern.osreldate', byref(ver), byref(uintlen), None, 0) < 0):
-  raise OSError, "sysctlbyname returned < 0"
+  raise OSError("sysctlbyname returned < 0")
 
 # kern.proc.filedesc added for procstat(1) after these __FreeBSD_versions
 if ver.value < 700104 and ver.value < 800019:
-  raise NotImplementedError, "cwd detection requires a recent 7.0-STABLE or 8-CURRENT"
+  raise NotImplementedError("cwd detection requires a recent 7.0-STABLE or 8-CURRENT")
 
 
 def get_process_cwd(pid):
@@ -72,7 +72,7 @@
     return None
 
   kifs = cast(buf, POINTER(kinfo_file))
-  for i in xrange(0, uintlen.value / sizeof(kinfo_file)):
+  for i in range(0, uintlen.value / sizeof(kinfo_file)):
     kif = kifs[i]
     if kif.kf_fd == -1: # KF_FD_TYPE_CWD
       return kif.kf_path
@@ -80,12 +80,12 @@
 
 if __name__ == '__main__':
   import os, sys
-  print " => %d cwd = %s" % (os.getpid(), get_process_cwd(os.getpid()))
+  print((" => %d cwd = %s" % (os.getpid(), get_process_cwd(os.getpid()))))
   for pid in sys.argv:
     try:
       pid = int(pid)
     except:
       pass
     else:
-      print " => %d cwd = %s" % (pid, get_process_cwd(pid))
+      print((" => %d cwd = %s" % (pid, get_process_cwd(pid))))
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/__init__.py python3/terminatorlib/__init__.py
--- terminator-1.91/terminatorlib/__init__.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/__init__.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    Terminator - multiple gnome terminals in one window
 #    Copyright (C) 2006-2010  cmsj@tenshu.net
 #
diff -x .bzr -uNr terminator-1.91/terminatorlib/ipc.py python3/terminatorlib/ipc.py
--- terminator-1.91/terminatorlib/ipc.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/ipc.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,17 +1,18 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """ipc.py - DBus server and API calls"""
 
+import hashlib
 from gi.repository import Gdk
 import dbus.service
 from dbus.exceptions import DBusException
 import dbus.glib
-from borg import Borg
-from terminator import Terminator
-from config import Config
-from factory import Factory
-from util import dbg,  enumerate_descendants
+from .borg import Borg
+from .terminator import Terminator
+from .config import Config
+from .factory import Factory
+from .util import dbg,  enumerate_descendants
 
 CONFIG = Config()
 if not CONFIG['dbus']:
@@ -23,7 +24,9 @@
 BUS_PATH = '/net/tenshu/Terminator2'
 try:
     # Try and include the X11 display name in the dbus bus name
-    DISPLAY  = hex(hash(Gdk.get_display().partition('.')[0]))
+    DISPLAY = Gdk.get_display().partition('.')[0]
+    # In Python 3, hash() uses a different seed on each run, so use hashlib
+    DISPLAY = hashlib.md5(DISPLAY.encode('utf-8')).hexdigest()
     BUS_NAME = '%s%s' % (BUS_BASE, DISPLAY)
 except:
     BUS_NAME = BUS_BASE
@@ -185,7 +188,7 @@
 
 def with_proxy(func):
     """Decorator function to connect to the session dbus bus"""
-    dbg('dbus client call: %s' % func.func_name)
+    dbg('dbus client call: %s' % func.__name__)
     def _exec(*args, **argd):
         bus = dbus.SessionBus()
         proxy = bus.get_object(BUS_NAME, BUS_PATH)
@@ -205,45 +208,45 @@
 @with_proxy
 def new_window(session, options):
     """Call the dbus method to open a new window"""
-    print session.new_window()
+    print((session.new_window()))
 
 @with_proxy
 def new_tab(session, uuid, options):
     """Call the dbus method to open a new tab in the first window"""
-    print session.new_tab(uuid)
+    print((session.new_tab(uuid)))
 
 @with_proxy
 def hsplit(session, uuid, options):
     """Call the dbus method to horizontally split a terminal"""
-    print session.hsplit(uuid)
+    print((session.hsplit(uuid)))
 
 @with_proxy
 def vsplit(session, uuid, options):
     """Call the dbus method to vertically split a terminal"""
-    print session.vsplit(uuid)
+    print((session.vsplit(uuid)))
 
 @with_proxy
 def get_terminals(session, options):
     """Call the dbus method to return a list of all terminals"""
-    print '\n'.join(session.get_terminals())
+    print(('\n'.join(session.get_terminals())))
 
 @with_proxy
 def get_window(session, uuid, options):
     """Call the dbus method to return the toplevel tab for a terminal"""
-    print session.get_window(uuid)
+    print((session.get_window(uuid)))
 
 @with_proxy
 def get_window_title(session, uuid, options):
     """Call the dbus method to return the title of a tab"""
-    print session.get_window_title(uuid)
+    print((session.get_window_title(uuid)))
 
 @with_proxy
 def get_tab(session, uuid, options):
     """Call the dbus method to return the toplevel tab for a terminal"""
-    print session.get_tab(uuid)
+    print((session.get_tab(uuid)))
 
 @with_proxy
 def get_tab_title(session, uuid, options):
     """Call the dbus method to return the title of a tab"""
-    print session.get_tab_title(uuid)
+    print((session.get_tab_title(uuid)))
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/keybindings.py python3/terminatorlib/keybindings.py
--- terminator-1.91/terminatorlib/keybindings.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/keybindings.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #  Terminator - multiple gnome terminals in one window
 #   Copyright (C) 2006-2010  cmsj@tenshu.net
 #
@@ -24,7 +24,7 @@
 
 import re
 from gi.repository import Gtk, Gdk
-from util import err
+from .util import err
 
 class KeymapError(Exception):
     """Custom exception for errors in keybinding configurations"""
@@ -61,7 +61,7 @@
         """Parse bindings and mangle into an appropriate form"""
         self._lookup = {}
         self._masks = 0
-        for action, bindings in self.keys.items():
+        for action, bindings in list(self.keys.items()):
             if not isinstance(bindings, tuple):
                 bindings = (bindings,)
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/layoutlauncher.py python3/terminatorlib/layoutlauncher.py
--- terminator-1.91/terminatorlib/layoutlauncher.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/layoutlauncher.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """layoutlauncher.py - class for the Layout Launcher window"""
@@ -7,11 +7,11 @@
 from gi.repository import Gtk
 from gi.repository import GObject
 
-from util import dbg, err, spawn_new_terminator
-import config
-from translation import _
-from terminator import Terminator
-from plugin import PluginRegistry
+from .util import dbg, err, spawn_new_terminator
+from . import config
+from .translation import _
+from .terminator import Terminator
+from .plugin import PluginRegistry
 
 class LayoutLauncher:
     """Class implementing the various parts of the preferences editor"""
@@ -38,9 +38,9 @@
             librarypath = os.path.join(head, 'layoutlauncher.glade')
             gladefile = open(librarypath, 'r')
             gladedata = gladefile.read()
-        except Exception, ex:
-            print "Failed to find layoutlauncher.glade"
-            print ex
+        except Exception as ex:
+            print("Failed to find layoutlauncher.glade")
+            print(ex)
             return
 
         self.builder.add_from_string(gladedata)
@@ -72,7 +72,7 @@
         """Update the contents of the layout"""
         self.layouttreestore.clear()
         layouts = self.config.list_layouts()
-        for layout in sorted(layouts, cmp=lambda x,y: cmp(x.lower(), y.lower())):
+        for layout in sorted(layouts, key=str.lower):
             if layout != "default":
                 self.layouttreestore.append([layout])
             else:
@@ -100,9 +100,9 @@
         spawn_new_terminator(self.terminator.origcwd, ['-u', '-l', layout])
 
 if __name__ == '__main__':
-    import util
+    from . import util
     util.DEBUG = True
-    import terminal
+    from . import terminal
     LAYOUTLAUNCHER = LayoutLauncher()
 
     Gtk.main()
diff -x .bzr -uNr terminator-1.91/terminatorlib/notebook.py python3/terminatorlib/notebook.py
--- terminator-1.91/terminatorlib/notebook.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/notebook.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """notebook.py - classes for the notebook widget"""
@@ -8,13 +8,13 @@
 from gi.repository import Gdk
 from gi.repository import Gio
 
-from terminator import Terminator
-from config import Config
-from factory import Factory
-from container import Container
-from editablelabel import EditableLabel
-from translation import _
-from util import err, dbg, enumerate_descendants, make_uuid
+from .terminator import Terminator
+from .config import Config
+from .factory import Factory
+from .container import Container
+from .editablelabel import EditableLabel
+from .translation import _
+from .util import err, dbg, enumerate_descendants, make_uuid
 
 class Notebook(Container, Gtk.Notebook):
     """Class implementing a Gtk.Notebook container"""
@@ -65,7 +65,7 @@
             pos = getattr(Gtk.PositionType, self.config['tab_position'].upper())
             self.set_tab_pos(pos)
 
-        for tab in xrange(0, self.get_n_pages()):
+        for tab in range(0, self.get_n_pages()):
             label = self.get_tab_label(self.get_nth_page(tab))
             label.update_angle()
 
@@ -88,7 +88,7 @@
             if (order_a > order_b):
                 return 1
 
-        if not layout.has_key('children'):
+        if 'children' not in layout:
             err('layout specifies no children: %s' % layout)
             return
 
@@ -99,7 +99,7 @@
             return
 
         num = 0
-        keys = children.keys()
+        keys = list(children.keys())
         keys.sort(child_compare)
 
         for child_key in keys:
@@ -122,7 +122,7 @@
                 # This page does not yet exist, so make it
                 self.newtab(children[child_key])
                 page = self.get_nth_page(num)
-            if layout.has_key('labels'):
+            if 'labels' in layout:
                 labeltext = layout['labels'][num]
                 if labeltext and labeltext != "None":
                     label = self.get_tab_label(page)
@@ -133,7 +133,7 @@
                 self.last_active_term[page] = make_uuid(layout['last_active_term'][num])
             num = num + 1
 
-        if layout.has_key('active_page'):
+        if 'active_page' in layout:
             # Need to do it later, or layout changes result
             GObject.idle_add(self.set_current_page, int(layout['active_page']))
         else:
@@ -233,7 +233,7 @@
     def get_children(self):
         """Return an ordered list of our children"""
         children = []
-        for page in xrange(0,self.get_n_pages()):
+        for page in range(0,self.get_n_pages()):
             children.append(self.get_nth_page(page))
         return(children)
 
@@ -278,13 +278,13 @@
                     handler = handler[0]
                 self.connect_child(widget, signal, handler, *args)
 
-        if metadata and metadata.has_key('tabnum'):
+        if metadata and 'tabnum' in metadata:
             tabpos = metadata['tabnum']
         else:
             tabpos = -1
 
         label = TabLabel(self.window.get_title(), self)
-        if metadata and metadata.has_key('label'):
+        if metadata and 'label' in metadata:
             dbg('creating TabLabel with text: %s' % metadata['label'])
             label.set_custom_label(metadata['label'])
         label.connect('close-clicked', self.closetab)
@@ -334,7 +334,7 @@
             err('TabLabel::closetab: called on non-Notebook: %s' % widget)
             return
 
-        for i in xrange(0, nb.get_n_pages() + 1):
+        for i in range(0, nb.get_n_pages() + 1):
             if label == nb.get_tab_label(nb.get_nth_page(i)):
                 tabnum = i
                 break
@@ -434,7 +434,7 @@
             del(self)
             # Find the last terminal in the new parent and give it focus
             terms = parent.get_visible_terminals()
-            terms.keys()[-1].grab_focus()
+            list(terms.keys())[-1].grab_focus()
 
     def page_num_descendant(self, widget):
         """Find the tabnum of the tab containing a widget at any level"""
@@ -464,7 +464,7 @@
         if self.terminator.doing_layout == True:
             return
         last_active_term = {}
-        for tabnum in xrange(0, self.get_n_pages()):
+        for tabnum in range(0, self.get_n_pages()):
             nth_page = self.get_nth_page(tabnum)
             if nth_page in self.last_active_term:
                 last_active_term[nth_page] = self.last_active_term[nth_page]
@@ -501,7 +501,7 @@
         #print "event: %s" % event
         child = self.get_nth_page(self.get_current_page())
         if child == None:
-            print "Child = None,  return false"
+            print("Child = None,  return false")
             return False
 
         event_widget = Gtk.get_event_widget(event)
@@ -509,7 +509,7 @@
         if event_widget == None or \
            event_widget == child or \
            event_widget.is_ancestor(child):
-            print "event_widget is wrong one,  return false"
+            print("event_widget is wrong one,  return false")
             return False
 
         # Not sure if we need these. I don't think wehave any action widgets
diff -x .bzr -uNr terminator-1.91/terminatorlib/optionparse.py python3/terminatorlib/optionparse.py
--- terminator-1.91/terminatorlib/optionparse.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/optionparse.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    Terminator.optionparse - Parse commandline options
 #    Copyright (C) 2006-2010  cmsj@tenshu.net
 #
@@ -20,11 +20,11 @@
 import os
 
 from optparse import OptionParser, SUPPRESS_HELP
-from util import dbg, err
-import util
-import config
-import version
-from translation import _
+from .util import dbg, err
+from . import util
+from . import config
+from . import version
+from .translation import _
 
 options = None
 
@@ -79,8 +79,6 @@
                    'inside the terminal, and its arguments'))
     parser.add_option('--working-directory', metavar='DIR',
             dest='working_directory', help=_('Set the working directory'))
-    parser.add_option('-c', '--classname', dest='classname', help=_('Set a \
-custom name (WM_CLASS) property on the window'))
     parser.add_option('-i', '--icon', dest='forcedicon', help=_('Set a custom \
 icon for the window (by file or name)'))
     parser.add_option('-r', '--role', dest='role', 
@@ -112,7 +110,7 @@
         parser.error('Additional unexpected arguments found: %s' % args)
 
     if options.version:
-        print '%s %s' % (version.APP_NAME, version.APP_VERSION)
+        print(('%s %s' % (version.APP_NAME, version.APP_VERSION)))
         sys.exit(0)
 
     if options.debug_classes or options.debug_methods:
diff -x .bzr -uNr terminator-1.91/terminatorlib/paned.py python3/terminatorlib/paned.py
--- terminator-1.91/terminatorlib/paned.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/paned.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """paned.py - a base Paned container class and the vertical/horizontal
@@ -7,12 +7,11 @@
 import time
 from gi.repository import GObject, Gtk, Gdk
 
-from util import dbg, err,  enumerate_descendants
-from terminator import Terminator
-from factory import Factory
-from container import Container
+from .util import dbg, err,  enumerate_descendants
+from .terminator import Terminator
+from .factory import Factory
+from .container import Container
 
-# pylint: disable-msg=R0921
 # pylint: disable-msg=E1101
 class Paned(Container):
     """Base class for Paned Containers"""
@@ -28,9 +27,9 @@
         self.terminator = Terminator()
         self.maker = Factory()
         Container.__init__(self)
-        self.signals.append({'name': 'resize-term', 
+        self.signals.append({'name': 'resize-term',
                              'flags': GObject.SignalFlags.RUN_LAST,
-                             'return_type': None, 
+                             'return_type': None,
                              'param_types': (GObject.TYPE_STRING,)})
 
 
@@ -45,7 +44,7 @@
             container = VPaned()
         else:
             container = HPaned()
-        
+
         self.get_toplevel().set_pos_by_ratio = True
 
         if not sibling:
@@ -71,7 +70,7 @@
 
         self.show_all()
         sibling.grab_focus()
-        
+
         while Gtk.events_pending():
             Gtk.main_iteration_do(False)
         self.get_toplevel().set_pos_by_ratio = False
@@ -123,7 +122,7 @@
                 self.connect_child(widget, signal, handler, *args)
 
             if metadata and \
-               metadata.has_key('had_focus') and \
+               'had_focus' in metadata and \
                metadata['had_focus'] == True:
                     widget.grab_focus()
 
@@ -141,7 +140,7 @@
                 recurse_up=True
             else:
                 recurse_up=False
-            
+
             if event.get_state() & Gdk.ModifierType.SHIFT_MASK == Gdk.ModifierType.SHIFT_MASK:
                 recurse_down=True
             else:
@@ -184,7 +183,7 @@
             highest_ancestor = highest_ancestor.get_parent()
 
         highest_ancestor.set_autoresize(False)
-        
+
         # (1b) If Super modifier, redistribute higher sections too
         if recurse_up:
             grandfather=highest_ancestor.get_parent()
@@ -195,7 +194,7 @@
         highest_ancestor._do_redistribute(recurse_up, recurse_down)
 
         GObject.idle_add(highest_ancestor.set_autoresize, True)
-    
+
     def _do_redistribute(self, recurse_up=False, recurse_down=False):
         maker = Factory()
         #2 Make a list of self + all children of same type
@@ -221,7 +220,7 @@
                       (maker.isinstance(child, 'VPaned') or \
                        maker.isinstance(child, 'HPaned')):
                         child.do_redistribute(False, True)
-                    
+
         #3 Get ancestor x/y => a, and handle size => hs
         avail_pixels=self.get_length()
         handle_size = self.get_handlesize()
@@ -357,7 +356,7 @@
 
     def create_layout(self, layout):
         """Apply layout configuration"""
-        if not layout.has_key('children'):
+        if 'children' not in layout:
             err('layout specifies no children: %s' % layout)
             return
 
@@ -376,14 +375,14 @@
             for child in children:
                 key = children[child]['order']
                 child_order_map[key] = child
-            map_keys = child_order_map.keys()
+            map_keys = list(child_order_map.keys())
             map_keys.sort()
             for map_key in map_keys:
                 keys.append(child_order_map[map_key])
         except KeyError:
             # We've failed to figure out the order. At least give the terminals
             # in the wrong order
-            keys = children.keys()
+            keys = list(children.keys())
 
         num = 0
         for child_key in keys:
@@ -411,7 +410,7 @@
         self.get_child2().create_layout(children[keys[1]])
 
         # Set the position with ratio. For some reason more reliable than by pos.
-        if layout.has_key('ratio'):
+        if 'ratio' in layout:
             self.ratio = float(layout['ratio'])
             self.set_position_by_ratio()
 
@@ -472,7 +471,7 @@
             self.set_position_by_ratio()
         else:
             self.set_position(self.get_position())
-    
+
     def position_by_ratio(self, total_size, handle_size, ratio):
         non_separator_size = max(total_size - handle_size, 0)
         ratio = min(max(ratio, 0.0), 1.0)
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugin.py python3/terminatorlib/plugin.py
--- terminator-1.91/terminatorlib/plugin.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugin.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """plugin.py - Base plugin system
@@ -25,10 +25,10 @@
 
 import sys
 import os
-import borg
-from config import Config
-from util import dbg, err, get_config_dir
-from terminator import Terminator
+from . import borg
+from .config import Config
+from .util import dbg, err, get_config_dir
+from .terminator import Terminator
 
 class Plugin(object):
     """Definition of our base plugin class"""
@@ -95,7 +95,7 @@
                     try:
                         module = __import__(plugin[:-3], None, None, [''])
                         for item in getattr(module, 'AVAILABLE'):
-                            if item not in self.available_plugins.keys():
+                            if item not in list(self.available_plugins.keys()):
                                 func = getattr(module, item)
                                 self.available_plugins[item] = func
 
@@ -104,7 +104,7 @@
                                 continue
                             if item not in self.instances:
                                 self.instances[item] = func()
-                    except Exception, ex:
+                    except Exception as ex:
                         err('PluginRegistry::load_plugins: Importing plugin %s \
 failed: %s' % (plugin, ex))
 
@@ -127,12 +127,12 @@
     def get_available_plugins(self):
         """Return a list of all available plugins whether they are enabled or
         disabled"""
-        return(self.available_plugins.keys())
+        return(list(self.available_plugins.keys()))
 
     def is_enabled(self, plugin):
         """Return a boolean value indicating whether a plugin is enabled or
         not"""
-        return(self.instances.has_key(plugin))
+        return(plugin in self.instances)
 
     def enable(self, plugin):
         """Enable a plugin"""
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugins/activitywatch.py python3/terminatorlib/plugins/activitywatch.py
--- terminator-1.91/terminatorlib/plugins/activitywatch.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugins/activitywatch.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """activitywatch.py - Terminator Plugin to watch a terminal for activity"""
@@ -53,7 +53,7 @@
     def callback(self, menuitems, menu, terminal):
         """Add our menu item to the menu"""
         item = Gtk.CheckMenuItem.new_with_mnemonic(_('Watch for _activity'))
-        item.set_active(self.watches.has_key(terminal))
+        item.set_active(terminal in self.watches)
         if item.get_active():
             item.connect("activate", self.unwatch, terminal)
         else:
@@ -85,7 +85,7 @@
                                   terminal.get_window_title(), 'terminator')
 
         this_time = time.mktime(time.gmtime())
-        if not self.last_notifies.has_key(terminal):
+        if terminal not in self.last_notifies:
             show_notify = True
         else:
             last_time = self.last_notifies[terminal]
@@ -119,7 +119,7 @@
     def callback(self, menuitems, menu, terminal):
         """Add our menu item to the menu"""
         item = Gtk.CheckMenuItem.new_with_mnemonic(_("Watch for _silence"))
-        item.set_active(self.watches.has_key(terminal))
+        item.set_active(terminal in self.watches)
         if item.get_active():
             item.connect("activate", self.unwatch, terminal)
         else:
@@ -153,7 +153,7 @@
     def check_times(self, terminal):
         """Check if this terminal has gone silent"""
         time_now = time.mktime(time.gmtime())
-        if not self.last_activities.has_key(terminal):
+        if terminal not in self.last_activities:
             dbg('Terminal %s has no last activity' % terminal)
             return True
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugins/custom_commands.py python3/terminatorlib/plugins/custom_commands.py
--- terminator-1.91/terminatorlib/plugins/custom_commands.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugins/custom_commands.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """custom_commands.py - Terminator Plugin to add custom command menu entries"""
@@ -16,7 +16,7 @@
 from terminatorlib.translation import _
 from terminatorlib.util import get_config_dir, err, dbg, gerr
 
-(CC_COL_ENABLED, CC_COL_NAME, CC_COL_COMMAND) = range(0,3)
+(CC_COL_ENABLED, CC_COL_NAME, CC_COL_COMMAND) = list(range(0,3))
 
 # Every plugin you want Terminator to load *must* be listed in 'AVAILABLE'
 AVAILABLE = ['CustomCommandsMenu']
@@ -35,13 +35,13 @@
       noord_cmds = []
       for part in sections:
         s = sections[part]
-        if not (s.has_key("name") and s.has_key("command")):
-          print "CustomCommandsMenu: Ignoring section %s" % s
+        if not ("name" in s and "command" in s):
+          print(("CustomCommandsMenu: Ignoring section %s" % s))
           continue
         name = s["name"]
         command = s["command"]
         enabled = s["enabled"] and s["enabled"] or False
-        if s.has_key("position"):
+        if "position" in s:
           self.cmd_list[int(s["position"])] = {'enabled' : enabled,
                                                'name' : name,
                                                'command' : command
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugins/logger.py python3/terminatorlib/plugins/logger.py
--- terminator-1.91/terminatorlib/plugins/logger.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugins/logger.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 
 # Plugin by Sinan Nalkaya <sardok@gmail.com>
 # See LICENSE of Terminator package.
@@ -30,7 +30,7 @@
     def callback(self, menuitems, menu, terminal):
         """ Add save menu item to the menu"""
         vte_terminal = terminal.get_vte()
-        if not self.loggers.has_key(vte_terminal):
+        if vte_terminal not in self.loggers:
             item = Gtk.MenuItem.new_with_mnemonic(_('Start _Logger'))
             item.connect("activate", self.start_logger, terminal)
         else:
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugins/maven.py python3/terminatorlib/plugins/maven.py
--- terminator-1.91/terminatorlib/plugins/maven.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugins/maven.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Copyright (c) 2010 Julien Nicoulaud <julien.nicoulaud@gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
Binary files terminator-1.91/terminatorlib/plugins/__pycache__/activitywatch.cpython-37.pyc and python3/terminatorlib/plugins/__pycache__/activitywatch.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/plugins/__pycache__/custom_commands.cpython-37.pyc and python3/terminatorlib/plugins/__pycache__/custom_commands.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/plugins/__pycache__/logger.cpython-37.pyc and python3/terminatorlib/plugins/__pycache__/logger.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/plugins/__pycache__/maven.cpython-37.pyc and python3/terminatorlib/plugins/__pycache__/maven.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/plugins/__pycache__/terminalshot.cpython-37.pyc and python3/terminatorlib/plugins/__pycache__/terminalshot.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/plugins/__pycache__/testplugin.cpython-37.pyc and python3/terminatorlib/plugins/__pycache__/testplugin.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/plugins/__pycache__/url_handlers.cpython-37.pyc and python3/terminatorlib/plugins/__pycache__/url_handlers.cpython-37.pyc differ
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugins/terminalshot.py python3/terminatorlib/plugins/terminalshot.py
--- terminator-1.91/terminatorlib/plugins/terminalshot.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugins/terminalshot.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """terminalshot.py - Terminator Plugin to take 'screenshots' of individual
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugins/testplugin.py python3/terminatorlib/plugins/testplugin.py
--- terminator-1.91/terminatorlib/plugins/testplugin.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugins/testplugin.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 import terminatorlib.plugin as plugin
 
 # AVAILABLE must contain a list of all the classes that you want exposed
diff -x .bzr -uNr terminator-1.91/terminatorlib/plugins/url_handlers.py python3/terminatorlib/plugins/url_handlers.py
--- terminator-1.91/terminatorlib/plugins/url_handlers.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/plugins/url_handlers.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net?
 # GPL v2 only
 """url_handlers.py - Default plugins for URL handling"""
diff -x .bzr -uNr terminator-1.91/terminatorlib/prefseditor.py python3/terminatorlib/prefseditor.py
--- terminator-1.91/terminatorlib/prefseditor.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/prefseditor.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 """Preferences Editor for Terminator. 
 
 Load a UIBuilder config file, display it,
@@ -10,14 +10,14 @@
 import os
 from gi.repository import GObject, Gtk, Gdk
 
-from util import dbg, err
-import config
-from keybindings import Keybindings, KeymapError
-from translation import _
-from encoding import TerminatorEncoding
-from terminator import Terminator
-from plugin import PluginRegistry
-from version import APP_NAME
+from .util import dbg, err
+from . import config
+from .keybindings import Keybindings, KeymapError
+from .translation import _
+from .encoding import TerminatorEncoding
+from .terminator import Terminator
+from .plugin import PluginRegistry
+from .version import APP_NAME
 
 def color2hex(widget):
     """Pull the colour values out of a Gtk ColorPicker widget and return them
@@ -33,6 +33,8 @@
     plugins = None
     keybindings = None
     window = None
+    calling_window = None
+    term = None
     builder = None
     layouteditor = None
     previous_layout_selection = None
@@ -171,6 +173,8 @@
         self.config = config.Config()
         self.config.base.reload()
         self.term = term
+        self.calling_window = self.term.get_toplevel()
+        self.calling_window.preventHide = True
         self.builder = Gtk.Builder()
         self.builder.set_translation_domain(APP_NAME)
         self.keybindings = Keybindings()
@@ -180,9 +184,9 @@
             librarypath = os.path.join(head, 'preferences.glade')
             gladefile = open(librarypath, 'r')
             gladedata = gladefile.read()
-        except Exception, ex:
-            print "Failed to find preferences.glade"
-            print ex
+        except Exception as ex:
+            print("Failed to find preferences.glade")
+            print(ex)
             return
 
         self.builder.add_from_string(gladedata)
@@ -203,7 +207,7 @@
         try:
             self.config.inhibit_save()
             self.set_values()
-        except Exception, e:
+        except Exception as e:
             err('Unable to set values: %s' % e)
         self.config.uninhibit_save()
 
@@ -212,6 +216,7 @@
         terminator = Terminator()
         terminator.reconfigure()
         self.window.destroy()
+        self.calling_window.preventHide = False
         del(self)
 
     def set_values(self):
@@ -559,7 +564,7 @@
         # NOTE: The palette selector is set after the colour pickers
         # Palette colour pickers
         colourpalette = self.config['palette'].split(':')
-        for i in xrange(1, 17):
+        for i in range(1, 17):
             widget = guiget('palette_colorpicker_%d' % i)
             widget.set_color(Gdk.color_parse(colourpalette[i - 1]))
         # Now set the palette selector widget
@@ -647,7 +652,7 @@
         encodingstore = guiget('EncodingListStore')
         value = self.config['encoding']
         encodings = TerminatorEncoding().get_list()
-        encodings.sort(lambda x, y: cmp(x[2].lower(), y[2].lower()))
+        encodings.sort(key=lambda x: x[2].lower())
 
         for encoding in encodings:
             if encoding[1] is None:
@@ -885,7 +890,7 @@
         guiget = self.builder.get_object
         active = widget.get_active()
 
-        for key in self.palettevalues.keys():
+        for key in list(self.palettevalues.keys()):
             if self.palettevalues[key] == active:
                 value = key
 
@@ -894,20 +899,20 @@
         else:
             sensitive = False
 
-        for num in xrange(1, 17):
+        for num in range(1, 17):
             picker = guiget('palette_colorpicker_%d' % num)
             picker.set_sensitive(sensitive)
 
         if value in self.palettes:
             palette = self.palettes[value]
             palettebits = palette.split(':')
-            for num in xrange(1, 17):
+            for num in range(1, 17):
                 # Update the visible elements
                 picker = guiget('palette_colorpicker_%d' % num)
                 picker.set_color(Gdk.color_parse(palettebits[num - 1]))
         elif value == 'custom':
             palettebits = []
-            for num in xrange(1, 17):
+            for num in range(1, 17):
                 picker = guiget('palette_colorpicker_%d' % num)
                 palettebits.append(color2hex(picker))
             palette = ':'.join(palettebits)
@@ -935,7 +940,7 @@
         guiget = self.builder.get_object
 
         # FIXME: We do this at least once elsewhere. refactor!
-        for num in xrange(1, 17):
+        for num in range(1, 17):
             picker = guiget('palette_colorpicker_%d' % num)
             value = color2hex(picker)
             palettebits.append(value)
@@ -1444,7 +1449,7 @@
         guiget = self.builder.get_object
         active = widget.get_active()
 
-        for key in self.colorschemevalues.keys():
+        for key in list(self.colorschemevalues.keys()):
             if self.colorschemevalues[key] == active:
                 value = key
 
@@ -1549,7 +1554,7 @@
         listitems = {}
         store.clear()
 
-        children = layout.keys()
+        children = list(layout.keys())
         i = 0
         while children != []:
             child = children.pop()
@@ -1645,17 +1650,17 @@
         command.set_sensitive(True)
         chooser.set_sensitive(True)
         workdir.set_sensitive(True)
-        if layout_item.has_key('command') and layout_item['command'] != '':
+        if 'command' in layout_item and layout_item['command'] != '':
             command.set_text(layout_item['command'])
         else:
             command.set_text('')
 
-        if layout_item.has_key('profile') and layout_item['profile'] != '':
+        if 'profile' in layout_item and layout_item['profile'] != '':
             chooser.set_active(self.profile_profile_to_ids[layout_item['profile']])
         else:
             chooser.set_active(0)
 
-        if layout_item.has_key('directory') and layout_item['directory'] != '':
+        if 'directory' in layout_item and layout_item['directory'] != '':
             workdir.set_text(layout_item['directory'])
         else:
             workdir.set_text('')
@@ -1684,9 +1689,9 @@
         self.config.save()
 
 if __name__ == '__main__':
-    import util
+    from . import util
     util.DEBUG = True
-    import terminal
+    from . import terminal
     TERM = terminal.Terminal()
     PREFEDIT = PrefsEditor(TERM)
 
Binary files terminator-1.91/terminatorlib/__pycache__/borg.cpython-37.pyc and python3/terminatorlib/__pycache__/borg.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/config.cpython-37.pyc and python3/terminatorlib/__pycache__/config.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/container.cpython-37.pyc and python3/terminatorlib/__pycache__/container.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/cwd.cpython-37.pyc and python3/terminatorlib/__pycache__/cwd.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/editablelabel.cpython-37.pyc and python3/terminatorlib/__pycache__/editablelabel.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/encoding.cpython-37.pyc and python3/terminatorlib/__pycache__/encoding.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/factory.cpython-37.pyc and python3/terminatorlib/__pycache__/factory.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/__init__.cpython-37.pyc and python3/terminatorlib/__pycache__/__init__.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/ipc.cpython-37.pyc and python3/terminatorlib/__pycache__/ipc.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/keybindings.cpython-37.pyc and python3/terminatorlib/__pycache__/keybindings.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/layoutlauncher.cpython-37.pyc and python3/terminatorlib/__pycache__/layoutlauncher.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/notebook.cpython-37.pyc and python3/terminatorlib/__pycache__/notebook.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/optionparse.cpython-37.pyc and python3/terminatorlib/__pycache__/optionparse.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/paned.cpython-37.pyc and python3/terminatorlib/__pycache__/paned.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/plugin.cpython-37.pyc and python3/terminatorlib/__pycache__/plugin.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/prefseditor.cpython-37.pyc and python3/terminatorlib/__pycache__/prefseditor.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/searchbar.cpython-37.pyc and python3/terminatorlib/__pycache__/searchbar.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/signalman.cpython-37.pyc and python3/terminatorlib/__pycache__/signalman.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/terminal.cpython-37.pyc and python3/terminatorlib/__pycache__/terminal.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/terminal_popup_menu.cpython-37.pyc and python3/terminatorlib/__pycache__/terminal_popup_menu.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/terminator.cpython-37.pyc and python3/terminatorlib/__pycache__/terminator.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/titlebar.cpython-37.pyc and python3/terminatorlib/__pycache__/titlebar.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/translation.cpython-37.pyc and python3/terminatorlib/__pycache__/translation.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/util.cpython-37.pyc and python3/terminatorlib/__pycache__/util.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/version.cpython-37.pyc and python3/terminatorlib/__pycache__/version.cpython-37.pyc differ
Binary files terminator-1.91/terminatorlib/__pycache__/window.cpython-37.pyc and python3/terminatorlib/__pycache__/window.cpython-37.pyc differ
diff -x .bzr -uNr terminator-1.91/terminatorlib/pylint.sh python3/terminatorlib/pylint.sh
--- terminator-1.91/terminatorlib/pylint.sh	1969-12-31 19:00:00.000000000 -0500
+++ python3/terminatorlib/pylint.sh	2019-08-19 19:25:15.963479000 -0400
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+for file in *.py; do
+  line=$(pylint $file 2>&1 | grep "^Your code has been rated")
+  rating=$(echo $line | cut -f 7 -d ' ')
+  previous=$(echo $line | cut -f 10 -d ' ')
+
+  if [ "$rating" != "10.00/10" ]; then
+    echo "$file rated $rating (previously $previous)"
+  fi
+done
diff -x .bzr -uNr terminator-1.91/terminatorlib/searchbar.py python3/terminatorlib/searchbar.py
--- terminator-1.91/terminatorlib/searchbar.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/searchbar.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,14 +1,14 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """searchbar.py - classes necessary to provide a terminal search bar"""
 
 from gi.repository import Gtk, Gdk
 from gi.repository import GObject
-import re
+from gi.repository import GLib
 
-from translation import _
-from config import Config
+from .translation import _
+from .config import Config
 
 # pylint: disable-msg=R0904
 class Searchbar(Gtk.HBox):
@@ -19,7 +19,6 @@
     }
 
     entry = None
-    reslabel = None
     next = None
     prev = None
     wrap = None
@@ -29,9 +28,6 @@
 
     searchstring = None
     searchre = None
-    searchrow = None
-
-    searchits = None
 
     def __init__(self):
         """Class initialiser"""
@@ -52,10 +48,6 @@
         label = Gtk.Label(label=_('Search:'))
         label.show()
 
-        # Result label
-        self.reslabel = Gtk.Label(label='')
-        self.reslabel.show()
-
         # Close Button
         close = Gtk.Button()
         close.set_relief(Gtk.ReliefStyle.NONE)
@@ -89,7 +81,6 @@
 
         self.pack_start(label, False, True, 0)
         self.pack_start(self.entry, True, True, 0)
-        self.pack_start(self.reslabel, False, True, 0)
         self.pack_start(self.prev, False, False, 0)
         self.pack_start(self.next, False, False, 0)
         self.pack_start(self.wrap, False, False, 0)
@@ -99,10 +90,9 @@
         self.set_no_show_all(True)
 
     def wrap_toggled(self, toggled):
-        if self.searchrow is None:
-            self.prev.set_sensitive(False)
-            self.next.set_sensitive(False)
-        elif toggled:
+        toggled_state = toggled.get_active()
+        self.vte.search_set_wrap_around(toggled_state)
+        if toggled_state:
             self.prev.set_sensitive(True)
             self.next.set_sensitive(True)
 
@@ -137,93 +127,38 @@
             return
 
         if searchtext != self.searchstring:
-            self.searchrow = self.get_vte_buffer_range()[0] - 1
             self.searchstring = searchtext
-            self.searchre = re.compile(searchtext)
+            self.searchre = GLib.Regex(searchtext, 0, 0)
+            self.vte.search_set_gregex(self.searchre, 0)
 
-        self.reslabel.set_text(_("Searching scrollback"))
         self.next.set_sensitive(True)
         self.prev.set_sensitive(True)
         self.next_search(None)
 
     def next_search(self, widget):
         """Search forwards and jump to the next result, if any"""
-        startrow,endrow = self.get_vte_buffer_range()
-        found = startrow <= self.searchrow and self.searchrow < endrow
-        row = self.searchrow
-        while True:
-            row += 1
-            if row >= endrow:
-                if found and self.wrap.get_active():
-                    row = startrow - 1
-                else:
-                    self.prev.set_sensitive(found)
-                    self.next.set_sensitive(False)
-                    self.reslabel.set_text(_('No more results'))
-                    return
-            buffer = self.vte.get_text_range(row, 0, row + 1, 0, self.search_character)
-
-            buffer = buffer[0]
-            buffer = buffer[:buffer.find('\n')]
-            matches = self.searchre.search(buffer)
-            if matches:
-                self.searchrow = row
-                self.prev.set_sensitive(True)
-                self.search_hit(self.searchrow)
-                return
+        found_result = self.vte.search_find_next()
+        if not self.wrap.get_active():
+            self.next.set_sensitive(found_result)
+        else:
+            self.next.set_sensitive(True)
+        self.prev.set_sensitive(True)
+        return
 
     def prev_search(self, widget):
         """Jump back to the previous search"""
-        startrow,endrow = self.get_vte_buffer_range()
-        found = startrow <= self.searchrow and self.searchrow < endrow
-        row = self.searchrow
-        while True:
-            row -= 1
-            if row <= startrow:
-                if found and self.wrap.get_active():
-                    row = endrow
-                else:
-                    self.next.set_sensitive(found)
-                    self.prev.set_sensitive(False)
-                    self.reslabel.set_text(_('No more results'))
-                    return
-            buffer = self.vte.get_text_range(row, 0, row + 1, 0, self.search_character)
-
-            buffer = buffer[0]
-            buffer = buffer[:buffer.find('\n')]
-            matches = self.searchre.search(buffer)
-            if matches:
-                self.searchrow = row
-                self.next.set_sensitive(True)
-                self.search_hit(self.searchrow)
-                return
-
-    def search_hit(self, row):
-        """Update the UI for a search hit"""
-        self.reslabel.set_text("%s %d" % (_('Found at row'), row))
-        self.get_parent().scrollbar_jump(row)
-        self.next.show()
-        self.prev.show()
-
-    def search_character(self, widget, col, row):
-        """We have to have a callback for each character"""
-        return(True)
-
-    def get_vte_buffer_range(self):
-        """Get the range of a vte widget"""
-        column, endrow = self.vte.get_cursor_position()
-        if self.config['scrollback_infinite']:
-            startrow = 0
+        found_result = self.vte.search_find_previous()
+        if not self.wrap.get_active():
+            self.prev.set_sensitive(found_result)
         else:
-            startrow = max(0, endrow - self.config['scrollback_lines'])
-        return(startrow, endrow)
+            self.prev.set_sensitive(True)
+        self.next.set_sensitive(True)
+        return
 
     def end_search(self, widget=None):
         """Trap and re-emit the end-search signal"""
-        self.searchrow = 0
         self.searchstring = None
         self.searchre = None
-        self.reslabel.set_text('')
         self.emit('end-search')
 
     def get_search_term(self):
diff -x .bzr -uNr terminator-1.91/terminatorlib/signalman.py python3/terminatorlib/signalman.py
--- terminator-1.91/terminatorlib/signalman.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/signalman.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,9 +1,9 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """Simple management of Gtk Widget signal handlers"""
 
-from util import dbg, err
+from .util import dbg, err
 
 class Signalman(object):
     """Class providing glib signal tracking and management"""
@@ -16,16 +16,16 @@
 
     def __del__(self):
         """Class destructor. This is only used to check for stray signals"""
-        if len(self.cnxids.keys()) > 0:
+        if len(list(self.cnxids.keys())) > 0:
             dbg('Remaining signals: %s' % self.cnxids)
 
     def new(self, widget, signal, handler, *args):
         """Register a new signal on a widget"""
-        if not self.cnxids.has_key(widget):
+        if widget not in self.cnxids:
             dbg('creating new bucket for %s' % type(widget))
             self.cnxids[widget] = {}
 
-        if self.cnxids[widget].has_key(signal):
+        if signal in self.cnxids[widget]:
             err('%s already has a handler for %s' % (id(widget), signal))
 
         self.cnxids[widget][signal] = widget.connect(signal, handler, *args)
@@ -34,31 +34,31 @@
 
     def remove_signal(self, widget, signal):
         """Remove a signal handler"""
-        if not self.cnxids.has_key(widget):
+        if widget not in self.cnxids:
             dbg('%s is not registered' % widget)
             return
-        if not self.cnxids[widget].has_key(signal):
+        if signal not in self.cnxids[widget]:
             dbg('%s not registered for %s' % (signal, type(widget)))
             return
         dbg('removing %s::%s' % (type(widget), signal))
         widget.disconnect(self.cnxids[widget][signal])
         del(self.cnxids[widget][signal])
-        if len(self.cnxids[widget].keys()) == 0:
+        if len(list(self.cnxids[widget].keys())) == 0:
             dbg('no more signals for widget')
             del(self.cnxids[widget])
 
     def remove_widget(self, widget):
         """Remove all signal handlers for a widget"""
-        if not self.cnxids.has_key(widget):
+        if widget not in self.cnxids:
             dbg('%s not registered' % widget)
             return
-        signals = self.cnxids[widget].keys()
+        signals = list(self.cnxids[widget].keys())
         for signal in signals:
             self.remove_signal(widget, signal)
 
     def remove_all(self):
         """Remove all signal handlers for all widgets"""
-        widgets = self.cnxids.keys()
+        widgets = list(self.cnxids.keys())
         for widget in widgets:
             self.remove_widget(widget)
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/terminal_popup_menu.py python3/terminatorlib/terminal_popup_menu.py
--- terminator-1.91/terminatorlib/terminal_popup_menu.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/terminal_popup_menu.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,21 +1,19 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """terminal_popup_menu.py - classes necessary to provide a terminal context 
 menu"""
 
-import string
-
 from gi.repository import Gtk
 
-from version import APP_NAME
-from translation import _
-from encoding import TerminatorEncoding
-from terminator import Terminator
-from util import err, dbg
-from config import Config
-from prefseditor import PrefsEditor
-import plugin
+from .version import APP_NAME
+from .translation import _
+from .encoding import TerminatorEncoding
+from .terminator import Terminator
+from .util import err, dbg
+from .config import Config
+from .prefseditor import PrefsEditor
+from . import plugin
 
 class TerminalPopupMenu(object):
     """Class implementing the Terminal context menu"""
@@ -51,7 +49,7 @@
 
         if url and url[0]:
             dbg("URL matches id: %d" % url[1])
-            if not url[1] in terminal.matches.values():
+            if not url[1] in list(terminal.matches.values()):
                 err("Unknown URL match id: %d" % url[1])
                 dbg("Available matches: %s" % terminal.matches)
 
@@ -63,7 +61,7 @@
             elif url[1] == terminal.matches['voip']:
                 nameopen = _('Ca_ll VoIP address')
                 namecopy = _('_Copy VoIP address')
-            elif url[1] in terminal.matches.values():
+            elif url[1] in list(terminal.matches.values()):
                 # This is a plugin match
                 for pluginname in terminal.matches:
                     if terminal.matches[pluginname] == url[1]:
@@ -191,7 +189,7 @@
             item.connect('activate', lambda x: PrefsEditor(self.terminal))
             menu.append(item)
 
-        profilelist = sorted(self.config.list_profiles(), key=string.lower)
+        profilelist = sorted(self.config.list_profiles(), key=str.lower)
 
         if len(profilelist) > 1:
             item = Gtk.MenuItem.new_with_mnemonic(_('Profiles'))
@@ -228,7 +226,7 @@
 
             for menuitem in menuitems:
                 menu.append(menuitem)
-        except Exception, ex:
+        except Exception as ex:
             err('TerminalPopupMenu::show: %s' % ex)
 
         menu.show_all()
@@ -246,7 +244,7 @@
         submenu = Gtk.Menu ()
         item.set_submenu (submenu)
         encodings = TerminatorEncoding ().get_list ()
-        encodings.sort (lambda x, y: cmp (x[2].lower (), y[2].lower ()))
+        encodings.sort (key=lambda x: x[2].lower ())
 
         current_encoding = terminal.vte.get_encoding ()
         group = None
diff -x .bzr -uNr terminator-1.91/terminatorlib/terminal.py python3/terminatorlib/terminal.py
--- terminator-1.91/terminatorlib/terminal.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/terminal.py	2019-10-21 22:59:38.279726026 -0400
@@ -1,9 +1,9 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """terminal.py - classes necessary to provide Terminal widgets"""
 
-from __future__ import division
+
 import os
 import signal
 import gi
@@ -11,20 +11,20 @@
 gi.require_version('Vte', '2.91')  # vte-0.38 (gnome-3.14)
 from gi.repository import Vte
 import subprocess
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
-from util import dbg, err, spawn_new_terminator, make_uuid, manual_lookup, display_manager
-import util
-from config import Config
-from cwd import get_default_cwd
-from factory import Factory
-from terminator import Terminator
-from titlebar import Titlebar
-from terminal_popup_menu import TerminalPopupMenu
-from searchbar import Searchbar
-from translation import _
-from signalman import Signalman
-import plugin
+from .util import dbg, err, spawn_new_terminator, make_uuid, manual_lookup, display_manager
+from . import util
+from .config import Config
+from .cwd import get_default_cwd
+from .factory import Factory
+from .terminator import Terminator
+from .titlebar import Titlebar
+from .terminal_popup_menu import TerminalPopupMenu
+from .searchbar import Searchbar
+from .translation import _
+from .signalman import Signalman
+from . import plugin
 from terminatorlib.layoutlauncher import LayoutLauncher
 
 # pylint: disable-msg=R0904
@@ -63,7 +63,7 @@
             (GObject.TYPE_INT,)),
         'group-all': (GObject.SignalFlags.RUN_LAST, None, ()),
         'group-all-toggle': (GObject.SignalFlags.RUN_LAST, None, ()),
-        'move-tab': (GObject.SignalFlags.RUN_LAST, None, 
+        'move-tab': (GObject.SignalFlags.RUN_LAST, None,
             (GObject.TYPE_STRING,)),
     }
 
@@ -72,7 +72,7 @@
 
     MOUSEBUTTON_LEFT = 1
     MOUSEBUTTON_MIDDLE = 2
-    MOUSEBUTTON_RIGHT = 3    
+    MOUSEBUTTON_RIGHT = 3
 
     terminator = None
     vte = None
@@ -232,7 +232,7 @@
         try:
             dbg('close: killing %d' % self.pid)
             os.kill(self.pid, signal.SIGHUP)
-        except Exception, ex:
+        except Exception as ex:
             # We really don't want to care if this failed. Deep OS voodoo is
             # not what we should be doing.
             dbg('os.kill failed: %s' % ex)
@@ -269,7 +269,7 @@
         rboundry = "\\b"
 
         re = (lboundry + schemes +
-                "//(" + user + "@)?[" + hostchars  +".]+(:[0-9]+)?(" + 
+                "//(" + user + "@)?[" + hostchars  +".]+(:[0-9]+)?(" +
                 urlpath + ")?" + rboundry + "/?")
         reg = GLib.Regex.new(re, self.regex_flags, 0)
         self.matches['full_uri'] = self.vte.match_add_gregex(reg, 0)
@@ -278,13 +278,13 @@
             err ('Terminal::update_url_matches: Failed adding URL matches')
         else:
             re = (lboundry +
-                    '(callto:|h323:|sip:)' + "[" + userchars + "+][" + 
-                    userchars + ".]*(:[0-9]+)?@?[" + pathchars + "]+" + 
+                    '(callto:|h323:|sip:)' + "[" + userchars + "+][" +
+                    userchars + ".]*(:[0-9]+)?@?[" + pathchars + "]+" +
                     rboundry)
             reg = GLib.Regex.new(re, self.regex_flags, 0)
             self.matches['voip'] = self.vte.match_add_gregex(reg, 0)
             re = (lboundry +
-                    "(www|ftp)[" + hostchars + "]*\.[" + hostchars + 
+                    "(www|ftp)[" + hostchars + "]*\.[" + hostchars +
                     ".]+(:[0-9]+)?(" + urlpath + ")?" + rboundry + "/?")
             reg = GLib.Regex.new(re, self.regex_flags, 0)
             self.matches['addr_only'] = self.vte.match_add_gregex(reg, 0)
@@ -314,10 +314,10 @@
                         continue
                     reg = GLib.Regex.new(match, self.regex_flags, 0)
                     self.matches[name] = self.vte.match_add_gregex(reg, 0)
-                    dbg('added plugin URL handler for %s (%s) as %d' % 
+                    dbg('added plugin URL handler for %s (%s) as %d' %
                         (name, urlplugin.__class__.__name__,
                         self.matches[name]))
-            except Exception, ex:
+            except Exception as ex:
                 err('Exception occurred adding plugin URL match: %s' % ex)
 
     def match_add(self, name, match):
@@ -351,19 +351,19 @@
         self.cnxids.new(self.vte, 'popup-menu', self.popup_menu)
 
         srcvtetargets = [("vte", Gtk.TargetFlags.SAME_APP, self.TARGET_TYPE_VTE)]
-        dsttargets = [("vte", Gtk.TargetFlags.SAME_APP, self.TARGET_TYPE_VTE), 
-                      ('text/x-moz-url', 0, self.TARGET_TYPE_MOZ), 
+        dsttargets = [("vte", Gtk.TargetFlags.SAME_APP, self.TARGET_TYPE_VTE),
+                      ('text/x-moz-url', 0, self.TARGET_TYPE_MOZ),
                       ('_NETSCAPE_URL', 0, 0)]
         '''
         The following should work, but on my system it corrupts the returned
         TargetEntry's in the newdstargets with binary crap, causing "Segmentation
         fault (core dumped)" when the later drag_dest_set gets called.
-        
+
         dsttargetlist = Gtk.TargetList.new([])
         dsttargetlist.add_text_targets(0)
         dsttargetlist.add_uri_targets(0)
         dsttargetlist.add_table(dsttargets)
-        
+
         newdsttargets = Gtk.target_table_new_from_list(dsttargetlist)
         '''
         # FIXME: Temporary workaround for the problems with the correct way of doing things
@@ -381,7 +381,7 @@
         dbg('Finalised drag targets: %s' % dsttargets)
 
         for (widget, mask) in [
-            (self.vte, Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.BUTTON3_MASK), 
+            (self.vte, Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.BUTTON3_MASK),
             (self.titlebar, Gdk.ModifierType.BUTTON1_MASK)]:
             widget.drag_source_set(mask, srcvtetargets, Gdk.DragAction.MOVE)
 
@@ -398,7 +398,7 @@
         self.cnxids.new(self.vte, 'drag-data-received',
             self.on_drag_data_received, self)
 
-        self.cnxids.new(self.vte, 'selection-changed', 
+        self.cnxids.new(self.vte, 'selection-changed',
             lambda widget: self.maybe_copy_clipboard())
 
         if self.composite_support:
@@ -495,9 +495,9 @@
         groupitems = []
         cnxs = []
 
-        for key, value in {_('Broadcast _all'):'all', 
+        for key, value in list({_('Broadcast _all'):'all',
                           _('Broadcast _group'):'group',
-                          _('Broadcast _off'):'off'}.items():
+                          _('Broadcast _off'):'off'}.items()):
             item = Gtk.RadioMenuItem.new_with_mnemonic(groupitems, key)
             groupitems = item.get_group()
             dbg('Terminal::populate_group_menu: %s active: %s' %
@@ -568,7 +568,7 @@
         self.terminator.group_hoover()
 
     def create_group(self, _item):
-        """Trigger the creation of a group via the titlebar (because popup 
+        """Trigger the creation of a group via the titlebar (because popup
         windows are really lame)"""
         self.titlebar.create_group()
 
@@ -588,7 +588,7 @@
     def set_groupsend(self, _widget, value):
         """Set the groupsend mode"""
         # FIXME: Can we think of a smarter way of doing this than poking?
-        if value in self.terminator.groupsend_type.values():
+        if value in list(self.terminator.groupsend_type.values()):
             dbg('Terminal::set_groupsend: setting groupsend to %s' % value)
             self.terminator.groupsend = value
 
@@ -611,7 +611,7 @@
         if self.config['exit_action'] == 'restart':
             self.cnxids.new(self.vte, 'child-exited', self.spawn_child, True)
         elif self.config['exit_action'] in ('close', 'left'):
-            self.cnxids.new(self.vte, 'child-exited', 
+            self.cnxids.new(self.vte, 'child-exited',
                                             lambda x, y: self.emit('close-term'))
 
         if self.custom_encoding != True:
@@ -714,20 +714,20 @@
         if len(colors) == 16:
             # RGB values for indices 16..255 copied from vte source in order to dim them
             shades = [0, 95, 135, 175, 215, 255]
-            for r in xrange(0, 6):
-                for g in xrange(0, 6):
-                    for b in xrange(0, 6):
+            for r in range(0, 6):
+                for g in range(0, 6):
+                    for b in range(0, 6):
                         newcolor = Gdk.RGBA()
                         setattr(newcolor, "red",   shades[r] / 255.0)
                         setattr(newcolor, "green", shades[g] / 255.0)
                         setattr(newcolor, "blue",  shades[b] / 255.0)
                         self.palette_active.append(newcolor)
-            for y in xrange(8, 248, 10):
+            for y in range(8, 248, 10):
                 newcolor = Gdk.RGBA()
                 setattr(newcolor, "red",   y / 255.0)
                 setattr(newcolor, "green", y / 255.0)
                 setattr(newcolor, "blue",  y / 255.0)
-                self.palette_active.append(newcolor)        
+                self.palette_active.append(newcolor)
         self.palette_inactive = []
         for color in self.palette_active:
             newcolor = Gdk.RGBA()
@@ -743,7 +743,7 @@
                                 self.palette_inactive)
         profiles = self.config.base.profiles
         terminal_box_style_context = self.terminalbox.get_style_context()
-        for profile in profiles.keys():
+        for profile in list(profiles.keys()):
             munged_profile = "terminator-profile-%s" % (
                 "".join([c if c.isalnum() else "-" for c in profile]))
             if terminal_box_style_context.has_class(munged_profile):
@@ -799,7 +799,7 @@
     def set_cursor_color(self):
         """Set the cursor color appropriately"""
         if self.config['cursor_color_fg']:
-            self.vte.set_color_cursor(None) 
+            self.vte.set_color_cursor(None)
         else:
             cursor_color = Gdk.RGBA()
             cursor_color.parse(self.config['cursor_color'])
@@ -842,6 +842,8 @@
             elif event.type == Gdk.EventType.BUTTON_PRESS:
                 # Single Click gives popup
                 dbg('on_group_button_press: group menu popup')
+                window = self.get_toplevel()
+                window.preventHide = True
                 self.create_popup_group_menu(widget, event)
                 return True
             else:
@@ -868,7 +870,7 @@
         if mapping == "hide_window":
             return(False)
 
-        if mapping and mapping not in ['close_window', 
+        if mapping and mapping not in ['close_window',
                                        'full_screen']:
             dbg('Terminal::on_keypress: lookup found: %r' % mapping)
             # handle the case where user has re-bound copy to ctrl+<key>
@@ -926,8 +928,12 @@
             # try to pass it to vte widget first though
             if event.get_state() & Gdk.ModifierType.CONTROL_MASK == 0:
                 if event.get_state() & Gdk.ModifierType.SHIFT_MASK == 0:
+                    gtk_settings=Gtk.Settings().get_default()
+                    primary_state = gtk_settings.get_property('gtk-enable-primary-paste')
+                    gtk_settings.set_property('gtk-enable-primary-paste',  False)
                     if not Vte.Terminal.do_button_press_event(self.vte, event):
                         middle_click[0](*middle_click[1])
+                    gtk_settings.set_property('gtk-enable-primary-paste', primary_state)
                 else:
                     middle_click[0](*middle_click[1])
                 return(True)
@@ -945,7 +951,7 @@
                 return(True)
 
         return(False)
-    
+
     def on_mousewheel(self, widget, event):
         """Handler for modifier + mouse wheel scroll events"""
         SMOOTH_SCROLL_UP = event.direction == Gdk.ScrollDirection.SMOOTH and event.delta_y <= 0.
@@ -978,6 +984,8 @@
 
     def popup_menu(self, widget, event=None):
         """Display the context menu"""
+        window = self.get_toplevel()
+        window.preventHide = True
         menu = TerminalPopupMenu(self)
         menu.show(widget, event)
 
@@ -1004,11 +1012,11 @@
         """Handle the start of a drag event"""
         Gtk.drag_set_icon_pixbuf(drag_context, util.widget_pixbuf(self, 512), 0, 0)
 
-    def on_drag_data_get(self, _widget, _drag_context, selection_data, info, 
-            _time, data):
+    def on_drag_data_get(self, _widget, _drag_context, selection_data, info,
+            _time,data):
         """I have no idea what this does, drag and drop is a mystery. sorry."""
         selection_data.set(Gdk.atom_intern('vte', False), info,
-                str(data.terminator.terminals.index(self)))
+                str(data.terminator.terminals.index(self)).encode())
 
     def on_drag_motion(self, widget, drag_context, x, y, _time, _data):
         """*shrug*"""
@@ -1018,7 +1026,7 @@
             # copy text from another widget
             return
         srcwidget = Gtk.drag_get_source_widget(drag_context)
-        if(isinstance(srcwidget, Gtk.EventBox) and 
+        if(isinstance(srcwidget, Gtk.EventBox) and
            srcwidget == self.titlebar) or widget == srcwidget:
             # on self
             return
@@ -1049,7 +1057,7 @@
         elif pos == "left":
             coord = (topleft, topmiddle, bottommiddle, bottomleft)
         elif pos == "bottom":
-            coord = (bottomleft, bottomright, middleright , middleleft) 
+            coord = (bottomleft, bottomright, middleright , middleleft)
 
         #here, we define some widget internal values
         widget._draw_data = { 'color': color, 'coord' : coord }
@@ -1105,18 +1113,18 @@
                     str=''
                     for fname in txt_lines[:-1]:
                         dbg('drag data fname: %s' % fname)
-                        fname = "'%s'" % urllib.unquote(fname[7:].replace("'",
+                        fname = "'%s'" % urllib.parse.unquote(fname[7:].replace("'",
                                                                     '\'\\\'\''))
                         str += fname + ' '
                     txt=str
             for term in self.terminator.get_target_terms(self):
                 term.feed(txt)
             return
-        
+
         widgetsrc = data.terminator.terminals[int(selection_data.get_data())]
         srcvte = Gtk.drag_get_source_widget(drag_context)
         #check if computation requireds
-        if (isinstance(srcvte, Gtk.EventBox) and 
+        if (isinstance(srcvte, Gtk.EventBox) and
                 srcvte == self.titlebar) or srcvte == widget:
             return
 
@@ -1369,6 +1377,7 @@
         elif self.layout_command:
             command = self.layout_command
         elif debugserver is True:
+            # pylint: disable=unsubscriptable-object
             details = self.terminator.debug_address
             dbg('spawning debug session with: %s:%s' % (details[0],
                 details[1]))
@@ -1445,7 +1454,7 @@
             url = 'ftp://' + url
         elif match == self.matches['addr_only']:
             url = 'http://' + url
-        elif match in self.matches.values():
+        elif match in list(self.matches.values()):
             # We have a match, but it's not a hard coded one, so it's a plugin
             try:
                 registry = plugin.PluginRegistry()
@@ -1460,7 +1469,7 @@
 %s plugin' % urlplugin.handler_name)
                             url = newurl
                         break
-            except Exception, ex:
+            except Exception as ex:
                 err('Exception occurred preparing URL: %s' % ex)
 
         return(url)
@@ -1621,20 +1630,20 @@
     def create_layout(self, layout):
         """Apply our layout"""
         dbg('Setting layout')
-        if layout.has_key('command') and layout['command'] != '':
+        if 'command' in layout and layout['command'] != '':
             self.layout_command = layout['command']
-        if layout.has_key('profile') and layout['profile'] != '':
+        if 'profile' in layout and layout['profile'] != '':
             if layout['profile'] in self.config.list_profiles():
                 self.set_profile(self, layout['profile'])
-        if layout.has_key('group') and layout['group'] != '':
+        if 'group' in layout and layout['group'] != '':
             # This doesn't need/use self.titlebar, but it's safer than sending
             # None
             self.really_create_group(self.titlebar, layout['group'])
-        if layout.has_key('title') and layout['title'] != '':
+        if 'title' in layout and layout['title'] != '':
             self.titlebar.set_custom_string(layout['title'])
-        if layout.has_key('directory') and layout['directory'] != '':
+        if 'directory' in layout and layout['directory'] != '':
             self.directory = layout['directory']
-        if layout.has_key('uuid') and layout['uuid'] != '':
+        if 'uuid' in layout and layout['uuid'] != '':
             self.uuid = make_uuid(layout['uuid'])
 
     def scroll_by_page(self, pages):
@@ -1846,7 +1855,7 @@
 
     def key_insert_number(self):
         self.emit('enumerate', False)
-    
+
     def key_insert_padded(self):
         self.emit('enumerate', True)
 
@@ -1859,13 +1868,14 @@
         dialog.set_default_response(Gtk.ResponseType.ACCEPT)
         dialog.set_resizable(False)
         dialog.set_border_width(8)
-        
+
         label = Gtk.Label(label=_('Enter a new title for the Terminator window...'))
         name = Gtk.Entry()
         name.set_activates_default(True)
         if window.title.text != self.vte.get_window_title():
             name.set_text(self.get_toplevel().title.text)
-        
+
+
         dialog.vbox.pack_start(label, False, False, 6)
         dialog.vbox.pack_start(name, False, False, 6)
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/terminator.py python3/terminatorlib/terminator.py
--- terminator-1.91/terminatorlib/terminator.py	2017-02-28 17:07:22.000000000 -0500
+++ python3/terminatorlib/terminator.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """terminator.py - class for the master Terminator singleton"""
@@ -10,14 +10,14 @@
 from gi.repository import Gtk, Gdk, Vte, GdkX11
 from gi.repository.GLib import GError
 
-import borg
-from borg import Borg
-from config import Config
-from keybindings import Keybindings
-from util import dbg, err, enumerate_descendants
-from factory import Factory
-from cwd import get_pid_cwd
-from version import APP_NAME, APP_VERSION
+from . import borg
+from .borg import Borg
+from .config import Config
+from .keybindings import Keybindings
+from .util import dbg, err, enumerate_descendants
+from .factory import Factory
+from .cwd import get_pid_cwd
+from .version import APP_NAME, APP_VERSION
 
 def eventkey2gdkevent(eventkey):  # FIXME FOR GTK3: is there a simpler way of casting from specific EventKey to generic (union) GdkEvent?
     gdkevent = Gdk.Event.new(eventkey.type)
@@ -267,34 +267,34 @@
             count = count + 1
             if count == 1000:
                 err('hit maximum loop boundary. THIS IS VERY LIKELY A BUG')
-            for obj in layout.keys():
+            for obj in list(layout.keys()):
                 if layout[obj]['type'].lower() == 'window':
                     hierarchy[obj] = {}
                     hierarchy[obj]['type'] = 'Window'
                     hierarchy[obj]['children'] = {}
 
                     # Copy any additional keys
-                    for objkey in layout[obj].keys():
-                        if layout[obj][objkey] != '' and not hierarchy[obj].has_key(objkey):
+                    for objkey in list(layout[obj].keys()):
+                        if layout[obj][objkey] != '' and objkey not in hierarchy[obj]:
                             hierarchy[obj][objkey] = layout[obj][objkey]
 
                     objects[obj] = hierarchy[obj]
                     del(layout[obj])
                 else:
                     # Now examine children to see if their parents exist yet
-                    if not layout[obj].has_key('parent'):
+                    if 'parent' not in layout[obj]:
                         err('Invalid object: %s' % obj)
                         del(layout[obj])
                         continue
-                    if objects.has_key(layout[obj]['parent']):
+                    if layout[obj]['parent'] in objects:
                         # Our parent has been created, add ourselves
                         childobj = {}
                         childobj['type'] = layout[obj]['type']
                         childobj['children'] = {}
 
                         # Copy over any additional object keys
-                        for objkey in layout[obj].keys():
-                            if not childobj.has_key(objkey):
+                        for objkey in list(layout[obj].keys()):
+                            if objkey not in childobj:
                                 childobj[objkey] = layout[obj][objkey]
 
                         objects[layout[obj]['parent']]['children'][obj] = childobj
@@ -309,25 +309,25 @@
                 raise(ValueError)
             dbg('Creating a window')
             window, terminal = self.new_window()
-            if layout[windef].has_key('position'):
+            if 'position' in layout[windef]:
                 parts = layout[windef]['position'].split(':')
                 if len(parts) == 2:
                     window.move(int(parts[0]), int(parts[1]))
-            if layout[windef].has_key('size'):
+            if 'size' in layout[windef]:
                 parts = layout[windef]['size']
                 winx = int(parts[0])
                 winy = int(parts[1])
                 if winx > 1 and winy > 1:
                     window.resize(winx, winy)
-            if layout[windef].has_key('title'):
+            if 'title' in layout[windef]:
                 window.title.force_title(layout[windef]['title'])
-            if layout[windef].has_key('maximised'):
+            if 'maximised' in layout[windef]:
                 if layout[windef]['maximised'] == 'True':
                     window.ismaximised = True
                 else:
                     window.ismaximised = False
                 window.set_maximised(window.ismaximised)
-            if layout[windef].has_key('fullscreen'):
+            if 'fullscreen' in layout[windef]:
                 if layout[windef]['fullscreen'] == 'True':
                     window.isfullscreen = True
                 else:
@@ -359,7 +359,7 @@
                 # For windows with a notebook
                 notebook = window.get_toplevel().get_children()[0]
                 # Cycle through pages by number
-                for page in xrange(0, notebook.get_n_pages()):
+                for page in range(0, notebook.get_n_pages()):
                     # Try and get the entry in the previously saved mapping
                     mapping = window_last_active_term_mapping[window]
                     page_last_active_term = mapping.get(notebook.get_nth_page(page),  None)
@@ -474,7 +474,7 @@
                 background-color: alpha(%s, %s); }
             """
         profiles = self.config.base.profiles
-        for profile in profiles.keys():
+        for profile in list(profiles.keys()):
             if profiles[profile]['use_theme_colors']:
                 # Create a dummy window/vte and realise it so it has correct
                 # values to read from
@@ -501,7 +501,7 @@
             css += template % (munged_profile, bgcolor, bgalpha)
 
         style_provider = Gtk.CssProvider()
-        style_provider.load_from_data(css)
+        style_provider.load_from_data(css.encode('utf-8'))
         self.style_providers.append(style_provider)
 
         # Attempt to load some theme specific stylistic tweaks for appearances
@@ -537,19 +537,19 @@
 
         # Size the GtkPaned splitter handle size.
         css = ""
-        if self.config['handle_size'] in xrange(0, 21):
+        if self.config['handle_size'] in range(0, 21):
             css += """
                 .terminator-terminal-window GtkPaned,
                 .terminator-terminal-window paned {
                     -GtkPaned-handle-size: %s; }
                 """ % self.config['handle_size']
         style_provider = Gtk.CssProvider()
-        style_provider.load_from_data(css)
+        style_provider.load_from_data(css.encode('utf-8'))
         self.style_providers.append(style_provider)
 
         # Apply the providers, incrementing priority so they don't cancel out
         # each other
-        for idx in xrange(0, len(self.style_providers)):
+        for idx in range(0, len(self.style_providers)):
             Gtk.StyleContext.add_provider_for_screen(
                 Gdk.Screen.get_default(),
                 self.style_providers[idx],
diff -x .bzr -uNr terminator-1.91/terminatorlib/titlebar.py python3/terminatorlib/titlebar.py
--- terminator-1.91/terminatorlib/titlebar.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/titlebar.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """titlebar.py - classes necessary to provide a terminal title bar"""
@@ -9,11 +9,11 @@
 import random
 import itertools
 
-from version import APP_NAME
-from util import dbg
-from terminator import Terminator
-from editablelabel import EditableLabel
-from translation import _
+from .version import APP_NAME
+from .util import dbg
+from .terminator import Terminator
+from .editablelabel import EditableLabel
+from .translation import _
 
 # pylint: disable-msg=R0904
 # pylint: disable-msg=W0613
diff -x .bzr -uNr terminator-1.91/terminatorlib/translation.py python3/terminatorlib/translation.py
--- terminator-1.91/terminatorlib/translation.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/translation.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    Terminator - multiple gnome terminals in one window
 #    Copyright (C) 2006-2010  cmsj@tenshu.net
 #
@@ -17,8 +17,8 @@
 
 """Terminator by Chris Jones <cmsj@tenshu.net>"""
 
-from version import APP_NAME
-from util import dbg
+from .version import APP_NAME
+from .util import dbg
 
 _ = None
 
diff -x .bzr -uNr terminator-1.91/terminatorlib/util.py python3/terminatorlib/util.py
--- terminator-1.91/terminatorlib/util.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/util.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    Terminator.util - misc utility functions
 #    Copyright (C) 2006-2010  cmsj@tenshu.net
 #
@@ -64,14 +64,14 @@
         if DEBUGMETHODS != [] and method not in DEBUGMETHODS:
             return
         try:
-            print >> sys.stderr, "%s::%s: %s%s" % (classname, method, log, extra)
+            print(("%s::%s: %s%s" % (classname, method, log, extra)), file=sys.stderr)
         except IOError:
             pass
 
 def err(log = ""):
     """Print an error message"""
     try:
-        print >> sys.stderr, log
+        print(log, file=sys.stderr)
     except IOError:
         pass
 
@@ -279,7 +279,7 @@
     terminals"""
     # FIXME: Does having to import this here mean we should move this function
     # back to Container?
-    from factory import Factory
+    from .factory import Factory
 
     containerstmp = []
     containers = []
diff -x .bzr -uNr terminator-1.91/terminatorlib/version.py python3/terminatorlib/version.py
--- terminator-1.91/terminatorlib/version.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/terminatorlib/version.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 #    TerminatorVersion - version number
 #    Copyright (C) 2010  cmsj@tenshu.net
 #
@@ -21,4 +21,4 @@
 """
 
 APP_NAME = 'terminator'
-APP_VERSION = '1.91'
+APP_VERSION = '1.92'
diff -x .bzr -uNr terminator-1.91/terminatorlib/window.py python3/terminatorlib/window.py
--- terminator-1.91/terminatorlib/window.py	2017-02-28 17:07:22.000000000 -0500
+++ python3/terminatorlib/window.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """window.py - class for the main Terminator window"""
@@ -10,13 +10,13 @@
 from gi.repository import GObject
 from gi.repository import Gtk, Gdk, GdkX11
 
-from util import dbg, err, make_uuid, display_manager
-import util
-from translation import _
-from version import APP_NAME
-from container import Container
-from factory import Factory
-from terminator import Terminator
+from .util import dbg, err, make_uuid, display_manager
+from . import util
+from .translation import _
+from .version import APP_NAME
+from .container import Container
+from .factory import Factory
+from .terminator import Terminator
 
 if display_manager() == 'X11':
     try:
@@ -42,6 +42,7 @@
     ignore_startup_show = None
     set_pos_by_ratio = None
     last_active_term = None
+    preventHide = None
 
     zoom_data = None
 
@@ -75,6 +76,8 @@
         self.title = WindowTitle(self)
         self.title.update()
 
+        self.preventHide = False
+
         options = self.config.options_get()
         if options:
             if options.forcedtitle:
@@ -82,16 +85,13 @@
 
             if options.role:
                 self.set_role(options.role)
-            
-#            if options.classname is not None:
-#                self.set_wmclass(options.classname, self.wmclass_class)
-            
+
             if options.forcedicon is not None:
                 icon_to_apply = options.forcedicon
 
             if options.geometry:
                 if not self.parse_geometry(options.geometry):
-                    err('Window::__init__: Unable to parse geometry: %s' % 
+                    err('Window::__init__: Unable to parse geometry: %s' %
                             options.geometry)
 
         self.apply_icon(icon_to_apply)
@@ -229,14 +229,20 @@
             terminal.on_window_focus_out()
 
         self.losefocus_time = time.time()
-        if self.config['hide_on_lose_focus'] and self.get_property('visible'):
-            self.position = self.get_position()
-            self.hidefunc()
+
+        if self.preventHide:
+            self.preventHide = False
+        else:
+            if self.config['hide_on_lose_focus'] and self.get_property('visible'):
+                self.position = self.get_position()
+                self.hidefunc()
 
     def on_focus_in(self, window, event):
         """Focus has entered the window"""
         self.set_urgency_hint(False)
         if not self.terminator.doing_layout:
+            # self.uuid is injected in terminatorlib.factory
+            # pylint: disable=no-member
             self.terminator.last_active_window = self.uuid
         # FIXME: Cause the terminal titlebars to update here
 
@@ -283,7 +289,7 @@
     def confirm_close(self, window, type):
         """Display a confirmation dialog when the user is closing multiple
         terminals in one window"""
-        
+
         return(not (self.construct_confirm_close(window, type) == Gtk.ResponseType.ACCEPT))
 
     def on_destroy_event(self, widget, data=None):
@@ -321,7 +327,7 @@
     # pylint: disable-msg=W0613
     def on_window_state_changed(self, window, event):
         """Handle the state of the window changing"""
-        self.isfullscreen = bool(event.new_window_state & 
+        self.isfullscreen = bool(event.new_window_state &
                                  Gdk.WindowState.FULLSCREEN)
         self.ismaximised = bool(event.new_window_state &
                                  Gdk.WindowState.MAXIMIZED)
@@ -380,7 +386,7 @@
             visual = screen.get_rgba_visual()
             if visual:
                 self.set_visual(visual)
-    
+
     def show(self, startup=False):
         """Undo the startup show request if started in hidden mode"""
         #Present is necessary to grab focus when window is hidden from taskbar.
@@ -462,7 +468,7 @@
             container = maker.make('VPaned')
         else:
             container = maker.make('HPaned')
-        
+
         self.set_pos_by_ratio = True
 
         if not sibling:
@@ -486,7 +492,7 @@
         for term in order:
             container.add(term)
         container.show_all()
-        
+
         while Gtk.events_pending():
             Gtk.main_iteration_do(False)
         sibling.grab_focus()
@@ -513,7 +519,7 @@
         self.set_property('term_zoomed', True)
 
         if font_scale:
-            widget.cnxids.new(widget, 'size-allocate', 
+            widget.cnxids.new(widget, 'size-allocate',
                     widget.zoom_scale, self.zoom_data)
 
         widget.grab_focus()
@@ -651,7 +657,7 @@
         extra_height = win_height - total_font_height
 
         dbg('setting geometry hints: (ewidth:%s)(eheight:%s),\
-(fwidth:%s)(fheight:%s)' % (extra_width, extra_height, 
+(fwidth:%s)(fheight:%s)' % (extra_width, extra_height,
                             font_width, font_height))
         geometry = Gdk.Geometry()
         geometry.base_width = extra_width
@@ -750,7 +756,7 @@
         if not maker.isinstance(notebook, 'Notebook'):
             dbg('note in a notebook, refusing to ungroup tab')
             return
-        
+
         self.set_groups(None, self.get_visible_terminals())
 
     def move_tab(self, widget, direction):
@@ -780,7 +786,7 @@
         else:
             err('unknown direction: %s' % direction)
             return
-        
+
         notebook.reorder_child(child, page)
 
     def navigate_terminal(self, terminal, direction):
@@ -833,9 +839,9 @@
             for term in possibles:
                 rect = layout[term]
                 offsets[term] = util.get_nav_offset(edge, rect, direction)
-            keys = offsets.values()
+            keys = list(offsets.values())
             keys.sort()
-            winners = [k for k, v in offsets.iteritems() if v == keys[0]]
+            winners = [k for k, v in list(offsets.items()) if v == keys[0]]
             next = terminals.index(winners[0])
 
             if len(winners) > 1:
@@ -858,7 +864,7 @@
 
     def create_layout(self, layout):
         """Apply any config items from our layout"""
-        if not layout.has_key('children'):
+        if 'children' not in layout:
             err('layout describes no children: %s' % layout)
             return
         children = layout['children']
@@ -867,7 +873,7 @@
             err('incorrect number of children for Window: %s' % layout)
             return
 
-        child = children[children.keys()[0]]
+        child = children[list(children.keys())[0]]
         terminal = self.get_children()[0]
         dbg('Making a child of type: %s' % child['type'])
         if child['type'] == 'VPaned':
@@ -888,10 +894,12 @@
 
         self.get_children()[0].create_layout(child)
 
-        if layout.has_key('last_active_term') and layout['last_active_term'] not in ['', None]:
+        if 'last_active_term' in layout and layout['last_active_term'] not in ['', None]:
             self.last_active_term = make_uuid(layout['last_active_term'])
 
-        if layout.has_key('last_active_window') and layout['last_active_window'] == 'True':
+        if 'last_active_window' in layout and layout['last_active_window'] == 'True':
+            # self.uuid is injected in terminatorlib.factory
+            # pylint: disable=no-member
             self.terminator.last_active_window = self.uuid
 
 class WindowTitle(object):
Binary files terminator-1.91/terminatorlib/.window.py.swp and python3/terminatorlib/.window.py.swp differ
diff -x .bzr -uNr terminator-1.91/terminator.spec python3/terminator.spec
--- terminator-1.91/terminator.spec	1969-12-31 19:00:00.000000000 -0500
+++ python3/terminator.spec	2019-10-21 22:58:46.937140000 -0400
@@ -0,0 +1,126 @@
+Name:           terminator
+Version:        1.92
+Release:        1%{?dist}
+Summary:        Store and run multiple GNOME terminals in one window
+
+Group:          User Interface/Desktops
+License:        GPLv2
+URL:            https://gnometerminator.blogspot.com/p/introduction.html
+Source:         http://code.launchpad.net/terminator/gtk3/1.9/+download/terminator-%{version}.tar.gz
+
+BuildArch:      noarch
+BuildRequires:  python-devel gettext desktop-file-utils intltool
+Requires:       vte291 python-psutil python-gobject keybinder3 desktop-file-utils
+
+%description
+Multiple GNOME terminals in one window.  This is a project to produce
+an efficient way of filling a large area of screen space with
+terminals. This is done by splitting the window into a resizeable
+grid of terminals. As such, you can  produce a very flexible
+arrangements of terminals for different tasks.
+
+
+%prep
+%setup -q
+sed -i '/#! \?\/usr.*/d' terminatorlib/*.py
+%patch -p1
+
+
+%build
+%{__python} setup.py build
+
+
+%install
+rm -rf %{buildroot}
+%{__python} setup.py install -O1 --skip-build --root %{buildroot}
+%find_lang %{name}
+rm -f %{buildroot}/%{_datadir}/icons/hicolor/icon-theme.cache
+rm -f %{buildroot}/%{_datadir}/applications/%{name}.desktop
+desktop-file-install --dir=${RPM_BUILD_ROOT}%{_datadir}/applications data/%{name}.desktop
+
+
+%clean
+rm -rf %{buildroot}
+
+
+%files -f %{name}.lang
+%defattr(-,root,root)
+%doc README COPYING ChangeLog
+%{_mandir}/man1/%{name}.*
+%{_mandir}/man5/%{name}_config.*
+%{_bindir}/%{name}
+%{_bindir}/remotinator
+%{_bindir}/terminator.wrapper
+%{python_sitelib}/*
+%{_datadir}/applications/%{name}.desktop
+%{_datadir}/icons/hicolor/*/*/%{name}*.png
+%{_datadir}/icons/hicolor/*/*/%{name}*.svg
+%{_datadir}/icons/hicolor/16x16/status/terminal-bell.png
+%{_datadir}/pixmaps/%{name}.png
+%{_datadir}/icons/HighContrast/*/*/%{name}*.png
+%{_datadir}/icons/HighContrast/*/*/%{name}*.svg
+%{_datadir}/icons/HighContrast/16x16/status/terminal-bell.png
+%{_datadir}/appdata/terminator.appdata.xml
+
+%post
+gtk-update-icon-cache -qf %{_datadir}/icons/hicolor &>/dev/null || :
+gtk-update-icon-cache -qf %{_datadir}/icons/HighContrast &>/dev/null || :
+
+
+%postun
+gtk-update-icon-cache -qf %{_datadir}/icons/hicolor &>/dev/null || :
+gtk-update-icon-cache -qf %{_datadir}/icons/HighContrast &>/dev/null || :
+
+%changelog
+* Thu Nov 24 2016 Steve Boddy <stephen.j.boddy@gmail.com> 1.90-1
+- Update for gtk3 release using the specfile provided
+  by Matt Rose.
+    Note that this specfile is untested.
+
+* Mon Aug 22 2011 Chris Jones <cmsj@tenshu.net> 0.96-1
+- Update for modern release to fix various build issues
+  by borrowing the specfile that Fedora uses
+    Note that this specfile is untested.
+
+* Wed Mar 31 2010 Chris Jones <cmsj@tenshu.net> 0.91-1
+- Update to fix some stupid release bugs in 0.90.
+    Note that this specfile is untested.
+
+* Tue Jan 05 2010 Chris Jones <cmsj@tenshu.net> 0.90-1
+- Attempt to update for 0.90 pre-release.
+    Note that this specfile is untested.
+
+* Thu Jan 15 2009 Chris Jones <cmsj@tenshu.net> 0.12-1
+- Remove patch application since this isn't a fedora build.
+    Note that this specfile is untested.
+
+* Mon Dec 08 2008 Ian Weller <ianweller@gmail.com> 0.11-3
+- Patch version in terminatorlib/verison.py to the one we think it is
+- Fix License tag
+- Update post and postun scripts with one line
+
+* Mon Dec 01 2008 Ian Weller <ianweller@gmail.com> 0.11-2
+- Add BuildRequires: gettext
+- Fix installation of .desktop file
+- terminator-0.11-desktop.patch:
+    Remove useless things
+    Move to same category as gnome-terminal
+- Uses spaces instead of tabs in the specfile because I can't stand tabs
+
+* Mon Dec 01 2008 Ian Weller <ianweller@gmail.com> 0.11-1
+- Update upstream
+- Fix description to something useful
+- Fix group
+- Fix some specfile oddities
+- Complete/restandardize file list
+- Get rid of she-bangs in python_sitelib
+
+* Sat Sep 13 2008 - Max Spevack <mspevack AT redhat DOT com> 0.10
+- New upstream release.
+- Tried to make sure the spec file matches guidelines on Fedora wiki.
+
+* Fri Jul 08 2008 - chantra AatT rpm-based DdOoTt org 0.9.fc9.rb
+- New upstream release
+
+* Sat May 17 2008 - chantra AatT rpm-based DdOoTt org 0.8.1.fc9.rb
+- Initial release for Fedora 9.
diff -x .bzr -uNr terminator-1.91/tests/testborg.py python3/tests/testborg.py
--- terminator-1.91/tests/testborg.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/tests/testborg.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """testborg.py - We are the borg. Resistance is futile.
diff -x .bzr -uNr terminator-1.91/tests/test_doctests.py python3/tests/test_doctests.py
--- terminator-1.91/tests/test_doctests.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/tests/test_doctests.py	2019-08-19 19:25:15.963479000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 """Load up the tests."""
 
 import os
diff -x .bzr -uNr terminator-1.91/tests/testsignalman.py python3/tests/testsignalman.py
--- terminator-1.91/tests/testsignalman.py	2017-02-26 12:45:29.000000000 -0500
+++ python3/tests/testsignalman.py	2019-10-21 22:58:46.937140000 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # Terminator by Chris Jones <cmsj@tenshu.net>
 # GPL v2 only
 """testsignalman.py - Test the signalman class
@@ -8,23 +8,23 @@
 >>> signalman.new(widget, 'test1', handler)
 1
 >>> signalman.cnxids[widget].keys()
-['test1']
+dict_keys(['test1'])
 >>> widget.signals.values()
-['test1']
+dict_values(['test1'])
 >>> signalman.remove_widget(widget)
->>> signalman.cnxids.has_key(widget)
+>>> widget in signalman.cnxids
 False
 >>> widget.signals.values()
-[]
+dict_values([])
 >>> signalman.new(widget, 'test2', handler)
 2
 >>> signalman.new(widget, 'test3', handler)
 3
 >>> signalman.remove_signal(widget, 'test2')
 >>> signalman.cnxids[widget].keys()
-['test3']
+dict_keys(['test3'])
 >>> widget.signals.values()
-['test3']
+dict_values(['test3'])
 >>> signalman.remove_widget(widget)
 >>>
 
@@ -53,11 +53,11 @@
         del(self.signals[signalid])
 
 def handler():
-    print "I am a test handler"
+    print("I am a test handler")
 
 if __name__ == '__main__':
     import sys
     import doctest
     (failed, attempted) = doctest.testmod()
-    print "%d/%d tests failed" % (failed, attempted)
+    print(("%d/%d tests failed" % (failed, attempted)))
     sys.exit(failed)