changeset 5477:6f60bd9090b1 stable

release: merge default to stable for 0.3
author Mads Kiilerich <madski@unity3d.com>
date Sun, 06 Sep 2015 23:36:05 +0200
parents 763dc7a96bae (current diff) 7918ed610324 (diff)
children 23f8f477ed35
files MANIFEST.in init.d/kallithea-daemon-arch init.d/kallithea-daemon-redhat kallithea/bin/ldap_sync.py kallithea/lib/dbmigrate/migrate/versioning/config.py kallithea/lib/dbmigrate/migrate/versioning/script/__init__.py kallithea/lib/dbmigrate/migrate/versioning/script/base.py kallithea/lib/dbmigrate/migrate/versioning/script/py.py kallithea/lib/dbmigrate/migrate/versioning/script/sql.py kallithea/lib/dbmigrate/migrate/versioning/shell.py kallithea/lib/dbmigrate/migrate/versioning/util/__init__.py kallithea/lib/dbmigrate/migrate/versioning/util/keyedinstance.py kallithea/lib/dbmigrate/migrate/versioning/version.py kallithea/lib/dbmigrate/schema/db_1_2_0.py kallithea/lib/dbmigrate/schema/db_2_1_0.py kallithea/lib/dbmigrate/schema/db_2_2_0.py kallithea/lib/dbmigrate/schema/db_2_2_3.py kallithea/model/db.py kallithea/public/js/excanvas.js kallithea/public/js/excanvas.min.js kallithea/public/js/pyroutes_map.js kallithea/templates/changelog/changelog.html kallithea/templates/errors/error_document.html kallithea/templates/pullrequests/pullrequest_show_my_data.html kallithea/tests/nose_parametrized.py kallithea/tests/other/test_vcs_operations.py kallithea/tests/scripts/test_concurency.py kallithea/tests/scripts/test_crawler.py production.ini test.ini
diffstat 384 files changed, 32534 insertions(+), 26500 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Mon Jul 20 15:07:23 2015 +0200
+++ b/.hgignore	Sun Sep 06 23:36:05 2015 +0200
@@ -6,6 +6,8 @@
 *.egg-info
 *.egg
 *.mo
+.eggs/
+tarballcache/
 
 syntax: regexp
 ^rcextensions
@@ -14,6 +16,7 @@
 ^docs/build/
 ^docs/_build/
 ^data$
+^kallithea/tests/data$
 ^sql_dumps/
 ^\.settings$
 ^\.project$
--- a/.hgtags	Mon Jul 20 15:07:23 2015 +0200
+++ b/.hgtags	Sun Sep 06 23:36:05 2015 +0200
@@ -56,6 +56,7 @@
 78b53ee0d247f90d51b028307ff5717851b6c265 rhodecode-0.0.1.6.0
 351ad34d56321349ff5bd38f537bd768b8efef2e rhodecode-0.0.1.7.0
 1f71ef689d2a3c9978cea6591a1f4e9107a5ca83 rhodecode-0.0.1.7.1
+cc48c1541c7e2e84114bf92a0f9cd4b8b1341545 0.0
 d17e88a1a88a29f6fac948c94498129e405a40d3 0.1
 ad0ce803b40cb17fc3988373052943e041030b02 0.2
 c6e32714336345403adf76abb6ebf9b8116fcdc7 0.2.1
--- a/CONTRIBUTORS	Mon Jul 20 15:07:23 2015 +0200
+++ b/CONTRIBUTORS	Sun Sep 06 23:36:05 2015 +0200
@@ -1,80 +1,110 @@
 List of contributors to Kallithea project:
-    Marcin Kuźmiński <marcin@python-works.com>
-    Lukasz Balcerzak <lukaszbalcerzak@gmail.com>
-    Jason Harris <jason@jasonfharris.com>
-    Thayne Harbaugh  <thayne@fusionio.com>
-    cejones <>
-    Thomas Waldmann <tw-public@gmx.de>
-    Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it>
-    Dmitri Kuznetsov <>
-    Jared Bunting <jared.bunting@peachjean.com>
-    Steve Romanow <slestak989@gmail.com>
-    Augosto Hermann <augusto.herrmann@planejamento.gov.br>    
-    Ankit Solanki <ankit.solanki@gmail.com>    
-    Liad Shani <liadff@gmail.com>
-    Les Peabody <lpeabody@gmail.com>
+
+    Mads Kiilerich <madski@unity3d.com> 2012-2015
+    Takumi IINO <trot.thunder@gmail.com> 2012-2015
+    Unity Technologies 2012-2015
+    Andrew Shadura <andrew@shadura.me> 2012 2014-2015
+    Aras Pranckevičius <aras@unity3d.com> 2012-2013 2015
+    Sean Farley <sean.michael.farley@gmail.com> 2013-2015
+    Christian Oyarzun <oyarzun@gmail.com> 2014-2015
+    Joseph Rivera <rivera.d.joseph@gmail.com> 2014-2015
+    Thomas De Schampheleire <thomas.de.schampheleire@gmail.com> 2014-2015
+    Anatoly Bubenkov <bubenkoff@gmail.com> 2015
+    Andrew Bartlett <abartlet@catalyst.net.nz> 2015
+    Balázs Úr <urbalazs@gmail.com> 2015
+    Ben Finney <ben@benfinney.id.au> 2015
+    Branko Majic <branko@majic.rs> 2015
+    Daniel Hobley <danielh@unity3d.com> 2015
+    David Avigni <david.avigni@ankapi.com> 2015
+    Denis Blanchette <dblanchette@coveo.com> 2015
+    duanhongyi <duanhongyi@doopai.com> 2015
+    EriCSN Chang <ericsning@gmail.com> 2015
+    Étienne Gilli <etienne.gilli@gmail.com> 2015
+    Grzegorz Krason <grzegorz.krason@gmail.com> 2015
+    Jan Heylen <heyleke@gmail.com> 2015
+    Kazunari Kobayashi <kobanari@nifty.com> 2015
+    Kevin Bullock <kbullock@ringworld.org> 2015
+    kobanari <kobanari@nifty.com> 2015
+    Marc Abramowitz <marc@marc-abramowitz.com> 2015
+    Marc Villetard <marc.villetard@gmail.com> 2015
+    Matthias Zilk <matthias.zilk@gmail.com> 2015
+    Michael Pohl <michael@mipapo.de> 2015
+    Michael V. DePalatis <mike@depalatis.net> 2015
+    Morten Skaaning <mortens@unity3d.com> 2015
+    Nick High <nick@silverchip.org> 2015
+    Niemand Jedermann <predatorix@web.de> 2015
+    Peter Vitt <petervitt@web.de> 2015
+    Robert Martinez <ntttq@inboxen.org> 2015
+    Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> 2015
+    Sam Jaques <sam.jaques@me.com> 2015
+    Søren Løvborg <sorenl@unity3d.com> 2015
+    Tuux <tuxa@galaxie.eu.org> 2015
+    Viktar Palstsiuk <vipals@gmail.com> 2015
+    Dominik Ruf <dominikruf@gmail.com> 2012 2014
+    Bradley M. Kuhn <bkuhn@sfconservancy.org> 2014
+    Calinou <calinou@opmbx.org> 2014
+    Daniel Anderson <daniel@dattrix.com> 2014
+    Henrik Stuart <hg@hstuart.dk> 2014
+    Ingo von Borstel <kallithea@planetmaker.de> 2014
+    Jelmer Vernooij <jelmer@samba.org> 2014
+    Jim Hague <jim.hague@acm.org> 2014
+    Matt Fellows <kallithea@matt-fellows.me.uk> 2014
+    Max Roman <max@choloclos.se> 2014
+    Michal Čihař <michal@cihar.com> 2014
+    Na'Tosha Bard <natosha@unity3d.com> 2014
+    Rasmus Selsmark <rasmuss@unity3d.com> 2014
+    Tim Freund <tim@freunds.net> 2014
+    Travis Burtrum <android@moparisthebest.com> 2014
+    Zoltan Gyarmati <mr.zoltan.gyarmati@gmail.com> 2014
+    Marcin Kuźmiński <marcin@python-works.com> 2010-2013
+    xpol <xpolife@gmail.com> 2012-2013
+    Aparkar <aparkar@icloud.com> 2013
+    Dennis Brakhane <brakhane@googlemail.com> 2013
+    Grzegorz Rożniecki <xaerxess@gmail.com> 2013
+    Jonathan Sternberg <jonathansternberg@gmail.com> 2013
+    Leonardo Carneiro <leonardo@unity3d.com> 2013
+    Magnus Ericmats <magnus.ericmats@gmail.com> 2013
+    Martin Vium <martinv@unity3d.com> 2013
+    Simon Lopez <simon.lopez@slopez.org> 2013
+    Ton Plomp <tcplomp@gmail.com> 2013
+    Augusto Herrmann <augusto.herrmann@planejamento.gov.br> 2011-2012
+    Dan Sheridan <djs@adelard.com> 2012
+    Dies Koper <diesk@fast.au.fujitsu.com> 2012
+    Erwin Kroon <e.kroon@smartmetersolutions.nl> 2012
+    H Waldo G <gwaldo@gmail.com> 2012
+    hppj <hppj@postmage.biz> 2012
+    Indra Talip <indra.talip@gmail.com> 2012
+    mikespook 2012
+    nansenat16 <nansenat16@null.tw> 2012
+    Philip Jameson <philip.j@hostdime.com> 2012
+    Raoul Thill <raoul.thill@gmail.com> 2012
+    Stefan Engel <mail@engel-stefan.de> 2012
+    Tony Bussieres <t.bussieres@gmail.com> 2012
+    Vincent Caron <vcaron@bearstech.com> 2012
+    Vincent Duvert <vincent@duvert.net> 2012
+    Vladislav Poluhin <nuklea@gmail.com> 2012
+    Zachary Auclair <zach101@gmail.com> 2012
+    Ankit Solanki <ankit.solanki@gmail.com> 2011
+    Dmitri Kuznetsov 2011
+    Jared Bunting <jared.bunting@peachjean.com> 2011
+    Jason Harris <jason@jasonfharris.com> 2011
+    Les Peabody <lpeabody@gmail.com> 2011
+    Liad Shani <liadff@gmail.com> 2011
+    Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it> 2011
+    Matt Zuba <matt.zuba@goodwillaz.org> 2011
+    Nicolas VINOT <aeris@imirhil.fr> 2011
+    Shawn K. O'Shea <shawn@eth0.net> 2011
+    Thayne Harbaugh <thayne@fusionio.com> 2011
+    Łukasz Balcerzak <lukaszbalcerzak@gmail.com> 2010
+    Andrew Kesterson <andrew@aklabs.net>
+    cejones
+    David A. Sjøen <david.sjoen@westcon.no>
+    James Rhodes <jrhodes@redpointsoftware.com.au>
     Jonas Oberschweiber <jonas.oberschweiber@d-velop.de>
-    Matt Zuba <matt.zuba@goodwillaz.org>
-    Aras Pranckevicius <aras@unity3d.com>
-    Tony Bussieres <t.bussieres@gmail.com>
-    Erwin Kroon <e.kroon@smartmetersolutions.nl>
-    nansenat16 <nansenat16@null.tw>
-    Vincent Duvert <vincent@duvert.net>
-    Takumi IINO <trot.thunder@gmail.com>
-    Indra Talip <indra.talip@gmail.com>
-    James Rhodes <jrhodes@redpointsoftware.com.au>
-    Dominik Ruf <dominikruf@gmail.com>
-    xpol <xpolife@gmail.com>
-    Vincent Caron <vcaron@bearstech.com>
-    Zachary Auclair <zach101@gmail.com>
-    Stefan Engel <mail@engel-stefan.de>
-    Andrew Shadura <andrew@shadura.me>
-    Raoul Thill <raoul.thill@gmail.com>
-    Philip Jameson <philip.j@hostdime.com>
-    Mads Kiilerich <madski@unity3d.com>
-    Dan Sheridan <djs@adelard.com>
-    Dennis Brakhane <brakhane@googlemail.com>
-    Simon Lopez <simon.lopez@slopez.org>
-    Jonathan Sternberg <jonathansternberg@gmail.com>
-    Grzegorz Rożniecki <xaerxess@gmail.com>
-    Andrew Kesterson <andrew@aklabs.net>
-    David A. Sjøen <david.sjoen@westcon.no>
-    Jelmer Vernooij <jelmer@samba.org>
     larikale
-    SteveCohen
     RhodeCode GmbH
     Sebastian Kreutzberger <sebastian@rhodecode.com>
-    thomas <thomas@rhodecode.com>
-    Bradley M. Kuhn <bkuhn@sfconservancy.org>
-    Sean Farley <sean.michael.farley@gmail.com>
-    Martin Vium <martinv@unity3d.com>
-    Daniel Anderson <daniel@dattrix.com>
-    Travis Burtrum <android@moparisthebest.com>
-    Calinou <calinou@opmbx.org>
-    Christian Oyarzun <oyarzun@gmail.com>
-    Denis Blanchette <dblanchette@coveo.com>
-    duanhongyi <duanhongyi@doopai.com>
-    Henrik Stuart <hg@hstuart.dk>
-    Ingo von Borstel <kallithea@planetmaker.de>
-    Jan Heylen <heyleke@gmail.com>
-    Jim Hague <jim.hague@acm.org>
-    Joseph Rivera <rivera.d.joseph@gmail.com>
-    Kazunari Kobayashi <kobanari@nifty.com>
-    Matt Fellows <kallithea@matt-fellows.me.uk>
-    Max Roman <max@choloclos.se>
-    Michael Pohl <michael@mipapo.de>
-    Michael V. DePalatis <mike@depalatis.net>
-    Michal Čihař <michal@cihar.com>
-    Morten Skaaning <mortens@unity3d.com>
-    Na'Tosha Bard <natosha@unity3d.com>
-    Nick High <nick@silverchip.org>
-    Niemand Jedermann <predatorix@web.de>
-    Peter Vitt <petervitt@web.de>
-    Sam Jaques <sam.jaques@me.com>
-    Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
-    Tuux <tuxa@galaxie.eu.org>
-    Zoltan Gyarmati <mr.zoltan.gyarmati@gmail.com>
-    Kevin Bullock <kbullock@ringworld.org>
-    Marc Villetard <marc.villetard@gmail.com>
-    Matthias Zilk <matthias.zilk@gmail.com>
-    Tim Freund <tim@freunds.net>
+    Steve Romanow <slestak989@gmail.com>
+    SteveCohen
+    Thomas <thomas@rhodecode.com>
+    Thomas Waldmann <tw-public@gmx.de>
--- a/LICENSE.md	Mon Jul 20 15:07:23 2015 +0200
+++ b/LICENSE.md	Sun Sep 06 23:36:05 2015 +0200
@@ -13,7 +13,7 @@
 However, the definitive list of copyright holders for this project is kept in
 [the about page template](kallithea/templates/about.html) so that it is
 displayed appropriately when Kallithea is installed.  This is the most
-important place to update copyright notices. 
+important place to update copyright notices.
 
 Third-Party Code Incorporated in Kallithea
 ==========================================
--- a/MANIFEST.in	Mon Jul 20 15:07:23 2015 +0200
+++ b/MANIFEST.in	Sun Sep 06 23:36:05 2015 +0200
@@ -17,6 +17,5 @@
 recursive-include kallithea/templates *
 recursive-include kallithea/tests/fixtures *
 recursive-include kallithea/tests/scripts *
+include           kallithea/tests/test.ini
 include           kallithea/tests/vcs/aconfig
-include           production.ini
-include           test.ini
--- a/README.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/README.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -2,6 +2,7 @@
 Kallithea README
 ================
 
+
 About
 -----
 
@@ -21,14 +22,17 @@
 
 Kallithea was forked from RhodeCode in July 2014 and has been heavily modified.
 
+
 Installation
 ------------
-Official releases of Kallithea can be installed via::
+
+Kallithea requires Python_ 2.x and it is recommended to install it in a
+virtualenv_. Official releases of Kallithea can be installed with::
 
     pip install kallithea
 
 The development repository is kept very stable and used in production by the
-developers - you can do the same.
+developers -- you can do the same.
 
 Please visit https://docs.kallithea-scm.org/en/latest/installation.html for
 more details.
@@ -44,8 +48,7 @@
 https://bitbucket.org/conservancy/kallithea.
 
 
-
-Kallithea Features
+Kallithea features
 ------------------
 
 - Has its own middleware to handle Mercurial_ and Git_ protocol requests. Each
@@ -115,11 +118,11 @@
 ---------
 
 **Kallithea** is maintained by its users who contribute the fixes they would
- like to see.
+like to see.
 
 Get in touch with the rest of the community:
 
-- Join the mailing list users and developers - see
+- Join the mailing list users and developers -- see
   http://lists.sfconservancy.org/mailman/listinfo/kallithea-general.
 
 - Use IRC and join #kallithea on FreeNode (irc.freenode.net) or use
@@ -161,7 +164,7 @@
 - keep the database unconverted (intended for testing and evaluation)
 - convert the database in a one-time step
 
-Maintaining Interoperability
+Maintaining interoperability
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Interoperability with RhodeCode 2.2.X installations is provided so you don't
@@ -180,7 +183,7 @@
 then you will find this location at
 ``$VIRTUAL_ENV/lib/python2.7/site-packages/Kallithea-0.1-py2.7.egg/kallithea``.
 
-One-time Conversion
+One-time conversion
 ~~~~~~~~~~~~~~~~~~~
 
 Alternatively, if you would like to convert the database for good, you can use
@@ -198,6 +201,32 @@
    If you started out using the branding interoperability approach mentioned
    above, watch out for stray brand.pyc after removing brand.py.
 
+Git hooks
+~~~~~~~~~
+
+After switching to Kallithea, it will be necessary to update the Git_ hooks in
+your repositories. If not, the Git_ hooks from RhodeCode will still be called,
+which will cause ``git push`` to fail every time.
+
+If you do not have any custom Git_ hooks deployed, perform the following steps
+(this may take some time depending on the number and size of repositories you
+have):
+
+1. Log-in as an administrator.
+
+2. Open page *Admin > Settings > Remap and Rescan*.
+
+3. Turn on the option **Install Git Hooks**.
+
+4. Turn on the option **Overwrite existing Git hooks**.
+
+5. Click on the button **Rescan Repositories**.
+
+If you do have custom hooks, you will need to merge those changes manually. In
+order to get sample hooks from Kallithea, the easiest way is to create a new Git_
+repository, and have a look at the hooks deployed there.
+
+
 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
 .. _Python: http://www.python.org/
 .. _Sphinx: http://sphinx.pocoo.org/
--- a/development.ini	Mon Jul 20 15:07:23 2015 +0200
+++ b/development.ini	Sun Sep 06 23:36:05 2015 +0200
@@ -16,23 +16,55 @@
 pdebug = false
 
 ################################################################################
-## Uncomment and replace with the address which should receive                ##
-## any error reports after application crash                                  ##
-## Additionally those settings will be used by Kallithea mailing system       ##
+## Email settings                                                             ##
+##                                                                            ##
+## Refer to the documentation ("Email settings") for more details.            ##
+##                                                                            ##
+## It is recommended to use a valid sender address that passes access         ##
+## validation and spam filtering in mail servers.                             ##
 ################################################################################
-#email_to = admin@localhost
-#error_email_from = paste_error@localhost
-#app_email_from = kallithea-noreply@localhost
-#error_message =
+
+## 'From' header for application emails. You can optionally add a name.
+## Default:
+#app_email_from = Kallithea
+## Examples:
+#app_email_from = Kallithea <kallithea-noreply@example.com>
+#app_email_from = kallithea-noreply@example.com
+
+## Subject prefix for application emails.
+## A space between this prefix and the real subject is automatically added.
+## Default:
+#email_prefix =
+## Example:
 #email_prefix = [Kallithea]
 
+## Recipients for error emails and fallback recipients of application mails.
+## Multiple addresses can be specified, space-separated.
+## Only addresses are allowed, do not add any name part.
+## Default:
+#email_to =
+## Examples:
+#email_to = admin@example.com
+#email_to = admin@example.com another_admin@example.com
+
+## 'From' header for error emails. You can optionally add a name.
+## Default:
+#error_email_from = pylons@yourapp.com
+## Examples:
+#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
+#error_email_from = paste_error@example.com
+
+## SMTP server settings
+## Only smtp_server is mandatory. All other settings take the specified default
+## values.
 #smtp_server = mail.server.com
 #smtp_username =
 #smtp_password =
-#smtp_port =
+#smtp_port = 25
 #smtp_use_tls = false
-#smtp_use_ssl = true
-## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
+#smtp_use_ssl = false
+## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).
+## If empty, use any of the authentication parameters supported by the server.
 #smtp_auth =
 
 [server:main]
@@ -99,11 +131,11 @@
 #max-requests = 1000
 
 ## enable large buffers
-#buffer-size=65535
+#buffer-size = 65535
 
 ## socket and http timeouts ##
-#http-timeout=3600
-#socket-timeout=3600
+#http-timeout = 3600
+#socket-timeout = 3600
 
 ## Log requests slower than the specified number of milliseconds.
 #log-slow = 10
@@ -134,7 +166,7 @@
 host = 0.0.0.0
 port = 5000
 
-## prefix middleware for rc
+## middleware for hosting the WSGI application under a URL prefix
 #[filter:proxy-prefix]
 #use = egg:PasteDeploy#prefix
 #prefix = /<your-prefix>
@@ -248,7 +280,6 @@
 #issue_server_link_wiki = https://mywiki.com/{id}
 #issue_prefix_wiki = WIKI-
 
-
 ## instance-id prefix
 ## a prefix key for this instance used for cache invalidation when running
 ## multiple instances of kallithea, make sure it's globally unique for
@@ -270,7 +301,6 @@
 ## allows to setup custom hooks in settings page
 allow_custom_hooks_settings = True
 
-
 ####################################
 ###        CELERY CONFIG        ####
 ####################################
@@ -303,79 +333,55 @@
 ###         BEAKER CACHE        ####
 ####################################
 
-beaker.cache.data_dir=%(here)s/data/cache/data
-beaker.cache.lock_dir=%(here)s/data/cache/lock
-
-beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
+beaker.cache.data_dir = %(here)s/data/cache/data
+beaker.cache.lock_dir = %(here)s/data/cache/lock
 
-beaker.cache.super_short_term.type=memory
-beaker.cache.super_short_term.expire=10
-beaker.cache.super_short_term.key_length = 256
+beaker.cache.regions = short_term,long_term,sql_cache_short
 
-beaker.cache.short_term.type=memory
-beaker.cache.short_term.expire=60
+beaker.cache.short_term.type = memory
+beaker.cache.short_term.expire = 60
 beaker.cache.short_term.key_length = 256
 
-beaker.cache.long_term.type=memory
-beaker.cache.long_term.expire=36000
+beaker.cache.long_term.type = memory
+beaker.cache.long_term.expire = 36000
 beaker.cache.long_term.key_length = 256
 
-beaker.cache.sql_cache_short.type=memory
-beaker.cache.sql_cache_short.expire=10
+beaker.cache.sql_cache_short.type = memory
+beaker.cache.sql_cache_short.expire = 10
 beaker.cache.sql_cache_short.key_length = 256
 
-beaker.cache.sql_cache_med.type=memory
-beaker.cache.sql_cache_med.expire=360
-beaker.cache.sql_cache_med.key_length = 256
-
-beaker.cache.sql_cache_long.type=file
-beaker.cache.sql_cache_long.expire=3600
-beaker.cache.sql_cache_long.key_length = 256
-
 ####################################
 ###       BEAKER SESSION        ####
 ####################################
+
+## Name of session cookie. Should be unique for a given host and path, even when running
+## on different ports. Otherwise, cookie sessions will be shared and messed up.
+beaker.session.key = kallithea
+## Sessions should always only be accessible by the browser, not directly by JavaScript.
+beaker.session.httponly = true
+## Session lifetime. 2592000 seconds is 30 days.
+beaker.session.timeout = 2592000
+
+## Server secret used with HMAC to ensure integrity of cookies.
+beaker.session.secret = development-not-secret
+## Further, encrypt the data with AES.
+#beaker.session.encrypt_key = <key_for_encryption>
+#beaker.session.validate_key = <validation_key>
+
 ## Type of storage used for the session, current types are
 ## dbm, file, memcached, database, and memory.
-## The storage uses the Container API
-## that is also used by the cache system.
+
+## File system storage of session data. (default)
+#beaker.session.type = file
 
-## db session ##
+## Cookie only, store all session data inside the cookie. Requires secure secrets.
+#beaker.session.type = cookie
+
+## Database storage of session data.
 #beaker.session.type = ext:database
 #beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
 #beaker.session.table_name = db_session
 
-## encrypted cookie client side session, good for many instances ##
-#beaker.session.type = cookie
-
-## file based cookies (default) ##
-#beaker.session.type = file
-
-## beaker.session.key should be unique for a given host, even when running
-## on different ports. Otherwise, cookie sessions will be shared and messed up.
-beaker.session.key = kallithea
-beaker.session.secret = development-not-secret
-
-## Secure encrypted cookie. Requires AES and AES python libraries
-## you must disable beaker.session.secret to use this
-#beaker.session.encrypt_key = <key_for_encryption>
-#beaker.session.validate_key = <validation_key>
-
-## sets session as invalid if it haven't been accessed for given amount of time
-beaker.session.timeout = 2592000
-beaker.session.httponly = true
-#beaker.session.cookie_path = /<your-prefix>
-
-## uncomment for https secure cookie
-beaker.session.secure = false
-
-## auto save the session to not to use .save()
-beaker.session.auto = False
-
-## default cookie expiration time in seconds `true` expire at browser close ##
-#beaker.session.cookie_expires = 3600
-
-
 ############################
 ## ERROR HANDLING SYSTEMS ##
 ############################
@@ -407,10 +413,10 @@
 errormator.slow_requests = true
 
 ## enable hooking to application loggers
-# errormator.logging = true
+#errormator.logging = true
 
 ## minimum log level for log capture
-# errormator.logging.level = WARNING
+#errormator.logging.level = WARNING
 
 ## send logs only from erroneous/slow requests
 ## (saves API quota for intensive logging)
@@ -423,7 +429,6 @@
 ## start with HTTP* this list be extended with additional keywords here
 errormator.environ_keys_whitelist =
 
-
 ## list of keywords that should be blanked from request object
 ## can be string with comma separated list of words in lowercase
 ## (by default client will always blank keys that contain following words
@@ -431,13 +436,11 @@
 ## this list be extended with additional keywords set here
 errormator.request_keys_blacklist =
 
-
 ## list of namespaces that should be ignores when gathering log entries
 ## can be string with comma separated list of namespaces
 ## (by default the client ignores own entries: errormator_client.client)
 errormator.log_namespace_blacklist =
 
-
 ################
 ### [sentry] ###
 ################
@@ -456,7 +459,6 @@
 sentry.include_paths =
 sentry.exclude_paths =
 
-
 ################################################################################
 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
@@ -481,10 +483,10 @@
 sqlalchemy.db1.url = sqlite:///%(here)s/kallithea.db?timeout=60
 
 # POSTGRESQL
-# sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
+#sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
 
 # MySQL
-# sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
+#sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
 
 # see sqlalchemy docs for others
 
@@ -579,11 +581,11 @@
 datefmt = %Y-%m-%d %H:%M:%S
 
 [formatter_color_formatter]
-class=kallithea.lib.colored_formatter.ColorFormatter
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+class = kallithea.lib.colored_formatter.ColorFormatter
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %Y-%m-%d %H:%M:%S
 
 [formatter_color_formatter_sql]
-class=kallithea.lib.colored_formatter.ColorFormatterSql
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+class = kallithea.lib.colored_formatter.ColorFormatterSql
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %Y-%m-%d %H:%M:%S
--- a/docs/api/api.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/api/api.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -4,10 +4,9 @@
 API
 ===
 
-
 Kallithea has a simple JSON RPC API with a single schema for calling all API
 methods. Everything is available by sending JSON encoded http(s) requests to
-<your_server>/_admin/api .
+``<your_server>/_admin/api``.
 
 
 API access for web views
@@ -16,12 +15,12 @@
 API access can also be turned on for each web view in Kallithea that is
 decorated with the ``@LoginRequired`` decorator. Some views use
 ``@LoginRequired(api_access=True)`` and are always available. By default only
-RSS/ATOM feed views are enabled. Other views are
-only available if they have been white listed. Edit the
+RSS/Atom feed views are enabled. Other views are
+only available if they have been whitelisted. Edit the
 ``api_access_controllers_whitelist`` option in your .ini file and define views
 that should have API access enabled.
 
-For example, to enable API access to patch/diff raw file and archive::
+For example, to enable API access to patch/diff, raw file and archive::
 
     api_access_controllers_whitelist =
         ChangesetController:changeset_patch,
@@ -33,7 +32,7 @@
 GET parameter ``?api_key=<api_key>`` to the URL.
 
 Exposing raw diffs is a good way to integrate with
-3rd party services like code review, or build farms that could download archives.
+third-party services like code review, or build farms that can download archives.
 
 
 API access
@@ -50,27 +49,28 @@
 
 For example, to pull to a local "CPython" mirror using curl::
 
-    curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
+    curl https://example.com/_admin/api -X POST -H 'content-type:text/plain' \
+        --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
 
 In general, provide
  - *id*, a value of any type, can be used to match the response with the request that it is replying to.
  - *api_key*, for authentication and permission validation.
- - *method*, the name of the method to call - a list of available methods can be found below.
+ - *method*, the name of the method to call -- a list of available methods can be found below.
  - *args*, the arguments to pass to the method.
 
 .. note::
 
-    api_key can be found or set on the user account page
+    api_key can be found or set on the user account page.
 
 The response to the JSON-RPC API call will always be a JSON structure::
 
     {
-        "id":<id>, # the id that was used in the request
-        "result": "<result>"|null, # JSON formatted result, null if any errors
-        "error": "null"|<error_message> # JSON formatted error (if any)
+        "id": <id>,  # the id that was used in the request
+        "result": <result>|null,  # JSON formatted result (null on error)
+        "error": null|<error_message>  # JSON formatted error (null on success)
     }
 
-All responses from API will be ``HTTP/1.0 200 OK``. If there is an error,
+All responses from the API will be ``HTTP/1.0 200 OK``. If an error occurs,
 the reponse will have a failure description in *error* and
 *result* will be null.
 
@@ -78,7 +78,7 @@
 API client
 ++++++++++
 
-Kallithea comes with a ``kallithea-api`` command line tool providing a convenient
+Kallithea comes with a ``kallithea-api`` command line tool, providing a convenient
 way to call the JSON-RPC API.
 
 For example, to call ``get_repo``::
@@ -106,7 +106,7 @@
 
   kallithea-api --save-config --apihost=<your.kallithea.server.url> --apikey=<yourapikey>
 
-This will create a ``~/.config/kallithea`` with the specified hostname and apikey
+This will create a ``~/.config/kallithea`` with the specified hostname and API key
 so you don't have to specify them every time.
 
 
@@ -136,7 +136,6 @@
     result : "Pulled from `<reponame>`"
     error :  null
 
-
 rescan_repos
 ------------
 
@@ -160,7 +159,6 @@
                'removed': [<list of names of removed repos>]}"
     error :  null
 
-
 invalidate_cache
 ----------------
 
@@ -183,7 +181,6 @@
     result : "Caches of repository `<reponame>`"
     error :  null
 
-
 lock
 ----
 
@@ -215,7 +212,6 @@
              }
     error :  null
 
-
 get_ip
 ------
 
@@ -248,7 +244,6 @@
 
     error :  null
 
-
 get_user
 --------
 
@@ -257,7 +252,6 @@
 Any userid can be specified when the command is executed using the api_key of a user with admin rights.
 Regular users can only speicy their own userid.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -292,17 +286,14 @@
                     "repositories_groups": {"Group1": "group.read"}
                  },
             }
-
     error:  null
 
-
 get_users
 ---------
 
 List all existing users.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -332,6 +323,7 @@
             ]
     error:  null
 
+.. _create-user:
 
 create_user
 -----------
@@ -339,7 +331,6 @@
 Create new user.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -376,6 +367,9 @@
             }
     error:  null
 
+Example::
+
+    kallithea-api create_user username:bent email:bent@example.com firstname:Bent lastname:Bentsen extern_type:ldap extern_name:uid=bent,dc=example,dc=com
 
 update_user
 -----------
@@ -383,7 +377,6 @@
 Update the given user if such user exists.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -422,14 +415,12 @@
             }
     error:  null
 
-
 delete_user
 -----------
 
 Delete the given user if such a user exists.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -448,14 +439,12 @@
             }
     error:  null
 
-
 get_user_group
 --------------
 
 Get an existing user group.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -492,14 +481,12 @@
              }
     error : null
 
-
 get_user_groups
 ---------------
 
 List all existing user groups.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -520,14 +507,12 @@
               ]
     error : null
 
-
 create_user_group
 -----------------
 
 Create a new user group.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -535,7 +520,7 @@
     method :  "create_user_group"
     args:     {
                 "group_name": "<groupname>",
-                "owner" :     "<onwer_name_or_id = Optional(=apiuser)>",
+                "owner" :     "<owner_name_or_id = Optional(=apiuser)>",
                 "active":     "<bool> = Optional(True)"
               }
 
@@ -552,7 +537,6 @@
             }
     error:  null
 
-
 add_user_to_user_group
 ----------------------
 
@@ -560,7 +544,6 @@
 ``false``.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -581,7 +564,6 @@
             }
     error:  null
 
-
 remove_user_from_user_group
 ---------------------------
 
@@ -589,7 +571,6 @@
 be ``false``.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -610,7 +591,6 @@
             }
     error:  null
 
-
 get_repo
 --------
 
@@ -700,7 +680,6 @@
             }
     error:  null
 
-
 get_repos
 ---------
 
@@ -708,7 +687,6 @@
 This command can only be executed using the api_key of a user with admin rights,
 or that of a regular user with at least read access to the repository.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -725,7 +703,7 @@
                 "repo_name" :        "<reponame>"
                 "repo_type" :        "<repo_type>",
                 "clone_uri" :        "<clone_uri>",
-                "private": :         "<bool>",
+                "private" :          "<bool>",
                 "created_on" :       "<datetimecreated>",
                 "description" :      "<description>",
                 "landing_rev":       "<landing_rev>",
@@ -739,7 +717,6 @@
             ]
     error:  null
 
-
 get_repo_nodes
 --------------
 
@@ -747,7 +724,6 @@
 It is possible to specify ret_type to show only ``files`` or ``dirs``.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -772,7 +748,6 @@
             ]
     error:  null
 
-
 create_repo
 -----------
 
@@ -784,7 +759,6 @@
 or that of a regular user with create repository permission.
 Regular users cannot specify owner parameter.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -792,7 +766,7 @@
     method :  "create_repo"
     args:     {
                 "repo_name" :        "<reponame>",
-                "owner" :            "<onwer_name_or_id = Optional(=apiuser)>",
+                "owner" :            "<owner_name_or_id = Optional(=apiuser)>",
                 "repo_type" :        "<repo_type> = Optional('hg')",
                 "description" :      "<description> = Optional('')",
                 "private" :          "<bool> = Optional(False)",
@@ -813,7 +787,7 @@
                 "repo_name" :        "<reponame>"
                 "repo_type" :        "<repo_type>",
                 "clone_uri" :        "<clone_uri>",
-                "private": :         "<bool>",
+                "private" :          "<bool>",
                 "created_on" :       "<datetimecreated>",
                 "description" :      "<description>",
                 "landing_rev":       "<landing_rev>",
@@ -826,6 +800,65 @@
             }
     error:  null
 
+update_repo
+-----------
+
+Update a repository.
+This command can only be executed using the api_key of a user with admin rights,
+or that of a regular user with create repository permission.
+Regular users cannot specify owner parameter.
+
+INPUT::
+
+    id : <id_for_response>
+    api_key : "<api_key>"
+    method :  "update_repo"
+    args:     {
+                "repoid" :           "<reponame or repo_id>"
+                "name" :             "<reponame> = Optional('')",
+                "group" :            "<group_id> = Optional(None)",
+                "owner" :            "<owner_name_or_id = Optional(=apiuser)>",
+                "description" :      "<description> = Optional('')",
+                "private" :          "<bool> = Optional(False)",
+                "clone_uri" :        "<clone_uri> = Optional(None)",
+                "landing_rev" :      "<landing_rev> = Optional('tip')",
+                "enable_downloads":  "<bool> = Optional(False)",
+                "enable_locking":    "<bool> = Optional(False)",
+                "enable_statistics": "<bool> = Optional(False)",
+              }
+
+OUTPUT::
+
+    id : <id_given_in_input>
+    result: {
+              "msg": "updated repo ID:repo_id `<reponame>`",
+              "repository": {
+                "repo_id" :          "<repo_id>",
+                "repo_name" :        "<reponame>"
+                "repo_type" :        "<repo_type>",
+                "clone_uri" :        "<clone_uri>",
+                "private":           "<bool>",
+                "created_on" :       "<datetimecreated>",
+                "description" :      "<description>",
+                "landing_rev":       "<landing_rev>",
+                "owner":             "<username or user_id>",
+                "fork_of":           "<name_of_fork_parent>",
+                "enable_downloads":  "<bool>",
+                "enable_locking":    "<bool>",
+                "enable_statistics": "<bool>",
+                "last_changeset":    {
+                                       "author":   "<full_author>",
+                                       "date":     "<date_time_of_commit>",
+                                       "message":  "<commit_message>",
+                                       "raw_id":   "<raw_id>",
+                                       "revision": "<numeric_revision>",
+                                       "short_id": "<short_id>"
+                                     }
+                "locked_by": "<username>",
+                "locked_date": "<float lock_time>",
+              },
+            }
+    error:  null
 
 fork_repo
 ---------
@@ -838,7 +871,6 @@
 repository permission and at least read access to the repository.
 Regular users cannot specify owner parameter.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -864,7 +896,6 @@
             }
     error:  null
 
-
 delete_repo
 -----------
 
@@ -873,7 +904,6 @@
 or that of a regular user with admin access to the repository.
 When ``forks`` param is set it is possible to detach or delete forks of the deleted repository.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -893,14 +923,12 @@
             }
     error:  null
 
-
 grant_user_permission
 ---------------------
 
 Grant permission for a user on the given repository, or update the existing one if found.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -921,14 +949,12 @@
             }
     error:  null
 
-
 revoke_user_permission
 ----------------------
 
 Revoke permission for a user on the given repository.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -948,7 +974,6 @@
             }
     error:  null
 
-
 grant_user_group_permission
 ---------------------------
 
@@ -956,7 +981,6 @@
 existing one if found.
 This command can only be executed using the api_key of a user with admin rights.
 
-
 INPUT::
 
     id : <id_for_response>
@@ -977,7 +1001,6 @@
             }
     error:  null
 
-
 revoke_user_group_permission
 ----------------------------
 
--- a/docs/api/models.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/api/models.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -1,7 +1,7 @@
 .. _models:
 
 ========================
-The :mod:`models` Module
+The :mod:`models` module
 ========================
 
 .. automodule:: kallithea.model
--- a/docs/changelog.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/changelog.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -4,6 +4,7 @@
 Changelog
 =========
 
-Kallithea project doesn't keep its changelog here.  We refer you to our Mercurial logs_ .
+Kallithea project doesn't keep its changelog here.  We refer you to our `Mercurial logs`__.
 
-.. _logs: https://kallithea-scm.org/repos/kallithea/changelog
+
+.. __: https://kallithea-scm.org/repos/kallithea/changelog
--- a/docs/conf.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/conf.py	Sun Sep 06 23:36:05 2015 +0200
@@ -88,6 +88,7 @@
 
 # The name of the Pygments (syntax highlighting) style to use.
 pygments_style = 'sphinx'
+highlight_language = 'none'
 
 # A list of ignored prefixes for module index sorting.
 #modindex_common_prefix = []
--- a/docs/contributing.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/contributing.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -11,19 +11,20 @@
 Infrastructure
 --------------
 
-The main repository is hosted at Our Own Kallithea (aka OOK) on
-https://kallithea-scm.org/repos/kallithea/ (which is our self-hosted instance
-of Kallithea).
+The main repository is hosted on Our Own Kallithea (aka OOK) at
+https://kallithea-scm.org/repos/kallithea/, our self-hosted instance
+of Kallithea.
 
-For now, we use Bitbucket_ for `Pull Requests`_ and `Issue Tracker`_ services. The
-issue tracker is for tracking bugs, not for support, discussion, or ideas -
-please use the `mailing list`_ to reach the community.
+For now, we use Bitbucket_ for `pull requests`_ and `issue tracking`_. The
+issue tracker is for tracking bugs, not for support, discussion, or ideas --
+please use the `mailing list`_ or :ref:`IRC <readme>` to reach the community.
 
 We use Weblate_ to translate the user interface messages into languages other
 than English. Join our project on `Hosted Weblate`_ to help us.
 To register, you can use your Bitbucket or GitHub account. See :ref:`translations`
 for more details.
 
+
 Getting started
 ---------------
 
@@ -48,15 +49,15 @@
 
 After finishing your changes make sure all tests pass cleanly. You can run
 the testsuite running ``nosetests`` from the project root, or if you use tox
-run ``tox`` for python2.6-2.7 with multiple database test.
+run ``tox`` for Python 2.6--2.7 with multiple database test.
 
-When using `nosetests`, the `test.ini` file is used with an SQLite database. Edit
-this file to change your testing enviroment.
+When running tests, Kallithea uses `kallithea/tests/test.ini` and populates the
+SQLite database specified there.
 
 It is possible to avoid recreating the full test database on each invocation of
 the tests, thus eliminating the initial delay. To achieve this, run the tests as::
 
-    paster serve test.ini --pid-file=test.pid --daemon
+    paster serve kallithea/tests/test.ini --pid-file=test.pid --daemon
     KALLITHEA_WHOOSH_TEST_DISABLE=1 KALLITHEA_NO_TMP_PATH=1 nosetests
     kill -9 $(cat test.pid)
 
@@ -69,6 +70,7 @@
                           printed immediately) [NOSE_NOCAPTURE]
     --failed              Run the tests that failed in the last test run.
 
+
 Coding/contribution guidelines
 ------------------------------
 
@@ -85,27 +87,33 @@
 We support both Python 2.6.x and 2.7.x and nothing else. For now we don't care
 about Python 3 compatibility.
 
-We try to support the most common modern web browsers. IE8 is still supported
-to the extent it is feasible but we may stop supporting it very soon.
+We try to support the most common modern web browsers. IE9 is still supported
+to the extent it is feasible, IE8 is not.
 
 We primarily support Linux and OS X on the server side but Windows should also work.
 
-Html templates should use 2 spaces for indentation ... but be pragmatic. We
+HTML templates should use 2 spaces for indentation ... but be pragmatic. We
 should use templates cleverly and avoid duplication. We should use reasonable
-semantic markup with classes and ids that can be used for styling and testing.
+semantic markup with element classes and IDs that can be used for styling and testing.
 We should only use inline styles in places where it really is semantic (such as
-display:none).
+``display: none``).
 
-JavaScript must use ';' between/after statements. Indentation 4 spaces. Inline
-multiline functions should be indented two levels - one for the () and one for
-{}. jQuery value arrays should have a leading $.
+JavaScript must use ``;`` between/after statements. Indentation 4 spaces. Inline
+multiline functions should be indented two levels -- one for the ``()`` and one for
+``{}``.
+Variables holding jQuery objects should be named with a leading ``$``.
 
 Commit messages should have a leading short line summarizing the changes. For
-bug fixes, put "(Issue #123)" at the end of this line.
+bug fixes, put ``(Issue #123)`` at the end of this line.
+
+Use American English grammar and spelling overall. Use `English title case`_ for
+page titles, button labels, headers, and 'labels' for fields in forms.
 
-Contributions will be accepted in most formats - such as pull requests on
+.. _English title case: https://en.wikipedia.org/wiki/Capitalization#Title_case
+
+Contributions will be accepted in most formats -- such as pull requests on
 bitbucket, something hosted on your own Kallithea instance, or patches sent by
-mail to the kallithea-general mailing list.
+email to the `kallithea-general`_ mailing list.
 
 Make sure to test your changes both manually and with the automatic tests
 before posting.
@@ -116,7 +124,7 @@
 changes when we apply them.
 
 We try to make sure we have consensus on the direction the project is taking.
-Everything non-sensitive should be discussed in public - preferably on the
+Everything non-sensitive should be discussed in public -- preferably on the
 mailing list.  We aim at having all non-trivial changes reviewed by at least
 one other core developer before pushing. Obvious non-controversial changes will
 be handled more casually.
@@ -128,11 +136,12 @@
 .. _translations:
 .. include:: ./../kallithea/i18n/how_to
 
+
 "Roadmap"
 ---------
 
 We do not have a road map but are waiting for your contributions. Refer to the
-wiki_ for some ideas of places we might want to go - contributions in these
+wiki_ for some ideas of places we might want to go -- contributions in these
 areas are very welcome.
 
 
@@ -141,9 +150,10 @@
 
 
 .. _Weblate: http://weblate.org/
-.. _Issue Tracker: https://bitbucket.org/conservancy/kallithea/issues?status=new&status=open
-.. _Pull Requests: https://bitbucket.org/conservancy/kallithea/pull-requests
+.. _issue tracking: https://bitbucket.org/conservancy/kallithea/issues?status=new&status=open
+.. _pull requests: https://bitbucket.org/conservancy/kallithea/pull-requests
 .. _bitbucket: http://bitbucket.org/
 .. _mailing list: http://lists.sfconservancy.org/mailman/listinfo/kallithea-general
+.. _kallithea-general: http://lists.sfconservancy.org/mailman/listinfo/kallithea-general
 .. _Hosted Weblate: https://hosted.weblate.org/projects/kallithea/kallithea/
 .. _wiki: https://bitbucket.org/conservancy/kallithea/wiki/Home
--- a/docs/index.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/index.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -1,7 +1,8 @@
 .. _index:
 
+#######################
 Kallithea Documentation
------------------------
+#######################
 
 **Readme**
 
@@ -15,6 +16,7 @@
 .. toctree::
    :maxdepth: 1
 
+   overview
    installation
    installation_win
    installation_win_old
@@ -31,17 +33,18 @@
    usage/locking
    usage/statistics
 
-**Administrators Guide**
+**Administrator's guide**
 
 .. toctree::
    :maxdepth: 1
 
+   usage/email
    usage/performance
    usage/backup
    usage/debugging
    usage/troubleshooting
 
-**Develop**
+**Development**
 
 .. toctree::
    :maxdepth: 1
@@ -64,6 +67,7 @@
 * :ref:`genindex`
 * :ref:`search`
 
+
 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
 .. _python: http://www.python.org/
 .. _django: http://www.djangoproject.com/
--- a/docs/installation.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/installation.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -4,16 +4,12 @@
 Installation on Unix/Linux
 ==========================
 
-**Kallithea** is written entirely in Python_ and requires Python version
-2.6 or higher. Python 3.x is currently not supported.
-
-There are several ways to install Kallithea:
+The following describes three different ways of installing Kallithea:
 
-- :ref:`installation-source`: The Kallithea development repository is stable
-  and can be used in production. In fact, the Kallithea maintainers do
-  use it in production. The advantage of installation from source and regularly
-  updating it is that you take advantage of the most recent improvements, which
-  is particularly useful because Kallithea is evolving rapidly.
+- :ref:`installation-source`: The simplest way to keep the installation
+  up-to-date and track any local customizations is to run directly from
+  source in a Kallithea repository clone, preferably inside a virtualenv
+  virtual Python environment.
 
 - :ref:`installation-virtualenv`: If you prefer to only use released versions
   of Kallithea, the recommended method is to install Kallithea in a virtual
@@ -32,10 +28,11 @@
 
 .. _installation-source:
 
+
 Installation from repository source
 -----------------------------------
 
-To install Kallithea in a virtualenv using the stable branch of the development
+To install Kallithea in a virtualenv_ using the stable branch of the development
 repository, follow the instructions below::
 
         hg clone https://kallithea-scm.org/repos/kallithea -u stable
@@ -52,6 +49,7 @@
 
 .. _installation-virtualenv:
 
+
 Installing a released version in a virtualenv
 ---------------------------------------------
 
@@ -95,6 +93,7 @@
 
 .. _installation-without-virtualenv:
 
+
 Installing a released version without virtualenv
 ------------------------------------------------
 
@@ -111,8 +110,9 @@
 
 You can now proceed to :ref:`setup`.
 
+
 Upgrading Kallithea from Python Package Index (PyPI)
------------------------------------------------------
+----------------------------------------------------
 
 .. note::
    It is strongly recommended that you **always** perform a database and
@@ -123,19 +123,16 @@
    instance from version 0.1 to 0.2, the ``my.ini`` file could be
    backed up to ``my.ini.0-1``.
 
-
 If using a SQLite database, stop the Kallithea process/daemon/service, and
 then make a copy of the database file::
 
  service kallithea stop
  cp kallithea.db kallithea.db.{version}
 
-
 Back up your configuration file::
 
  cp my.ini my.ini.{version}
 
-
 Ensure that you are using the Python virtual environment that you originally
 installed Kallithea in by running::
 
@@ -146,12 +143,10 @@
 
  source /srv/kallithea/venv/bin/activate
 
-
 Once you have verified the environment you can upgrade Kallithea with::
 
  pip install --upgrade kallithea
 
-
 Then run the following command from the installation directory::
 
  paster make-config Kallithea my.ini
@@ -164,12 +159,10 @@
    Please always make sure your .ini files are up to date. Errors can
    often be caused by missing parameters added in new versions.
 
-
 It is also recommended that you rebuild the whoosh index after upgrading since
 the new whoosh version could introduce some incompatible index changes. Please
 read the changelog to see if there were any changes to whoosh.
 
-
 The final step is to upgrade the database. To do this simply run::
 
  paster upgrade-db my.ini
@@ -178,7 +171,6 @@
 and will always recheck the settings of the application, if there are no new
 options that need to be set.
 
-
 .. note::
    The DB schema upgrade library has some limitations and can sometimes fail if you try to
    upgrade from older major releases. In such a case simply run upgrades sequentially, e.g.,
@@ -205,5 +197,4 @@
 
 
 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
-.. _Python: http://www.python.org/
 .. _pylons: http://www.pylonsproject.org/
--- a/docs/installation_iis.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/installation_iis.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -1,5 +1,6 @@
 .. _installation_iis:
 
+=====================================================================
 Installing Kallithea on Microsoft Internet Information Services (IIS)
 =====================================================================
 
@@ -11,37 +12,38 @@
     For the best security, it is strongly recommended to only host the site over
     a secure connection, e.g. using TLS.
 
+
 Prerequisites
 -------------
 
 Apart from the normal requirements for Kallithea, it is also necessary to get an
 ISAPI-WSGI bridge module, e.g. isapi-wsgi.
 
+
 Installation
 ------------
 
-The following will assume that your Kallithea is at ``c:\inetpub\kallithea`` and
+The following assumes that your Kallithea is at ``c:\inetpub\kallithea``, and
 will be served from the root of its own website. The changes to serve it in its
 own virtual folder will be noted where appropriate.
 
-Application Pool
+Application pool
 ................
 
 Make sure that there is a unique application pool for the Kallithea application
 with an identity that has read access to the Kallithea distribution.
 
 The application pool does not need to be able to run any managed code. If you
-are using a 32-bit Python installation, then you must enable 32 bit program in
-the advanced settings for the application pool otherwise Python will not be able
-to run on the website and consequently, Kallithea will not be able to run.
+are using a 32-bit Python installation, then you must enable 32-bit program in
+the advanced settings for the application pool; otherwise Python will not be able
+to run on the website and neither will Kallithea.
 
 .. note::
 
-    The application pool can be the same as an existing application pool as long
-    as the requirements to Kallithea are enabled by the existing application
-    pool.
+    The application pool can be the same as an existing application pool,
+    as long as the Kallithea requirements are met by the existing pool.
 
-ISAPI Handler
+ISAPI handler
 .............
 
 The ISAPI handler can be generated using::
@@ -88,6 +90,7 @@
 The last necessary step is to enable the relevant authentication in IIS, e.g.
 Windows authentication.
 
+
 Troubleshooting
 ---------------
 
--- a/docs/installation_win.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/installation_win.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -1,9 +1,10 @@
 .. _installation_win:
 
-
+================================================================
 Installation and upgrade on Windows (7/Server 2008 R2 and newer)
 ================================================================
 
+
 First time install
 ::::::::::::::::::
 
@@ -13,9 +14,8 @@
 
 To install on an older version of Windows, see `<installation_win_old.html>`_
 
-
-Step 1 - Install Python
------------------------
+Step 1 -- Install Python
+------------------------
 
 Install Python 2.x.y (x = 6 or 7). Latest version is recommended. If you need another version, they can run side by side.
 
@@ -30,9 +30,8 @@
 Remember the specific major and minor versions installed, because they will
 be needed in the next step. In this case, it is "2.7".
 
-
-Step 2 - Python BIN
--------------------
+Step 2 -- Python BIN
+--------------------
 
 Add Python BIN folder to the path. This can be done manually (editing
 "PATH" environment variable) or by using Windows Support Tools that
@@ -45,9 +44,8 @@
 Please substitute [your-python-path] with your Python installation
 path. Typically this is ``C:\\Python27``.
 
-
-Step 3 - Install pywin32 extensions
------------------------------------
+Step 3 -- Install pywin32 extensions
+------------------------------------
 
 Download pywin32 from:
 http://sourceforge.net/projects/pywin32/files/
@@ -62,9 +60,8 @@
   http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe/download
   (Win32)
 
-
-Step 4 - Install pip
---------------------
+Step 4 -- Install pip
+---------------------
 
 pip is a package management system for Python. You will need it to install Kallithea and its dependencies.
 
@@ -87,9 +84,8 @@
 
   SETX PATH "%PATH%;[your-python-path]\Scripts" /M
 
-
-Step 5 - Kallithea Folder Structure
------------------------------------
+Step 5 -- Kallithea folder structure
+------------------------------------
 
 Create a Kallithea folder structure.
 
@@ -105,9 +101,8 @@
   C:\Kallithea\Env
   C:\Kallithea\Repos
 
-
-Step 6 - Install virtualenv
----------------------------
+Step 6 -- Install virtualenv
+----------------------------
 
 .. note::
    A python virtual environment will allow for isolation between the Python packages of your system and those used for Kallithea.
@@ -123,9 +118,8 @@
 
   virtualenv C:\Kallithea\Env
 
-
-Step 7 - Install Kallithea
---------------------------
+Step 7 -- Install Kallithea
+---------------------------
 
 In order to install Kallithea, you need to be able to run "pip install kallithea". It will use pip to install the Kallithea Python package and its dependencies.
 Some Python packages use managed code and need to be compiled.
@@ -150,9 +144,8 @@
           complete. Some warnings will appear. Don't worry, they are
           normal.
 
-
-Step 8 - (Optional) Install git
--------------------------------
+Step 8 -- Install git (optional)
+--------------------------------
 
 Mercurial being a python package, it was installed automatically when doing "pip install kallithea".
 
@@ -160,9 +153,8 @@
 
 See http://git-scm.com/book/en/v2/Getting-Started-Installing-Git#Installing-on-Windows for instructions.
 
-
-Step 9 - Configuring Kallithea
-------------------------------
+Step 9 -- Configuring Kallithea
+-------------------------------
 
 Steps taken from `<setup.html>`_
 
@@ -200,9 +192,8 @@
 
 If you decided not to install git, you will get errors about it that you can ignore.
 
-
-Step 10 - Running Kallithea
----------------------------
+Step 10 -- Running Kallithea
+----------------------------
 
 In the previous command prompt, being in the C:\\Kallithea\\Bin folder, type::
 
@@ -215,7 +206,6 @@
 Remark:
 If it does not work the first time, Ctrl-C the CMD process and start it again. Don't forget the "http://" in Internet Explorer.
 
-
 What this guide does not cover:
 
 - Installing Celery
--- a/docs/installation_win_old.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/installation_win_old.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -1,29 +1,30 @@
 .. _installation_win_old:
 
-
+======================================================================
 Installation and upgrade on Windows (XP/Vista/Server 2003/Server 2008)
 ======================================================================
 
-First time install
+
+First-time install
 ::::::::::::::::::
 
-Target OS: Windows XP SP3 32bit English (Clean installation)
+Target OS: Windows XP SP3 32-bit English (Clean installation)
 + All Windows Updates until 24-may-2012
 
 .. note::
 
-   This installation is for 32bit systems, for 64bit windows you might need
-   to download proper 64bit versions of the different packages(Windows Installer, Win32py extensions)
+   This installation is for 32-bit systems, for 64-bit Windows you might need
+   to download proper 64-bit versions of the different packages (Windows Installer, Win32py extensions)
    plus some extra tweaks.
-   These extra steps haven been marked as "64bit".
+   These extra steps haven been marked as "64-bit".
    Tested on Windows Server 2008 R2 SP1, 9-feb-2013.
-   If you run into any 64bit related problems, please check these pages:
+   If you run into any 64-bit related problems, please check these pages:
+
    - http://blog.victorjabur.com/2011/06/05/compiling-python-2-7-modules-on-windows-32-and-64-using-msvc-2008-express/
    - http://bugs.python.org/issue7511
 
-Step1 - Install Visual Studio 2008 Express
-------------------------------------------
-
+Step 1 -- Install Visual Studio 2008 Express
+--------------------------------------------
 
 Optional: You can also install MinGW, but VS2008 installation is easier.
 
@@ -32,7 +33,7 @@
 (if not found or relocated, google for "visual studio 2008 express" for updated link. This link was taken from http://stackoverflow.com/questions/15318560/visual-c-2008-express-download-link-dead)
 
 You can also download full ISO file for offline installation, just
-choose "All - Offline Install ISO image file" in the previous page and
+choose "All -- Offline Install ISO image file" in the previous page and
 choose "Visual C++ 2008 Express" when installing.
 
 .. note::
@@ -47,34 +48,33 @@
 
 .. note::
 
-   64bit: You also need to install the Microsoft Windows SDK for .NET 3.5 SP1 (.NET 4.0 won't work).
+   64-bit: You also need to install the Microsoft Windows SDK for .NET 3.5 SP1 (.NET 4.0 won't work).
    Download from: http://www.microsoft.com/en-us/download/details.aspx?id=3138
 
 .. note::
 
-   64bit: You also need to copy and rename a .bat file to make the Visual C++ compiler work.
-   I am not sure why this is not necessary for 32bit.
+   64-bit: You also need to copy and rename a .bat file to make the Visual C++ compiler work.
+   I am not sure why this is not necessary for 32-bit.
    Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat to C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat
 
+Step 2 -- Install Python
+------------------------
 
-Step2 - Install Python
-----------------------
-
-Install Python 2.x.y (x = 6 or 7) x86 version (32bit). DO NOT USE A 3.x version.
+Install Python 2.x.y (x = 6 or 7) x86 version (32-bit). DO NOT USE A 3.x version.
 Download Python 2.x.y from:
 http://www.python.org/download/
 
-Choose "Windows Installer" (32bit version) not "Windows X86-64
+Choose "Windows Installer" (32-bit version) not "Windows X86-64
 Installer". While writing this guide, the latest version was v2.7.3.
 Remember the specific major and minor version installed, because it will
 be needed in the next step. In this case, it is "2.7".
 
 .. note::
 
-   64bit: Just download and install the 64bit version of python.
+   64-bit: Just download and install the 64-bit version of python.
 
-Step3 - Install Win32py extensions
-----------------------------------
+Step 3 -- Install Win32py extensions
+------------------------------------
 
 Download pywin32 from:
 http://sourceforge.net/projects/pywin32/files/
@@ -88,12 +88,12 @@
 
   .. note::
 
-     64bit: Download and install the 64bit version.
+     64-bit: Download and install the 64-bit version.
      At the time of writing you can find this at:
      http://sourceforge.net/projects/pywin32/files/pywin32/Build%20218/pywin32-218.win-amd64-py2.7.exe/download
 
-Step4 - Python BIN
-------------------
+Step 4 -- Python BIN
+--------------------
 
 Add Python BIN folder to the path
 
@@ -119,9 +119,8 @@
   Please substitute [your-python-path] with your Python installation path.
   Typically: C:\\Python27
 
-
-Step5 - Kallithea folder structure
-----------------------------------
+Step 5 -- Kallithea folder structure
+------------------------------------
 
 Create a Kallithea folder structure
 
@@ -137,9 +136,8 @@
   C:\Kallithea\Env
   C:\Kallithea\Repos
 
-
-Step6 - Install virtualenv
----------------------------
+Step 6 -- Install virtualenv
+----------------------------
 
 Install Virtual Env for Python
 
@@ -158,9 +156,8 @@
 (--no-site-packages is now the default behaviour of virtualenv, no need
 to include it)
 
-
-Step7 - Install Kallithea
--------------------------
+Step 7 -- Install Kallithea
+---------------------------
 
 Finally, install Kallithea
 
@@ -171,7 +168,7 @@
 
 .. note::
 
-   64bit: For 64bit you need to modify the shortcut that is used to start the
+   64-bit: For 64-bit you need to modify the shortcut that is used to start the
    Visual Studio 2008 Command Prompt. Use right-mouse click to open properties.
 
 Change commandline from::
@@ -182,7 +179,6 @@
 
 %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" amd64
 
-
 In that CMD (loaded with VS2008 PATHs) type::
 
   cd C:\Kallithea\Env\Scripts (or similar)
@@ -197,10 +193,8 @@
 
 Some warnings will appear, don't worry as they are normal.
 
-
-Step8 - Configuring Kallithea
------------------------------
-
+Step 8 -- Configuring Kallithea
+-------------------------------
 
 steps taken from http://packages.python.org/Kallithea/setup.html
 
@@ -211,7 +205,7 @@
   cd C:\Kallithea\Bin
   paster make-config Kallithea production.ini
 
-Then, you must edit production.ini to fit your needs (ip address, ip
+Then, you must edit production.ini to fit your needs (network address and
 port, mail settings, database, whatever). I recommend using NotePad++
 (free) or similar text editor, as it handles well the EndOfLine
 character differences between Unix and Windows
@@ -237,10 +231,8 @@
 If you make some mistake and the script does not end, don't worry, start
 it again.
 
-
-Step9 - Running Kallithea
--------------------------
-
+Step 9 -- Running Kallithea
+---------------------------
 
 In the previous command prompt, being in the C:\\Kallithea\\Bin folder,
 just type::
@@ -255,8 +247,6 @@
 If it does not work first time, just Ctrl-C the CMD process and start it
 again. Don't forget the "http://" in Internet Explorer
 
-
-
 What this Guide does not cover:
 
 - Installing Celery
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/overview.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,141 @@
+.. _overview:
+
+=====================
+Installation overview
+=====================
+
+Some overview and some details that can help understanding the options when
+installing Kallithea.
+
+
+Python environment
+------------------
+
+**Kallithea** is written entirely in Python_ and requires Python version
+2.6 or higher. Python 3.x is currently not supported.
+
+Given a Python installation, there are different ways of providing the
+environment for running Python applications. Each of them pretty much
+corresponds to a ``site-packages`` directory somewhere where packages can be
+installed.
+
+Kallithea itself can be run from source or be installed, but even when running
+from source, there are some dependencies that must be installed in the Python
+environment used for running Kallithea.
+
+- Packages *could* be installed in Python's ``site-packages`` directory ... but
+  that would require running pip_ as root and it would be hard to uninstall or
+  upgrade and is probably not a good idea unless using a package manager.
+
+- Packages could also be installed in ``~/.local`` ... but that is probably
+  only a good idea if using a dedicated user per application or instance.
+
+- Finally, it can be installed in a virtualenv_. That is a very lightweight
+  "container" where each Kallithea instance can get its own dedicated and
+  self-contained virtual environment.
+
+We recommend using virtualenv for installing Kallithea.
+
+
+Installation methods
+--------------------
+
+Kallithea must be installed on a server. Kallithea is installed in a Python
+environment so it can use packages that are installed there and make itself
+available for other packages.
+
+Two different cases will pretty much cover the options for how it can be
+installed.
+
+- The Kallithea source repository can be cloned and used -- it is kept stable and
+  can be used in production. The Kallithea maintainers use the development
+  branch in production. The advantage of installation from source and regularly
+  updating it is that you take advantage of the most recent improvements. Using
+  it directly from a DVCS also means that it is easy to track local customizations.
+
+  Running ``setup.py develop`` in the source will use pip to install the
+  necessary dependencies in the Python environment and create a
+  ``.../site-packages/Kallithea.egg-link`` file there that points at the Kallithea
+  source.
+
+- Kallithea can also be installed from ready-made packages using a package manager.
+  The official released versions are available on PyPI_ and can be downloaded and
+  installed with all dependencies using ``pip install kallithea``.
+
+  With this method, Kallithea is installed in the Python environment as any
+  other package, usually as a ``.../site-packages/Kallithea-X-py2.7.egg/``
+  directory with Python files and everything else that is needed.
+
+  (``pip install kallithea`` from a source tree will do pretty much the same
+  but build the Kallithea package itself locally instead of downloading it.)
+
+
+Web server
+----------
+
+Kallithea is (primarily) a WSGI_ application that must be run from a web
+server that serves WSGI applications over HTTP.
+
+Kallithea itself is not serving HTTP (or HTTPS); that is the web server's
+responsibility. Kallithea does however need to know its own user facing URL
+(protocol, address, port and path) for each HTTP request. Kallithea will
+usually use its own HTML/cookie based authentication but can also be configured
+to use web server authentication.
+
+There are several web server options:
+
+- Kallithea uses the Paste_ tool as command line interface. Paste provides
+  ``paster serve`` as a convenient way to launch a Python WSGI / web server
+  from the command line. That is perfect for development and evaluation.
+  Actual use in production might have different requirements and need extra
+  work to make it manageable as a scalable system service.
+
+  Paste comes with its own built-in web server but Kallithea defaults to use
+  Waitress_. Gunicorn_ is also an option. These web servers have different
+  limited feature sets.
+
+  The web server used by ``paster`` is configured in the ``.ini`` file passed
+  to it. The entry point for the WSGI application is configured
+  in ``setup.py`` as ``kallithea.config.middleware:make_app``.
+
+- `Apache httpd`_ can serve WSGI applications directly using mod_wsgi_ and a
+  simple Python file with the necessary configuration. This is a good option if
+  Apache is an option.
+
+- uWSGI_ is also a full web server with built-in WSGI module.
+
+- IIS_ can also server WSGI applications directly using isapi-wsgi_.
+
+- A `reverse HTTP proxy <https://en.wikipedia.org/wiki/Reverse_proxy>`_
+  can be put in front of another web server which has WSGI support.
+  Such a layered setup can be complex but might in some cases be the right
+  option, for example to standardize on one internet-facing web server, to add
+  encryption or special authentication or for other security reasons, to
+  provide caching of static files, or to provide load balancing or fail-over.
+  Nginx_, Varnish_ and HAProxy_ are often used for this purpose, often in front
+  of a ``paster`` server that somehow is wrapped as a service.
+
+The best option depends on what you are familiar with and the requirements for
+performance and stability. Also, keep in mind that Kallithea mainly is serving
+dynamically generated pages from a relatively slow Python process. Kallithea is
+also often used inside organizations with a limited amount of users and thus no
+continuous hammering from the internet.
+
+
+.. _Python: http://www.python.org/
+.. _Gunicorn: http://gunicorn.org/
+.. _Waitress: http://waitress.readthedocs.org/en/latest/
+.. _virtualenv: http://pypi.python.org/pypi/virtualenv
+.. _Paste: http://pythonpaste.org/
+.. _PyPI: https://pypi.python.org/pypi
+.. _Apache httpd: http://httpd.apache.org/
+.. _mod_wsgi: https://code.google.com/p/modwsgi/
+.. _isapi-wsgi: https://github.com/hexdump42/isapi-wsgi
+.. _uWSGI: https://uwsgi-docs.readthedocs.org/en/latest/
+.. _nginx: http://nginx.org/en/
+.. _iis: http://en.wikipedia.org/wiki/Internet_Information_Services
+.. _pip: http://en.wikipedia.org/wiki/Pip_%28package_manager%29
+.. _WSGI: http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
+.. _pylons: http://www.pylonsproject.org/
+.. _HAProxy: http://www.haproxy.org/
+.. _Varnish: https://www.varnish-cache.org/
--- a/docs/setup.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/setup.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -14,11 +14,10 @@
     paster make-config Kallithea my.ini
 
 This will create the file ``my.ini`` in the current directory. This
-configuration file contains the various settings for Kallithea, e.g.,
+configuration file contains the various settings for Kallithea, e.g.
 proxy port, email settings, usage of static files, cache, Celery
 settings, and logging.
 
-
 Next, you need to create the databases used by Kallithea. It is recommended to
 use PostgreSQL or SQLite (default). If you choose a database other than the
 default, ensure you properly adjust the database URL in your ``my.ini``
@@ -34,12 +33,12 @@
 and password for the initial admin account which ``setup-db`` sets
 up for you.
 
-The setup process can be fully automated, example for lazy::
+The ``setup-db`` values can also be given on the command line.
+Example::
 
-    paster setup-db my.ini --user=nn --password=secret --email=nn@your.kallithea.server --repos=/srv/repos
+    paster setup-db my.ini --user=nn --password=secret --email=nn@example.org --repos=/srv/repos
 
-
-The ``setup-db`` command will create all of the needed tables and an
+The ``setup-db`` command will create all needed tables and an
 admin account. When choosing a root path you can either use a new
 empty location, or a location which already contains existing
 repositories. If you choose a location which contains existing
@@ -58,26 +57,31 @@
     paster serve my.ini
 
 - This command runs the Kallithea server. The web app should be available at
-  http://127.0.0.1:5000. This ip and port is configurable via the my.ini
-  file created in previous step
-- Use the admin account you created above when running ``setup-db``
-  to login to the web app.
+  http://127.0.0.1:5000. The IP address and port is configurable via the
+  configuration file created in the previous step.
+- Log in to Kallithea using the admin account created when running ``setup-db``.
 - The default permissions on each repository is read, and the owner is admin.
   Remember to update these if needed.
 - In the admin panel you can toggle LDAP, anonymous, and permissions
   settings, as well as edit more advanced options on users and
-  repositories
+  repositories.
+
 
-Optionally users can create an ``rcextensions`` package that extends Kallithea
-functionality. To do this simply execute::
+Extensions
+----------
+
+Optionally one can create an ``rcextensions`` package that extends Kallithea
+functionality.
+To generate a skeleton extensions package, run::
 
     paster make-rcext my.ini
 
-This will create an ``rcextensions`` package in the same place that your ``ini`` file
-lives. With ``rcextensions`` it's possible to add additional mapping for whoosh,
+This will create an ``rcextensions`` package next to the specified ``ini`` file.
+With ``rcextensions`` it's possible to add additional mapping for whoosh,
 stats and add additional code into the push/pull/create/delete repo hooks,
-for example, for sending signals to build-bots such as Jenkins.
-Please see the ``__init__.py`` file inside ``rcextensions`` package
+for example for sending signals to build-bots such as Jenkins.
+
+See the ``__init__.py`` file inside the generated ``rcextensions`` package
 for more details.
 
 
@@ -115,48 +119,41 @@
           to the Kallithea db and run check functions for permissions
           against that.
 
+
 Setting up Whoosh full text search
 ----------------------------------
 
-The whoosh index can be built by using the paster
-command ``make-index``. To use ``make-index`` you must specify the configuration
-file that stores the location of the index. You may specify the location of the
-repositories (``--repo-location``).  If not specified, this value is retrieved
-from the Kallithea database.
-It is also possible to specify a comma separated list of
-repositories (``--index-only``) to build index only on chooses repositories
-skipping any other found in repos location
+Kallithea provides full text search of repositories using `Whoosh`__.
 
-You may optionally pass the option ``-f`` to enable a full index rebuild. Without
-the ``-f`` option, indexing will run always in "incremental" mode.
+.. __: https://pythonhosted.org/Whoosh/
 
-For an incremental index build use::
+For an incremental index build, run::
 
     paster make-index my.ini
 
-For a full index rebuild use::
+For a full index rebuild, run::
 
     paster make-index my.ini -f
 
+The ``--repo-location`` option allows the location of the repositories to be overriden;
+usually, the location is retrieved from the Kallithea database.
 
-Building an index for just selected repositories is possible with such command::
+The ``--index-only`` option can be used to limit the indexed repositories to a comma-separated list::
 
     paster make-index my.ini --index-only=vcs,kallithea
 
+To keep your index up-to-date it is necessary to do periodic index builds;
+for this, it is recommended to use a crontab entry. Example::
 
-In order to do periodic index builds and keep your index always up to
-date, it is recommended to use a crontab entry.  An example entry
-might look like this::
+    0  3  *  *  *  /path/to/virtualenv/bin/paster make-index /path/to/kallithea/my.ini
 
-    /path/to/python/bin/paster make-index /path/to/kallithea/my.ini
-
-When using incremental mode (the default) whoosh will check the last
+When using incremental mode (the default), Whoosh will check the last
 modification date of each file and add it to be reindexed if a newer file is
 available. The indexing daemon checks for any removed files and removes them
 from index.
 
 If you want to rebuild the index from scratch, you can use the ``-f`` flag as above,
-or in the admin panel you can check the "build from scratch" flag.
+or in the admin panel you can check the "build from scratch" checkbox.
 
 
 Setting up LDAP support
@@ -164,7 +161,7 @@
 
 Kallithea supports LDAP authentication. In order
 to use LDAP, you have to install the python-ldap_ package. This package is
-available via pypi, so you can install it by running::
+available via PyPI, so you can install it by running::
 
     pip install python-ldap
 
@@ -172,7 +169,8 @@
           your system, so before installing it check that you have at
           least the ``openldap`` and ``sasl`` libraries.
 
-LDAP settings are located in the Admin->LDAP section.
+Choose *Admin > Authentication*, click the ``kallithea.lib.auth_modules.auth_ldap`` button
+and then *Save*, to enable the LDAP plugin and configure its settings.
 
 Here's a typical LDAP setup::
 
@@ -194,7 +192,7 @@
  Login Attribute      = uid
  First Name Attribute = firstName
  Last Name Attribute  = lastName
- E-mail Attribute     = mail
+ Email Attribute      = mail
 
 If your user groups are placed in an Organisation Unit (OU) structure, the Search Settings configuration differs::
 
@@ -251,7 +249,7 @@
 .. _Certificate Checks:
 
 Certificate Checks : optional
-    How SSL certificates verification is handled - this is only useful when
+    How SSL certificates verification is handled -- this is only useful when
     `Enable LDAPS`_ is enabled.  Only DEMAND or HARD offer full SSL security
     while the other options are susceptible to man-in-the-middle attacks.  SSL
     certificates can be installed to /etc/openldap/cacerts so that the
@@ -359,7 +357,7 @@
  Login Attribute      = sAMAccountName
  First Name Attribute = givenName
  Last Name Attribute  = sn
- E-mail Attribute     = mail
+ Email Attribute     = mail
 
 All other LDAP settings will likely be site-specific and should be
 appropriately configured.
@@ -373,16 +371,16 @@
 clients access the application.
 
 When these authentication methods are enabled in Kallithea, it uses the
-username that the container/proxy (Apache/Nginx/etc) authenticated and doesn't
+username that the container/proxy (Apache or Nginx, etc.) provides and doesn't
 perform the authentication itself. The authorization, however, is still done by
 Kallithea according to its settings.
 
 When a user logs in for the first time using these authentication methods,
 a matching user account is created in Kallithea with default permissions. An
 administrator can then modify it using Kallithea's admin interface.
+
 It's also possible for an administrator to create accounts and configure their
-permissions before the user logs in for the first time.
-
+permissions before the user logs in for the first time, using the :ref:`create-user` API.
 
 Container-based authentication
 ''''''''''''''''''''''''''''''
@@ -390,11 +388,10 @@
 In a container-based authentication setup, Kallithea reads the user name from
 the ``REMOTE_USER`` server variable provided by the WSGI container.
 
-After setting up your container (see `Apache's WSGI config`_), you'd need
+After setting up your container (see `Apache with mod_wsgi`_), you'll need
 to configure it to require authentication on the location configured for
 Kallithea.
 
-
 Proxy pass-through authentication
 '''''''''''''''''''''''''''''''''
 
@@ -403,22 +400,24 @@
 sent by the reverse-proxy server.
 
 After setting up your proxy solution (see `Apache virtual host reverse proxy example`_,
-`Apache as subdirectory`_ or `Nginx virtual host example`_), you'd need to
+`Apache as subdirectory`_ or `Nginx virtual host example`_), you'll need to
 configure the authentication and add the username in a request header named
 ``X-Forwarded-User``.
 
 For example, the following config section for Apache sets a subdirectory in a
-reverse-proxy setup with basic auth::
+reverse-proxy setup with basic auth:
+
+.. code-block:: apache
 
-    <Location /<someprefix> >
-      ProxyPass http://127.0.0.1:5000/<someprefix>
-      ProxyPassReverse http://127.0.0.1:5000/<someprefix>
+    <Location /someprefix>
+      ProxyPass http://127.0.0.1:5000/someprefix
+      ProxyPassReverse http://127.0.0.1:5000/someprefix
       SetEnvIf X-Url-Scheme https HTTPS=1
 
       AuthType Basic
       AuthName "Kallithea authentication"
       AuthUserFile /srv/kallithea/.htpasswd
-      require valid-user
+      Require valid-user
 
       RequestHeader unset X-Forwarded-User
 
@@ -428,19 +427,19 @@
       RequestHeader set X-Forwarded-User %{RU}e
     </Location>
 
-
 .. note::
    If you enable proxy pass-through authentication, make sure your server is
    only accessible through the proxy. Otherwise, any client would be able to
    forge the authentication header and could effectively become authenticated
    using any account of their liking.
 
-Integration with Issue trackers
+
+Integration with issue trackers
 -------------------------------
 
 Kallithea provides a simple integration with issue trackers. It's possible
-to define a regular expression that will fetch an issue id stored in a commit
-messages and replace that with a URL to the issue. To enable this simply
+to define a regular expression that will match an issue ID in commit messages,
+and have that replaced with a URL to the issue. To enable this simply
 uncomment the following variables in the ini file::
 
     issue_pat = (?:^#|\s#)(\w+)
@@ -453,12 +452,14 @@
 
 The default expression matches issues in the format ``#<number>``, e.g., ``#300``.
 
-Matched issues are replaced with the link specified as
-``issue_server_link`` ``{id}`` is replaced with issue id, and
+Matched issue references are replaced with the link specified in
+``issue_server_link``. ``{id}`` is replaced with the issue ID, and
 ``{repo}`` with the repository name.  Since the # is stripped away,
 ``issue_prefix`` is prepended to the link text.  ``issue_prefix`` doesn't
 necessarily need to be ``#``: if you set issue prefix to ``ISSUE-`` this will
-generate a URL in the format::
+generate a URL in the format:
+
+.. code-block:: html
 
   <a href="https://myissueserver.com/example_repo/issue/300">ISSUE-300</a>
 
@@ -470,7 +471,9 @@
     issue_prefix_wiki = WIKI-
 
 With these settings, wiki pages can be referenced as wiki-some-id, and every
-such reference will be transformed into::
+such reference will be transformed into:
+
+.. code-block:: html
 
   <a href="https://mywiki.com/some-id">WIKI-some-id</a>
 
@@ -479,13 +482,12 @@
 ---------------
 
 Hooks can be managed in similar way to that used in ``.hgrc`` files.
-To access hooks setting click `advanced setup` in the `Hooks` section
-of Mercurial Settings in Admin.
+To manage hooks, choose *Admin > Settings > Hooks*.
 
-There are four built in hooks that cannot be changed (only enabled/disabled by
-checkboxes in the previous section).
-To add another custom hook simply fill in the first section with
-``<name>.<hook_type>`` and the second one with hook path. Example hooks
+The built-in hooks cannot be modified, though they can be enabled or disabled in the *VCS* section.
+
+To add another custom hook simply fill in the first textbox with
+``<name>.<hook_type>`` and the second with the hook path. Example hooks
 can be found in ``kallithea.lib.hooks``.
 
 
@@ -504,7 +506,7 @@
 --------------------
 
 Kallithea can use the distributed task queue system Celery_ to run tasks like
-cloning repositories or sending mails.
+cloning repositories or sending emails.
 
 Kallithea will in most setups work perfectly fine out of the box (without
 Celery), executing all tasks in the web server process. Some tasks can however
@@ -530,11 +532,11 @@
 
  paster celeryd <configfile.ini>
 
-
 .. note::
    Make sure you run this command from the same virtualenv, and with the same
    user that Kallithea runs.
 
+
 HTTPS support
 -------------
 
@@ -543,15 +545,19 @@
 Alternatively, you can use some special configuration settings to control
 directly which scheme/protocol Kallithea will use when generating URLs:
 
-- With ``https_fixup = true``, the scheme will be taken from the ``HTTP_X_URL_SCHEME``,
-  ``HTTP_X_FORWARDED_SCHEME`` or ``HTTP_X_FORWARDED_PROTO HTTP`` header (default ``http``).
+- With ``https_fixup = true``, the scheme will be taken from the
+  ``X-Url-Scheme``, ``X-Forwarded-Scheme`` or ``X-Forwarded-Proto`` HTTP header
+  (default ``http``).
 - With ``force_https = true`` the default will be ``https``.
-- With ``use_htsts = true``, it will set ``Strict-Transport-Security`` when using https.
+- With ``use_htsts = true``, Kallithea will set ``Strict-Transport-Security`` when using https.
+
 
 Nginx virtual host example
 --------------------------
 
-Sample config for nginx using proxy::
+Sample config for Nginx using proxy:
+
+.. code-block:: nginx
 
     upstream kallithea {
         server 127.0.0.1:5000;
@@ -637,15 +643,21 @@
 Apache virtual host reverse proxy example
 -----------------------------------------
 
-Here is a sample configuration file for apache using proxy::
+Here is a sample configuration file for Apache using proxy:
+
+.. code-block:: apache
 
     <VirtualHost *:80>
             ServerName hg.myserver.com
             ServerAlias hg.myserver.com
 
             <Proxy *>
-              Order allow,deny
-              Allow from all
+              # For Apache 2.4 and later:
+              Require all granted
+
+              # For Apache 2.2 and earlier, instead use:
+              # Order allow,deny
+              # Allow from all
             </Proxy>
 
             #important !
@@ -658,10 +670,8 @@
 
             #to enable https use line below
             #SetEnvIf X-Url-Scheme https HTTPS=1
-
     </VirtualHost>
 
-
 Additional tutorial
 http://pylonsbook.com/en/1.1/deployment.html#using-apache-to-proxy-requests-to-pylons
 
@@ -669,7 +679,9 @@
 Apache as subdirectory
 ----------------------
 
-Apache subdirectory part::
+Apache subdirectory part:
+
+.. code-block:: apache
 
     <Location /<someprefix> >
       ProxyPass http://127.0.0.1:5000/<someprefix>
@@ -688,10 +700,10 @@
     use = egg:PasteDeploy#prefix
     prefix = /<someprefix>
 
-
 then change ``<someprefix>`` into your chosen prefix
 
-Apache's WSGI config
+
+Apache with mod_wsgi
 --------------------
 
 Alternatively, Kallithea can be set up with Apache under mod_wsgi. For
@@ -713,7 +725,9 @@
   as in the following example. Once again, check the paths are
   correctly specified.
 
-Here is a sample excerpt from an Apache Virtual Host configuration file::
+Here is a sample excerpt from an Apache Virtual Host configuration file:
+
+.. code-block:: apache
 
     WSGIDaemonProcess kallithea \
         processes=1 threads=4 \
@@ -721,13 +735,14 @@
     WSGIScriptAlias / /srv/kallithea/dispatch.wsgi
     WSGIPassAuthorization On
 
-Or if using a dispatcher WSGI script with proper virtualenv activation::
+Or if using a dispatcher WSGI script with proper virtualenv activation:
+
+.. code-block:: apache
 
     WSGIDaemonProcess kallithea processes=1 threads=4
     WSGIScriptAlias / /srv/kallithea/dispatch.wsgi
     WSGIPassAuthorization On
 
-
 .. note::
    When running apache as root, please make sure it doesn't run Kallithea as
    root, for examply by adding: ``user=www-data group=www-data`` to the configuration.
@@ -737,8 +752,9 @@
    make sure you set ``instance_id = *`` in the configuration so each process
    gets it's own cache invalidation key.
 
+Example WSGI dispatch script:
 
-Example WSGI dispatch script::
+.. code-block:: python
 
     import os
     os.environ["HGENCODING"] = "UTF-8"
@@ -756,10 +772,12 @@
     fileConfig('/srv/kallithea/my.ini')
     application = loadapp('config:/srv/kallithea/my.ini')
 
-Or using proper virtualenv activation::
+Or using proper virtualenv activation:
+
+.. code-block:: python
 
     activate_this = '/srv/kallithea/venv/bin/activate_this.py'
-    execfile(activate_this,dict(__file__=activate_this))
+    execfile(activate_this, dict(__file__=activate_this))
 
     import os
     os.environ['HOME'] = '/srv/kallithea'
@@ -774,8 +792,11 @@
 Other configuration files
 -------------------------
 
-Some example init.d scripts can be found in the ``init.d`` directory:
-https://kallithea-scm.org/repos/kallithea/files/tip/init.d/ .
+A number of `example init.d scripts`__ can be found in
+the ``init.d`` directory of the Kallithea source.
+
+.. __: https://kallithea-scm.org/repos/kallithea/files/tip/init.d/ .
+
 
 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
 .. _python: http://www.python.org/
--- a/docs/theme/nature/layout.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/theme/nature/layout.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,15 +1,15 @@
 {% extends "basic/layout.html" %}
 
 {% block sidebarlogo %}
-<div style="text-align:center;margin:10px;padding:20px;background:white">
-  <img src="{{pathto('_static/kallithea-logo.svg',1)}}"/>
+<div style="text-align:center;margin:30px 0;">
+  <img src="{{pathto('_static/kallithea-logo.svg',1)}}" width="200px"/>
 </div>
 <h3>Support Kallithea development</h3>
 <div style="text-align:center">
 <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
 <input type="hidden" name="cmd" value="_s-xclick">
 <input type="hidden" name="hosted_button_id" value="EYXFS3SQPHYUL">
-<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
+<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal &ndash; The safer, easier way to pay online!">
 <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
 </form>
     <div style="padding:5px">
--- a/docs/theme/nature/static/nature.css_t	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/theme/nature/static/nature.css_t	Sun Sep 06 23:36:05 2015 +0200
@@ -122,6 +122,10 @@
 div.sphinxsidebar input[type=text]{
     margin-left: 20px;
 }
+
+div.sphinxsidebar input[type=image] {
+    border: 0;
+}
  
 /* -- body styles ----------------------------------------------------------- */
  
@@ -216,8 +220,7 @@
     border: 1px solid #C6C9CB;
     font-size: 1.2em;
     margin: 1.5em 0 1.5em 0;
-    -webkit-box-shadow: 1px 1px 1px #d8d8d8;
-    -moz-box-shadow: 1px 1px 1px #d8d8d8;
+    box-shadow: 1px 1px 1px #d8d8d8;
 }
  
 tt {
--- a/docs/usage/backup.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/backup.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -10,6 +10,7 @@
 
 Just copy your .ini file, it contains all Kallithea settings.
 
+
 Whoosh index
 ------------
 
--- a/docs/usage/debugging.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/debugging.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -9,6 +9,7 @@
 
 .. note:: First make sure you're using the latest version available.
 
+
 Enable detailed debug
 ---------------------
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/usage/email.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,79 @@
+.. _email:
+
+==============
+Email settings
+==============
+
+The Kallithea configuration file has several email related settings. When
+these contain correct values, Kallithea will send email in the situations
+described below. If the email configuration is not correct so that emails
+cannot be sent, all mails will show up in the log output.
+
+Before any email can be sent, an SMTP server has to be configured using the
+configuration file setting ``smtp_server``. If required for that server, specify
+a username (``smtp_username``) and password (``smtp_password``), a non-standard
+port (``smtp_port``), encryption settings (``smtp_use_tls`` or ``smtp_use_ssl``)
+and/or specific authentication parameters (``smtp_auth``).
+
+
+Application emails
+------------------
+
+Kallithea sends an email to `users` on several occasions:
+
+- when comments are given on one of their changesets
+- when comments are given on changesets they are reviewer on or on which they
+  commented regardless
+- when they are invited as reviewer in pull requests
+- when they request a password reset
+
+Kallithea sends an email to all `administrators` upon new account registration.
+Administrators are users with the ``Admin`` flag set on the *Admin > Users*
+page.
+
+When Kallithea wants to send an email but due to an error cannot correctly
+determine the intended recipients, the administrators and the addresses
+specified in ``email_to`` in the configuration file are used as fallback.
+
+Recipients will see these emails originating from the sender specified in the
+``app_email_from`` setting in the configuration file. This setting can either
+contain only an email address, like `kallithea-noreply@example.com`, or both
+a name and an address in the following format: `Kallithea
+<kallithea-noreply@example.com>`. However, if the email is sent due to an
+action of a particular user, for example when a comment is given or a pull
+request created, the name of that user will be combined with the email address
+specified in ``app_email_from`` to form the sender (and any name part in that
+configuration setting disregarded).
+
+The subject of these emails can optionally be prefixed with the value of
+``email_prefix`` in the configuration file.
+
+
+Error emails
+------------
+
+When an exception occurs in Kallithea -- and unless interactive debugging is
+enabled using ``set debug = true`` in the ``[app:main]`` section of the
+configuration file -- an email with exception details is sent by WebError_'s
+``ErrorMiddleware`` to the addresses specified in ``email_to`` in the
+configuration file.
+
+Recipients will see these emails originating from the sender specified in the
+``error_email_from`` setting in the configuration file. This setting can either
+contain only an email address, like `kallithea-noreply@example.com`, or both
+a name and an address in the following format: `Kallithea Errors
+<kallithea-noreply@example.com>`.
+
+*Note:* The WebError_ package does not respect ``smtp_port`` and assumes the
+standard SMTP port (25). If you have a remote SMTP server with a different port,
+you could set up a local forwarding SMTP server on port 25.
+
+
+References
+----------
+
+- `Error Middleware (Pylons documentation) <http://pylons-webframework.readthedocs.org/en/latest/debugging.html#error-middleware>`_
+- `ErrorHandler (Pylons modules documentation) <http://pylons-webframework.readthedocs.org/en/latest/modules/middleware.html#pylons.middleware.ErrorHandler>`_
+
+
+.. _WebError: https://pypi.python.org/pypi/WebError
--- a/docs/usage/general.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/general.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -5,7 +5,7 @@
 =======================
 
 
-Repository deleting
+Repository deletion
 -------------------
 
 Currently when an admin or owner deletes a repository, Kallithea does
@@ -13,7 +13,7 @@
 renames it in a special way so that it is not possible to push, clone
 or access the repository.
 
-There is a special command for cleaning up such archived repos::
+There is a special command for cleaning up such archived repositories::
 
     paster cleanup-repos --older-than=30d my.ini
 
@@ -27,6 +27,7 @@
 Kallithea and deletes a repository, you can easily restore such an action by
 renaming the repository directory, removing the ``rm__<date>`` prefix.
 
+
 File view: follow current branch
 --------------------------------
 
@@ -70,17 +71,18 @@
   (and its ancestors) by selecting it and clicking the ``Open new pull request
   for selected changesets`` button.
 
+
 Permanent repository URLs
 -------------------------
 
 Due to the complicated nature of repository grouping, URLs of repositories
 can often change. For example, a repository originally accessible from::
 
-  http://server.com/repo_name
+  http://example.com/repo_name
 
 would get a new URL after moving it to test_group::
 
-  http://server.com/test_group/repo_name
+  http://example.com/test_group/repo_name
 
 Such moving of a repository to a group can be an issue for build systems and
 other scripts where the repository paths are hardcoded. To mitigate this,
@@ -92,19 +94,20 @@
 
 In the example, the repository could also be accessible as::
 
-  http://server.com/_<ID>
+  http://example.com/_<ID>
 
 The ID of a given repository can be shown from the repository ``Summary`` page,
 by selecting the ``Show by ID`` button next to ``Clone URL``.
 
-E-mail notifications
---------------------
 
-When the administrator correctly specified the e-mail settings in the Kallithea
-configuration file, Kallithea will send e-mails on user registration and when
+Email notifications
+-------------------
+
+With email settings properly configured in the Kallithea
+configuration file, Kallithea will send emails on user registration and when
 errors occur.
 
-Mails are also sent for comments on changesets. In this case, an e-mail is sent
+Emails are also sent for comments on changesets. In this case, an email is sent
 to the committer of the changeset (if known to Kallithea), to all reviewers of
 the pull request (if applicable) and to all people mentioned in the comment
 using @mention notation.
@@ -129,7 +132,6 @@
 - svn -> hg clone
 - git -> git clone
 
-
 .. note:: svn -> hg cloning requires the ``hgsubversion`` library to be
    installed.
 
@@ -151,22 +153,23 @@
 Repository extra fields
 ~~~~~~~~~~~~~~~~~~~~~~~
 
-In the `Visual` tab, there is an option `Use repository extra
-fields`, which allows to set custom fields for each repository in the system.
-Each new field consists of 3 attributes: ``field key``, ``field label``,
-``field description``.
+In the *Visual* tab, there is an option "Use repository extra
+fields", which allows to set custom fields for each repository in the system.
+
+Once enabled site-wide, the custom fields can be edited per-repository under
+*Options* | *Settings* | *Extra Fields*.
 
 Example usage of such fields would be to define company-specific information
 into repositories, e.g., defining a ``repo_manager`` key that would give info
 about a manager of each repository.  There's no limit for adding custom fields.
 Newly created fields are accessible via the API.
 
-Meta-Tagging
+Meta tagging
 ~~~~~~~~~~~~
 
-In the `Visual` tab, option `Stylify recognised meta tags` will cause Kallithea
-to turn certain meta-tags, detected in repository and repository group
-descriptions, into colored tags. Currently recognised tags are::
+In the *Visual* tab, option "Stylify recognised meta tags" will cause Kallithea
+to turn certain text fragments in repository and repository group
+descriptions into colored tags. Currently recognised tags are::
 
     [featured]
     [stale]
--- a/docs/usage/locking.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/locking.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -4,24 +4,24 @@
 Repository locking
 ==================
 
-Kallithea has a ``repository locking`` feature, disabled by default. When
+Kallithea has a *repository locking* feature, disabled by default. When
 enabled, every initial clone and every pull gives users (with write permission)
 the exclusive right to do a push.
 
-When repository locking is enabled, repositories get a ``locked`` state that
-can be true or false.  The hg/git commands ``hg/git clone``, ``hg/git pull``,
+When repository locking is enabled, repositories get a ``locked`` flag.
+The hg/git commands ``hg/git clone``, ``hg/git pull``,
 and ``hg/git push`` influence this state:
 
-- A ``clone`` or ``pull`` action on the repository locks it (``locked=true``)
+- A ``clone`` or ``pull`` action locks the target repository
   if the user has write/admin permissions on this repository.
 
 - Kallithea will remember the user who locked the repository so only this
-  specific user can unlock the repo (``locked=false``) by performing a ``push``
+  specific user can unlock the repo by performing a ``push``
   command.
 
 - Every other command on a locked repository from this user and every command
   from any other user will result in an HTTP return code 423 (Locked).
-  Additionally, the HTTP error includes the <user> that locked the repository
+  Additionally, the HTTP error will mention the user that locked the repository
   (e.g., “repository <repo> locked by user <user>”).
 
 Each repository can be manually unlocked by an administrator from the
--- a/docs/usage/performance.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/performance.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -1,7 +1,7 @@
 .. _performance:
 
 ================================
-Optimizing Kallithea Performance
+Optimizing Kallithea performance
 ================================
 
 When serving a large amount of big repositories, Kallithea can start
@@ -9,42 +9,32 @@
 amounts of data from version control systems, here are some tips on how to get
 the best performance.
 
-* Kallithea will perform better on machines with faster disks (SSD/SAN). It's
-  more important to have a faster disk than a faster CPU.
+* Kallithea is often I/O bound, and hence a fast disk (SSD/SAN) is
+  usually more important than a fast CPU.
 
-* Slowness on initial page can be easily fixed by grouping repositories, and/or
+* Sluggish loading of the front page can easily be fixed by grouping repositories or by
   increasing cache size (see below). This includes using the lightweight dashboard
-  option and ``vcs_full_cache`` setting in .ini file
-
+  option and ``vcs_full_cache`` setting in .ini file.
 
 Follow these few steps to improve performance of Kallithea system.
 
-
 1. Increase cache
 
-    In the .ini file::
+    Tweak beaker cache settings in the ini file. The actual effect of that
+    is questionable.
 
-     beaker.cache.sql_cache_long.expire=3600 <-- set this to higher number
+2. Switch from SQLite to PostgreSQL or MySQL
 
-    This option affects the cache expiration time for the main
-    page. Having several hundreds of repositories on main page can
-    sometimes make the system behave slowly when the cache expires for
-    all of them. Increasing the ``expire`` option to a day (86400) or a
-    week (604800) will improve general response times for the main
-    page. Kallithea has an intelligent cache expiration system and it
-    will expire the cache for repositories that have been changed.
-
-2. Switch from sqlite to postgres or mysql
-
-    sqlite is a good option when having a small load on the system. But due to
-    locking issues with sqlite, it is not recommended to use it for larger
-    deployments. Switching to mysql or postgres will result in an immediate
-    performance increase.
+    SQLite is a good option when having a small load on the system. But due to
+    locking issues with SQLite, it is not recommended to use it for larger
+    deployments. Switching to MySQL or PostgreSQL will result in an immediate
+    performance increase. A tool like SQLAlchemyGrate_ can be used for
+    migrating to another database platform.
 
 3. Scale Kallithea horizontally
 
-    Scaling horizontally can give huge performance increases when dealing with
-    large traffic (large amount of users, CI servers etc). Kallithea can be
+    Scaling horizontally can give huge performance benefits when dealing with
+    large amounts of traffic (many users, CI servers, etc.). Kallithea can be
     scaled horizontally on one (recommended) or multiple machines. In order
     to scale horizontally you need to do the following:
 
@@ -61,3 +51,6 @@
     - Load balance using round robin or IP hash, recommended is writing LB rules
       that will separate regular user traffic from automated processes like CI
       servers or build bots.
+
+
+.. _SQLAlchemyGrate: https://github.com/shazow/sqlalchemygrate
--- a/docs/usage/statistics.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/statistics.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -4,7 +4,7 @@
 Repository statistics
 =====================
 
-Kallithea has a ``repository statistics`` feature, disabled by default. When
+Kallithea has a *repository statistics* feature, disabled by default. When
 enabled, the amount of commits per committer is visualized in a timeline. This
 feature can be enabled using the ``Enable statistics`` checkbox on the
 repository ``Settings`` page.
--- a/docs/usage/troubleshooting.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/troubleshooting.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -1,6 +1,5 @@
 .. _troubleshooting:
 
-
 ===============
 Troubleshooting
 ===============
--- a/docs/usage/vcs_support.rst	Mon Jul 20 15:07:23 2015 +0200
+++ b/docs/usage/vcs_support.rst	Sun Sep 06 23:36:05 2015 +0200
@@ -17,18 +17,21 @@
        #'git': 'Git repository',
    }
 
+
 Git support
 -----------
 
+
 Web server with chunked encoding
 ````````````````````````````````
+
 Large Git pushes require an HTTP server with support for
 chunked encoding for POST. The Python web servers waitress_ and
 gunicorn_ (Linux only) can be used. By default, Kallithea uses
 waitress_ for `paster serve` instead of the built-in `paste` WSGI
 server.
 
-The default paste server is controlled in the .ini file::
+The paster server is controlled in the .ini file::
 
     use = egg:waitress#main
 
@@ -36,7 +39,6 @@
 
     use = egg:gunicorn#main
 
-
 Also make sure to comment out the following options::
 
     threadpool_workers =
@@ -47,8 +49,10 @@
 Mercurial support
 -----------------
 
+
 Working with Mercurial subrepositories
 ``````````````````````````````````````
+
 This section explains how to use Mercurial subrepositories_ in Kallithea.
 
 Example usage::
@@ -77,6 +81,7 @@
 Next we can edit the subrepository data, and push back to Kallithea. This will
 update both repositories.
 
+
 .. _waitress: http://pypi.python.org/pypi/waitress
 .. _gunicorn: http://pypi.python.org/pypi/gunicorn
 .. _subrepositories: http://mercurial.aragost.com/kick-start/en/subrepositories/
--- a/kallithea/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.__init__
-~~~~~~~~~~~~~~~~~~
+kallithea
+~~~~~~~~~
 
 Kallithea, a web based repository management based on pylons
 versioning implementation: http://www.python.org/dev/peps/pep-0386/
@@ -71,7 +71,7 @@
     from kallithea.lib import get_current_revision
     _rev = get_current_revision(quiet=True)
     if _rev and len(VERSION) > 3:
-        VERSION += ('%s' % _rev[0],)
+        VERSION += (_rev[0],)
 except ImportError:
     pass
 
--- a/kallithea/bin/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.bin.__init__
-~~~~~~~~~~~~~~~~~~~~~~
+kallithea.bin
+~~~~~~~~~~~~~
 
 Binary scripts for Kallithea
 
--- a/kallithea/bin/base.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/base.py	Sun Sep 06 23:36:05 2015 +0200
@@ -146,7 +146,7 @@
         try:
             with open(self._conf_name, 'rb') as conf:
                 config = json.load(conf)
-        except IOError, e:
+        except IOError as e:
             sys.stderr.write(str(e) + '\n')
 
         config.update(new_config)
@@ -159,6 +159,6 @@
         try:
             with open(self._conf_name, 'rb') as conf:
                 return  json.load(conf)
-        except IOError, e:
+        except IOError as e:
             #sys.stderr.write(str(e) + '\n')
             pass
--- a/kallithea/bin/kallithea_api.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/kallithea_api.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.bin.api
-~~~~~~~~~~~~~~~~~
+kallithea.bin.kallithea_api
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Api CLI client for Kallithea
 
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 import sys
 import argparse
 
--- a/kallithea/bin/kallithea_backup.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/kallithea_backup.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.bin.backup_manager
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.bin.kallithea_backup
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Repositories backup manager, it allows to backups all
 repositories and send it to backup server using RSA key via ssh.
--- a/kallithea/bin/kallithea_config.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/kallithea_config.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 
 # -*- coding: utf-8 -*-
 # This program is free software: you can redistribute it and/or modify
@@ -28,7 +28,6 @@
 """
 
 
-from __future__ import with_statement
 import os
 import sys
 import uuid
@@ -132,13 +131,13 @@
             tmpl_file = args.template
 
         with open(tmpl_file, 'rb') as f:
-            tmpl_data = f.read()
+            tmpl_data = f.read().decode('utf-8')
             if args.raw:
                 tmpl = tmpl_data
             else:
                 tmpl = Template(tmpl_data).render(**tmpl_stored_args)
         with open(args.filename, 'wb') as f:
-            f.write(tmpl)
+            f.write(tmpl.encode('utf-8'))
         print 'Wrote new config file in %s' % (os.path.abspath(args.filename))
 
     except Exception:
--- a/kallithea/bin/kallithea_gist.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/kallithea_gist.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 import os
 import sys
 import stat
@@ -164,7 +163,7 @@
 
     try:
         return _run(argv)
-    except Exception, e:
+    except Exception as e:
         print e
         return 1
 
--- a/kallithea/bin/ldap_sync.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/ldap_sync.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.bin.__init__
-~~~~~~~~~~~~~~~~~~~~~~
+kallithea.bin.ldap_sync
+~~~~~~~~~~~~~~~~~~~~~~~
 
 LDAP sync script
 
@@ -198,8 +198,8 @@
                                       config.get("default", "ldap_user"),
                                       config.get("default", "ldap_key"),
                                       config.get("default", "base_dn"))
-        self.rhodocode_api = API(config.get("default", "api_url"),
-                                          config.get("default", "api_key"))
+        self.kallithea_api = API(config.get("default", "api_url"),
+                                 config.get("default", "api_key"))
 
     def update_groups_from_ldap(self):
         """Add all the groups from LDAP to Kallithea."""
@@ -225,7 +225,7 @@
         for member in members:
             if member not in group_users:
                 try:
-                    self.rhodocode_api.remove_membership(group,
+                    self.kallithea_api.remove_membership(group,
                                                          member)
                 except UserNotInGroupError:
                     pass
--- a/kallithea/bin/rebranddb.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/rebranddb.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 
 # 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
@@ -57,7 +57,7 @@
             t = metadata.tables[old_ui_name]
             print 'Renaming', t, 'to', new_ui_name
             migrate.changeset.rename_table(t, new_ui_name)
-        except KeyError, e:
+        except KeyError as e:
             print 'Not renaming ui:', e
 
     if new_settings_name == old_settings_name:
@@ -67,7 +67,7 @@
             t = metadata.tables[old_settings_name]
             print 'Renaming', t, 'to', new_settings_name
             migrate.changeset.rename_table(t, new_settings_name)
-        except KeyError, e:
+        except KeyError as e:
             print 'Not renaming settings:', e
 
     old_auth_name = 'internal' if old == 'kallithea' else old
--- a/kallithea/bin/template.ini.mako	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/bin/template.ini.mako	Sun Sep 06 23:36:05 2015 +0200
@@ -1,32 +1,64 @@
 ## -*- coding: utf-8 -*-
-<%text>################################################################################
-################################################################################
+<%text>################################################################################</%text>
+<%text>################################################################################</%text>
 # Kallithea - config file generated with kallithea-config                      #
-################################################################################
-################################################################################
-</%text>
+<%text>################################################################################</%text>
+<%text>################################################################################</%text>
+
 [DEFAULT]
 debug = true
 pdebug = false
-<%text>
-################################################################################
-## Uncomment and replace with the address which should receive                ##
-## any error reports after application crash                                  ##
-## Additionally those settings will be used by Kallithea mailing system       ##
-################################################################################</%text>
-#email_to = admin@localhost
-#error_email_from = paste_error@localhost
-#app_email_from = kallithea-noreply@localhost
-#error_message =
+
+<%text>################################################################################</%text>
+<%text>## Email settings                                                             ##</%text>
+<%text>##                                                                            ##</%text>
+<%text>## Refer to the documentation ("Email settings") for more details.            ##</%text>
+<%text>##                                                                            ##</%text>
+<%text>## It is recommended to use a valid sender address that passes access         ##</%text>
+<%text>## validation and spam filtering in mail servers.                             ##</%text>
+<%text>################################################################################</%text>
+
+<%text>## 'From' header for application emails. You can optionally add a name.</%text>
+<%text>## Default:</%text>
+#app_email_from = Kallithea
+<%text>## Examples:</%text>
+#app_email_from = Kallithea <kallithea-noreply@example.com>
+#app_email_from = kallithea-noreply@example.com
+
+<%text>## Subject prefix for application emails.</%text>
+<%text>## A space between this prefix and the real subject is automatically added.</%text>
+<%text>## Default:</%text>
+#email_prefix =
+<%text>## Example:</%text>
 #email_prefix = [Kallithea]
 
+<%text>## Recipients for error emails and fallback recipients of application mails.</%text>
+<%text>## Multiple addresses can be specified, space-separated.</%text>
+<%text>## Only addresses are allowed, do not add any name part.</%text>
+<%text>## Default:</%text>
+#email_to =
+<%text>## Examples:</%text>
+#email_to = admin@example.com
+#email_to = admin@example.com another_admin@example.com
+
+<%text>## 'From' header for error emails. You can optionally add a name.</%text>
+<%text>## Default:</%text>
+#error_email_from = pylons@yourapp.com
+<%text>## Examples:</%text>
+#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
+#error_email_from = paste_error@example.com
+
+<%text>## SMTP server settings</%text>
+<%text>## Only smtp_server is mandatory. All other settings take the specified default</%text>
+<%text>## values.</%text>
 #smtp_server = mail.server.com
 #smtp_username =
 #smtp_password =
-#smtp_port =
+#smtp_port = 25
 #smtp_use_tls = false
-#smtp_use_ssl = true
-<%text>## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)</%text>
+#smtp_use_ssl = false
+<%text>## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).</%text>
+<%text>## If empty, use any of the authentication parameters supported by the server.</%text>
 #smtp_auth =
 
 [server:main]
@@ -39,8 +71,8 @@
 threadpool_max_requests = 10
 <%text>## option to use threads of process</%text>
 use_threadpool = true
-%endif
-%if http_server == 'waitress':
+
+%elif http_server == 'waitress':
 <%text>## WAITRESS ##</%text>
 use = egg:waitress#main
 <%text>## number of worker threads</%text>
@@ -50,8 +82,8 @@
 <%text>## use poll instead of select, fixes fd limits, may not work on old</%text>
 <%text>## windows systems.</%text>
 #asyncore_use_poll = True
-%endif
-%if http_server == 'gunicorn':
+
+%elif http_server == 'gunicorn':
 <%text>## GUNICORN ##</%text>
 use = egg:gunicorn#main
 <%text>## number of process workers. You must set `instance_id = *` when this option</%text>
@@ -66,8 +98,8 @@
 <%text>## ammount of time a worker can handle request before it gets killed and</%text>
 <%text>## restarted</%text>
 timeout = 3600
-%endif
-%if http_server == 'uwsgi':
+
+%elif http_server == 'uwsgi':
 <%text>## UWSGI ##</%text>
 <%text>## run with uwsgi --ini-paste-logged <inifile.ini></%text>
 [uwsgi]
@@ -97,11 +129,11 @@
 max-requests = 1000
 
 <%text>## enable large buffers</%text>
-buffer-size=65535
+buffer-size = 65535
 
 <%text>## socket and http timeouts ##</%text>
-http-timeout=3600
-socket-timeout=3600
+http-timeout = 3600
+socket-timeout = 3600
 
 <%text>## Log requests slower than the specified number of milliseconds.</%text>
 log-slow = 10
@@ -127,12 +159,13 @@
 
 <%text>## how many workers should be spawned at a time</%text>
 cheaper-step = 1
+
 %endif
 <%text>## COMMON ##</%text>
 host = ${host}
 port = ${port}
 
-<%text>## prefix middleware for rc</%text>
+<%text>## middleware for hosting the WSGI application under a URL prefix</%text>
 #[filter:proxy-prefix]
 #use = egg:PasteDeploy#prefix
 #prefix = /<your-prefix>
@@ -245,7 +278,6 @@
 #issue_server_link_wiki = https://mywiki.com/{id}
 #issue_prefix_wiki = WIKI-
 
-
 <%text>## instance-id prefix</%text>
 <%text>## a prefix key for this instance used for cache invalidation when running</%text>
 <%text>## multiple instances of kallithea, make sure it's globally unique for</%text>
@@ -267,11 +299,10 @@
 <%text>## allows to setup custom hooks in settings page</%text>
 allow_custom_hooks_settings = True
 
-<%text>
-####################################
-###        CELERY CONFIG        ####
-####################################
-</%text>
+<%text>####################################</%text>
+<%text>###        CELERY CONFIG        ####</%text>
+<%text>####################################</%text>
+
 use_celery = false
 broker.host = localhost
 broker.vhost = rabbitmqhost
@@ -295,99 +326,73 @@
 
 <%text>## tasks will never be sent to the queue, but executed locally instead.</%text>
 celery.always.eager = false
-<%text>
-####################################
-###         BEAKER CACHE        ####
-####################################
-</%text>
-beaker.cache.data_dir=${here}/data/cache/data
-beaker.cache.lock_dir=${here}/data/cache/lock
+
+<%text>####################################</%text>
+<%text>###         BEAKER CACHE        ####</%text>
+<%text>####################################</%text>
 
-beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
+beaker.cache.data_dir = ${here}/data/cache/data
+beaker.cache.lock_dir = ${here}/data/cache/lock
 
-beaker.cache.super_short_term.type=memory
-beaker.cache.super_short_term.expire=10
-beaker.cache.super_short_term.key_length = 256
+beaker.cache.regions = short_term,long_term,sql_cache_short
 
-beaker.cache.short_term.type=memory
-beaker.cache.short_term.expire=60
+beaker.cache.short_term.type = memory
+beaker.cache.short_term.expire = 60
 beaker.cache.short_term.key_length = 256
 
-beaker.cache.long_term.type=memory
-beaker.cache.long_term.expire=36000
+beaker.cache.long_term.type = memory
+beaker.cache.long_term.expire = 36000
 beaker.cache.long_term.key_length = 256
 
-beaker.cache.sql_cache_short.type=memory
-beaker.cache.sql_cache_short.expire=10
+beaker.cache.sql_cache_short.type = memory
+beaker.cache.sql_cache_short.expire = 10
 beaker.cache.sql_cache_short.key_length = 256
 
-beaker.cache.sql_cache_med.type=memory
-beaker.cache.sql_cache_med.expire=360
-beaker.cache.sql_cache_med.key_length = 256
+<%text>####################################</%text>
+<%text>###       BEAKER SESSION        ####</%text>
+<%text>####################################</%text>
+
+<%text>## Name of session cookie. Should be unique for a given host and path, even when running</%text>
+<%text>## on different ports. Otherwise, cookie sessions will be shared and messed up.</%text>
+beaker.session.key = kallithea
+<%text>## Sessions should always only be accessible by the browser, not directly by JavaScript.</%text>
+beaker.session.httponly = true
+<%text>## Session lifetime. 2592000 seconds is 30 days.</%text>
+beaker.session.timeout = 2592000
 
-beaker.cache.sql_cache_long.type=file
-beaker.cache.sql_cache_long.expire=3600
-beaker.cache.sql_cache_long.key_length = 256
-<%text>
-####################################
-###       BEAKER SESSION        ####
-####################################
-## Type of storage used for the session, current types are
-## dbm, file, memcached, database, and memory.
-## The storage uses the Container API
-## that is also used by the cache system.
-</%text>
-<%text>## db session ##</%text>
+<%text>## Server secret used with HMAC to ensure integrity of cookies.</%text>
+beaker.session.secret = ${uuid()}
+<%text>## Further, encrypt the data with AES.</%text>
+#beaker.session.encrypt_key = <key_for_encryption>
+#beaker.session.validate_key = <validation_key>
+
+<%text>## Type of storage used for the session, current types are</%text>
+<%text>## dbm, file, memcached, database, and memory.</%text>
+
+<%text>## File system storage of session data. (default)</%text>
+#beaker.session.type = file
+
+<%text>## Cookie only, store all session data inside the cookie. Requires secure secrets.</%text>
+#beaker.session.type = cookie
+
+<%text>## Database storage of session data.</%text>
 #beaker.session.type = ext:database
 #beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
 #beaker.session.table_name = db_session
 
-<%text>## encrypted cookie client side session, good for many instances ##</%text>
-#beaker.session.type = cookie
-
-<%text>## file based cookies (default) ##</%text>
-#beaker.session.type = file
-
-<%text>
-## beaker.session.key should be unique for a given host, even when running
-## on different ports. Otherwise, cookie sessions will be shared and messed up.
-</%text>
-beaker.session.key = kallithea
-beaker.session.secret = ${uuid()}
-
-<%text>## Secure encrypted cookie. Requires AES and AES python libraries</%text>
-<%text>## you must disable beaker.session.secret to use this</%text>
-#beaker.session.encrypt_key = <key_for_encryption>
-#beaker.session.validate_key = <validation_key>
-
-<%text>## sets session as invalid if it haven't been accessed for given amount of time</%text>
-beaker.session.timeout = 2592000
-beaker.session.httponly = true
-#beaker.session.cookie_path = /<your-prefix>
+%if error_aggregation_service == 'errormator':
+<%text>############################</%text>
+<%text>## ERROR HANDLING SYSTEMS ##</%text>
+<%text>############################</%text>
 
-<%text>## uncomment for https secure cookie</%text>
-beaker.session.secure = false
-
-<%text>## auto save the session to not to use .save()</%text>
-beaker.session.auto = False
-
-<%text>## default cookie expiration time in seconds `true` expire at browser close ##</%text>
-#beaker.session.cookie_expires = 3600
+<%text>####################</%text>
+<%text>### [errormator] ###</%text>
+<%text>####################</%text>
 
-%if error_aggregation_service == 'errormator':
-<%text>
-############################
-## ERROR HANDLING SYSTEMS ##
-############################
+<%text>## Errormator is tailored to work with Kallithea, see</%text>
+<%text>## http://errormator.com for details how to obtain an account</%text>
+<%text>## you must install python package `errormator_client` to make it work</%text>
 
-####################
-### [errormator] ###
-####################
-
-## Errormator is tailored to work with Kallithea, see
-## http://errormator.com for details how to obtain an account
-## you must install python package `errormator_client` to make it work
-</%text>
 <%text>## errormator enabled</%text>
 errormator = false
 
@@ -407,10 +412,10 @@
 errormator.slow_requests = true
 
 <%text>## enable hooking to application loggers</%text>
-# errormator.logging = true
+#errormator.logging = true
 
 <%text>## minimum log level for log capture</%text>
-# errormator.logging.level = WARNING
+#errormator.logging.level = WARNING
 
 <%text>## send logs only from erroneous/slow requests</%text>
 <%text>## (saves API quota for intensive logging)</%text>
@@ -423,7 +428,6 @@
 <%text>## start with HTTP* this list be extended with additional keywords here</%text>
 errormator.environ_keys_whitelist =
 
-
 <%text>## list of keywords that should be blanked from request object</%text>
 <%text>## can be string with comma separated list of words in lowercase</%text>
 <%text>## (by default client will always blank keys that contain following words</%text>
@@ -431,20 +435,19 @@
 <%text>## this list be extended with additional keywords set here</%text>
 errormator.request_keys_blacklist =
 
-
 <%text>## list of namespaces that should be ignores when gathering log entries</%text>
 <%text>## can be string with comma separated list of namespaces</%text>
 <%text>## (by default the client ignores own entries: errormator_client.client)</%text>
 errormator.log_namespace_blacklist =
+
 %elif error_aggregation_service == 'sentry':
-<%text>
-################
-### [sentry] ###
-################
+<%text>################</%text>
+<%text>### [sentry] ###</%text>
+<%text>################</%text>
 
-## sentry is a alternative open source error aggregator
-## you must install python packages `sentry` and `raven` to enable
-</%text>
+<%text>## sentry is a alternative open source error aggregator</%text>
+<%text>## you must install python packages `sentry` and `raven` to enable</%text>
+
 sentry.dsn = YOUR_DNS
 sentry.servers =
 sentry.name =
@@ -455,47 +458,50 @@
 sentry.site =
 sentry.include_paths =
 sentry.exclude_paths =
+
 %endif
-<%text>
-################################################################################
-## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
-## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
-## execute malicious code after an exception is raised.                       ##
-################################################################################</%text>
+<%text>################################################################################</%text>
+<%text>## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##</%text>
+<%text>## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##</%text>
+<%text>## execute malicious code after an exception is raised.                       ##</%text>
+<%text>################################################################################</%text>
 set debug = false
-<%text>
-##################################
-###       LOGVIEW CONFIG       ###
-##################################
-</%text>
+
+<%text>##################################</%text>
+<%text>###       LOGVIEW CONFIG       ###</%text>
+<%text>##################################</%text>
+
 logview.sqlalchemy = #faa
 logview.pylons.templating = #bfb
 logview.pylons.util = #eee
-<%text>
-#########################################################
-### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
-#########################################################
-</%text>
+
+<%text>#########################################################</%text>
+<%text>### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###</%text>
+<%text>#########################################################</%text>
+
 %if database_engine == 'sqlite':
 # SQLITE [default]
 sqlalchemy.db1.url = sqlite:///${here}/kallithea.db?timeout=60
+
 %elif database_engine == 'postgres':
 # POSTGRESQL
 sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
+
 %elif database_engine == 'mysql':
 # MySQL
 sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
+
 %endif
 # see sqlalchemy docs for others
 
 sqlalchemy.db1.echo = false
 sqlalchemy.db1.pool_recycle = 3600
 sqlalchemy.db1.convert_unicode = true
-<%text>
-################################
-### LOGGING CONFIGURATION   ####
-################################
-</%text>
+
+<%text>################################</%text>
+<%text>### LOGGING CONFIGURATION   ####</%text>
+<%text>################################</%text>
+
 [loggers]
 keys = root, routes, kallithea, sqlalchemy, beaker, templates, whoosh_indexer
 
@@ -504,11 +510,11 @@
 
 [formatters]
 keys = generic, color_formatter, color_formatter_sql
-<%text>
-#############
-## LOGGERS ##
-#############
-</%text>
+
+<%text>#############</%text>
+<%text>## LOGGERS ##</%text>
+<%text>#############</%text>
+
 [logger_root]
 level = NOTSET
 handlers = console
@@ -549,11 +555,11 @@
 handlers =
 qualname = whoosh_indexer
 propagate = 1
-<%text>
-##############
-## HANDLERS ##
-##############
-</%text>
+
+<%text>##############</%text>
+<%text>## HANDLERS ##</%text>
+<%text>##############</%text>
+
 [handler_console]
 class = StreamHandler
 args = (sys.stderr,)
@@ -565,21 +571,21 @@
 args = (sys.stderr,)
 level = WARN
 formatter = generic
-<%text>
-################
-## FORMATTERS ##
-################
-</%text>
+
+<%text>################</%text>
+<%text>## FORMATTERS ##</%text>
+<%text>################</%text>
+
 [formatter_generic]
 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %Y-%m-%d %H:%M:%S
 
 [formatter_color_formatter]
-class=kallithea.lib.colored_formatter.ColorFormatter
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+class = kallithea.lib.colored_formatter.ColorFormatter
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %Y-%m-%d %H:%M:%S
 
 [formatter_color_formatter_sql]
-class=kallithea.lib.colored_formatter.ColorFormatterSql
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+class = kallithea.lib.colored_formatter.ColorFormatterSql
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %Y-%m-%d %H:%M:%S
--- a/kallithea/config/deployment.ini_tmpl	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/config/deployment.ini_tmpl	Sun Sep 06 23:36:05 2015 +0200
@@ -11,23 +11,55 @@
 pdebug = false
 
 ################################################################################
-## Uncomment and replace with the address which should receive                ##
-## any error reports after application crash                                  ##
-## Additionally those settings will be used by Kallithea mailing system       ##
+## Email settings                                                             ##
+##                                                                            ##
+## Refer to the documentation ("Email settings") for more details.            ##
+##                                                                            ##
+## It is recommended to use a valid sender address that passes access         ##
+## validation and spam filtering in mail servers.                             ##
 ################################################################################
-#email_to = admin@localhost
-#error_email_from = paste_error@localhost
-#app_email_from = kallithea-noreply@localhost
-#error_message =
+
+## 'From' header for application emails. You can optionally add a name.
+## Default:
+#app_email_from = Kallithea
+## Examples:
+#app_email_from = Kallithea <kallithea-noreply@example.com>
+#app_email_from = kallithea-noreply@example.com
+
+## Subject prefix for application emails.
+## A space between this prefix and the real subject is automatically added.
+## Default:
+#email_prefix =
+## Example:
 #email_prefix = [Kallithea]
 
+## Recipients for error emails and fallback recipients of application mails.
+## Multiple addresses can be specified, space-separated.
+## Only addresses are allowed, do not add any name part.
+## Default:
+#email_to =
+## Examples:
+#email_to = admin@example.com
+#email_to = admin@example.com another_admin@example.com
+
+## 'From' header for error emails. You can optionally add a name.
+## Default:
+#error_email_from = pylons@yourapp.com
+## Examples:
+#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
+#error_email_from = paste_error@example.com
+
+## SMTP server settings
+## Only smtp_server is mandatory. All other settings take the specified default
+## values.
 #smtp_server = mail.server.com
 #smtp_username =
 #smtp_password =
-#smtp_port =
+#smtp_port = 25
 #smtp_use_tls = false
-#smtp_use_ssl = true
-## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
+#smtp_use_ssl = false
+## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).
+## If empty, use any of the authentication parameters supported by the server.
 #smtp_auth =
 
 [server:main]
@@ -94,11 +126,11 @@
 #max-requests = 1000
 
 ## enable large buffers
-#buffer-size=65535
+#buffer-size = 65535
 
 ## socket and http timeouts ##
-#http-timeout=3600
-#socket-timeout=3600
+#http-timeout = 3600
+#socket-timeout = 3600
 
 ## Log requests slower than the specified number of milliseconds.
 #log-slow = 10
@@ -129,7 +161,7 @@
 host = 127.0.0.1
 port = 5000
 
-## prefix middleware for rc
+## middleware for hosting the WSGI application under a URL prefix
 #[filter:proxy-prefix]
 #use = egg:PasteDeploy#prefix
 #prefix = /<your-prefix>
@@ -242,7 +274,6 @@
 #issue_server_link_wiki = https://mywiki.com/{id}
 #issue_prefix_wiki = WIKI-
 
-
 ## instance-id prefix
 ## a prefix key for this instance used for cache invalidation when running
 ## multiple instances of kallithea, make sure it's globally unique for
@@ -264,7 +295,6 @@
 ## allows to setup custom hooks in settings page
 allow_custom_hooks_settings = True
 
-
 ####################################
 ###        CELERY CONFIG        ####
 ####################################
@@ -297,79 +327,55 @@
 ###         BEAKER CACHE        ####
 ####################################
 
-beaker.cache.data_dir=%(here)s/data/cache/data
-beaker.cache.lock_dir=%(here)s/data/cache/lock
-
-beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
+beaker.cache.data_dir = %(here)s/data/cache/data
+beaker.cache.lock_dir = %(here)s/data/cache/lock
 
-beaker.cache.super_short_term.type=memory
-beaker.cache.super_short_term.expire=10
-beaker.cache.super_short_term.key_length = 256
+beaker.cache.regions = short_term,long_term,sql_cache_short
 
-beaker.cache.short_term.type=memory
-beaker.cache.short_term.expire=60
+beaker.cache.short_term.type = memory
+beaker.cache.short_term.expire = 60
 beaker.cache.short_term.key_length = 256
 
-beaker.cache.long_term.type=memory
-beaker.cache.long_term.expire=36000
+beaker.cache.long_term.type = memory
+beaker.cache.long_term.expire = 36000
 beaker.cache.long_term.key_length = 256
 
-beaker.cache.sql_cache_short.type=memory
-beaker.cache.sql_cache_short.expire=10
+beaker.cache.sql_cache_short.type = memory
+beaker.cache.sql_cache_short.expire = 10
 beaker.cache.sql_cache_short.key_length = 256
 
-beaker.cache.sql_cache_med.type=memory
-beaker.cache.sql_cache_med.expire=360
-beaker.cache.sql_cache_med.key_length = 256
-
-beaker.cache.sql_cache_long.type=file
-beaker.cache.sql_cache_long.expire=3600
-beaker.cache.sql_cache_long.key_length = 256
-
 ####################################
 ###       BEAKER SESSION        ####
 ####################################
+
+## Name of session cookie. Should be unique for a given host and path, even when running
+## on different ports. Otherwise, cookie sessions will be shared and messed up.
+beaker.session.key = kallithea
+## Sessions should always only be accessible by the browser, not directly by JavaScript.
+beaker.session.httponly = true
+## Session lifetime. 2592000 seconds is 30 days.
+beaker.session.timeout = 2592000
+
+## Server secret used with HMAC to ensure integrity of cookies.
+beaker.session.secret = ${app_instance_uuid}
+## Further, encrypt the data with AES.
+#beaker.session.encrypt_key = <key_for_encryption>
+#beaker.session.validate_key = <validation_key>
+
 ## Type of storage used for the session, current types are
 ## dbm, file, memcached, database, and memory.
-## The storage uses the Container API
-## that is also used by the cache system.
+
+## File system storage of session data. (default)
+#beaker.session.type = file
 
-## db session ##
+## Cookie only, store all session data inside the cookie. Requires secure secrets.
+#beaker.session.type = cookie
+
+## Database storage of session data.
 #beaker.session.type = ext:database
 #beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
 #beaker.session.table_name = db_session
 
-## encrypted cookie client side session, good for many instances ##
-#beaker.session.type = cookie
-
-## file based cookies (default) ##
-#beaker.session.type = file
-
-## beaker.session.key should be unique for a given host, even when running
-## on different ports. Otherwise, cookie sessions will be shared and messed up.
-beaker.session.key = kallithea
-beaker.session.secret = ${app_instance_uuid}
-
-## Secure encrypted cookie. Requires AES and AES python libraries
-## you must disable beaker.session.secret to use this
-#beaker.session.encrypt_key = <key_for_encryption>
-#beaker.session.validate_key = <validation_key>
-
-## sets session as invalid if it haven't been accessed for given amount of time
-beaker.session.timeout = 2592000
-beaker.session.httponly = true
-#beaker.session.cookie_path = /<your-prefix>
-
-## uncomment for https secure cookie
-beaker.session.secure = false
-
-## auto save the session to not to use .save()
-beaker.session.auto = False
-
-## default cookie expiration time in seconds `true` expire at browser close ##
-#beaker.session.cookie_expires = 3600
-
-
 ############################
 ## ERROR HANDLING SYSTEMS ##
 ############################
@@ -401,10 +407,10 @@
 errormator.slow_requests = true
 
 ## enable hooking to application loggers
-# errormator.logging = true
+#errormator.logging = true
 
 ## minimum log level for log capture
-# errormator.logging.level = WARNING
+#errormator.logging.level = WARNING
 
 ## send logs only from erroneous/slow requests
 ## (saves API quota for intensive logging)
@@ -417,7 +423,6 @@
 ## start with HTTP* this list be extended with additional keywords here
 errormator.environ_keys_whitelist =
 
-
 ## list of keywords that should be blanked from request object
 ## can be string with comma separated list of words in lowercase
 ## (by default client will always blank keys that contain following words
@@ -425,13 +430,11 @@
 ## this list be extended with additional keywords set here
 errormator.request_keys_blacklist =
 
-
 ## list of namespaces that should be ignores when gathering log entries
 ## can be string with comma separated list of namespaces
 ## (by default the client ignores own entries: errormator_client.client)
 errormator.log_namespace_blacklist =
 
-
 ################
 ### [sentry] ###
 ################
@@ -450,7 +453,6 @@
 sentry.include_paths =
 sentry.exclude_paths =
 
-
 ################################################################################
 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
@@ -474,10 +476,10 @@
 sqlalchemy.db1.url = sqlite:///%(here)s/kallithea.db?timeout=60
 
 # POSTGRESQL
-# sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
+#sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
 
 # MySQL
-# sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
+#sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
 
 # see sqlalchemy docs for others
 
@@ -568,11 +570,11 @@
 datefmt = %Y-%m-%d %H:%M:%S
 
 [formatter_color_formatter]
-class=kallithea.lib.colored_formatter.ColorFormatter
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+class = kallithea.lib.colored_formatter.ColorFormatter
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %Y-%m-%d %H:%M:%S
 
 [formatter_color_formatter_sql]
-class=kallithea.lib.colored_formatter.ColorFormatterSql
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+class = kallithea.lib.colored_formatter.ColorFormatterSql
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %Y-%m-%d %H:%M:%S
--- a/kallithea/config/environment.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/config/environment.py	Sun Sep 06 23:36:05 2015 +0200
@@ -20,9 +20,9 @@
 import kallithea
 import platform
 
-from mako.lookup import TemplateLookup
-from pylons.configuration import PylonsConfig
-from pylons.error import handle_mako_error
+import pylons
+import mako.lookup
+import beaker
 
 # don't remove this import it does magic for celery
 from kallithea.lib import celerypylons
@@ -49,7 +49,7 @@
     Configure the Pylons environment via the ``pylons.config``
     object
     """
-    config = PylonsConfig()
+    config = pylons.configuration.PylonsConfig()
 
     # Pylons paths
     root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -75,13 +75,12 @@
     load_rcextensions(root_path=config['here'])
 
     # Setup cache object as early as possible
-    import pylons
     pylons.cache._push_object(config['pylons.app_globals'].cache)
 
     # Create the Mako TemplateLookup, with the default auto-escaping
-    config['pylons.app_globals'].mako_lookup = TemplateLookup(
+    config['pylons.app_globals'].mako_lookup = mako.lookup.TemplateLookup(
         directories=paths['templates'],
-        error_handler=handle_mako_error,
+        error_handler=pylons.error.handle_mako_error,
         module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
         input_encoding='utf-8', default_filters=['escape'],
         imports=['from webhelpers.html import escape'])
@@ -137,5 +136,5 @@
 
     if str2bool(config.get('initial_repo_scan', True)):
         repo2db_mapper(ScmModel().repo_scan(repos_path),
-                       remove_obsolete=False, install_git_hook=False)
+                       remove_obsolete=False, install_git_hooks=False)
     return config
--- a/kallithea/config/middleware.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/config/middleware.py	Sun Sep 06 23:36:05 2015 +0200
@@ -15,7 +15,6 @@
     Pylons middleware initialization
 """
 
-from beaker.middleware import SessionMiddleware
 from routes.middleware import RoutesMiddleware
 from paste.cascade import Cascade
 from paste.registry import RegistryManager
@@ -29,6 +28,7 @@
 from kallithea.lib.middleware.simplehg import SimpleHg
 from kallithea.lib.middleware.simplegit import SimpleGit
 from kallithea.lib.middleware.https_fixup import HttpsFixup
+from kallithea.lib.middleware.sessionmiddleware import SecureSessionMiddleware
 from kallithea.config.environment import load_environment
 from kallithea.lib.middleware.wrapper import RequestWrapper
 
@@ -60,7 +60,7 @@
 
     # Routing/Session/Cache Middleware
     app = RoutesMiddleware(app, config['routes.map'])
-    app = SessionMiddleware(app, config)
+    app = SecureSessionMiddleware(app, config)
 
     # CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
     if asbool(config['pdebug']):
--- a/kallithea/config/post_receive_tmpl.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/config/post_receive_tmpl.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 import os
 import sys
 
--- a/kallithea/config/pre_receive_tmpl.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/config/pre_receive_tmpl.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 import os
 import sys
 
--- a/kallithea/config/routing.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/config/routing.py	Sun Sep 06 23:36:05 2015 +0200
@@ -19,7 +19,6 @@
 refer to the routes manual at http://routes.groovie.org/docs/
 """
 
-from __future__ import with_statement
 from routes import Mapper
 
 # prefix for non repository related links needs to be prefixed with `/`
@@ -120,15 +119,12 @@
                   action="index", conditions=dict(method=["GET"]))
         m.connect("new_repo", "/create_repository",
                   action="create_repository", conditions=dict(method=["GET"]))
-        m.connect("/repos/{repo_name:.*?}",
+        m.connect("put_repo", "/repos/{repo_name:.*?}",
                   action="update", conditions=dict(method=["PUT"],
                   function=check_repo))
         m.connect("delete_repo", "/repos/{repo_name:.*?}",
                   action="delete", conditions=dict(method=["DELETE"],
                   ))
-        m.connect("repo", "/repos/{repo_name:.*?}",
-                  action="show", conditions=dict(method=["GET"],
-                  function=check_repo))
 
     #ADMIN REPOSITORY GROUPS ROUTES
     with rmap.submapper(path_prefix=ADMIN_PREFIX,
@@ -206,7 +202,7 @@
         m.connect("edit_user_api_keys", "/users/{id}/edit/api_keys",
                   action="edit_api_keys", conditions=dict(method=["GET"]))
         m.connect("edit_user_api_keys", "/users/{id}/edit/api_keys",
-                  action="add_api_key", conditions=dict(method=["PUT"]))
+                  action="add_api_key", conditions=dict(method=["POST"]))
         m.connect("edit_user_api_keys", "/users/{id}/edit/api_keys",
                   action="delete_api_key", conditions=dict(method=["DELETE"]))
 
@@ -699,11 +695,6 @@
                  action='create', conditions=dict(function=check_repo,
                                                   method=["POST"]))
 
-    rmap.connect('pullrequest_copy_update',
-                 '/{repo_name:.*?}/pull-request-update/{pull_request_id}', controller='pullrequests',
-                 action='copy_update', conditions=dict(function=check_repo,
-                                                       method=["POST"]))
-
     rmap.connect('pullrequest_show',
                  '/{repo_name:.*?}/pull-request/{pull_request_id:\\d+}{extra:(/.*)?}', extra='',
                  controller='pullrequests',
--- a/kallithea/controllers/admin/admin.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/admin.py	Sun Sep 06 23:36:05 2015 +0200
@@ -54,13 +54,13 @@
     :param user_log:
     :param search_term:
     """
-    log.debug('Initial search term: %r' % search_term)
+    log.debug('Initial search term: %r', search_term)
     qry = None
     if search_term:
         qp = QueryParser('repository', schema=JOURNAL_SCHEMA)
         qp.add_plugin(DateParserPlugin())
         qry = qp.parse(unicode(search_term))
-        log.debug('Filtering using parsed query %r' % qry)
+        log.debug('Filtering using parsed query %r', qry)
 
     def wildcard_handler(col, wc_term):
         if wc_term.startswith('*') and not wc_term.endswith('*'):
@@ -85,7 +85,7 @@
             field = getattr(UserLog, 'username')
         else:
             field = getattr(UserLog, field)
-        log.debug('filter field: %s val=>%s' % (field, val))
+        log.debug('filter field: %s val=>%s', field, val)
 
         #sql filtering
         if isinstance(term, query.Wildcard):
--- a/kallithea/controllers/admin/auth_settings.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/auth_settings.py	Sun Sep 06 23:36:05 2015 +0200
@@ -23,7 +23,6 @@
 :author: akesterson
 """
 
-import pprint
 import logging
 import formencode.htmlfill
 import traceback
@@ -61,56 +60,67 @@
         ]
         c.enabled_plugins = Setting.get_auth_plugins()
 
-    def index(self, defaults=None, errors=None, prefix_error=False):
-        self.__load_defaults()
-        _defaults = {}
-        # default plugins loaded
-        formglobals = {
-            "auth_plugins": ["kallithea.lib.auth_modules.auth_internal"]
-        }
-        formglobals.update(Setting.get_auth_settings())
-        formglobals["plugin_settings"] = {}
-        formglobals["auth_plugins_shortnames"] = {}
-        _defaults["auth_plugins"] = formglobals["auth_plugins"]
+    def __render(self, defaults, errors):
+        c.defaults = {}
+        c.plugin_settings = {}
+        c.plugin_shortnames = {}
 
-        for module in formglobals["auth_plugins"]:
+        for module in c.enabled_plugins:
             plugin = auth_modules.loadplugin(module)
             plugin_name = plugin.name
-            formglobals["auth_plugins_shortnames"][module] = plugin_name
-            formglobals["plugin_settings"][module] = plugin.plugin_settings()
-            for v in formglobals["plugin_settings"][module]:
+            c.plugin_shortnames[module] = plugin_name
+            c.plugin_settings[module] = plugin.plugin_settings()
+            for v in c.plugin_settings[module]:
                 fullname = ("auth_" + plugin_name + "_" + v["name"])
                 if "default" in v:
-                    _defaults[fullname] = v["default"]
+                    c.defaults[fullname] = v["default"]
                 # Current values will be the default on the form, if there are any
                 setting = Setting.get_by_name(fullname)
-                if setting:
-                    _defaults[fullname] = setting.app_settings_value
+                if setting is not None:
+                    c.defaults[fullname] = setting.app_settings_value
         # we want to show , separated list of enabled plugins
-        _defaults['auth_plugins'] = ','.join(_defaults['auth_plugins'])
-        if defaults:
-            _defaults.update(defaults)
+        c.defaults['auth_plugins'] = ','.join(c.enabled_plugins)
 
-        formglobals["defaults"] = _defaults
-        # set template context variables
-        for k, v in formglobals.iteritems():
-            setattr(c, k, v)
+        if defaults:
+            c.defaults.update(defaults)
 
-        log.debug(pprint.pformat(formglobals, indent=4))
         log.debug(formatted_json(defaults))
         return formencode.htmlfill.render(
             render('admin/auth/auth_settings.html'),
-            defaults=_defaults,
+            defaults=c.defaults,
             errors=errors,
-            prefix_error=prefix_error,
+            prefix_error=False,
             encoding="UTF-8",
             force_defaults=False)
 
+    def index(self):
+        self.__load_defaults()
+        return self.__render(defaults=None, errors=None)
+
     def auth_settings(self):
         """POST create and store auth settings"""
         self.__load_defaults()
+        log.debug("POST Result: %s", formatted_json(dict(request.POST)))
+
+        # First, parse only the plugin list (not the plugin settings).
+        _auth_plugins_validator = AuthSettingsForm([]).fields['auth_plugins']
+        try:
+            new_enabled_plugins = _auth_plugins_validator.to_python(request.POST.get('auth_plugins'))
+        except formencode.Invalid:
+            # User provided an invalid plugin list. Just fall back to
+            # the list of currently enabled plugins. (We'll re-validate
+            # and show an error message to the user, below.)
+            pass
+        else:
+            # Hide plugins that the user has asked to be disabled, but
+            # do not show plugins that the user has asked to be enabled
+            # (yet), since that'll cause validation errors and/or wrong
+            # settings being applied (e.g. checkboxes being cleared),
+            # since the plugin settings will not be in the POST data.
+            c.enabled_plugins = [ p for p in c.enabled_plugins if p in new_enabled_plugins ]
+
+        # Next, parse everything including plugin settings.
         _form = AuthSettingsForm(c.enabled_plugins)()
-        log.debug("POST Result: %s" % formatted_json(dict(request.POST)))
 
         try:
             form_result = _form.to_python(dict(request.POST))
@@ -118,19 +128,19 @@
                 if k == 'auth_plugins':
                     # we want to store it comma separated inside our settings
                     v = ','.join(v)
-                log.debug("%s = %s" % (k, str(v)))
+                log.debug("%s = %s", k, str(v))
                 setting = Setting.create_or_update(k, v)
                 Session().add(setting)
             Session().commit()
             h.flash(_('Auth settings updated successfully'),
                        category='success')
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             log.error(traceback.format_exc())
             e = errors.error_dict or {}
-            return self.index(
+            return self.__render(
                 defaults=errors.value,
                 errors=e,
-                prefix_error=False)
+            )
         except Exception:
             log.error(traceback.format_exc())
             h.flash(_('error occurred during update of auth settings'),
--- a/kallithea/controllers/admin/defaults.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/defaults.py	Sun Sep 06 23:36:05 2015 +0200
@@ -97,7 +97,7 @@
             h.flash(_('Default settings updated successfully'),
                     category='success')
 
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             defaults = errors.value
 
             return htmlfill.render(
--- a/kallithea/controllers/admin/gists.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/gists.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.controllers.admin.gist
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.controllers.admin.gists
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 gist controller for Kallithea
 
@@ -56,7 +56,7 @@
 
     def __load_defaults(self, extra_values=None):
         c.lifetime_values = [
-            (str(-1), _('forever')),
+            (str(-1), _('Forever')),
             (str(5), _('5 minutes')),
             (str(60), _('1 hour')),
             (str(60 * 24), _('1 day')),
@@ -130,7 +130,7 @@
             )
             Session().commit()
             new_gist_id = gist.gist_access_id
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             defaults = errors.value
 
             return formencode.htmlfill.render(
@@ -141,7 +141,7 @@
                 encoding="UTF-8",
                 force_defaults=False)
 
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
             h.flash(_('Error occurred during gist creation'), category='error')
             return redirect(url('new_gist'))
@@ -196,8 +196,8 @@
         #check if this gist is not expired
         if c.gist.gist_expires != -1:
             if time.time() > c.gist.gist_expires:
-                log.error('Gist expired at %s' %
-                          (time_to_datetime(c.gist.gist_expires)))
+                log.error('Gist expired at %s',
+                          time_to_datetime(c.gist.gist_expires))
                 raise HTTPNotFound()
         try:
             c.file_changeset, c.files = GistModel().get_gist_files(gist_id,
@@ -221,8 +221,8 @@
         #check if this gist is not expired
         if c.gist.gist_expires != -1:
             if time.time() > c.gist.gist_expires:
-                log.error('Gist expired at %s' %
-                          (time_to_datetime(c.gist.gist_expires)))
+                log.error('Gist expired at %s',
+                          time_to_datetime(c.gist.gist_expires))
                 raise HTTPNotFound()
         try:
             c.file_changeset, c.files = GistModel().get_gist_files(gist_id)
@@ -230,7 +230,7 @@
             log.error(traceback.format_exc())
             raise HTTPNotFound()
 
-        self.__load_defaults(extra_values=('0', _('unmodified')))
+        self.__load_defaults(extra_values=('0', _('Unmodified')))
         rendered = render('admin/gists/edit.html')
 
         if request.POST:
@@ -285,8 +285,8 @@
 
         ##TODO: maybe move this to model ?
         if revision != last_rev.raw_id:
-            log.error('Last revision %s is different than submitted %s'
-                      % (revision, last_rev))
+            log.error('Last revision %s is different than submitted %s',
+                      revision, last_rev)
             # our gist has newer version than we
             success = False
 
--- a/kallithea/controllers/admin/my_account.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/my_account.py	Sun Sep 06 23:36:05 2015 +0200
@@ -37,12 +37,12 @@
 
 from kallithea import EXTERN_TYPE_INTERNAL
 from kallithea.lib import helpers as h
+from kallithea.lib import auth_modules
 from kallithea.lib.auth import LoginRequired, NotAnonymous, AuthUser
 from kallithea.lib.base import BaseController, render
 from kallithea.lib.utils2 import generate_api_key, safe_int
 from kallithea.lib.compat import json
-from kallithea.model.db import Repository, \
-    UserEmailMap, UserApiKeys, User, UserFollowing
+from kallithea.model.db import Repository, UserEmailMap, User, UserFollowing
 from kallithea.model.forms import UserForm, PasswordChangeForm
 from kallithea.model.user import UserModel
 from kallithea.model.repo import RepoModel
@@ -98,10 +98,14 @@
         # url('my_account')
         c.active = 'profile'
         self.__load_data()
-        c.perm_user = AuthUser(user_id=self.authuser.user_id,
-                               ip_addr=self.ip_addr)
-        c.extern_type = c.user.extern_type
-        c.extern_name = c.user.extern_name
+        c.perm_user = AuthUser(user_id=self.authuser.user_id)
+        c.ip_addr = self.ip_addr
+        managed_fields = auth_modules.get_managed_fields(c.user)
+        def_user_perms = User.get_default_user().AuthUser.permissions['global']
+        if 'hg.register.none' in def_user_perms:
+            managed_fields.extend(['username', 'firstname', 'lastname', 'email'])
+
+        c.readonly = lambda n: 'readonly' if n in managed_fields else None
 
         defaults = c.user.get_dict()
         update = False
@@ -117,11 +121,8 @@
                 form_result = _form.to_python(post_data)
                 # skip updating those attrs for my account
                 skip_attrs = ['admin', 'active', 'extern_type', 'extern_name',
-                              'new_password', 'password_confirmation']
-                #TODO: plugin should define if username can be updated
-                if c.extern_type != EXTERN_TYPE_INTERNAL:
-                    # forbid updating username for external accounts
-                    skip_attrs.append('username')
+                              'new_password', 'password_confirmation',
+                             ] + managed_fields
 
                 UserModel().update(self.authuser.user_id, form_result,
                                    skip_attrs=skip_attrs)
@@ -130,7 +131,7 @@
                 Session().commit()
                 update = True
 
-            except formencode.Invalid, errors:
+            except formencode.Invalid as errors:
                 return htmlfill.render(
                     render('admin/my_account/my_account.html'),
                     defaults=errors.value,
@@ -153,7 +154,11 @@
     def my_account_password(self):
         c.active = 'password'
         self.__load_data()
-        if request.POST:
+
+        managed_fields = auth_modules.get_managed_fields(c.user)
+        c.can_change_password = 'password' not in managed_fields
+
+        if request.POST and c.can_change_password:
             _form = PasswordChangeForm(self.authuser.username)()
             try:
                 form_result = _form.to_python(request.POST)
@@ -193,8 +198,8 @@
     def my_account_perms(self):
         c.active = 'perms'
         self.__load_data()
-        c.perm_user = AuthUser(user_id=self.authuser.user_id,
-                               ip_addr=self.ip_addr)
+        c.perm_user = AuthUser(user_id=self.authuser.user_id)
+        c.ip_addr = self.ip_addr
 
         return render('admin/my_account/my_account.html')
 
@@ -213,7 +218,7 @@
             UserModel().add_extra_email(self.authuser.user_id, email)
             Session().commit()
             h.flash(_("Added email %s to user") % email, category='success')
-        except formencode.Invalid, error:
+        except formencode.Invalid as error:
             msg = error.error_dict['email']
             h.flash(msg, category='error')
         except Exception:
@@ -235,7 +240,7 @@
         self.__load_data()
         show_expired = True
         c.lifetime_values = [
-            (str(-1), _('forever')),
+            (str(-1), _('Forever')),
             (str(5), _('5 minutes')),
             (str(60), _('1 hour')),
             (str(60 * 24), _('1 day')),
@@ -251,7 +256,7 @@
         description = request.POST.get('description')
         ApiKeyModel().create(self.authuser.user_id, description, lifetime)
         Session().commit()
-        h.flash(_("Api key successfully created"), category='success')
+        h.flash(_("API key successfully created"), category='success')
         return redirect(url('my_account_api_keys'))
 
     def my_account_api_keys_delete(self):
@@ -259,14 +264,14 @@
         user_id = self.authuser.user_id
         if request.POST.get('del_api_key_builtin'):
             user = User.get(user_id)
-            if user:
+            if user is not None:
                 user.api_key = generate_api_key()
                 Session().add(user)
                 Session().commit()
-                h.flash(_("Api key successfully reset"), category='success')
+                h.flash(_("API key successfully reset"), category='success')
         elif api_key:
             ApiKeyModel().delete(api_key, self.authuser.user_id)
             Session().commit()
-            h.flash(_("Api key successfully deleted"), category='success')
+            h.flash(_("API key successfully deleted"), category='success')
 
         return redirect(url('my_account_api_keys'))
--- a/kallithea/controllers/admin/notifications.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/notifications.py	Sun Sep 06 23:36:05 2015 +0200
@@ -160,7 +160,7 @@
 
             # if this association to user is not valid, we don't want to show
             # this message
-            if unotification:
+            if unotification is not None:
                 if not unotification.read:
                     unotification.mark_as_read()
                     Session().commit()
--- a/kallithea/controllers/admin/permissions.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/permissions.py	Sun Sep 06 23:36:05 2015 +0200
@@ -36,8 +36,7 @@
 from pylons.i18n.translation import _
 
 from kallithea.lib import helpers as h
-from kallithea.lib.auth import LoginRequired, HasPermissionAllDecorator,\
-    AuthUser
+from kallithea.lib.auth import LoginRequired, HasPermissionAllDecorator
 from kallithea.lib.base import BaseController, render
 from kallithea.model.forms import DefaultPermissionsForm
 from kallithea.model.permission import PermissionModel
@@ -125,7 +124,7 @@
                 h.flash(_('Global permissions updated successfully'),
                         category='success')
 
-            except formencode.Invalid, errors:
+            except formencode.Invalid as errors:
                 defaults = errors.value
 
                 return htmlfill.render(
--- a/kallithea/controllers/admin/repo_groups.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/repo_groups.py	Sun Sep 06 23:36:05 2015 +0200
@@ -39,12 +39,12 @@
 import kallithea
 from kallithea.lib import helpers as h
 from kallithea.lib.compat import json
-from kallithea.lib.auth import LoginRequired, HasPermissionAnyDecorator,\
-    HasRepoGroupPermissionAnyDecorator, HasRepoGroupPermissionAll,\
+from kallithea.lib.auth import LoginRequired, \
+    HasRepoGroupPermissionAnyDecorator, HasRepoGroupPermissionAll, \
     HasPermissionAll
 from kallithea.lib.base import BaseController, render
 from kallithea.model.db import RepoGroup, Repository
-from kallithea.model.scm import RepoGroupList
+from kallithea.model.scm import RepoGroupList, AvailableRepoGroupChoices
 from kallithea.model.repo_group import RepoGroupModel
 from kallithea.model.forms import RepoGroupForm, RepoGroupPermsForm
 from kallithea.model.meta import Session
@@ -58,27 +58,21 @@
 
 
 class RepoGroupsController(BaseController):
-    """REST Controller styled on the Atom Publishing Protocol"""
 
     @LoginRequired()
     def __before__(self):
         super(RepoGroupsController, self).__before__()
 
-    def __load_defaults(self, allow_empty_group=False, exclude_group_ids=[]):
-        if HasPermissionAll('hg.admin')('group edit'):
-            #we're global admin, we're ok and we can create TOP level groups
-            allow_empty_group = True
+    def __load_defaults(self, extras=(), exclude=()):
+        """extras is used for keeping current parent ignoring permissions
+        exclude is used for not moving group to itself TODO: also exclude descendants
+        Note: only admin can create top level groups
+        """
+        repo_groups = AvailableRepoGroupChoices([], ['group.admin'], extras)
+        exclude_group_ids = set(rg.group_id for rg in exclude)
+        c.repo_groups = [rg for rg in repo_groups
+                         if rg[0] not in exclude_group_ids]
 
-        #override the choices for this form, we need to filter choices
-        #and display only those we have ADMIN right
-        groups_with_admin_rights = RepoGroupList(RepoGroup.query().all(),
-                                                 perm_set=['group.admin'])
-        c.repo_groups = RepoGroup.groups_choices(groups=groups_with_admin_rights,
-                                                 show_empty_group=allow_empty_group)
-        # exclude filtered ids
-        c.repo_groups = filter(lambda x: x[0] not in exclude_group_ids,
-                               c.repo_groups)
-        c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
         repo_model = RepoModel()
         c.users_array = repo_model.get_users_js()
         c.user_groups_array = repo_model.get_user_groups_js()
@@ -169,22 +163,19 @@
 
         # permissions for can create group based on parent_id are checked
         # here in the Form
-        repo_group_form = RepoGroupForm(available_groups=
-                                map(lambda k: unicode(k[0]), c.repo_groups))()
+        repo_group_form = RepoGroupForm(repo_groups=c.repo_groups)
         try:
             form_result = repo_group_form.to_python(dict(request.POST))
-            RepoGroupModel().create(
+            gr = RepoGroupModel().create(
                 group_name=form_result['group_name'],
                 group_description=form_result['group_description'],
                 parent=form_result['group_parent_id'],
-                owner=self.authuser.user_id,
+                owner=self.authuser.user_id, # TODO: make editable
                 copy_permissions=form_result['group_copy_permissions']
             )
             Session().commit()
-            h.flash(_('Created repository group %s') \
-                    % form_result['group_name'], category='success')
             #TODO: in futureaction_logger(, '', '', '', self.sa)
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             return htmlfill.render(
                 render('admin/repo_groups/repo_group_add.html'),
                 defaults=errors.value,
@@ -196,9 +187,12 @@
             log.error(traceback.format_exc())
             h.flash(_('Error occurred during creation of repository group %s') \
                     % request.POST.get('group_name'), category='error')
-        parent_group_id = form_result['group_parent_id']
-        #TODO: maybe we should get back to the main view, not the admin one
-        return redirect(url('repos_groups', parent_group=parent_group_id))
+            parent_group_id = form_result['group_parent_id']
+            #TODO: maybe we should get back to the main view, not the admin one
+            return redirect(url('repos_groups', parent_group=parent_group_id))
+        h.flash(_('Created repository group %s') % gr.group_name,
+                category='success')
+        return redirect(url('repos_group_home', group_name=gr.group_name))
 
     def new(self):
         """GET /repo_groups/new: Form to create a new item"""
@@ -231,6 +225,10 @@
         # url('repos_group', group_name=GROUP_NAME)
 
         c.repo_group = RepoGroupModel()._get_repo_group(group_name)
+        self.__load_defaults(extras=[c.repo_group.parent_group],
+                             exclude=[c.repo_group])
+
+        # TODO: kill allow_empty_group - it is only used for redundant form validation!
         if HasPermissionAll('hg.admin')('group edit'):
             #we're global admin, we're ok and we can create TOP level groups
             allow_empty_group = True
@@ -238,13 +236,10 @@
             allow_empty_group = True
         else:
             allow_empty_group = False
-        self.__load_defaults(allow_empty_group=allow_empty_group,
-                             exclude_group_ids=[c.repo_group.group_id])
-
         repo_group_form = RepoGroupForm(
             edit=True,
             old_data=c.repo_group.get_dict(),
-            available_groups=c.repo_groups_choices,
+            repo_groups=c.repo_groups,
             can_create_in_root=allow_empty_group,
         )()
         try:
@@ -257,7 +252,7 @@
             # we now have new name !
             group_name = new_gr.group_name
             #TODO: in future action_logger(, '', '', '', self.sa)
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
 
             return htmlfill.render(
                 render('admin/repo_groups/repo_group_edit.html'),
@@ -358,18 +353,8 @@
         c.active = 'settings'
 
         c.repo_group = RepoGroupModel()._get_repo_group(group_name)
-        #we can only allow moving empty group if it's already a top-level
-        #group, ie has no parents, or we're admin
-        if HasPermissionAll('hg.admin')('group edit'):
-            #we're global admin, we're ok and we can create TOP level groups
-            allow_empty_group = True
-        elif not c.repo_group.parent_group:
-            allow_empty_group = True
-        else:
-            allow_empty_group = False
-
-        self.__load_defaults(allow_empty_group=allow_empty_group,
-                             exclude_group_ids=[c.repo_group.group_id])
+        self.__load_defaults(extras=[c.repo_group.parent_group],
+                             exclude=[c.repo_group])
         defaults = self.__load_data(c.repo_group.group_id)
 
         return htmlfill.render(
@@ -432,7 +417,7 @@
         #action_logger(self.authuser, 'admin_changed_repo_permissions',
         #              repo_name, self.ip_addr, self.sa)
         Session().commit()
-        h.flash(_('Repository Group permissions updated'), category='success')
+        h.flash(_('Repository group permissions updated'), category='success')
         return redirect(url('edit_repo_group_perms', group_name=group_name))
 
     @HasRepoGroupPermissionAnyDecorator('group.admin')
--- a/kallithea/controllers/admin/repos.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/repos.py	Sun Sep 06 23:36:05 2015 +0200
@@ -36,17 +36,17 @@
 from sqlalchemy.sql.expression import func
 
 from kallithea.lib import helpers as h
-from kallithea.lib.auth import LoginRequired, HasPermissionAllDecorator, \
-    HasRepoPermissionAllDecorator, NotAnonymous,HasPermissionAny, \
-    HasRepoGroupPermissionAny, HasRepoPermissionAnyDecorator
+from kallithea.lib.auth import LoginRequired, \
+    HasRepoPermissionAllDecorator, NotAnonymous, HasPermissionAny, \
+    HasRepoPermissionAnyDecorator
 from kallithea.lib.base import BaseRepoController, render
-from kallithea.lib.utils import action_logger, repo_name_slug, jsonify
+from kallithea.lib.utils import action_logger, jsonify
 from kallithea.lib.vcs import RepositoryError
 from kallithea.model.meta import Session
 from kallithea.model.db import User, Repository, UserFollowing, RepoGroup,\
     Setting, RepositoryField
 from kallithea.model.forms import RepoForm, RepoFieldForm, RepoPermsForm
-from kallithea.model.scm import ScmModel, RepoGroupList, RepoList
+from kallithea.model.scm import ScmModel, AvailableRepoGroupChoices, RepoList
 from kallithea.model.repo import RepoModel
 from kallithea.lib.compat import json
 from kallithea.lib.exceptions import AttachedForksError
@@ -76,24 +76,15 @@
         return repo_obj
 
     def __load_defaults(self, repo=None):
-        acl_groups = RepoGroupList(RepoGroup.query().all(),
-                               perm_set=['group.write', 'group.admin'])
-        c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
-        c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
-
-        # in case someone no longer have a group.write access to a repository
-        # pre fill the list with this entry, we don't care if this is the same
-        # but it will allow saving repo data properly.
+        top_perms = ['hg.create.repository']
+        repo_group_perms = ['group.admin']
+        if HasPermissionAny('hg.create.write_on_repogroup.true')():
+            repo_group_perms.append('group.write')
+        extras = [] if repo is None else [repo.group]
 
-        repo_group = None
-        if repo:
-            repo_group = repo.group
-        if repo_group and unicode(repo_group.group_id) not in c.repo_groups_choices:
-            c.repo_groups_choices.append(unicode(repo_group.group_id))
-            c.repo_groups.append(RepoGroup._generate_choice(repo_group))
+        c.repo_groups = AvailableRepoGroupChoices(top_perms, repo_group_perms, extras)
 
-        choices, c.landing_revs = ScmModel().get_repo_landing_revs()
-        c.landing_revs_choices = choices
+        c.landing_revs_choices, c.landing_revs = ScmModel().get_repo_landing_revs(repo)
 
     def __load_data(self, repo_name=None):
         """
@@ -104,10 +95,8 @@
         c.repo_info = self._load_repo(repo_name)
         self.__load_defaults(c.repo_info)
 
-        ##override defaults for exact repo info here git/hg etc
-        choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info)
-        c.landing_revs_choices = choices
         defaults = RepoModel()._get_defaults(repo_name)
+        defaults['clone_uri'] = c.repo_info.clone_uri_hidden # don't show password
 
         return defaults
 
@@ -137,8 +126,8 @@
         form_result = {}
         task_id = None
         try:
-            # CanWriteToGroup validators checks permissions of this POST
-            form_result = RepoForm(repo_groups=c.repo_groups_choices,
+            # CanWriteGroup validators checks permissions of this POST
+            form_result = RepoForm(repo_groups=c.repo_groups,
                                    landing_revs=c.landing_revs_choices)()\
                             .to_python(dict(request.POST))
 
@@ -148,7 +137,8 @@
             from celery.result import BaseAsyncResult
             if isinstance(task, BaseAsyncResult):
                 task_id = task.task_id
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
+            log.info(errors)
             return htmlfill.render(
                 render('admin/repos/repo_add.html'),
                 defaults=errors.value,
@@ -171,31 +161,18 @@
     @NotAnonymous()
     def create_repository(self):
         """GET /_admin/create_repository: Form to create a new item"""
-        new_repo = request.GET.get('repo', '')
+        self.__load_defaults()
+        if not c.repo_groups:
+            raise HTTPForbidden
         parent_group = request.GET.get('parent_group')
-        if not HasPermissionAny('hg.admin', 'hg.create.repository')():
-            #you're not super admin nor have global create permissions,
-            #but maybe you have at least write permission to a parent group ?
-            _gr = RepoGroup.get(parent_group)
-            gr_name = _gr.group_name if _gr else None
-            # create repositories with write permission on group is set to true
-            create_on_write = HasPermissionAny('hg.create.write_on_repogroup.true')()
-            group_admin = HasRepoGroupPermissionAny('group.admin')(group_name=gr_name)
-            group_write = HasRepoGroupPermissionAny('group.write')(group_name=gr_name)
-            if not (group_admin or (group_write and create_on_write)):
-                raise HTTPForbidden
-
-        acl_groups = RepoGroupList(RepoGroup.query().all(),
-                               perm_set=['group.write', 'group.admin'])
-        c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
-        c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
-        choices, c.landing_revs = ScmModel().get_repo_landing_revs()
-
-        c.new_repo = repo_name_slug(new_repo)
 
         ## apply the defaults from defaults page
         defaults = Setting.get_default_repo_settings(strip_prefix=True)
         if parent_group:
+            prg = RepoGroup.get(parent_group)
+            if prg is None or not any(rgc[0] == prg.group_id
+                                      for rgc in c.repo_groups):
+                raise HTTPForbidden
             defaults.update({'repo_group': parent_group})
 
         return htmlfill.render(
@@ -233,15 +210,14 @@
         repo = Repository.get_by_repo_name(repo_name)
         if repo and repo.repo_state == Repository.STATE_CREATED:
             if repo.clone_uri:
-                clone_uri = repo.clone_uri_hidden
                 h.flash(_('Created repository %s from %s')
-                        % (repo.repo_name, clone_uri), category='success')
+                        % (repo.repo_name, repo.clone_uri_hidden), category='success')
             else:
                 repo_url = h.link_to(repo.repo_name,
                                      h.url('summary_home',
                                            repo_name=repo.repo_name))
                 fork = repo.fork
-                if fork:
+                if fork is not None:
                     fork_name = fork.repo_name
                     h.flash(h.literal(_('Forked repository %s as %s')
                             % (fork_name, repo_url)), category='success')
@@ -258,20 +234,17 @@
         # Forms posted to this method should contain a hidden field:
         #    <input type="hidden" name="_method" value="PUT" />
         # Or using helpers:
-        #    h.form(url('repo', repo_name=ID),
+        #    h.form(url('put_repo', repo_name=ID),
         #           method='put')
-        # url('repo', repo_name=ID)
+        # url('put_repo', repo_name=ID)
         c.repo_info = self._load_repo(repo_name)
+        self.__load_defaults(c.repo_info)
         c.active = 'settings'
         c.repo_fields = RepositoryField.query()\
             .filter(RepositoryField.repository == c.repo_info).all()
-        self.__load_defaults(c.repo_info)
 
         repo_model = RepoModel()
         changed_name = repo_name
-        #override the choices with extracted revisions !
-        choices, c.landing_revs = ScmModel().get_repo_landing_revs(repo_name)
-        c.landing_revs_choices = choices
         repo = Repository.get_by_repo_name(repo_name)
         old_data = {
             'repo_name': repo_name,
@@ -279,7 +252,7 @@
             'repo_type': repo.repo_type,
         }
         _form = RepoForm(edit=True, old_data=old_data,
-                         repo_groups=c.repo_groups_choices,
+                         repo_groups=c.repo_groups,
                          landing_revs=c.landing_revs_choices)()
 
         try:
@@ -292,9 +265,11 @@
             action_logger(self.authuser, 'admin_updated_repo',
                               changed_name, self.ip_addr, self.sa)
             Session().commit()
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
+            log.info(errors)
             defaults = self.__load_data(repo_name)
             defaults.update(errors.value)
+            c.users_array = repo_model.get_users_js()
             return htmlfill.render(
                 render('admin/repos/repo_edit.html'),
                 defaults=defaults,
@@ -316,9 +291,9 @@
         # Forms posted to this method should contain a hidden field:
         #    <input type="hidden" name="_method" value="DELETE" />
         # Or using helpers:
-        #    h.form(url('repo', repo_name=ID),
+        #    h.form(url('delete_repo', repo_name=ID),
         #           method='delete')
-        # url('repo', repo_name=ID)
+        # url('delete_repo', repo_name=ID)
 
         repo_model = RepoModel()
         repo = repo_model.get_by_repo_name(repo_name)
@@ -343,7 +318,7 @@
             h.flash(_('Deleted repository %s') % repo_name, category='success')
             Session().commit()
         except AttachedForksError:
-            h.flash(_('Cannot delete %s it still contains attached forks')
+            h.flash(_('Cannot delete repository %s which still has forks')
                         % repo_name, category='warning')
 
         except Exception:
@@ -355,21 +330,15 @@
             return redirect(url('repos_group_home', group_name=repo.group.group_name))
         return redirect(url('repos'))
 
-    @HasPermissionAllDecorator('hg.admin')
-    def show(self, repo_name, format='html'):
-        """GET /repos/repo_name: Show a specific item"""
-        # url('repo', repo_name=ID)
-
     @HasRepoPermissionAllDecorator('repository.admin')
     def edit(self, repo_name):
         """GET /repo_name/settings: Form to edit an existing item"""
         # url('edit_repo', repo_name=ID)
         defaults = self.__load_data(repo_name)
-        if 'clone_uri' in defaults:
-            del defaults['clone_uri']
-
         c.repo_fields = RepositoryField.query()\
             .filter(RepositoryField.repository == c.repo_info).all()
+        repo_model = RepoModel()
+        c.users_array = repo_model.get_users_js()
         c.active = 'settings'
         return htmlfill.render(
             render('admin/repos/repo_edit.html'),
@@ -456,7 +425,7 @@
             new_field.field_label = form_result['new_field_label']
             Session().add(new_field)
             Session().commit()
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
             msg = _('An error occurred during creation of field')
             if isinstance(e, formencode.Invalid):
@@ -470,7 +439,7 @@
         try:
             Session().delete(field)
             Session().commit()
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
             msg = _('An error occurred during removal of field')
             h.flash(msg, category='error')
@@ -542,12 +511,12 @@
                                            self.authuser.username)
             fork = repo.fork.repo_name if repo.fork else _('Nothing')
             Session().commit()
-            h.flash(_('Marked repo %s as fork of %s') % (repo_name, fork),
+            h.flash(_('Marked repository %s as fork of %s') % (repo_name, fork),
                     category='success')
-        except RepositoryError, e:
+        except RepositoryError as e:
             log.error(traceback.format_exc())
             h.flash(str(e), category='error')
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
             h.flash(_('An error occurred during this operation'),
                     category='error')
@@ -565,11 +534,11 @@
             repo = Repository.get_by_repo_name(repo_name)
             if request.POST.get('set_lock'):
                 Repository.lock(repo, c.authuser.user_id)
-                h.flash(_('Locked repository'), category='success')
+                h.flash(_('Repository has been locked'), category='success')
             elif request.POST.get('set_unlock'):
                 Repository.unlock(repo)
-                h.flash(_('Unlocked repository'), category='success')
-        except Exception, e:
+                h.flash(_('Repository has been unlocked'), category='success')
+        except Exception as e:
             log.error(traceback.format_exc())
             h.flash(_('An error occurred during unlocking'),
                     category='error')
@@ -589,14 +558,12 @@
             if repo.enable_locking:
                 if repo.locked[0]:
                     Repository.unlock(repo)
-                    action = _('Unlocked')
+                    h.flash(_('Repository has been unlocked'), category='success')
                 else:
                     Repository.lock(repo, c.authuser.user_id)
-                    action = _('Locked')
+                    h.flash(_('Repository has been locked'), category='success')
 
-                h.flash(_('Repository has been %s') % action,
-                        category='success')
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
             h.flash(_('An error occurred during unlocking'),
                     category='error')
@@ -614,7 +581,7 @@
                 Session().commit()
                 h.flash(_('Cache invalidation successful'),
                         category='success')
-            except Exception, e:
+            except Exception as e:
                 log.error(traceback.format_exc())
                 h.flash(_('An error occurred during cache invalidation'),
                         category='error')
@@ -632,7 +599,7 @@
             try:
                 ScmModel().pull_changes(repo_name, self.authuser.username)
                 h.flash(_('Pulled from remote location'), category='success')
-            except Exception, e:
+            except Exception as e:
                 log.error(traceback.format_exc())
                 h.flash(_('An error occurred during pull from remote location'),
                         category='error')
@@ -665,7 +632,7 @@
             try:
                 RepoModel().delete_stats(repo_name)
                 Session().commit()
-            except Exception, e:
+            except Exception as e:
                 log.error(traceback.format_exc())
                 h.flash(_('An error occurred during deletion of repository stats'),
                         category='error')
--- a/kallithea/controllers/admin/settings.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/settings.py	Sun Sep 06 23:36:05 2015 +0200
@@ -94,7 +94,7 @@
             application_form = ApplicationUiSettingsForm()()
             try:
                 form_result = application_form.to_python(dict(request.POST))
-            except formencode.Invalid, errors:
+            except formencode.Invalid as errors:
                 return htmlfill.render(
                      render('admin/settings/settings.html'),
                      defaults=errors.value,
@@ -177,7 +177,7 @@
 
             except Exception:
                 log.error(traceback.format_exc())
-                h.flash(_('Error occurred during updating '
+                h.flash(_('Error occurred while updating '
                           'application settings'), category='error')
 
         defaults = Setting.get_app_settings()
@@ -197,9 +197,11 @@
         if request.POST:
             rm_obsolete = request.POST.get('destroy', False)
             install_git_hooks = request.POST.get('hooks', False)
+            overwrite_git_hooks = request.POST.get('hooks_overwrite', False);
             invalidate_cache = request.POST.get('invalidate', False)
-            log.debug('rescanning repo location with destroy obsolete=%s and '
-                      'install git hooks=%s' % (rm_obsolete,install_git_hooks))
+            log.debug('rescanning repo location with destroy obsolete=%s, '
+                      'install git hooks=%s and '
+                      'overwrite git hooks=%s' % (rm_obsolete, install_git_hooks, overwrite_git_hooks))
 
             if invalidate_cache:
                 log.debug('invalidating all repositories cache')
@@ -208,8 +210,9 @@
 
             filesystem_repos = ScmModel().repo_scan()
             added, removed = repo2db_mapper(filesystem_repos, rm_obsolete,
-                                            install_git_hook=install_git_hooks,
-                                            user=c.authuser.username)
+                                            install_git_hooks=install_git_hooks,
+                                            user=c.authuser.username,
+                                            overwrite_git_hooks=overwrite_git_hooks)
             h.flash(h.literal(_('Repositories successfully rescanned. Added: %s. Removed: %s.') %
                 (', '.join(h.link_to(safe_unicode(repo_name), h.url('summary_home', repo_name=repo_name))
                  for repo_name in added) or '-',
@@ -235,7 +238,7 @@
             application_form = ApplicationSettingsForm()()
             try:
                 form_result = application_form.to_python(dict(request.POST))
-            except formencode.Invalid, errors:
+            except formencode.Invalid as errors:
                 return htmlfill.render(
                     render('admin/settings/settings.html'),
                     defaults=errors.value,
@@ -271,7 +274,7 @@
 
             except Exception:
                 log.error(traceback.format_exc())
-                h.flash(_('Error occurred during updating '
+                h.flash(_('Error occurred while updating '
                           'application settings'),
                           category='error')
 
@@ -295,7 +298,7 @@
             application_form = ApplicationVisualisationForm()()
             try:
                 form_result = application_form.to_python(dict(request.POST))
-            except formencode.Invalid, errors:
+            except formencode.Invalid as errors:
                 return htmlfill.render(
                     render('admin/settings/settings.html'),
                     defaults=errors.value,
@@ -497,16 +500,16 @@
         try:
             import kallithea
             ver = kallithea.__version__
-            log.debug('Checking for upgrade on `%s` server' % _update_url)
+            log.debug('Checking for upgrade on `%s` server', _update_url)
             opener = urllib2.build_opener()
             opener.addheaders = [('User-agent', 'Kallithea-SCM/%s' % ver)]
             response = opener.open(_update_url)
             response_data = response.read()
             data = json.loads(response_data)
-        except urllib2.URLError, e:
+        except urllib2.URLError as e:
             log.error(traceback.format_exc())
             return _err('Failed to contact upgrade server: %r' % e)
-        except ValueError, e:
+        except ValueError as e:
             log.error(traceback.format_exc())
             return _err('Bad data sent from update server')
 
--- a/kallithea/controllers/admin/user_groups.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/user_groups.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.controllers.admin.users_groups
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.controllers.admin.user_groups
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 User Groups crud controller for pylons
 
@@ -40,18 +40,18 @@
 
 import kallithea
 from kallithea.lib import helpers as h
-from kallithea.lib.exceptions import UserGroupsAssignedException,\
+from kallithea.lib.exceptions import UserGroupsAssignedException, \
     RepoGroupAssignmentError
 from kallithea.lib.utils2 import safe_unicode, safe_int
-from kallithea.lib.auth import LoginRequired, HasPermissionAllDecorator,\
+from kallithea.lib.auth import LoginRequired, \
     HasUserGroupPermissionAnyDecorator, HasPermissionAnyDecorator
 from kallithea.lib.base import BaseController, render
 from kallithea.model.scm import UserGroupList
 from kallithea.model.user_group import UserGroupModel
 from kallithea.model.repo import RepoModel
-from kallithea.model.db import User, UserGroup, UserGroupToPerm,\
+from kallithea.model.db import User, UserGroup, UserGroupToPerm, \
     UserGroupRepoToPerm, UserGroupRepoGroupToPerm
-from kallithea.model.forms import UserGroupForm, UserGroupPermsForm,\
+from kallithea.model.forms import UserGroupForm, UserGroupPermsForm, \
     CustomDefaultPermissionsForm
 from kallithea.model.meta import Session
 from kallithea.lib.utils import action_logger
@@ -150,7 +150,7 @@
             h.flash(h.literal(_('Created user group %s') % h.link_to(h.escape(gr), url('edit_users_group', id=ug.users_group_id))),
                 category='success')
             Session().commit()
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             return htmlfill.render(
                 render('admin/user_groups/user_group_add.html'),
                 defaults=errors.value,
@@ -200,7 +200,7 @@
                           None, self.ip_addr, self.sa)
             h.flash(_('Updated user group %s') % gr, category='success')
             Session().commit()
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             ug_model = UserGroupModel()
             defaults = errors.value
             e = errors.error_dict or {}
@@ -240,7 +240,7 @@
             UserGroupModel().delete(usr_gr)
             Session().commit()
             h.flash(_('Successfully deleted user group'), category='success')
-        except UserGroupsAssignedException, e:
+        except UserGroupsAssignedException as e:
             h.flash(e, category='error')
         except Exception:
             log.error(traceback.format_exc())
@@ -317,7 +317,7 @@
         #action_logger(self.authuser, 'admin_changed_repo_permissions',
         #              repo_name, self.ip_addr, self.sa)
         Session().commit()
-        h.flash(_('User Group permissions updated'), category='success')
+        h.flash(_('User group permissions updated'), category='success')
         return redirect(url('edit_user_group_perms', id=id))
 
     @HasUserGroupPermissionAnyDecorator('usergroup.admin')
--- a/kallithea/controllers/admin/users.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/admin/users.py	Sun Sep 06 23:36:05 2015 +0200
@@ -34,6 +34,7 @@
 from pylons.controllers.util import redirect
 from pylons.i18n.translation import _
 from sqlalchemy.sql.expression import func
+from webob.exc import HTTPNotFound
 
 import kallithea
 from kallithea.lib.exceptions import DefaultUserException, \
@@ -41,8 +42,8 @@
 from kallithea.lib import helpers as h
 from kallithea.lib.auth import LoginRequired, HasPermissionAllDecorator, \
     AuthUser
-import kallithea.lib.auth_modules.auth_internal
 from kallithea.lib import auth_modules
+from kallithea.lib.auth_modules import auth_internal
 from kallithea.lib.base import BaseController, render
 from kallithea.model.api_key import ApiKeyModel
 
@@ -120,7 +121,8 @@
     def create(self):
         """POST /users: Create a new item"""
         # url('users')
-        c.default_extern_type = auth_modules.auth_internal.KallitheaAuthPlugin.name
+        c.default_extern_type = auth_internal.KallitheaAuthPlugin.name
+        c.default_extern_name = auth_internal.KallitheaAuthPlugin.name
         user_model = UserModel()
         user_form = UserForm()()
         try:
@@ -132,7 +134,7 @@
             h.flash(h.literal(_('Created user %s') % h.link_to(h.escape(usr), url('edit_user', id=user.user_id))),
                     category='success')
             Session().commit()
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             return htmlfill.render(
                 render('admin/users/user_add.html'),
                 defaults=errors.value,
@@ -140,7 +142,7 @@
                 prefix_error=False,
                 encoding="UTF-8",
                 force_defaults=False)
-        except UserCreationError, e:
+        except UserCreationError as e:
             h.flash(e, 'error')
         except Exception:
             log.error(traceback.format_exc())
@@ -151,7 +153,8 @@
     def new(self, format='html'):
         """GET /users/new: Form to create a new item"""
         # url('new_user')
-        c.default_extern_type = auth_modules.auth_internal.KallitheaAuthPlugin.name
+        c.default_extern_type = auth_internal.KallitheaAuthPlugin.name
+        c.default_extern_name = auth_internal.KallitheaAuthPlugin.name
         return render('admin/users/user_add.html')
 
     def update(self, id):
@@ -162,22 +165,15 @@
         #    h.form(url('update_user', id=ID),
         #           method='put')
         # url('user', id=ID)
-        c.active = 'profile'
         user_model = UserModel()
-        c.user = user_model.get(id)
-        c.extern_type = c.user.extern_type
-        c.extern_name = c.user.extern_name
-        c.perm_user = AuthUser(user_id=id, ip_addr=self.ip_addr)
+        user = user_model.get(id)
         _form = UserForm(edit=True, old_data={'user_id': id,
-                                              'email': c.user.email})()
+                                              'email': user.email})()
         form_result = {}
         try:
             form_result = _form.to_python(dict(request.POST))
-            skip_attrs = ['extern_type', 'extern_name']
-            #TODO: plugin should define if username can be updated
-            if c.extern_type != kallithea.EXTERN_TYPE_INTERNAL:
-                # forbid updating username for external accounts
-                skip_attrs.append('username')
+            skip_attrs = ['extern_type', 'extern_name',
+                         ] + auth_modules.get_managed_fields(user)
 
             user_model.update(id, form_result, skip_attrs=skip_attrs)
             usr = form_result['username']
@@ -185,7 +181,7 @@
                           None, self.ip_addr, self.sa)
             h.flash(_('User updated successfully'), category='success')
             Session().commit()
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             defaults = errors.value
             e = errors.error_dict or {}
             defaults.update({
@@ -195,7 +191,7 @@
                 '_method': 'put'
             })
             return htmlfill.render(
-                render('admin/users/user_edit.html'),
+                self._render_edit_profile(user),
                 defaults=defaults,
                 errors=e,
                 prefix_error=False,
@@ -220,7 +216,7 @@
             UserModel().delete(usr)
             Session().commit()
             h.flash(_('Successfully deleted user'), category='success')
-        except (UserOwnsReposException, DefaultUserException), e:
+        except (UserOwnsReposException, DefaultUserException) as e:
             h.flash(e, category='warning')
         except Exception:
             log.error(traceback.format_exc())
@@ -233,34 +229,39 @@
         # url('user', id=ID)
         User.get_or_404(-1)
 
+    def _get_user_or_raise_if_default(self, id):
+        try:
+            return User.get_or_404(id, allow_default=False)
+        except DefaultUserException:
+            h.flash(_("The default user cannot be edited"), category='warning')
+            raise HTTPNotFound
+
+    def _render_edit_profile(self, user):
+        c.user = user
+        c.active = 'profile'
+        c.perm_user = AuthUser(dbuser=user)
+        c.ip_addr = self.ip_addr
+        managed_fields = auth_modules.get_managed_fields(user)
+        c.readonly = lambda n: 'readonly' if n in managed_fields else None
+        return render('admin/users/user_edit.html')
+
     def edit(self, id, format='html'):
         """GET /users/id/edit: Form to edit an existing item"""
         # url('edit_user', id=ID)
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
+        user = self._get_user_or_raise_if_default(id)
+        defaults = user.get_dict()
 
-        c.active = 'profile'
-        c.extern_type = c.user.extern_type
-        c.extern_name = c.user.extern_name
-        c.perm_user = AuthUser(user_id=id, ip_addr=self.ip_addr)
-
-        defaults = c.user.get_dict()
         return htmlfill.render(
-            render('admin/users/user_edit.html'),
+            self._render_edit_profile(user),
             defaults=defaults,
             encoding="UTF-8",
             force_defaults=False)
 
     def edit_advanced(self, id):
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
-
+        c.user = self._get_user_or_raise_if_default(id)
         c.active = 'advanced'
-        c.perm_user = AuthUser(user_id=id, ip_addr=self.ip_addr)
+        c.perm_user = AuthUser(user_id=id)
+        c.ip_addr = self.ip_addr
 
         umodel = UserModel()
         defaults = c.user.get_dict()
@@ -277,15 +278,11 @@
             force_defaults=False)
 
     def edit_api_keys(self, id):
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
-
+        c.user = self._get_user_or_raise_if_default(id)
         c.active = 'api_keys'
         show_expired = True
         c.lifetime_values = [
-            (str(-1), _('forever')),
+            (str(-1), _('Forever')),
             (str(5), _('5 minutes')),
             (str(60), _('1 hour')),
             (str(60 * 24), _('1 day')),
@@ -302,36 +299,30 @@
             force_defaults=False)
 
     def add_api_key(self, id):
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
+        c.user = self._get_user_or_raise_if_default(id)
 
         lifetime = safe_int(request.POST.get('lifetime'), -1)
         description = request.POST.get('description')
         ApiKeyModel().create(c.user.user_id, description, lifetime)
         Session().commit()
-        h.flash(_("Api key successfully created"), category='success')
+        h.flash(_("API key successfully created"), category='success')
         return redirect(url('edit_user_api_keys', id=c.user.user_id))
 
     def delete_api_key(self, id):
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
+        c.user = self._get_user_or_raise_if_default(id)
 
         api_key = request.POST.get('del_api_key')
         if request.POST.get('del_api_key_builtin'):
             user = User.get(c.user.user_id)
-            if user:
+            if user is not None:
                 user.api_key = generate_api_key()
                 Session().add(user)
                 Session().commit()
-                h.flash(_("Api key successfully reset"), category='success')
+                h.flash(_("API key successfully reset"), category='success')
         elif api_key:
             ApiKeyModel().delete(api_key, c.user.user_id)
             Session().commit()
-            h.flash(_("Api key successfully deleted"), category='success')
+            h.flash(_("API key successfully deleted"), category='success')
 
         return redirect(url('edit_user_api_keys', id=c.user.user_id))
 
@@ -339,13 +330,10 @@
         pass
 
     def edit_perms(self, id):
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
-
+        c.user = self._get_user_or_raise_if_default(id)
         c.active = 'perms'
-        c.perm_user = AuthUser(user_id=id, ip_addr=self.ip_addr)
+        c.perm_user = AuthUser(user_id=id)
+        c.ip_addr = self.ip_addr
 
         umodel = UserModel()
         defaults = c.user.get_dict()
@@ -364,7 +352,7 @@
     def update_perms(self, id):
         """PUT /users_perm/id: Update an existing item"""
         # url('user_perm', id=ID, method='put')
-        user = User.get_or_404(id)
+        user = self._get_user_or_raise_if_default(id)
 
         try:
             form = CustomDefaultPermissionsForm()()
@@ -402,11 +390,7 @@
         return redirect(url('edit_user_perms', id=id))
 
     def edit_emails(self, id):
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
-
+        c.user = self._get_user_or_raise_if_default(id)
         c.active = 'emails'
         c.user_email_map = UserEmailMap.query()\
             .filter(UserEmailMap.user == c.user).all()
@@ -421,7 +405,7 @@
     def add_email(self, id):
         """POST /user_emails:Add an existing item"""
         # url('user_emails', id=ID, method='put')
-
+        user = self._get_user_or_raise_if_default(id)
         email = request.POST.get('new_email')
         user_model = UserModel()
 
@@ -429,7 +413,7 @@
             user_model.add_extra_email(id, email)
             Session().commit()
             h.flash(_("Added email %s to user") % email, category='success')
-        except formencode.Invalid, error:
+        except formencode.Invalid as error:
             msg = error.error_dict['email']
             h.flash(msg, category='error')
         except Exception:
@@ -441,6 +425,7 @@
     def delete_email(self, id):
         """DELETE /user_emails_delete/id: Delete an existing item"""
         # url('user_emails_delete', id=ID, method='delete')
+        user = self._get_user_or_raise_if_default(id)
         email_id = request.POST.get('del_email_id')
         user_model = UserModel()
         user_model.delete_extra_email(id, email_id)
@@ -449,11 +434,7 @@
         return redirect(url('edit_user_emails', id=id))
 
     def edit_ips(self, id):
-        c.user = User.get_or_404(id)
-        if c.user.username == User.DEFAULT_USER:
-            h.flash(_("You can't edit this user"), category='warning')
-            return redirect(url('users'))
-
+        c.user = self._get_user_or_raise_if_default(id)
         c.active = 'ips'
         c.user_ip_map = UserIpMap.query()\
             .filter(UserIpMap.user == c.user).all()
@@ -479,13 +460,13 @@
         try:
             user_model.add_extra_ip(id, ip)
             Session().commit()
-            h.flash(_("Added ip %s to user whitelist") % ip, category='success')
-        except formencode.Invalid, error:
+            h.flash(_("Added IP address %s to user whitelist") % ip, category='success')
+        except formencode.Invalid as error:
             msg = error.error_dict['ip']
             h.flash(msg, category='error')
         except Exception:
             log.error(traceback.format_exc())
-            h.flash(_('An error occurred during ip saving'),
+            h.flash(_('An error occurred while adding IP address'),
                     category='error')
 
         if 'default_user' in request.POST:
@@ -499,7 +480,7 @@
         user_model = UserModel()
         user_model.delete_extra_ip(id, ip_id)
         Session().commit()
-        h.flash(_("Removed ip address from user whitelist"), category='success')
+        h.flash(_("Removed IP address from user whitelist"), category='success')
 
         if 'default_user' in request.POST:
             return redirect(url('admin_permissions_ips'))
--- a/kallithea/controllers/api/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/api/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -117,7 +117,7 @@
         else:
             length = environ['CONTENT_LENGTH'] or 0
             length = int(environ['CONTENT_LENGTH'])
-            log.debug('Content-Length: %s' % length)
+            log.debug('Content-Length: %s', length)
 
         if length == 0:
             log.debug("Content-Length is 0")
@@ -128,13 +128,13 @@
 
         try:
             json_body = json.loads(raw_body)
-        except ValueError, e:
+        except ValueError as e:
             # catch JSON errors Here
             return jsonrpc_error(retid=self._req_id,
                                  message="JSON parse error ERR:%s RAW:%r"
                                  % (e, raw_body))
 
-        # check AUTH based on API KEY
+        # check AUTH based on API key
         try:
             self._req_api_key = json_body['api_key']
             self._req_id = json_body['id']
@@ -144,10 +144,10 @@
                 self._request_params = {}
 
             log.debug(
-                'method: %s, params: %s' % (self._req_method,
-                                            self._request_params)
+                'method: %s, params: %s', self._req_method,
+                                            self._request_params
             )
-        except KeyError, e:
+        except KeyError as e:
             return jsonrpc_error(retid=self._req_id,
                                  message='Incorrect JSON query missing %s' % e)
 
@@ -156,24 +156,23 @@
             u = User.get_by_api_key(self._req_api_key)
             if u is None:
                 return jsonrpc_error(retid=self._req_id,
-                                     message='Invalid API KEY')
+                                     message='Invalid API key')
 
-            #check if we are allowed to use this IP
-            auth_u = AuthUser(u.user_id, self._req_api_key, ip_addr=ip_addr)
-            if not auth_u.ip_allowed:
+            auth_u = AuthUser(dbuser=u)
+            if not AuthUser.check_ip_allowed(auth_u, ip_addr):
                 return jsonrpc_error(retid=self._req_id,
                         message='request from IP:%s not allowed' % (ip_addr,))
             else:
-                log.info('Access for IP:%s allowed' % (ip_addr,))
+                log.info('Access for IP:%s allowed', ip_addr)
 
-        except Exception, e:
+        except Exception as e:
             return jsonrpc_error(retid=self._req_id,
-                                 message='Invalid API KEY')
+                                 message='Invalid API key')
 
         self._error = None
         try:
             self._func = self._find_method()
-        except AttributeError, e:
+        except AttributeError as e:
             return jsonrpc_error(retid=self._req_id,
                                  message=str(e))
 
@@ -208,7 +207,7 @@
         # get our arglist and check if we provided them as args
         for arg, default in func_kwargs.iteritems():
             if arg == USER_SESSION_ATTR:
-                # USER_SESSION_ATTR is something translated from api key and
+                # USER_SESSION_ATTR is something translated from API key and
                 # this is checked before so we don't need validate it
                 continue
 
@@ -259,11 +258,11 @@
             raw_response = self._inspect_call(self._func)
             if isinstance(raw_response, HTTPError):
                 self._error = str(raw_response)
-        except JSONRPCError, e:
+        except JSONRPCError as e:
             self._error = safe_str(e)
-        except Exception, e:
-            log.error('Encountered unhandled exception: %s'
-                      % (traceback.format_exc(),))
+        except Exception as e:
+            log.error('Encountered unhandled exception: %s',
+                      traceback.format_exc(),)
             json_exc = JSONRPCError('Internal server error')
             self._error = safe_str(json_exc)
 
@@ -273,8 +272,8 @@
         response = dict(id=self._req_id, result=raw_response, error=self._error)
         try:
             return json.dumps(response)
-        except TypeError, e:
-            log.error('API FAILED. Error encoding response: %s' % e)
+        except TypeError as e:
+            log.error('API FAILED. Error encoding response: %s', e)
             return json.dumps(
                 dict(
                     id=self._req_id,
@@ -287,7 +286,7 @@
         """
         Return method named by `self._req_method` in controller if able
         """
-        log.debug('Trying to find JSON-RPC method: %s' % (self._req_method,))
+        log.debug('Trying to find JSON-RPC method: %s', self._req_method)
         if self._req_method.startswith('_'):
             raise AttributeError("Method not allowed")
 
--- a/kallithea/controllers/api/api.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/api/api.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.controllers.api
-~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.controllers.api.api
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 API controller for Kallithea
 
@@ -463,7 +463,7 @@
             if time_:
                 _api_data = r.get_api_data()
                 # if we use userfilter just show the locks for this user
-                if user:
+                if user is not None:
                     if safe_int(userid) == user.user_id:
                         ret.append(_api_data)
                 else:
@@ -553,7 +553,7 @@
                     {
                         "user_id" :     "<user_id>",
                         "api_key" :     "<api_key>",
-                        "api_keys":     "[<list of all api keys including additional ones>]"
+                        "api_keys":     "[<list of all API keys including additional ones>]"
                         "username" :    "<username>",
                         "firstname":    "<firstname>",
                         "lastname" :    "<lastname>",
@@ -672,10 +672,10 @@
 
         """
 
-        if UserModel().get_by_username(username):
+        if User.get_by_username(username):
             raise JSONRPCError("user `%s` already exist" % (username,))
 
-        if UserModel().get_by_email(email, case_insensitive=True):
+        if User.get_by_email(email, case_insensitive=True):
             raise JSONRPCError("email `%s` already exist" % (email,))
 
         if Optional.extract(extern_name):
@@ -1066,7 +1066,7 @@
                     (user_group.users_group_id, user_group.users_group_name),
                 user_group=None
             )
-        except UserGroupsAssignedException, e:
+        except UserGroupsAssignedException as e:
             log.error(traceback.format_exc())
             raise JSONRPCError(str(e))
         except Exception:
--- a/kallithea/controllers/changelog.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/changelog.py	Sun Sep 06 23:36:05 2015 +0200
@@ -82,10 +82,10 @@
 
         try:
             return c.db_repo_scm_instance.get_changeset(rev)
-        except EmptyRepositoryError, e:
+        except EmptyRepositoryError as e:
             h.flash(h.literal(_('There are no changesets yet')),
                     category='error')
-        except RepositoryError, e:
+        except RepositoryError as e:
             log.error(traceback.format_exc())
             h.flash(safe_str(e), category='error')
         raise HTTPBadRequest()
@@ -94,6 +94,15 @@
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
     def index(self, repo_name, revision=None, f_path=None):
+        # Fix URL after page size form submission via GET
+        # TODO: Somehow just don't send this extra junk in the GET URL
+        if request.GET.get('set'):
+            request.GET.pop('set', None)
+            request.GET.pop('_authentication_token', None)
+            if revision is None:
+                return redirect(url('changelog_home', repo_name=repo_name, **request.GET))
+            return redirect(url('changelog_file_home', repo_name=repo_name, revision=revision, f_path=f_path, **request.GET))
+
         limit = 2000
         default = 100
         if request.GET.get('size'):
@@ -120,7 +129,7 @@
         try:
 
             if f_path:
-                log.debug('generating changelog for path %s' % f_path)
+                log.debug('generating changelog for path %s', f_path)
                 # get the history for the file !
                 tip_cs = c.db_repo_scm_instance.get_changeset()
                 try:
@@ -130,7 +139,7 @@
                     try:
                         cs = self.__get_cs(revision, repo_name)
                         collection = cs.get_file_history(f_path)
-                    except RepositoryError, e:
+                    except RepositoryError as e:
                         h.flash(safe_str(e), category='warning')
                         redirect(h.url('changelog_home', repo_name=repo_name))
                 collection = list(reversed(collection))
@@ -145,10 +154,10 @@
             page_revisions = [x.raw_id for x in c.pagination]
             c.comments = c.db_repo.get_comments(page_revisions)
             c.statuses = c.db_repo.statuses(page_revisions)
-        except (EmptyRepositoryError), e:
+        except EmptyRepositoryError as e:
             h.flash(safe_str(e), category='warning')
             return redirect(url('summary_home', repo_name=c.repo_name))
-        except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
+        except (RepositoryError, ChangesetDoesNotExistError, Exception) as e:
             log.error(traceback.format_exc())
             h.flash(safe_str(e), category='error')
             return redirect(url('changelog_home', repo_name=c.repo_name))
--- a/kallithea/controllers/changeset.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/changeset.py	Sun Sep 06 23:36:05 2015 +0200
@@ -166,7 +166,7 @@
     if ig_ws:
         params[ig_ws_key] += [ig_ws_val]
 
-    lbl = _('increase diff context to %(num)s lines') % {'num': ln_ctx}
+    lbl = _('Increase diff context to %(num)s lines') % {'num': ln_ctx}
 
     params['anchor'] = fileid
     icon = h.literal('<i class="icon-sort"></i>')
@@ -208,7 +208,7 @@
                 raise RepositoryError('Changeset range returned empty result')
 
         except(ChangesetDoesNotExistError,), e:
-            log.error(traceback.format_exc())
+            log.debug(traceback.format_exc())
             msg = _('Such revision does not exist for this repository')
             h.flash(msg, category='error')
             raise HTTPNotFound()
@@ -241,7 +241,8 @@
                 comments.update((st.changeset_comment_id, st.comment)
                                 for st in ChangesetStatusModel()
                                 .get_statuses(c.db_repo.repo_id,
-                                              changeset.raw_id, with_revisions=True))
+                                              changeset.raw_id, with_revisions=True)
+                                if st.changeset_comment_id is not None)
 
                 inlines = ChangesetCommentsModel()\
                             .get_inline_comments(c.db_repo.repo_id,
@@ -349,9 +350,9 @@
     @jsonify
     def comment(self, repo_name, revision):
         status = request.POST.get('changeset_status')
-        text = request.POST.get('text', '').strip() or _('No comments.')
+        text = request.POST.get('text', '').strip()
 
-        c.co = comm = ChangesetCommentsModel().create(
+        c.comment = comment = ChangesetCommentsModel().create(
             text=text,
             repo=c.db_repo.repo_id,
             user=c.authuser.user_id,
@@ -373,12 +374,12 @@
                     c.db_repo.repo_id,
                     status,
                     c.authuser.user_id,
-                    comm,
+                    comment,
                     revision=revision,
                     dont_allow_on_closed_pull_request=True
                 )
             except StatusChangeOnClosedPullRequestError:
-                log.error(traceback.format_exc())
+                log.debug(traceback.format_exc())
                 msg = _('Changing status on a changeset associated with '
                         'a closed pull request is not allowed')
                 h.flash(msg, category='warning')
@@ -397,8 +398,8 @@
         data = {
            'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
         }
-        if comm:
-            data.update(comm.get_dict())
+        if comment is not None:
+            data.update(comment.get_dict())
             data.update({'rendered_text':
                          render('changeset/changeset_comment_block.html')})
 
@@ -442,7 +443,7 @@
         if request.is_xhr:
             try:
                 return c.db_repo_scm_instance.get_changeset(revision)
-            except ChangesetDoesNotExistError, e:
+            except ChangesetDoesNotExistError as e:
                 return EmptyChangeset(message=str(e))
         else:
             raise HTTPBadRequest()
--- a/kallithea/controllers/compare.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/compare.py	Sun Sep 06 23:36:05 2015 +0200
@@ -42,8 +42,7 @@
 from kallithea.lib import diffs
 from kallithea.model.db import Repository
 from kallithea.lib.diffs import LimitedDiffContainer
-from kallithea.controllers.changeset import _ignorews_url,\
-    _context_url, get_line_ctx, get_ignore_ws
+from kallithea.controllers.changeset import _ignorews_url, _context_url
 from kallithea.lib.graphmod import graph_data
 from kallithea.lib.compat import json
 
@@ -70,7 +69,7 @@
         :param other_rev: revision we want out compare to be made on other_repo
         """
         ancestor = None
-        if org_rev == other_rev or org_repo.EMPTY_CHANGESET in (org_rev, other_rev):
+        if org_rev == other_rev:
             org_changesets = []
             other_changesets = []
             ancestor = org_rev
@@ -88,14 +87,18 @@
             else:
                 hgrepo = other_repo._repo
 
-            ancestors = hgrepo.revs("ancestor(id(%s), id(%s))", org_rev, other_rev)
-            if ancestors:
-                # FIXME: picks arbitrary ancestor - but there is usually only one
-                try:
-                    ancestor = hgrepo[ancestors.first()].hex()
-                except AttributeError:
-                    # removed in hg 3.2
-                    ancestor = hgrepo[ancestors[0]].hex()
+            if org_repo.EMPTY_CHANGESET in (org_rev, other_rev):
+                # work around unexpected behaviour in Mercurial < 3.4
+                ancestor = org_repo.EMPTY_CHANGESET
+            else:
+                ancestors = hgrepo.revs("ancestor(id(%s), id(%s))", org_rev, other_rev)
+                if ancestors:
+                    # FIXME: picks arbitrary ancestor - but there is usually only one
+                    try:
+                        ancestor = hgrepo[ancestors.first()].hex()
+                    except AttributeError:
+                        # removed in hg 3.2
+                        ancestor = hgrepo[ancestors[0]].hex()
 
             other_revs = hgrepo.revs("ancestors(id(%s)) and not ancestors(id(%s)) and not id(%s)",
                                      other_rev, org_rev, org_rev)
@@ -130,13 +133,13 @@
 
             else:
                 so, se = org_repo.run_git_command(
-                    'log --reverse --pretty="format: %%H" -s %s..%s'
-                        % (org_rev, other_rev)
+                    ['log', '--reverse', '--pretty=format:%H',
+                     '-s', '%s..%s' % (org_rev, other_rev)]
                 )
                 other_changesets = [org_repo.get_changeset(cs)
                               for cs in re.findall(r'[0-9a-fA-F]{40}', so)]
                 so, se = org_repo.run_git_command(
-                    'merge-base %s %s' % (org_rev, other_rev)
+                    ['merge-base', org_rev, other_rev]
                 )
                 ancestor = re.findall(r'[0-9a-fA-F]{40}', so)[0]
             org_changesets = []
@@ -162,6 +165,9 @@
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
     def compare(self, repo_name, org_ref_type, org_ref_name, other_ref_type, other_ref_name):
+        org_ref_name = org_ref_name.strip()
+        other_ref_name = other_ref_name.strip()
+
         org_repo = c.db_repo.repo_name
         other_repo = request.GET.get('other_repo', org_repo)
         # If merge is True:
@@ -242,8 +248,8 @@
             # case we want a simple diff without incoming changesets,
             # previewing what will be merged.
             # Make the diff on the other repo (which is known to have other_rev)
-            log.debug('Using ancestor %s as rev1 instead of %s'
-                      % (c.ancestor, c.a_rev))
+            log.debug('Using ancestor %s as rev1 instead of %s',
+                      c.ancestor, c.a_rev)
             rev1 = c.ancestor
             org_repo = other_repo
         else: # comparing tips, not necessarily linearly related
@@ -258,8 +264,8 @@
 
         diff_limit = self.cut_off_limit if not c.fulldiff else None
 
-        log.debug('running diff between %s and %s in %s'
-                  % (rev1, c.cs_rev, org_repo.scm_instance.path))
+        log.debug('running diff between %s and %s in %s',
+                  rev1, c.cs_rev, org_repo.scm_instance.path)
         txtdiff = org_repo.scm_instance.get_diff(rev1=rev1, rev2=c.cs_rev,
                                       ignore_whitespace=ignore_whitespace,
                                       context=line_context)
--- a/kallithea/controllers/error.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/error.py	Sun Sep 06 23:36:05 2015 +0200
@@ -32,7 +32,7 @@
 
 from pylons import tmpl_context as c, request, config
 from pylons.i18n.translation import _
-from pylons.middleware import  media_path
+from pylons.middleware import media_path
 
 from kallithea.lib.base import BaseController, render
 
@@ -50,22 +50,26 @@
     """
 
     def __before__(self):
-        #disable all base actions since we don't need them here
+        # disable all base actions since we don't need them here
         pass
 
     def document(self):
         resp = request.environ.get('pylons.original_response')
         c.site_name = config.get('title')
 
-        log.debug('### %s ###' % (resp and resp.status or 'no response'))
+        log.debug('### %s ###', resp and resp.status or 'no response')
 
         e = request.environ
-        c.serv_p = r'%(protocol)s://%(host)s/' \
-                                    % {'protocol': e.get('wsgi.url_scheme'),
-                                       'host': e.get('HTTP_HOST'), }
-
-        c.error_message = resp and cgi.escape(request.GET.get('code', str(resp.status)))
-        c.error_explanation = resp and self.get_error_explanation(resp.status_int)
+        c.serv_p = r'%(protocol)s://%(host)s/' % {
+            'protocol': e.get('wsgi.url_scheme'),
+            'host': e.get('HTTP_HOST'), }
+        if resp:
+            c.error_message = cgi.escape(request.GET.get('code',
+                                                         str(resp.status)))
+            c.error_explanation = self.get_error_explanation(resp.status_int)
+        else:
+            c.error_message = _('No response')
+            c.error_explanation = _('Unknown error')
 
         return render('/errors/error_document.html')
 
--- a/kallithea/controllers/feed.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/feed.py	Sun Sep 06 23:36:05 2015 +0200
@@ -65,9 +65,7 @@
         self.feed_diff_limit = safe_int(CONF.get('rss_cut_off_limit', 32 * 1024))
 
     def _get_title(self, cs):
-        return "%s" % (
-            h.shorter(cs.message, 160)
-        )
+        return h.shorter(cs.message, 160)
 
     def __changes(self, cs):
         changes = []
--- a/kallithea/controllers/files.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/files.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 import os
 import logging
 import traceback
@@ -83,7 +82,7 @@
 
         try:
             return c.db_repo_scm_instance.get_changeset(rev)
-        except EmptyRepositoryError, e:
+        except EmptyRepositoryError as e:
             if silent_empty:
                 return None
             url_ = url('files_add_home',
@@ -97,7 +96,7 @@
             msg = _('Such revision does not exist for this repository')
             h.flash(msg, category='error')
             raise HTTPNotFound()
-        except RepositoryError, e:
+        except RepositoryError as e:
             h.flash(safe_str(e), category='error')
             raise HTTPNotFound()
 
@@ -117,7 +116,7 @@
             msg = _('Such revision does not exist for this repository')
             h.flash(msg, category='error')
             raise HTTPNotFound()
-        except RepositoryError, e:
+        except RepositoryError as e:
             h.flash(safe_str(e), category='error')
             raise HTTPNotFound()
 
@@ -182,7 +181,7 @@
                     c.authors.append((h.email(a), h.person(a)))
             else:
                 c.authors = c.file_history = []
-        except RepositoryError, e:
+        except RepositoryError as e:
             h.flash(safe_str(e), category='error')
             raise HTTPNotFound()
 
@@ -490,12 +489,12 @@
 
                 h.flash(_('Successfully committed to %s') % node_path,
                         category='success')
-            except NonRelativePathError, e:
+            except NonRelativePathError as e:
                 h.flash(_('Location must be relative path and must not '
                           'contain .. in path'), category='warning')
                 return redirect(url('changeset_home', repo_name=c.repo_name,
                                     revision='tip'))
-            except (NodeError, NodeAlreadyExistsError), e:
+            except (NodeError, NodeAlreadyExistsError) as e:
                 h.flash(_(e), category='error')
             except Exception:
                 log.error(traceback.format_exc())
@@ -509,7 +508,6 @@
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
     def archivefile(self, repo_name, fname):
-
         fileformat = None
         revision = None
         ext = None
@@ -525,7 +523,7 @@
         try:
             dbrepo = RepoModel().get_by_repo_name(repo_name)
             if not dbrepo.enable_downloads:
-                return _('Downloads disabled')
+                return _('Downloads disabled') # TODO: do something else?
 
             if c.db_repo_scm_instance.alias == 'hg':
                 # patch and reset hooks section of UI config to not run any
@@ -541,58 +539,57 @@
             return _('Empty repository')
         except (ImproperArchiveTypeError, KeyError):
             return _('Unknown archive type')
-        # archive cache
+
         from kallithea import CONFIG
         rev_name = cs.raw_id[:12]
         archive_name = '%s-%s%s' % (safe_str(repo_name.replace('/', '_')),
                                     safe_str(rev_name), ext)
 
-        use_cached_archive = False  # defines if we use cached version of archive
-        archive_cache_enabled = CONFIG.get('archive_cache_dir')
-        if not subrepos and archive_cache_enabled:
-            #check if we it's ok to write
-            if not os.path.isdir(CONFIG['archive_cache_dir']):
-                os.makedirs(CONFIG['archive_cache_dir'])
-            cached_archive_path = os.path.join(CONFIG['archive_cache_dir'], archive_name)
+        archive_path = None
+        cached_archive_path = None
+        archive_cache_dir = CONFIG.get('archive_cache_dir')
+        if archive_cache_dir and not subrepos: # TOOD: subrepo caching?
+            if not os.path.isdir(archive_cache_dir):
+                os.makedirs(archive_cache_dir)
+            cached_archive_path = os.path.join(archive_cache_dir, archive_name)
             if os.path.isfile(cached_archive_path):
-                log.debug('Found cached archive in %s' % cached_archive_path)
-                archive = cached_archive_path
-                use_cached_archive = True
+                log.debug('Found cached archive in %s', cached_archive_path)
+                archive_path = cached_archive_path
             else:
-                log.debug('Archive %s is not yet cached' % (archive_name))
+                log.debug('Archive %s is not yet cached', archive_name)
 
-        if not use_cached_archive:
+        if archive_path is None:
             # generate new archive
-            fd, archive = tempfile.mkstemp()
-            os.close(fd)
-            temp_stream = open(archive, 'wb')
-            log.debug('Creating new temp archive in %s' % archive)
-            cs.fill_archive(stream=temp_stream, kind=fileformat, subrepos=subrepos)
-            temp_stream.close()
-            if not subrepos and archive_cache_enabled:
-                #if we generated the archive and use cache rename that
-                log.debug('Storing new archive in %s' % cached_archive_path)
-                shutil.move(archive, cached_archive_path)
-                archive = cached_archive_path
+            fd, archive_path = tempfile.mkstemp()
+            log.debug('Creating new temp archive in %s', archive_path)
+            with os.fdopen(fd, 'wb') as stream:
+                cs.fill_archive(stream=stream, kind=fileformat, subrepos=subrepos)
+                # stream (and thus fd) has been closed by cs.fill_archive
+            if cached_archive_path is not None:
+                # we generated the archive - move it to cache
+                log.debug('Storing new archive in %s', cached_archive_path)
+                shutil.move(archive_path, cached_archive_path)
+                archive_path = cached_archive_path
 
-        def get_chunked_archive(archive):
-            stream = open(archive, 'rb')
+        def get_chunked_archive(archive_path):
+            stream = open(archive_path, 'rb')
             while True:
                 data = stream.read(16 * 1024)
                 if not data:
-                    stream.close()
-                    if not archive_cache_enabled:
-                        log.debug('Destroying temp archive %s' % archive)
-                        os.remove(archive)
                     break
                 yield data
-        # store download action
+            stream.close()
+            if archive_path != cached_archive_path:
+                log.debug('Destroying temp archive %s', archive_path)
+                os.remove(archive_path)
+
         action_logger(user=c.authuser,
                       action='user_downloaded_archive:%s' % (archive_name),
                       repo=repo_name, ipaddr=self.ip_addr, commit=True)
+
         response.content_disposition = str('attachment; filename=%s' % (archive_name))
         response.content_type = str(content_type)
-        return get_chunked_archive(archive)
+        return get_chunked_archive(archive_path)
 
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
--- a/kallithea/controllers/forks.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/forks.py	Sun Sep 06 23:36:05 2015 +0200
@@ -38,13 +38,12 @@
 
 from kallithea.lib.helpers import Page
 from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator, \
-    NotAnonymous, HasRepoPermissionAny, HasPermissionAnyDecorator
+    NotAnonymous, HasRepoPermissionAny, HasPermissionAnyDecorator, HasPermissionAny
 from kallithea.lib.base import BaseRepoController, render
-from kallithea.model.db import Repository, RepoGroup, UserFollowing, User,\
-    Ui
+from kallithea.model.db import Repository, UserFollowing, User, Ui
 from kallithea.model.repo import RepoModel
 from kallithea.model.forms import RepoForkForm
-from kallithea.model.scm import ScmModel, RepoGroupList
+from kallithea.model.scm import ScmModel, AvailableRepoGroupChoices
 from kallithea.lib.utils2 import safe_int
 
 log = logging.getLogger(__name__)
@@ -56,12 +55,13 @@
         super(ForksController, self).__before__()
 
     def __load_defaults(self):
-        acl_groups = RepoGroupList(RepoGroup.query().all(),
-                               perm_set=['group.write', 'group.admin'])
-        c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
-        c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
-        choices, c.landing_revs = ScmModel().get_repo_landing_revs()
-        c.landing_revs_choices = choices
+        repo_group_perms = ['group.admin']
+        if HasPermissionAny('hg.create.write_on_repogroup.true')():
+            repo_group_perms.append('group.write')
+        c.repo_groups = AvailableRepoGroupChoices(['hg.create.repository'], repo_group_perms)
+
+        c.landing_revs_choices, c.landing_revs = ScmModel().get_repo_landing_revs()
+
         c.can_update = Ui.get_by_key(Ui.HOOK_UPDATE).ui_active
 
     def __load_data(self, repo_name=None):
@@ -156,7 +156,7 @@
         self.__load_defaults()
         c.repo_info = Repository.get_by_repo_name(repo_name)
         _form = RepoForkForm(old_data={'repo_type': c.repo_info.repo_type},
-                             repo_groups=c.repo_groups_choices,
+                             repo_groups=c.repo_groups,
                              landing_revs=c.landing_revs_choices)()
         form_result = {}
         task_id = None
@@ -173,8 +173,7 @@
             from celery.result import BaseAsyncResult
             if isinstance(task, BaseAsyncResult):
                 task_id = task.task_id
-        except formencode.Invalid, errors:
-            c.new_repo = errors.value['repo_name']
+        except formencode.Invalid as errors:
             return htmlfill.render(
                 render('forks/fork.html'),
                 defaults=errors.value,
--- a/kallithea/controllers/journal.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/journal.py	Sun Sep 06 23:36:05 2015 +0200
@@ -108,11 +108,11 @@
         journal = self._get_journal_data(repos)
         if public:
             _link = h.canonical_url('public_journal_atom')
-            _desc = '%s %s %s' % (c.site_name, _('public journal'),
+            _desc = '%s %s %s' % (c.site_name, _('Public Journal'),
                                   'atom feed')
         else:
             _link = h.canonical_url('journal_atom')
-            _desc = '%s %s %s' % (c.site_name, _('journal'), 'atom feed')
+            _desc = '%s %s %s' % (c.site_name, _('Journal'), 'atom feed')
 
         feed = Atom1Feed(title=_desc,
                          link=_link,
@@ -150,11 +150,11 @@
         journal = self._get_journal_data(repos)
         if public:
             _link = h.canonical_url('public_journal_atom')
-            _desc = '%s %s %s' % (c.site_name, _('public journal'),
+            _desc = '%s %s %s' % (c.site_name, _('Public Journal'),
                                   'rss feed')
         else:
             _link = h.canonical_url('journal_atom')
-            _desc = '%s %s %s' % (c.site_name, _('journal'), 'rss feed')
+            _desc = '%s %s %s' % (c.site_name, _('Journal'), 'rss feed')
 
         feed = Rss201rev2Feed(title=_desc,
                          link=_link,
@@ -239,10 +239,7 @@
 
         def desc(desc):
             from pylons import tmpl_context as c
-            if c.visual.stylify_metatags:
-                return h.urlify_text(h.desc_stylize(h.truncate(desc, 60)))
-            else:
-                return h.urlify_text(h.truncate(desc, 60))
+            return h.urlify_text(desc, truncate=60, stylize=c.visual.stylify_metatags)
 
         def repo_actions(repo_name):
             return _render('repo_actions', repo_name)
--- a/kallithea/controllers/login.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/login.py	Sun Sep 06 23:36:05 2015 +0200
@@ -28,22 +28,22 @@
 
 import logging
 import formencode
-import datetime
 import urlparse
 
 from formencode import htmlfill
-from webob.exc import HTTPFound
+from webob.exc import HTTPFound, HTTPBadRequest
 from pylons.i18n.translation import _
 from pylons.controllers.util import redirect
 from pylons import request, session, tmpl_context as c, url
 
 import kallithea.lib.helpers as h
 from kallithea.lib.auth import AuthUser, HasPermissionAnyDecorator
-from kallithea.lib.auth_modules import importplugin
-from kallithea.lib.base import BaseController, render
+from kallithea.lib.base import BaseController, log_in_user, render
 from kallithea.lib.exceptions import UserCreationError
+from kallithea.lib.utils2 import safe_str
 from kallithea.model.db import User, Setting
-from kallithea.model.forms import LoginForm, RegisterForm, PasswordResetForm
+from kallithea.model.forms import \
+    LoginForm, RegisterForm, PasswordResetRequestForm, PasswordResetConfirmationForm
 from kallithea.model.user import UserModel
 from kallithea.model.meta import Session
 
@@ -56,76 +56,50 @@
     def __before__(self):
         super(LoginController, self).__before__()
 
-    def _store_user_in_session(self, username, remember=False):
-        user = User.get_by_username(username, case_insensitive=True)
-        auth_user = AuthUser(user.user_id)
-        auth_user.set_authenticated()
-        cs = auth_user.get_cookie_store()
-        session['authuser'] = cs
-        user.update_lastlogin()
-        Session().commit()
-
-        # If they want to be remembered, update the cookie
-        if remember:
-            _year = (datetime.datetime.now() +
-                     datetime.timedelta(seconds=60 * 60 * 24 * 365))
-            session._set_cookie_expires(_year)
-
-        session.save()
-
-        log.info('user %s is now authenticated and stored in '
-                 'session, session attrs %s' % (username, cs))
-
-        # dumps session attrs back to cookie
-        session._update_cookie_out()
-        # we set new cookie
-        headers = None
-        if session.request['set_cookie']:
-            # send set-cookie headers back to response to update cookie
-            headers = [('Set-Cookie', session.request['cookie_out'])]
-        return headers
-
     def _validate_came_from(self, came_from):
+        """Return True if came_from is valid and can and should be used"""
         if not came_from:
-            return came_from
+            return False
 
         parsed = urlparse.urlparse(came_from)
         server_parsed = urlparse.urlparse(url.current())
         allowed_schemes = ['http', 'https']
         if parsed.scheme and parsed.scheme not in allowed_schemes:
-            log.error('Suspicious URL scheme detected %s for url %s' %
-                     (parsed.scheme, parsed))
-            came_from = url('home')
-        elif server_parsed.netloc != parsed.netloc:
+            log.error('Suspicious URL scheme detected %s for url %s',
+                     parsed.scheme, parsed)
+            return False
+        if server_parsed.netloc != parsed.netloc:
             log.error('Suspicious NETLOC detected %s for url %s server url '
                       'is: %s' % (parsed.netloc, parsed, server_parsed))
-            came_from = url('home')
-        return came_from
+            return False
+        return True
+
+    def _redirect_to_origin(self, origin):
+        '''redirect to the original page, preserving any get arguments given'''
+        request.GET.pop('came_from', None)
+        raise HTTPFound(location=url(origin, **request.GET))
 
     def index(self):
-        _default_came_from = url('home')
-        came_from = self._validate_came_from(request.GET.get('came_from'))
-        c.came_from = came_from or _default_came_from
+        c.came_from = safe_str(request.GET.get('came_from', ''))
+        if not self._validate_came_from(c.came_from):
+            c.came_from = url('home')
 
         not_default = self.authuser.username != User.DEFAULT_USER
-        ip_allowed = self.authuser.ip_allowed
+        ip_allowed = AuthUser.check_ip_allowed(self.authuser, self.ip_addr)
 
         # redirect if already logged in
         if self.authuser.is_authenticated and not_default and ip_allowed:
-            raise HTTPFound(location=c.came_from)
+            return self._redirect_to_origin(c.came_from)
 
         if request.POST:
             # import Login Form validator class
             login_form = LoginForm()
             try:
-                session.invalidate()
                 c.form_result = login_form.to_python(dict(request.POST))
                 # form checks for username/password, now we're authenticated
-                headers = self._store_user_in_session(
-                                        username=c.form_result['username'],
-                                        remember=c.form_result['remember'])
-                raise HTTPFound(location=c.came_from, headers=headers)
-            except formencode.Invalid, errors:
+                username = c.form_result['username']
+                user = User.get_by_username(username, case_insensitive=True)
+            except formencode.Invalid as errors:
                 defaults = errors.value
                 # remove password from filling in form again
                 del defaults['password']
@@ -136,28 +110,17 @@
                     prefix_error=False,
                     encoding="UTF-8",
                     force_defaults=False)
-            except UserCreationError, e:
+            except UserCreationError as e:
                 # container auth or other auth functions that create users on
                 # the fly can throw this exception signaling that there's issue
                 # with user creation, explanation should be provided in
                 # Exception itself
                 h.flash(e, 'error')
+            else:
+                log_in_user(user, c.form_result['remember'],
+                    is_external_auth=False)
+                return self._redirect_to_origin(c.came_from)
 
-        # check if we use container plugin, and try to login using it.
-        auth_plugins = Setting.get_auth_plugins()
-        if any((importplugin(name).is_container_auth for name in auth_plugins)):
-            from kallithea.lib import auth_modules
-            try:
-                auth_info = auth_modules.authenticate('', '', request.environ)
-            except UserCreationError, e:
-                log.error(e)
-                h.flash(e, 'error')
-                # render login, with flash message about limit
-                return render('/login.html')
-
-            if auth_info:
-                headers = self._store_user_in_session(auth_info.get('username'))
-                raise HTTPFound(location=c.came_from, headers=headers)
         return render('/login.html')
 
     @HasPermissionAnyDecorator('hg.admin', 'hg.register.auto_activate',
@@ -185,7 +148,7 @@
                                       remoteip=self.ip_addr)
                     if c.captcha_active and not response.is_valid:
                         _value = form_result
-                        _msg = _('bad captcha')
+                        _msg = _('Bad captcha')
                         error_dict = {'recaptcha_field': _msg}
                         raise formencode.Invalid(_msg, _value, None,
                                                  error_dict=error_dict)
@@ -196,7 +159,7 @@
                 Session().commit()
                 return redirect(url('login_home'))
 
-            except formencode.Invalid, errors:
+            except formencode.Invalid as errors:
                 return htmlfill.render(
                     render('/register.html'),
                     defaults=errors.value,
@@ -204,7 +167,7 @@
                     prefix_error=False,
                     encoding="UTF-8",
                     force_defaults=False)
-            except UserCreationError, e:
+            except UserCreationError as e:
                 # container auth or other auth functions that create users on
                 # the fly can throw this exception signaling that there's issue
                 # with user creation, explanation should be provided in
@@ -220,7 +183,7 @@
         c.captcha_public_key = settings.get('captcha_public_key')
 
         if request.POST:
-            password_reset_form = PasswordResetForm()()
+            password_reset_form = PasswordResetRequestForm()()
             try:
                 form_result = password_reset_form.to_python(dict(request.POST))
                 if c.captcha_active:
@@ -231,16 +194,16 @@
                                       remoteip=self.ip_addr)
                     if c.captcha_active and not response.is_valid:
                         _value = form_result
-                        _msg = _('bad captcha')
+                        _msg = _('Bad captcha')
                         error_dict = {'recaptcha_field': _msg}
                         raise formencode.Invalid(_msg, _value, None,
                                                  error_dict=error_dict)
-                UserModel().reset_password_link(form_result)
-                h.flash(_('Your password reset link was sent'),
+                redirect_link = UserModel().send_reset_password_email(form_result)
+                h.flash(_('A password reset confirmation code has been sent'),
                             category='success')
-                return redirect(url('login_home'))
+                return redirect(redirect_link)
 
-            except formencode.Invalid, errors:
+            except formencode.Invalid as errors:
                 return htmlfill.render(
                     render('/password_reset.html'),
                     defaults=errors.value,
@@ -252,18 +215,45 @@
         return render('/password_reset.html')
 
     def password_reset_confirmation(self):
-        if request.GET and request.GET.get('key'):
-            try:
-                user = User.get_by_api_key(request.GET.get('key'))
-                data = dict(email=user.email)
-                UserModel().reset_password(data)
-                h.flash(_('Your password reset was successful, '
-                          'new password has been sent to your email'),
-                            category='success')
-            except Exception, e:
-                log.error(e)
-                return redirect(url('reset_password'))
+        # This controller handles both GET and POST requests, though we
+        # only ever perform the actual password change on POST (since
+        # GET requests are not allowed to have side effects, and do not
+        # receive automatic CSRF protection).
+
+        # The template needs the email address outside of the form.
+        c.email = request.params.get('email')
+
+        if not request.POST:
+            return htmlfill.render(
+                render('/password_reset_confirmation.html'),
+                defaults=dict(request.params),
+                encoding='UTF-8')
 
+        form = PasswordResetConfirmationForm()()
+        try:
+            form_result = form.to_python(dict(request.POST))
+        except formencode.Invalid as errors:
+            return htmlfill.render(
+                render('/password_reset_confirmation.html'),
+                defaults=errors.value,
+                errors=errors.error_dict or {},
+                prefix_error=False,
+                encoding='UTF-8')
+
+        if not UserModel().verify_reset_password_token(
+            form_result['email'],
+            form_result['timestamp'],
+            form_result['token'],
+        ):
+            return htmlfill.render(
+                render('/password_reset_confirmation.html'),
+                defaults=form_result,
+                errors={'token': _('Invalid password reset token')},
+                prefix_error=False,
+                encoding='UTF-8')
+
+        UserModel().reset_password(form_result['email'], form_result['password'])
+        h.flash(_('Successfully updated password'), category='success')
         return redirect(url('login_home'))
 
     def logout(self):
@@ -273,7 +263,7 @@
 
     def authentication_token(self):
         """Return the CSRF protection token for the session - just like it
-        could have been screen scrabed from a page with a form.
+        could have been screen scraped from a page with a form.
         Only intended for testing but might also be useful for other kinds
         of automation.
         """
--- a/kallithea/controllers/pullrequests.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/pullrequests.py	Sun Sep 06 23:36:05 2015 +0200
@@ -44,12 +44,13 @@
 from kallithea.lib.helpers import Page
 from kallithea.lib import helpers as h
 from kallithea.lib import diffs
+from kallithea.lib.exceptions import UserInvalidException
 from kallithea.lib.utils import action_logger, jsonify
 from kallithea.lib.vcs.utils import safe_str
 from kallithea.lib.vcs.exceptions import EmptyRepositoryError
 from kallithea.lib.diffs import LimitedDiffContainer
-from kallithea.model.db import  PullRequest, ChangesetStatus, ChangesetComment,\
-    PullRequestReviewers
+from kallithea.model.db import PullRequest, ChangesetStatus, ChangesetComment,\
+    PullRequestReviewers, User
 from kallithea.model.pull_request import PullRequestModel
 from kallithea.model.meta import Session
 from kallithea.model.repo import RepoModel
@@ -57,8 +58,7 @@
 from kallithea.model.changeset_status import ChangesetStatusModel
 from kallithea.model.forms import PullRequestForm, PullRequestPostForm
 from kallithea.lib.utils2 import safe_int
-from kallithea.controllers.changeset import _ignorews_url,\
-    _context_url, get_line_ctx, get_ignore_ws
+from kallithea.controllers.changeset import _ignorews_url, _context_url
 from kallithea.controllers.compare import CompareController
 from kallithea.lib.graphmod import graph_data
 
@@ -67,12 +67,6 @@
 
 class PullrequestsController(BaseRepoController):
 
-    def __before__(self):
-        super(PullrequestsController, self).__before__()
-        repo_model = RepoModel()
-        c.users_array = repo_model.get_users_js()
-        c.user_groups_array = repo_model.get_user_groups_js()
-
     def _get_repo_refs(self, repo, rev=None, branch=None, branch_rev=None):
         """return a structure with repo's interesting changesets, suitable for
         the selectors in pullrequest.html
@@ -203,10 +197,7 @@
         c.repo_name = repo_name
         p = safe_int(request.GET.get('page', 1), 1)
 
-        c.pullrequests_pager = Page(c.pull_requests, page=p, items_per_page=10)
-
-        if request.environ.get('HTTP_X_PARTIAL_XHR'):
-            return render('/pullrequests/pullrequest_data.html')
+        c.pullrequests_pager = Page(c.pull_requests, page=p, items_per_page=100)
 
         return render('/pullrequests/pullrequest_show_all.html')
 
@@ -243,7 +234,7 @@
         org_scm_instance = org_repo.scm_instance
         try:
             org_scm_instance.get_changeset()
-        except EmptyRepositoryError, e:
+        except EmptyRepositoryError as e:
             h.flash(h.literal(_('There are no changesets yet')),
                     category='warning')
             redirect(url('summary_home', repo_name=org_repo.repo_name))
@@ -251,7 +242,14 @@
         org_rev = request.GET.get('rev_end')
         # rev_start is not directly useful - its parent could however be used
         # as default for other and thus give a simple compare view
-        #other_rev = request.POST.get('rev_start')
+        rev_start = request.GET.get('rev_start')
+        other_rev = None
+        if rev_start:
+            starters = org_repo.get_changeset(rev_start).parents
+            if starters:
+                other_rev = starters[0].raw_id
+            else:
+                other_rev = org_repo.scm_instance.EMPTY_CHANGESET
         branch = request.GET.get('branch')
 
         c.cs_repos = [(org_repo.repo_name, org_repo.repo_name)]
@@ -271,11 +269,11 @@
             c.a_repos.append((org_repo.parent.repo_name, '%s (parent)' % org_repo.parent.repo_name))
             c.a_repo = org_repo.parent
             c.a_refs, c.default_a_ref = self._get_repo_refs(
-                    org_repo.parent.scm_instance, branch=default_cs_branch)
+                    org_repo.parent.scm_instance, branch=default_cs_branch, rev=other_rev)
 
         else:
             c.a_repo = org_repo
-            c.a_refs, c.default_a_ref = self._get_repo_refs(org_scm_instance) # without rev and branch
+            c.a_refs, c.default_a_ref = self._get_repo_refs(org_scm_instance, rev=other_rev)
 
         # gather forks and add to this list ... even though it is rare to
         # request forks to pull from their parent
@@ -306,7 +304,7 @@
         repo = RepoModel()._get_repo(repo_name)
         try:
             _form = PullRequestForm(repo.repo_id)().to_python(request.POST)
-        except formencode.Invalid, errors:
+        except formencode.Invalid as errors:
             log.error(traceback.format_exc())
             log.error(str(errors))
             msg = _('Error creating pull request: %s') % errors.msg
@@ -337,7 +335,9 @@
                                               other_repo.scm_instance, other_rev, # org and other "swapped"
                                               org_repo.scm_instance, org_rev,
                                               )
-        revisions = [cs.raw_id for cs in cs_ranges]
+        if ancestor_rev is None:
+            ancestor_rev = org_repo.scm_instance.EMPTY_CHANGESET
+        revisions = [cs_.raw_id for cs_ in cs_ranges]
 
         # hack: ancestor_rev is not an other_rev but we want to show the
         # requested destination and have the exact ancestor
@@ -362,6 +362,9 @@
             Session().commit()
             h.flash(_('Successfully opened new pull request'),
                     category='success')
+        except UserInvalidException as u:
+            h.flash(_('Invalid reviewer "%s" specified') % u, category='error')
+            raise HTTPBadRequest()
         except Exception:
             h.flash(_('Error occurred while creating pull request'),
                     category='error')
@@ -446,6 +449,9 @@
                 old_pull_request.other_repo.repo_name, new_other_ref,
                 revisions, reviewers_ids, title, description
             )
+        except UserInvalidException as u:
+            h.flash(_('Invalid reviewer "%s" specified') % u, category='error')
+            raise HTTPBadRequest()
         except Exception:
             h.flash(_('Error occurred while creating pull request'),
                     category='error')
@@ -477,7 +483,7 @@
             raise HTTPForbidden()
         assert pull_request.other_repo.repo_name == repo_name
         #only owner or admin can update it
-        owner = pull_request.author.user_id == c.authuser.user_id
+        owner = pull_request.owner.user_id == c.authuser.user_id
         repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
         if not (h.HasPermissionAny('hg.admin') or repo_admin or owner):
             raise HTTPForbidden()
@@ -495,9 +501,13 @@
         old_description = pull_request.description
         pull_request.title = _form['pullrequest_title']
         pull_request.description = _form['pullrequest_desc'].strip() or _('No description')
-        PullRequestModel().mention_from_description(pull_request, old_description)
-
-        PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
+        pull_request.owner = User.get_by_username(_form['owner'])
+        try:
+            PullRequestModel().mention_from_description(pull_request, old_description)
+            PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
+        except UserInvalidException as u:
+            h.flash(_('Invalid reviewer "%s" specified') % u, category='error')
+            raise HTTPBadRequest()
 
         Session().commit()
         h.flash(_('Pull request updated'), category='success')
@@ -512,7 +522,7 @@
     def delete(self, repo_name, pull_request_id):
         pull_request = PullRequest.get_or_404(pull_request_id)
         #only owner can delete it !
-        if pull_request.author.user_id == c.authuser.user_id:
+        if pull_request.owner.user_id == c.authuser.user_id:
             PullRequestModel().delete(pull_request)
             Session().commit()
             h.flash(_('Successfully deleted pull request'),
@@ -555,6 +565,13 @@
         revs = [ctx.revision for ctx in reversed(c.cs_ranges)]
         c.jsdata = json.dumps(graph_data(org_scm_instance, revs))
 
+        c.is_range = False
+        if c.a_ref_type == 'rev': # this looks like a free range where target is ancestor
+            cs_a = org_scm_instance.get_changeset(c.a_rev)
+            root_parents = c.cs_ranges[0].parents
+            c.is_range = cs_a in root_parents
+            #c.merge_root = len(root_parents) > 1 # a range starting with a merge might deserve a warning
+
         avail_revs = set()
         avail_show = []
         c.cs_branch_name = c.cs_ref_name
@@ -629,8 +646,8 @@
         diff_limit = self.cut_off_limit if not c.fulldiff else None
 
         # we swap org/other ref since we run a simple diff on one repo
-        log.debug('running diff between %s and %s in %s'
-                  % (c.a_rev, c.cs_rev, org_scm_instance.path))
+        log.debug('running diff between %s and %s in %s',
+                  c.a_rev, c.cs_rev, org_scm_instance.path)
         txtdiff = org_scm_instance.get_diff(rev1=safe_str(c.a_rev), rev2=safe_str(c.cs_rev),
                                       ignore_whitespace=ignore_whitespace,
                                       context=line_context)
@@ -690,23 +707,32 @@
     def comment(self, repo_name, pull_request_id):
         pull_request = PullRequest.get_or_404(pull_request_id)
 
-        status = 0
-        close_pr = False
+        status = request.POST.get('changeset_status')
+        close_pr = request.POST.get('save_close')
+        f_path = request.POST.get('f_path')
+        line_no = request.POST.get('line')
+
+        if (status or close_pr) and (f_path or line_no):
+            # status votes and closing is only possible in general comments
+            raise HTTPBadRequest()
+
         allowed_to_change_status = self._get_is_allowed_change_status(pull_request)
-        if allowed_to_change_status:
-            status = request.POST.get('changeset_status')
-            close_pr = request.POST.get('save_close')
-        text = request.POST.get('text', '').strip() or _('No comments.')
+        if not allowed_to_change_status:
+            if status or close_pr:
+                h.flash(_('No permission to change pull request status'), 'error')
+                raise HTTPForbidden()
+
+        text = request.POST.get('text', '').strip()
         if close_pr:
             text = _('Closing.') + '\n' + text
 
-        comm = ChangesetCommentsModel().create(
+        comment = ChangesetCommentsModel().create(
             text=text,
             repo=c.db_repo.repo_id,
             user=c.authuser.user_id,
             pull_request=pull_request_id,
-            f_path=request.POST.get('f_path'),
-            line_no=request.POST.get('line'),
+            f_path=f_path,
+            line_no=line_no,
             status_change=(ChangesetStatus.get_status_lbl(status)
                            if status and allowed_to_change_status else None),
             closing_pr=close_pr
@@ -716,22 +742,20 @@
                       'user_commented_pull_request:%s' % pull_request_id,
                       c.db_repo, self.ip_addr, self.sa)
 
-        if allowed_to_change_status:
-            # get status if set !
-            if status:
-                ChangesetStatusModel().set_status(
-                    c.db_repo.repo_id,
-                    status,
-                    c.authuser.user_id,
-                    comm,
-                    pull_request=pull_request_id
-                )
+        if status:
+            ChangesetStatusModel().set_status(
+                c.db_repo.repo_id,
+                status,
+                c.authuser.user_id,
+                comment,
+                pull_request=pull_request_id
+            )
 
-            if close_pr:
-                PullRequestModel().close_pull_request(pull_request_id)
-                action_logger(self.authuser,
-                              'user_closed_pull_request:%s' % pull_request_id,
-                              c.db_repo, self.ip_addr, self.sa)
+        if close_pr:
+            PullRequestModel().close_pull_request(pull_request_id)
+            action_logger(self.authuser,
+                          'user_closed_pull_request:%s' % pull_request_id,
+                          c.db_repo, self.ip_addr, self.sa)
 
         Session().commit()
 
@@ -741,9 +765,9 @@
         data = {
            'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
         }
-        if comm:
-            c.co = comm
-            data.update(comm.get_dict())
+        if comment is not None:
+            c.comment = comment
+            data.update(comment.get_dict())
             data.update({'rendered_text':
                          render('changeset/changeset_comment_block.html')})
 
--- a/kallithea/controllers/search.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/search.py	Sun Sep 06 23:36:05 2015 +0200
@@ -77,8 +77,8 @@
             'path': SCHEMA
         }.get(c.cur_type, SCHEMA)
 
-        log.debug('IDX: %s' % index_name)
-        log.debug('SCHEMA: %s' % schema_defn)
+        log.debug('IDX: %s', index_name)
+        log.debug('SCHEMA: %s', schema_defn)
 
         if c.cur_query:
             cur_query = c.cur_query.lower()
@@ -109,8 +109,8 @@
 
                     matcher = query.matcher(searcher)
 
-                    log.debug('query: %s' % query)
-                    log.debug('hl terms: %s' % highlight_items)
+                    log.debug('query: %s', query)
+                    log.debug('hl terms: %s', highlight_items)
                     results = searcher.search(query)
                     res_ln = len(results)
                     c.runtime = '%s results (%.3f seconds)' % (
--- a/kallithea/controllers/summary.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/controllers/summary.py	Sun Sep 06 23:36:05 2015 +0200
@@ -67,25 +67,6 @@
     def __before__(self):
         super(SummaryController, self).__before__()
 
-    def _get_download_links(self, repo):
-
-        download_l = []
-
-        branches_group = ([], _("Branches"))
-        tags_group = ([], _("Tags"))
-
-        for name, chs in c.db_repo_scm_instance.branches.items():
-            #chs = chs.split(':')[-1]
-            branches_group[0].append((chs, name),)
-        download_l.append(branches_group)
-
-        for name, chs in c.db_repo_scm_instance.tags.items():
-            #chs = chs.split(':')[-1]
-            tags_group[0].append((chs, name),)
-        download_l.append(tags_group)
-
-        return download_l
-
     def __get_readme_data(self, db_repo):
         repo_name = db_repo.repo_name
         log.debug('Looking for README file')
@@ -106,7 +87,7 @@
                         if not isinstance(readme, FileNode):
                             continue
                         readme_file = f
-                        log.debug('Found README file `%s` rendering...' %
+                        log.debug('Found README file `%s` rendering...',
                                   readme_file)
                         readme_data = renderer.render(readme.content,
                                                       filename=f)
--- a/kallithea/i18n/be/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/be/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,11 +5,11 @@
 # #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea 0.1\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
 "POT-Creation-Date: 2015-04-01 03:17+0200\n"
-"PO-Revision-Date: 2015-06-09 14:58+0200\n"
-"Last-Translator: Viktar Palstsiuk <vipals@gmail.com>\n"
+"PO-Revision-Date: 2015-08-08 12:03+0300\n"
+"Last-Translator: Andrew Shadura <andrew@shadura.me>\n"
 "Language-Team: Belarusian "
 "<https://hosted.weblate.org/projects/kallithea/kallithea/be/>\n"
 "Language: be\n"
@@ -21,19 +21,23 @@
 "X-Generator: Weblate 2.4-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Яшчэ не было змен"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "Нічога"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(зачынена)"
 
@@ -41,63 +45,66 @@
 msgid "Show whitespace"
 msgstr "Адлюстроўваць прабелы"
 
-#: kallithea/controllers/changeset.py:96
-#: kallithea/controllers/changeset.py:103
+#: kallithea/controllers/changeset.py:96 kallithea/controllers/changeset.py:103
 #: kallithea/templates/files/diff_2way.html:55
 msgid "Ignore whitespace"
 msgstr "Ігнараваць прабелы"
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
-msgstr "павялічыць кантэкст да %(num)s радкоў"
+msgid "Increase diff context to %(num)s lines"
+msgstr "Павялічыць кантэкст да %(num)s радкоў"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "Няма такой рэвізіі ў гэтым рэпазітары"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Няма каментароў."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
-"Changing status on a changeset associated with a closed pull request is not "
-"allowed"
-msgstr "Нельга рэдагаваць статут змен, злучаных з зачыненымі pull-request'ами"
-
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+"Changing status on a changeset associated with a closed pull request is "
+"not allowed"
+msgstr "Нельга рэдагаваць статус змен, злучаных з зачыненымі pull-request'ами"
+
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
-msgstr "Абраць набор змен"
-
-#: kallithea/controllers/compare.py:255
+msgstr "Выбраць набор змен"
+
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr "Немагчыма параўноўваць рэпазітары без агульнага продка"
 
-#: kallithea/controllers/error.py:96
-msgid ""
-"The request could not be understood by the server due to malformed syntax."
+#: kallithea/controllers/error.py:71
+msgid "No response"
+msgstr "Няма адказу"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr "Невядомая памылка"
+
+#: kallithea/controllers/error.py:100
+msgid "The request could not be understood by the server due to malformed syntax."
 msgstr "Запыт не распазнаны серверам з-за няправільнага сінтаксісу."
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "Несанкцыянаваны доступ да рэсурсу"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "У вас няма правоў для прагляду гэтай старонкі"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "Рэсурс не знойдзены"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
-msgstr "Сервер не можа выканаць запыт з-за няправільнай умовы ў запыце."
+msgstr ""
+"Сервер не можа выканаць запыт з-за нечаканых умоваў, якія ўзніклі падчас "
+"яго спрацавання."
 
 #: kallithea/controllers/feed.py:55
 #, python-format
@@ -109,17 +116,17 @@
 msgid "%s %s feed"
 msgstr "Стужка навін %s %s"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
-msgstr "Змены апынуліся занадта вялікімі і былі выразаны..."
-
-#: kallithea/controllers/feed.py:93
+msgstr "Змены апынуліся занадта вялікімі і былі выразаныя..."
+
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr "%s выканаў каміт у %s"
@@ -196,50 +203,46 @@
 #: kallithea/controllers/files.py:494
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
-"Размяшчэнне павінна быць адносным шляхам, і не павінна ўтрымоўваць \"..\" у "
+"Размяшчэнне павінна быць адносным шляхам, і не можа ўтрымліваць \"..\" у "
 "шляхі"
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Магчымасць спампоўваць адключана"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Невядомая рэвізія %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Пусты рэпазітар"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "Невядомы тып архіва"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Набор змен"
 
-#: kallithea/controllers/files.py:776
-#: kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Галінкі"
 
-#: kallithea/controllers/files.py:777
-#: kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
-msgstr "Пазнакі"
-
-#: kallithea/controllers/forks.py:187
+msgstr "Тэгі"
+
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Адбылася памылка падчас стварэння форка рэпазітара %s"
@@ -255,9 +258,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Рэпазітары"
 
@@ -277,144 +280,161 @@
 msgstr "Закладкі"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
-msgstr "агульнадаступны часопіс"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
+msgstr "Публічны часопіс"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr "часопіс"
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr "няслушная капча"
-
-#: kallithea/controllers/login.py:194
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr "Часопіс"
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr "Няслушная капча"
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr "Рэгістрацыя ў Kallithea прайшла паспяхова"
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
-msgstr "Спасылка для скіду пароля адпраўлена"
-
-#: kallithea/controllers/login.py:260
+msgstr "Спасылка для скідання пароля адпраўлена"
+
+#: kallithea/controllers/login.py:222
 msgid ""
-"Your password reset was successful, new password has been sent to your email"
-msgstr "Скід пароля выраблены, новы пароль быў адпраўлены на ваш email"
-
-#: kallithea/controllers/pullrequests.py:130
+"Your password reset was successful, new password has been sent to your "
+"email"
+msgstr "Пароль скінуты паспяхова, новы пароль быў адпраўлены на ваш email"
+
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr "%s (зачынена)"
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "Змены"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr "Адмысловы"
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr "Галінкі ўдзельніка"
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Закладкі"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr "Памылка пры стварэнні pull-запыту: %s"
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr "Няма апісання"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "Pull-запыт створаны паспяхова"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr "Адбылася памылка пры стварэнні pull-запыту"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr "Адсутныя рэвізіі адносна папярэдняга pull-запыту:"
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr "Новыя рэвізіі на %s %s адносна папярэдняга pull-запыту:"
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr "Гэты pull-запыт заснаваны на іншай рэвізіі %s, просты diff немагчымы."
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr "Няма змен на %s %s адносна папярэдняй версіі."
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
-msgstr "Зачынены, замешчаны %s ."
-
-#: kallithea/controllers/pullrequests.py:464
+msgstr "Зачынены, замешчаны %s."
+
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr "Абнаўленне для pull-запыту створана"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr "Pull-запыт абноўлены"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "Pull-запыт паспяхова выдалены"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr "Гэты pull-запыт ужо прыняты на галінку %s."
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr "Гэты pull-запыт быў зачынены і не можа быць абноўлены."
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr "Гэты pull-запыт можа быць абноўлены з %s:"
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr "Няма змен для абнаўлення гэтага pull-запыту."
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr "Увага: Галінка %s мае яшчэ адну верхавіну: %s."
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
-msgstr "Абнаўленне pull-запыты git не падтрымліваецца."
-
-#: kallithea/controllers/pullrequests.py:701
+msgstr "Абнаўленне pull-запытаў git не падтрымліваецца."
+
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr "Няма правоў змяняць статус pull-запыту"
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr "Зачынены."
 
@@ -430,21 +450,21 @@
 msgid "An error occurred during search operation."
 msgstr "Адбылася памылка пры выкананні гэтага пошуку."
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr "Няма дадзеных"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "Статыстычныя дадзеныя адключаны для гэтага рэпазітара"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr "Налады аўтарызацыі паспяхова абноўлены"
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr "адбылася памылка пры абнаўленні налад аўтарызацыі"
 
@@ -457,38 +477,38 @@
 msgstr "Адбылася памылка пры абнаўленні стандартных налад"
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
-msgstr "назаўжды"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+msgid "Forever"
+msgstr "Назаўжды"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 хвілін"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 гадзіна"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 дзень"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 месяц"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr "Тэрмін"
 
@@ -502,8 +522,8 @@
 msgstr "Gist-запіс %s выдалены"
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
-msgstr ""
+msgid "Unmodified"
+msgstr "Без змен"
 
 #: kallithea/controllers/admin/gists.py:262
 msgid "Successfully updated gist content"
@@ -518,119 +538,135 @@
 msgid "Error occurred during update of gist %s"
 msgstr "Адбылася памылка пры абнаўленні gist-запісы %s"
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
-"Вы не можаце змяніць дадзеныя гэтага карыстача, паколькі ён важны для працы "
-"ўсяго прыкладання"
-
-#: kallithea/controllers/admin/my_account.py:128
+"Вы не можаце змяніць дадзеныя гэтага карыстача, паколькі ён важны для "
+"працы ўсяго прыкладання"
+
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "Ваш уліковы запіс паспяхова абноўлены"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr "Адбылася памылка пры абнаўленні карыстача %s"
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr "Пароль абноўлены"
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr "Памылка пры абнаўленні пароля"
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "Карыстачу дададзены e-mail %s"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Адбылася памылка пры захаванні e-mail"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "E-mail карыстача выдалены"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
 msgstr "API-ключ паспяхова створаны"
 
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
 msgstr "API-ключ паспяхова скінуты"
 
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
 msgstr "API-ключ паспяхова выдалены"
 
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "Чытанне"
+
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "Чытанне"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "Запіс"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "Запіс"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "Адміністратар"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "Адключана"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr "Дазволена, з ручной актывацыяй уліковага запісу"
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr "Дазволена, з аўтаматычнай актывацыяй уліковага запісу"
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -638,11 +674,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr "Ручная актывацыя вонкавага ўліковага запісу"
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -650,221 +686,207 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr "Аўтаматычная актывацыя вонкавага ўліковага запісу"
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "Уключана"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr "Глабальныя прывілеі паспяхова абноўлены"
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr "Адбылася памылка падчас абнаўлення прывілеяў"
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr "Адбылася памылка пры стварэнні групы рэпазітароў %s"
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr "Створана новая група рэпазітароў %s"
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr "Адбылася памылка пры стварэнні групы рэпазітароў %s"
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr "Група рэпазітароў %s абноўлена"
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "Адбылася памылка пры абнаўленні групы рэпазітароў %s"
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "Дадзеная група ўтрымоўвае %s рэпазітароў і не можа быць выдалена"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Група ўтрымоўвае ў сабе %s падгруп і не можа быць выдалены"
 
-#: kallithea/controllers/admin/repo_groups.py:302
+#: kallithea/controllers/admin/repo_groups.py:297
 #, python-format
 msgid "Removed repository group %s"
 msgstr "Група рэпазітароў %s выдалена"
 
-#: kallithea/controllers/admin/repo_groups.py:307
+#: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr "Адбылася памылка пры выдаленні групы рэпазітароў %s"
 
-#: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
 #: kallithea/controllers/admin/user_groups.py:340
 msgid "Cannot revoke permission for yourself as admin"
 msgstr "Адміністратар не можа адклікаць свае прывелеі"
 
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
+#: kallithea/controllers/admin/repo_groups.py:420
+msgid "Repository group permissions updated"
 msgstr "Прывілеі групы рэпазітароў абноўлены"
 
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr "Адбылася памылка пры водгуку прывелеі"
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "Адбылася памылка пры стварэнні рэпазітара %s"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr "Рэпазітар %s створаны з %s"
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "Зроблены форк(копія) рэпазітара %s на %s"
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr "Рэпазітар %s створаны"
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Рэпазітар %s паспяхова абноўлены"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "Адбылася памылка падчас абнаўлення рэпазітара %s"
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr "Форки %s адлучаны"
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr "Выдалены форки рэпазітара %s"
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr "Рэпазітар %s выдалены"
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
-msgstr "Немагчыма выдаліць %s, ён усё-яшчэ ўтрымоўвае форки"
-
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:321
+#, python-format
+msgid "Cannot delete repository %s which still has forks"
+msgstr "Немагчыма выдаліць %s, ён усё яшчэ мае форкі"
+
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Адбылася памылка падчас выдалення %s"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr "Прывілеі рэпазітара абноўлены"
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr "Адбылася памылка пры стварэнні поля"
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr "Адбылася памылка пры выдаленні поля"
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr "-- Не форк --"
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "Бачнасць рэпазітара ў публічным часопісе абноўлена"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr "Адбылася памылка пры ўсталёўцы рэпазітара ў агульнадаступны часопіс"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "Несупадзенне токенаў"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "Нічога"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "Рэпазітар %s адзначаны як форк %s"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "Адбылася памылка пры выкананні аперацыі"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr "Зачынены рэпазітар"
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr "Адкрыты рэпазітар"
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+msgid "Repository has been locked"
+msgstr "Рэпазітар заблакаваны"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:
+msgid "Repository has been unlocked"
+msgstr "Рэпазітар адблакаваны"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "Адбылася памылка падчас разблакавання"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "Разблакавана"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "Заблакавана"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr "Кэш скінуты"
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "Адбылася памылка пры ачыстцы кэша"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "Занесены змены з выдаленага рэпазітара"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "Рэпазітар %s"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr "Кэш скінуты"
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "Адбылася памылка пры ачыстцы кэша"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "Занесены змены з выдаленага рэпазітара"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr "Адбылася памылка пры занясенні змен з выдаленага рэпазітара"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "Адбылася памылка пры выдаленні статыстыкі рэпазітара"
 
@@ -882,7 +904,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr "Адбылася памылка пры абнаўленні налад прыкладання"
 
 #: kallithea/controllers/admin/settings.py:213
@@ -896,7 +918,7 @@
 
 #: kallithea/controllers/admin/settings.py:327
 msgid "Updated visualisation settings"
-msgstr "Налады візуалізацыі абноўлены"
+msgstr "Налады візуалізацыі абноўленыя"
 
 #: kallithea/controllers/admin/settings.py:332
 msgid "Error occurred during updating visualisation settings"
@@ -904,19 +926,19 @@
 
 #: kallithea/controllers/admin/settings.py:358
 msgid "Please enter email address"
-msgstr "Калі ласка, увядзіце адрас электроннай пошты"
+msgstr "Калі ласка, увядзіце email-адрас"
 
 #: kallithea/controllers/admin/settings.py:373
 msgid "Send email task created"
-msgstr "Задача адпраўкі Email створана"
+msgstr "Задача адпраўкі e-mail створаная"
 
 #: kallithea/controllers/admin/settings.py:404
 msgid "Added new hook"
-msgstr "Дададзена новая пастка"
+msgstr "Дададзены новы хук"
 
 #: kallithea/controllers/admin/settings.py:418
 msgid "Updated hooks"
-msgstr "Абноўленыя пасткі"
+msgstr "Абноўленыя хукі"
 
 #: kallithea/controllers/admin/settings.py:422
 msgid "Error occurred during hook creation"
@@ -959,83 +981,80 @@
 msgstr "Мэтавая група не можа быць такі ж"
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr "Прывілеі групы карыстачоў абноўлены"
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr "Абноўлены прывілеі"
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "Адбылася памылка пры захаванні прывілеяў"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr "Карыстач %s створаны"
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr "Адбылася памылка пры стварэнні карыстача %s"
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "Карыстач паспяхова абноўлены"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr "Карыстач паспяхова выдалены"
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "Адбылася памылка пры выдаленні карыстача"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "Вы не можаце рэдагаваць дадзенага карыстача"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
 msgstr "Дададзены IP %s у белы спіс карыстача"
 
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
 msgstr "Адбылася памылка пры захаванні IP"
 
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
 msgstr "Выдалены IP %s з белага спісу карыстача"
 
-#: kallithea/lib/auth.py:745
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr "IP %s заблакаваны"
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr "Няслушны API-ключ"
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "Вы павінны быць зарэгістраваным карыстачом, каб выканаць гэта дзеянне"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "Старонка даступная толькі аўтарызаваным карыстачам"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr "Рэпазітар не знойдзены на файлавай сістэме"
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "Набор змен не знойдзены"
 
@@ -1044,179 +1063,182 @@
 msgstr "Двайковы файл"
 
 #: kallithea/lib/diffs.py:82
-msgid ""
-"Changeset was too big and was cut off, use diff menu to display this diff"
-msgstr ""
-"Набор змены апынуўся занадта вялікімі і быў падрэзаны, выкарыстоўвайце меню "
-"параўнання для паказу выніку параўнання"
+msgid "Changeset was too big and was cut off, use diff menu to display this diff"
+msgstr ""
+"Набор змены апынуўся занадта вялікімі і быў падрэзаны, выкарыстоўвайце "
+"меню параўнання для паказу выніку параўнання"
 
 #: kallithea/lib/diffs.py:92
 msgid "No changes detected"
 msgstr "Змен не выяўлена"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "Выдалена галінка: %s"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "Створаны тэг: %s"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Паказаць адрозненні разам %s->%s"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "параўнанне"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "і"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "на %s больш"
 
-#: kallithea/lib/helpers.py:720
-#: kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "версіі"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
-msgstr "імя форка %s"
-
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
-msgstr "Pull-запыт #%s"
-
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:722
+#, python-format
+msgid "Fork name %s"
+msgstr "Імя форка %s"
+
+#: kallithea/lib/helpers.py:742
+#, python-format
+msgid "Pull request %s"
+msgstr "Pull-запыт %s"
+
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "[выдалены] рэпазітар"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "[створаны] рэпазітар"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "[створаны] рэпазітар як форк"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "[форкнуты] рэпазітар"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "[абноўлены] рэпазітар"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr "[загружаны] архіў з рэпазітара"
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "[выдалены] рэпазітар"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "[створаны] карыстач"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "[абноўлены] карыстач"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr "[створана] група карыстачоў"
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr "[абноўлена] група карыстачоў"
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "[каментар] да рэвізіі ў рэпазітары"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "[пракаменціравана] у запыце на занясенне змен для"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "[зачынены] Pull-запыт для"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[адпраўлена] у"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "[занесены змены з дапамогай Kallithea] у рэпазітары"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "[занесены змены з выдаленага рэпазітара] у рэпазітар"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[занесены змены] з"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "[дададзены ў назіранні] рэпазітар"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "[выдалены з назірання] рэпазітар"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " і на %s больш"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "Файлаў няма"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr "Няма файлаў"
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr "новы файл"
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr "зменены"
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr "выдалены"
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr "пераназваны"
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr "chmod"
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
-"%s repository is not mapped to db perhaps it was created or renamed from the "
-"filesystem please run the application again in order to rescan repositories"
+"%s repository is not mapped to db perhaps it was created or renamed from "
+"the filesystem please run the application again in order to rescan "
+"repositories"
 msgstr ""
 "Рэпазітар %s адсутнічае ў базе дадзеных; магчыма, ён быў створаны ці "
-"пераназваны з файлавай сістэмы. Калі ласка, перазапусціце прыкладанне для "
-"сканавання рэпазітароў"
-
-#: kallithea/lib/utils2.py:425
+"пераназваны з файлавай сістэмы. Калі ласка, перазапусціце прыкладанне для"
+" сканавання рэпазітароў"
+
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
@@ -1224,7 +1246,7 @@
 msgstr[1] "%d гадоў"
 msgstr[2] "%d гады"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
@@ -1232,7 +1254,7 @@
 msgstr[1] "%d месяца"
 msgstr[2] "%d месяцаў"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
@@ -1240,7 +1262,7 @@
 msgstr[1] "%d дня"
 msgstr[2] "%d дзён"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
@@ -1248,7 +1270,7 @@
 msgstr[1] "%d гадзін"
 msgstr[2] "%d гадзіны"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
@@ -1256,7 +1278,7 @@
 msgstr[1] "%d хвіліны"
 msgstr[2] "%d хвілін"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
@@ -1264,27 +1286,27 @@
 msgstr[1] "%d секунды"
 msgstr[2] "%d секунды"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "у %s"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "%s назад"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "у %s і %s"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s і %s назад"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "прама цяпер"
 
@@ -1299,7 +1321,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "Рэпазітар - няма доступу"
 
@@ -1314,7 +1336,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "Рэпазітар - доступ на чытанне"
 
@@ -1329,7 +1351,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "Рэпазітар - доступ на запіс"
 
@@ -1344,7 +1366,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "Рэпазітар - адміністраванне"
 
@@ -1383,7 +1405,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Адміністратар Kallithea"
 
@@ -1398,7 +1420,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "Стварэнне рэпазітароў адключана"
 
@@ -1413,7 +1435,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "Стварэнне рэпазітароў уключана"
 
@@ -1428,7 +1450,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "Магчымасць ствараць форк рэпазітара адключана"
 
@@ -1443,7 +1465,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "Магчымасць ствараць форк рэпазітара ўключана"
 
@@ -1479,7 +1501,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "Не прагледжана"
 
@@ -1494,7 +1516,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "Ухвалена"
 
@@ -1509,7 +1531,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "Адхілена"
 
@@ -1524,7 +1546,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "На разглядзе"
 
@@ -1536,7 +1558,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr "верхні ўзровень"
 
@@ -1548,7 +1570,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr "Група Рэпазітароў - няма доступу"
 
@@ -1560,7 +1582,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr "Група рэпазітароў - доступ на чытанне"
 
@@ -1572,7 +1594,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr "Група рэпазітароў - доступ на запіс"
 
@@ -1584,7 +1606,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr "Група рэпазітароў - адміністраванне"
 
@@ -1595,7 +1617,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr "Група карыстачоў - няма доступу"
 
@@ -1606,7 +1628,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr "Група карыстачоў - доступ на чытанне"
 
@@ -1617,7 +1639,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr "Група карыстачоў - доступ на запіс"
 
@@ -1628,7 +1650,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr "Група карыстачоў - адміністраванне"
 
@@ -1639,7 +1661,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr "Стварэнне груп рэпазітароў адключана"
 
@@ -1650,7 +1672,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr "Стварэнне груп рэпазітароў уключана"
 
@@ -1661,7 +1683,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr "Стварэнне груп карыстачоў адключана"
 
@@ -1672,7 +1694,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr "Стварэнне груп карыстачоў уключана"
 
@@ -1683,7 +1705,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr "Рэгістрацыя адключана"
 
@@ -1694,7 +1716,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr "Рэгістрацыя карыстача з ручной актывацыяй уліковага запісу"
 
@@ -1705,30 +1727,153 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr "Рэгістрацыя карыстача з аўтаматычнай актывацыяй"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
-msgid ""
-"Repository creation disabled with write permission to a repository group"
-msgstr ""
-
-#: kallithea/model/comment.py:76
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
+msgid "Repository creation disabled with write permission to a repository group"
+msgstr ""
+
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "на радку %s"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[Згадванне]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "Несанкцыянаваны доступ да рэсурсу"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "Несанкцыянаваны доступ да рэсурсу"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Only admins can create repository groups"
+msgstr "Створана новая група рэпазітароў %s"
+
+#: kallithea/model/db.py:1683
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Non-admins can create repository groups"
+msgstr "Створана новая група рэпазітароў %s"
+
+#: kallithea/model/db.py:1685
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Only admins can create user groups"
+msgstr "Ствараць групы карыстачоў"
+
+#: kallithea/model/db.py:1686
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Non-admins can create user groups"
+msgstr "Ствараць групы карыстачоў"
+
+#: kallithea/model/db.py:1688
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Only admins can create top level repositories"
+msgstr "Рэпазітары верхняга ўзроўню"
+
+#: kallithea/model/db.py:1689
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Non-admins can create top level repositories"
+msgstr "Рэпазітары верхняга ўзроўню"
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Месцазнаходжанне рэпазітароў"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Invalidate cache for all repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Скінуць кэш для ўсіх рэпазітароў"
+
+#: kallithea/model/db.py:1698
+#, fuzzy
+#| msgid "User Registration with manual account activation"
+msgid "User registration with manual account activation"
+msgstr "Рэгістрацыя карыстача з ручной актывацыяй уліковага запісу"
+
+#: kallithea/model/db.py:1699
+#, fuzzy
+#| msgid "User Registration with automatic account activation"
+msgid "User registration with automatic account activation"
+msgstr "Рэгістрацыя карыстача з аўтаматычнай актывацыяй"
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "Не прагледжана"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "На разглядзе"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "Калі ласка, увядзіце лагін"
@@ -1747,96 +1892,120 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Увядзіце не меней %(min)i знакаў"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
-msgstr ""
-
-#: kallithea/model/notification.py:252
+msgstr "Імя не можа ўтрымліваць толькі лічбы"
+
+#: kallithea/model/notification.py:254
+#, python-format
+msgid "%(user)s commented on changeset %(age)s"
+msgstr "%(user)s пакінуў каментар да набору змен %(age)s"
+
+#: kallithea/model/notification.py:255
+#, python-format
+msgid "%(user)s sent message %(age)s"
+msgstr "%(user)s адправіў паведамленне %(age)s"
+
+#: kallithea/model/notification.py:256
+#, python-format
+msgid "%(user)s mentioned you %(age)s"
+msgstr "%(user)s згадаў вас %(age)s"
+
+#: kallithea/model/notification.py:257
+#, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr "%(user)s зарэгістраваўся ў Kallithea %(age)s"
+
+#: kallithea/model/notification.py:258
+#, python-format
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "%(user)s адкрыў новы pull-запыт %(age)s"
+
+#: kallithea/model/notification.py:259
+#, python-format
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "%(user)s пакінуў каментар да pull-запыту %(age)s"
+
+#: kallithea/model/notification.py:266
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s пакінуў каментар да набору змен %(when)s"
 
-#: kallithea/model/notification.py:253
+#: kallithea/model/notification.py:267
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s адправіў паведамленне %(when)s"
 
-#: kallithea/model/notification.py:254
+#: kallithea/model/notification.py:268
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s згадаў вас %(when)s"
 
-#: kallithea/model/notification.py:255
+#: kallithea/model/notification.py:269
 #, python-format
 msgid "%(user)s registered in Kallithea at %(when)s"
 msgstr "%(user)s зарэгістраваўся ў Kallithea %(when)s"
 
-#: kallithea/model/notification.py:256
+#: kallithea/model/notification.py:270
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s адкрыў новы pull-запыт %(when)s"
 
-#: kallithea/model/notification.py:257
+#: kallithea/model/notification.py:271
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s пакінуў каментар да pull-запыту %(when)s"
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr "Новы карыстач \"%(new_username)s\" зарэгістраваны"
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr "Новы карыстач \"%(new_username)s\" зарэгістраваны"
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr "Зачынены"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr "%(user)s просіць вас разгледзець pull request #%(pr_id)s: %(pr_title)s"
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr "%(user)s просіць вас разгледзець pull request %(pr_nice_id)s: %(pr_title)s"
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "апошняя версія"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr "Рэгістрацыя новага карыстача"
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-"Вы не можаце рэдагаваць карыстача, паколькі гэта крытычна для працы ўсяго "
-"прыкладання"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr ""
 "Вы не можаце выдаліць карыстача, паколькі гэта крытычна для працы ўсяго "
 "прыкладання"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch owners "
@@ -1845,7 +2014,7 @@
 "Карыстач \"%s\" усё яшчэ з'яўляецца ўладальнікам %s рэпазітароў і таму не "
 "можа быць выдалены. Зменіце ўладальніка ці выдаліце гэтыя рэпазітары: %s"
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch "
@@ -1854,7 +2023,7 @@
 "Карыстач \"%s\" усё яшчэ з'яўляецца ўладальнікам %s груп рэпазітароў і таму "
 "не можа быць выдалены. Зменіце ўладальніка ці выдаліце дадзеныя групы: %s"
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch owners "
@@ -1863,61 +2032,61 @@
 "Карыстач \"%s\" усё яшчэ з'яўляецца ўладальнікам %s груп карыстачоў і таму "
 "не можа быць выдалены. Зменіце ўладальніка ці выдаліце дадзеныя групы: %s"
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr "Спасылка скіду пароля"
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr "Ваш новы пароль"
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr "Ваш новы пароль ад Kallithea: %s"
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "Значэнне не можа быць пустым спісам"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "Карыстач з імем \"%(username)s\" ужо існуе"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "Імя \"%(username)s\" адхілена"
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, python-format
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "Імя \"%(username)s\" недапушчальнае"
+
+#: kallithea/model/validators.py:99
 msgid ""
-"Username may only contain alphanumeric characters underscores, periods or "
-"dashes and must begin with alphanumeric character or underscore"
+"Username may only contain alphanumeric characters underscores, periods or"
+" dashes and must begin with an alphanumeric character or underscore"
 msgstr ""
 "Імя карыстача можа ўтрымоўваць толькі літары, лічбы, знакі падкрэслення, "
 "кропкі і працяжнік; а гэтак жа павінна пачынацца з літары, лічбы або са "
 "знака падкрэслення"
 
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "Імя \"%(username)s\" недапушчальна"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr "Няслушнае імя групы карыстачоў"
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr "Група карыстачоў \"%(usergroup)s\" ужо існуе"
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
@@ -1926,141 +2095,135 @@
 "падкрэслення, кропкі і працяжнік; а гэтак жа павінна пачынацца з літары ці "
 "лічбы"
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "Немагчыма выкарыстоўваць гэту групу як бацькоўскую"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "Група \"%(group_name)s\" ужо існуе"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "Рэпазітар з  імем \"%(group_name)s\" ужо існуе"
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "Недапушчальныя знакі (не ascii) у паролі"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr "Няслушна зададзены стары пароль"
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "Паролі не супадаюць"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
-msgstr "няслушны пароль"
-
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "няслушнае імя карыстача"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "Ваш акаўнт выключаны"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
-msgstr "Імя рэпазітара %(repo)s забаронена"
-
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:300
+msgid "Invalid username or password"
+msgstr "Няслушнае імя ці пароль"
+
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "Несупадзенне токенаў"
+
+#: kallithea/model/validators.py:345
+#, python-format
+msgid "Repository name %(repo)s is not allowed"
+msgstr "Імя рэпазітара %(repo)s забароненае"
+
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "Рэпазітар %(repo)s ужо існуе"
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr "Рэпазітар \"%(repo)s\" ужо існуе ў групе \"%(group)s\""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr "Група рэпазітароў \"%(repo)s\" ужо існуе"
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr "няслушны URL для кланавання"
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-"Няслушны URL кланаванні, падайце карэктны URL для кланавання ў фармаце "
-"http(s)/svn+http(s)/ssh"
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+msgid "Invalid repository URL"
+msgstr "Няслушны URL рэпазітара"
+
+#: kallithea/model/validators.py:466
+#, fuzzy
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+"Няслушны URL рэпазітара. Ён мусіць быць карэктным URL http, https, ssh, svn+http ці svn+https"
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "Тып форка будзе супадаць з бацькоўскім"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr "У вас недастаткова мае рацыю для стварэння рэпазітароў у гэтай групе"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr "недастаткова мае рацыю для стварэння рэпазітара ў каранёвым каталогу"
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr "У Вас недастаткова прывілеяў для стварэння групы ў гэтым месцы"
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr "Дадзенае імя карыстача ці групы карыстачоў недапушчальна"
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "Гэты шлях хібны"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+msgid "This email address is already in use"
 msgstr "Гэты E-mail ужо заняты"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "\"%(email)s\" не існуе."
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
-"The LDAP Login attribute of the CN must be specified - this is the name of "
-"the attribute that is equivalent to \"username\""
+"The LDAP Login attribute of the CN must be specified - this is the name "
+"of the attribute that is equivalent to \"username\""
 msgstr ""
 "Для ўваходу па LDAP павінна быць паказана значэнне атрыбута CN - гэта "
 "эквівалент імя карыстача"
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr "Рэвізіі %(revs)s ужо ўключаны ў pull-request ці маюць усталяваны статус"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr "Калі ласка, увядзіце існы IPv4 ці IpV6 адрас"
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr "Калі ласка, увядзіце існы IPv4 ці IPv6 адрас"
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 "Значэнне маскі падсеткі павінна быць у межах ад 0 да 32 (%(bits)r - няслушна)"
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 "Ключавое імя можа толькі складацца з літар, знака падкрэслення, працяжнік ці "
 "лікаў"
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr "Файла няма ў каталогу"
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2122,13 +2285,13 @@
 msgstr "Імя групы"
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2140,11 +2303,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "Апісанне"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2165,11 +2328,11 @@
 msgid "Name"
 msgstr "Імя"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "Апошняя змена"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2178,18 +2341,19 @@
 msgid "Tip"
 msgstr "Стан"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "Уладальнік"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2201,7 +2365,7 @@
 msgid "Click to sort ascending"
 msgstr "Па ўзрастанні"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2213,11 +2377,11 @@
 msgid "Click to sort descending"
 msgstr "Па змяншэнні"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr "Рэпазітары не знойдзены."
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2229,11 +2393,10 @@
 msgid "Data error."
 msgstr "Памылка дадзеных."
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143
-#: kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2243,7 +2406,7 @@
 msgstr "Загрузка..."
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "Увайсці"
 
@@ -2252,39 +2415,39 @@
 msgid "Log In to %s"
 msgstr "Увайсці ў %s"
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "Імя карыстача"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "Пароль"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "Запомніць"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "Забыліся пароль?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "Няма акаўнта?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "Увайсці"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "Забыліся пароль?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "Няма акаўнта?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr "Скід пароля"
@@ -2331,26 +2494,26 @@
 msgstr "Паўторыце пароль"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "Імя"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "Прозвішча"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "E-mail"
 
@@ -2460,111 +2623,100 @@
 msgstr "Уключаныя ўбудовы"
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
+#, fuzzy
+#| msgid "" "Comma separated list of plugins. Order of plugins is also order in
+#| which " "Kallithea will try to authenticate user"
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
-msgstr ""
-"Спіс убудоў, падзеленых коскі. Kallithea будзе спрабаваць аўтэнтыфікаваць "
-"карыстача ў парадку ўказання ўбудоў"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
+msgstr ""
+"Спіс убудоў, падзеленых коскі. Kallithea будзе спрабаваць аўтэнтыфікаваць"
+" карыстача ў парадку ўказання ўбудоў"
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr "Даступныя ўбудаваныя ўбудовы"
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr "уключана"
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr "адключана"
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr "Убудова"
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "Захаваць"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
-msgid "Repository Defaults"
-msgstr "Значэнні па змаўчанні"
-
 #: kallithea/templates/admin/defaults/defaults.html:11
 #: kallithea/templates/base/base.html:66
-msgid "Defaults"
+msgid "Repository Defaults"
 msgstr "Значэнні па змаўчанні"
 
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "Тып"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "Прыватны рэпазітар"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr "Прыватныя рэпазітары бачныя толькі іх удзельнікам."
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "Уключыць статыстыку"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "Уключыць акно статыстыкі на старонцы «Агульныя звесткі»."
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "Уключыць спампоўку"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "Уключыць меню спампоўкі на старонцы «Агульныя звесткі»."
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "Уключыць блакаванне"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr "Уключыць аўтаблакоўку для рэпазітара."
 
@@ -2596,6 +2748,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr "Мінае"
 
@@ -2606,7 +2764,9 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+#, fuzzy
+#| msgid "never"
+msgid "Never"
 msgstr "ніколі"
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2614,7 +2774,7 @@
 msgstr "Абнавіць"
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "Адмена"
 
@@ -2637,12 +2797,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr "Стварыць новую gist-запіс"
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr "Створана"
 
@@ -2668,25 +2828,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2698,7 +2860,7 @@
 #: kallithea/templates/admin/gists/show.html:5
 #: kallithea/templates/admin/gists/show.html:9
 msgid "Gist"
-msgstr "Gist"
+msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:10
 #: kallithea/templates/email_templates/changeset_comment.html:15
@@ -2716,11 +2878,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "Выдаліць"
 
@@ -2729,9 +2902,18 @@
 msgstr "Пацвердзіце выдаленне гэтай gist-запісы"
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2757,7 +2939,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "Мой Акаўнт"
 
@@ -2766,83 +2948,90 @@
 msgid "Profile"
 msgstr "Профіль"
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
-msgstr "API-ключы"
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "Новы E-mail"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
-msgstr "Мае адрасы E-mail"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
+msgstr "API-ключы"
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr "Мае рэпазітары"
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "рэпазітары"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "Прагледжана"
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "Стварыць рэпазітары"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
-msgstr "Мае прывілеі"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+#, fuzzy
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "Скапіяваць прывілеі"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr "мінае"
+msgstr "Убудаваны"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to reset this api key: %s"
+msgid "Confirm to reset this API key: %s"
 msgstr "Пацвердзіце скід гэтага API-ключа: %s"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
-msgstr ""
+#, fuzzy
+#| msgid "expires"
+msgid "Expired"
+msgstr "мінае"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr "Пацвердзіце выдаленне гэтага API-ключа: %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+#, fuzzy
+#| msgid "remove"
+msgid "Remove"
 msgstr "выдаліць"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
-msgstr ""
+#, fuzzy
+#| msgid "No additional emails specified."
+msgid "No additional API keys specified"
+msgstr "Дадатковыя адрасы e-mail не пазначаны."
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
-msgstr ""
+#, fuzzy
+#| msgid "New field key"
+msgid "New API key"
+msgstr "Ключ"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2855,19 +3044,6 @@
 msgid "Primary"
 msgstr "Асноўны"
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "выдаліць"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2888,19 +3064,24 @@
 msgid "Change Your Account Password"
 msgstr "Змена пароля"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr "Бягучы пароль"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "Новы пароль"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr "Пацвердзіце новы пароль"
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "Зменіце аватар праз сайт"
@@ -2921,15 +3102,11 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
+#, fuzzy
+#| msgid "current IP"
+msgid "Current IP"
 msgstr "бягучы IP-адрас"
 
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be managed "
-"here"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
 msgid "Repositories You Own"
 msgstr "Рэпазітары, дзе Вы — уладальнік"
@@ -2963,7 +3140,7 @@
 msgstr "Каментары"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr "Pull-запыты"
 
@@ -2981,36 +3158,26 @@
 msgstr "Паказаць апавяшчэнне"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "Апавяшчэнні"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr "Кіраванне прывілеямі"
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "Прывілеі"
+msgid "Default Permissions"
+msgstr "Стандартныя прывілеі"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
 msgid "Global"
-msgstr ""
+msgstr "Глабальныя"
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr "Белы спіс IP"
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr "Агляд"
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "Ананімны доступ"
@@ -3018,29 +3185,33 @@
 #: kallithea/templates/admin/permissions/permissions_globals.html:13
 #, python-format
 msgid ""
-"Allow access to Kallithea without needing to log in. Anonymous users use %s "
-"user permissions."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+"Allow access to Kallithea without needing to log in. Anonymous users use "
+"%s user permissions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
-"permission, note that all custom default permission on repositories will be "
-"lost"
+"permission, note that all custom default permission on repositories will "
+"be lost"
 msgstr ""
 "Абраныя прывілеі будуць усталяваны па змаўчанні для кожнага рэпазітара. "
 "Улічыце, што раней усталяваныя прывілеі па змаўчанні будуць скінуты"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repositories"
+msgstr "Імпартаваць існы рэпазітар?"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
-msgstr "Перазапісаць існыя налады"
+msgid "Permissions for the Default user on new repositories."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "Група рэпазітароў"
@@ -3052,78 +3223,114 @@
 "will be lost"
 msgstr ""
 "Абраныя прывілеі будуць усталяваны па змаўчанні для кожнай групы "
-"рэпазітароў. Улічыце, што раней усталяваныя прывілеі па змаўчанні для груп "
-"рэпазітароў будуць скінуты"
+"рэпазітароў. Улічыце, што раней усталяваныя прывілеі па змаўчанні для "
+"груп рэпазітароў будуць скінуты"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repository groups"
+msgstr "Імпартаваць існы рэпазітар?"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr "Група карыстачоў"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
+#, fuzzy
+#| msgid "" "All default permissions on each user group will be reset to chosen
+#| " "permission, note that all custom default permission on repository groups
+#| " "will be lost"
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
-msgstr ""
-"Абраныя прывілеі будуць усталяваны па змаўчанні для кожнай групы карыстачоў. "
-"Улічыце, што раней усталяваныя прывілеі па змаўчанні для груп карыстачоў "
-"будуць скінуты"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+"Абраныя прывілеі будуць усталяваны па змаўчанні для кожнай групы "
+"карыстачоў. Улічыце, што раней усталяваныя прывілеі па змаўчанні для груп"
+" карыстачоў будуць скінуты"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "Стварэнне рэпазітара"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid ""
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
 msgid ""
-"Write permission to a repository group allows creating repositories inside "
-"that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr "Стварэнне груп карыстачоў"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr "Стварэнне форка рэпазітара"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "Рэгістрацыя"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr "Актывацыя іншага ўліковага запісу"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr "Белы спіс IP для ўсіх карыстачоў"
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
 msgstr "Пацвердзіце выдаленне IP %s"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr "Дазволены любыя IP-адрасы."
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr "Новы IP-адрас"
 
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-msgid "Default User Permissions Overview"
-msgstr "Агляд мае рацыю карыстачоў па змаўчанні"
-
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:105
@@ -3145,12 +3352,12 @@
 msgstr "Бацькоўская група"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3168,20 +3375,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67
-#: kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "Налады"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr "Дадаткова"
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "Прывілеі"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3189,7 +3401,7 @@
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:6
 msgid "Top level repositories"
-msgstr ""
+msgstr "Рэпазітары верхняга ўзроўню"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:7
 msgid "Total repositories"
@@ -3202,12 +3414,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "Створана"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3219,39 +3431,13 @@
 msgid "Delete this repository group"
 msgstr "Выдаліць гэту групу рэпазітароў"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "нічога"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "чытаць"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "запісваць"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "адміністратар"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
-msgstr ""
+#, fuzzy
+#| msgid "user groups"
+msgid "User/User Group"
+msgstr "групы карыстальнікаў"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:45
@@ -3259,7 +3445,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "па змаўчанні"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3268,14 +3456,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "адклікаць"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3283,12 +3468,14 @@
 msgstr "Дадаць новы"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+#, fuzzy
+#| msgid "apply to children"
+msgid "Apply to children"
 msgstr "дастасаваць да даччыным"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
 msgid "Both"
-msgstr ""
+msgstr "Абедзьве"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:108
 msgid ""
@@ -3298,8 +3485,8 @@
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:38
 msgid ""
-"Enable lock-by-pulling on group. This option will be applied to all other "
-"groups and repositories inside"
+"Enable lock-by-pulling on group. This option will be applied to all other"
+" groups and repositories inside"
 msgstr ""
 "Уключыць аўтаблакоўку для групы. Гэта опцыя будзе ўжыта да ўсіх даччыных "
 "груп і рэпазітарам"
@@ -3333,45 +3520,43 @@
 msgid "Number of Top-level Repositories"
 msgstr "Лік рэпазітароў верхняга ўзроўня"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "Кланаваць з"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr "Апцыянальны URL, з якога патрабуецца скланаваць рэпазітар."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "[створаны] рэпазітар"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
-msgid ""
-"Keep it short and to the point. Use a README file for longer descriptions."
+msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 "Кароткае і асэнсаванае. Для разгорнутага апісання выкарыстоўвайце файл "
 "README."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr "Апцыянальна абраць групу, у якую змясціць дадзены рэпазітар."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "Тып стваранага рэпазітара."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "Рэвізія для выгрузкі"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3384,13 +3569,13 @@
 
 #: kallithea/templates/admin/repos/repo_creating.html:13
 msgid "Creating repository"
-msgstr ""
+msgstr "Стварэнне рэпазітара"
 
 #: kallithea/templates/admin/repos/repo_creating.html:27
 #, python-format
 msgid ""
-"Repository \"%(repo_name)s\" is being created, you will be redirected when "
-"this process is finished.repo_name"
+"Repository \"%(repo_name)s\" is being created, you will be redirected "
+"when this process is finished.repo_name"
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_creating.html:39
@@ -3410,7 +3595,7 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:52
 msgid "Caches"
-msgstr ""
+msgstr "Кэшы"
 
 #: kallithea/templates/admin/repos/repo_edit.html:55
 msgid "Remote"
@@ -3418,8 +3603,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "Статыстыка"
 
@@ -3441,15 +3626,15 @@
 msgid "Public Journal Visibility"
 msgstr "Доступ да публічнага часопіса"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "Выдаліць з агульнадаступнага часопіса"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 msgid "Add to Public Journal"
 msgstr "Дадаць у публічны часопіс"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
@@ -3457,49 +3642,49 @@
 "Усе выконваемыя з гэтым рэпазітаром дзеянні будуць адлюстроўвацца ў "
 "публічным часопісе."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 msgid "Change Locking"
 msgstr "Уключыць блакаванне"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 msgid "Confirm to unlock repository."
 msgstr "Пацвердзіце здыманне блакавання з рэпазітара."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 msgid "Unlock Repository"
 msgstr "Разблакаваць рэпазітар"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 msgid "Confirm to lock repository."
 msgstr "Пацвердзіце блакаванне рэпазітара."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 msgid "Lock Repository"
 msgstr "Заблакаваць рэпазітар"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "Рэпазітар не заблакаваны"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
-"disabled. Triggering a pull locks the repository.  The user who is pulling "
-"locks the repository; only the user who pulled and locked it can unlock it "
-"by doing a push."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+"disabled. Triggering a pull locks the repository.  The user who is "
+"pulling locks the repository; only the user who pulled and locked it can "
+"unlock it by doing a push."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "Пацвердзіце выдаленне гэтага рэпазітара: %s"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 msgid "Delete this Repository"
 msgstr "Выдаліць гэты рэпазітар"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
@@ -3507,18 +3692,19 @@
 msgstr[1] "Дадзены рэпазітар мае %s копіі"
 msgstr[2] "Дадзены рэпазітар мае %s дзід"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr "Адлучыць fork'і"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr "Выдаліць fork'і"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
-"The deleted repository will be moved away and hidden until the administrator "
-"expires it. The administrator can both permanently delete it or restore it."
+"The deleted repository will be moved away and hidden until the "
+"administrator expires it. The administrator can both permanently delete "
+"it or restore it."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:4
@@ -3552,8 +3738,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "Актыўны"
@@ -3592,32 +3778,42 @@
 msgstr "Дадатковыя палі адключаны."
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "прыватны рэпазітар"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr "Спасылка для кланавання"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr "Атрымаць змены з выдаленага боку"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
+#, fuzzy, python-format
+#| msgid "Created repository %s"
+msgid "Remote repository URL"
+msgstr "Рэпазітар %s створаны"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "[занесены змены з выдаленага рэпазітара] у рэпазітар"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to pull changes from remote side."
+msgid "Confirm to pull changes from remote repository."
 msgstr "Пацвердзіце спампоўку змен."
 
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr "Нязменлівы id"
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "прыватны рэпазітар"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
-msgstr ""
+msgstr "Што гэта?"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:13
 msgid "URL by id"
@@ -3627,44 +3823,37 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr "Спасылка для кланавання"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "рэдагаваць"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "[створаны] рэпазітар"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "Рэпазітар"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
-"Рэвізія па змаўчанні, з якой будзе вырабляцца выгрузка файлаў пры спампоўцы"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+"Рэвізія па змаўчанні, з якой будзе вырабляцца выгрузка файлаў пры "
+"спампоўцы"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "Змяніць уладальніка рэпазітара."
 
@@ -3690,7 +3879,7 @@
 
 #: kallithea/templates/admin/repos/repos.html:51
 msgid "State"
-msgstr ""
+msgstr "Стан"
 
 #: kallithea/templates/admin/settings/settings.html:5
 msgid "Settings Administration"
@@ -3715,61 +3904,17 @@
 
 #: kallithea/templates/admin/settings/settings.html:33
 msgid "Full Text Search"
-msgstr ""
+msgstr "Паўнатэкставы пошук"
 
 #: kallithea/templates/admin/settings/settings.html:34
 msgid "System Info"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
+msgstr "Інфармацыя пра сістэму"
 
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
-msgstr ""
+msgid "Send test email to"
+msgstr "Адаслаць тэставае паведамленне на"
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "Адправіць"
 
@@ -3809,8 +3954,8 @@
 
 #: kallithea/templates/admin/settings/settings_global.html:51
 msgid ""
-"Private key for reCaptcha system. Setting this value will enable captcha on "
-"registration."
+"Private key for reCaptcha system. Setting this value will enable captcha "
+"on registration."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_global.html:56
@@ -3825,8 +3970,8 @@
 
 #: kallithea/templates/admin/settings/settings_hooks.html:15
 msgid ""
-"Hooks can be used to trigger actions on certain events such as push / pull. "
-"They can trigger Python functions or external applications."
+"Hooks can be used to trigger actions on certain events such as push / "
+"pull. They can trigger Python functions or external applications."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_hooks.html:19
@@ -3842,13 +3987,15 @@
 msgstr "Опцыі перасканіравання"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
-msgstr "Знішчыць усе дадзеныя"
+#, fuzzy
+#| msgid "Search in repositories"
+msgid "Delete records of missing repositories"
+msgstr "Пошук па рэпазітарах"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer exist "
-"in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3865,11 +4012,11 @@
 
 #: kallithea/templates/admin/settings/settings_mapping.html:25
 msgid ""
-"Verify if Kallithea's Git hooks are installed for each repository. Current "
-"hooks will be updated to the latest version."
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+"Verify if Kallithea's Git hooks are installed for each repository. "
+"Current hooks will be updated to the latest version."
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3896,38 +4043,44 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
-msgstr ""
+#, fuzzy
+#| msgid "check for updates"
+msgid "Check for updates"
+msgstr "праверыць наяўнасць абнаўленняў"
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
+msgid "Platform"
+msgstr "Платформа"
+
+#: kallithea/templates/admin/settings/settings_system.html:8
 msgid "Git version"
 msgstr "Версія Git"
 
-#: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:22
+msgstr "Праверка абнаўленняў..."
+
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -3985,10 +4138,11 @@
 
 #: kallithea/templates/admin/settings/settings_vcs.html:69
 msgid ""
-"Click to unlock. You must restart Kallithea in order to make this setting "
-"take effect."
-msgstr ""
-"Націсніце для разблакавання. Змены набудуць моц пасля перазагрузкі Kallithea."
+"Click to unlock. You must restart Kallithea in order to make this setting"
+" take effect."
+msgstr ""
+"Націсніце для разблакавання. Змены набудуць моц пасля перазагрузкі "
+"Kallithea."
 
 #: kallithea/templates/admin/settings/settings_vcs.html:72
 msgid ""
@@ -4025,25 +4179,26 @@
 "Gravatar URL allows you to use another avatar server application.\n"
 "                                                        The following "
 "variables of the URL will be replaced accordingly.\n"
-"                                                        {scheme}    'http' "
-"or 'https' sent from running Kallithea server,\n"
+"                                                        {scheme}    "
+"'http' or 'https' sent from running Kallithea server,\n"
 "                                                        {email}     user "
 "email,\n"
-"                                                        {md5email}  md5 hash "
-"of the user email (like at gravatar.com),\n"
-"                                                        {size}      size of "
-"the image that is expected from the server application,\n"
-"                                                        {netloc}    network "
-"location/server host of running Kallithea server"
+"                                                        {md5email}  md5 "
+"hash of the user email (like at gravatar.com),\n"
+"                                                        {size}      size "
+"of the image that is expected from the server application,\n"
+"                                                        {netloc}    "
+"network location/server host of running Kallithea server"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:42
 msgid ""
-"Schema of clone URL construction eg. '{scheme}://{user}@{netloc}/{repo}'.\n"
+"Schema of clone URL construction eg. '{scheme}://{user}@{netloc}/{repo}'."
+"\n"
 "                                                        The following "
 "variables are available:\n"
-"                                                        {scheme} 'http' or "
-"'https' sent from running Kallithea server,\n"
+"                                                        {scheme} 'http' "
+"or 'https' sent from running Kallithea server,\n"
 "                                                        {user}   current "
 "user username,\n"
 "                                                        {netloc} network "
@@ -4060,11 +4215,11 @@
 
 #: kallithea/templates/admin/settings/settings_visual.html:59
 msgid ""
-"Number of items displayed in the main page dashboard before pagination is "
-"shown."
-msgstr ""
-"Колькасць элементаў, што паказваюцца на галоўнай старонцы панэлі кіравання "
-"перад паказам нумарацыі старонак."
+"Number of items displayed in the main page dashboard before pagination is"
+" shown."
+msgstr ""
+"Колькасць элементаў, што паказваюцца на галоўнай старонцы панэлі "
+"кіравання перад паказам нумарацыі старонак."
 
 #: kallithea/templates/admin/settings/settings_visual.html:65
 msgid "Admin pages items"
@@ -4081,11 +4236,11 @@
 msgstr "Абразкі"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr "Паказваць абразкі публічных рэпазітароў"
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr "Паказваць абразкі прыватных рэпазітароў"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4093,7 +4248,9 @@
 msgstr "Паказваць абразкі публічных рэпазітароў."
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+#, fuzzy
+#| msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr "Метатэгіраванне"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4102,8 +4259,8 @@
 
 #: kallithea/templates/admin/settings/settings_visual.html:111
 msgid ""
-"Parses meta tags from the repository description field and turns them into "
-"colored tags."
+"Parses meta tags from the repository description field and turns them "
+"into colored tags."
 msgstr ""
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:5
@@ -4112,6 +4269,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr "Групы карыстальнікаў"
@@ -4131,24 +4289,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "Стандартныя прывілеі"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "удзельнікі"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "Удзельнікі"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "Пацвердзіце выдаленне наступнай групы карыстачоў: %s"
@@ -4173,10 +4332,6 @@
 msgid "User Groups Administration"
 msgstr "Адміністраванне груп карыстачоў"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr "групы карыстальнікаў"
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "Дадаць карыстача"
@@ -4202,11 +4357,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr "Стандартныя прывілеі"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4216,7 +4367,7 @@
 msgstr "Карыстальнік: %s"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4226,11 +4377,11 @@
 msgstr "Апошні ўваход"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Пацвердзіце выдаленне карыстача %s"
@@ -4250,20 +4401,13 @@
 
 #: kallithea/templates/admin/users/user_edit_profile.html:12
 msgid "Missing email, please update this user email address."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be "
-"managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+msgstr "Не паказаны email. Калі ласка, абнавіце email карыстальніка."
+
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "Пацвердзіце новы пароль"
 
@@ -4284,47 +4428,55 @@
 msgid "Support"
 msgstr "Падтрымка"
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Рэпазітар Mercurial"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Git рэпазітар"
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr "Стварыць форк"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Агульныя звесткі"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "Гісторыя змен"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "Файлы"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr "Пераключыцца на"
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "Опцыі"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr "Параўнаць форк"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4334,129 +4486,125 @@
 msgid "Compare"
 msgstr "Параўнаць"
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "Пошук"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr "Разблакаваць"
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr "Заблакаваць"
 
-#: kallithea/templates/base/base.html:176
+#: kallithea/templates/base/base.html:180
 msgid "Follow"
 msgstr "Назіраць"
 
-#: kallithea/templates/base/base.html:177
+#: kallithea/templates/base/base.html:181
 msgid "Unfollow"
 msgstr "Не назіраць"
 
-#: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "Форк"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr "Стварыць Pull запыт"
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr "Паказаць pull-запыты для %s"
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr "Паказаць апошнюю актыўнасць"
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "Часопіс"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "Агульнадаступны часопіс"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr "Паказаць публічныя запісы"
 
-#: kallithea/templates/base/base.html:237
+#: kallithea/templates/base/base.html:241
 msgid "Gists"
 msgstr "Gist"
 
-#: kallithea/templates/base/base.html:241
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr "Усе публічныя Gist-запісы"
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr "Мае публічныя Gist-запісы"
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr "Мае прыватныя Gist-запісы"
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr "Пошук па рэпазітарах"
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr "Мае Pull-запыты"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr "Не аўтарызаваны"
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr "Аўтарызавацца"
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "Забыліся пароль?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "Выйсце"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
-msgstr ""
-
-#: kallithea/templates/base/base.html:524
+msgstr "Супадзенняў не знойдзена"
+
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
-msgstr ""
-
-#: kallithea/templates/base/base.html:533
+msgstr "Гарачыя клавішы"
+
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Значэнні па змаўчанні"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default IP "
-"address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4486,8 +4634,9 @@
 "рэпазітароў"
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "Паказаць"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4512,7 +4661,7 @@
 msgstr "Дадаць яшчэ адзін каментар"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "Адмяніць назіранне за рэпазітаром"
 
@@ -4582,6 +4731,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr "Пацвердзіце выдаленне прывілею для {0}: {1} ?"
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr "уключана"
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr "адключана"
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr "Абраць набор змен"
@@ -4611,6 +4768,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4640,10 +4798,6 @@
 msgstr[1] "Паказаны %d з %d рэвізій"
 msgstr[2] "Паказаны %d з %d рэвізій"
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "Паказаць"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr "Ачысціць выбар"
@@ -4660,7 +4814,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr "Параўнаць форк з бацькоўскім рэпазітаром (%s)"
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4670,10 +4824,12 @@
 
 #: kallithea/templates/changelog/changelog.html:92
 #: kallithea/templates/changelog/changelog_summary_data.html:20
-#, python-format
+#, fuzzy, python-format
+#| msgid "" "Changeset status: %s\n" "Click to open associated pull request
+#| #%s"
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 "Статут набору змен: %s?\n"
 "Клікніце, каб перайсці да адпаведнага pull-request'у #%s"
@@ -4685,7 +4841,7 @@
 msgstr "Статут набору змен: %s"
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4718,7 +4874,7 @@
 msgid "Branch %s"
 msgstr "Галінка %s"
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "Змен яшчэ няма"
 
@@ -4734,7 +4890,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr "Дададзена"
 
@@ -4764,21 +4920,23 @@
 msgid "Refs"
 msgstr "Спасылкі"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr "Дадаць ці загрузіць файлы праз Kallithea"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
-msgstr ""
-
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
+msgstr "Дадаць новы файл"
+
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Push new repo"
+msgid "Push new repository"
 msgstr "Адправіць новы рэпазітар"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr "Існы рэпазітар?"
 
@@ -4788,15 +4946,15 @@
 msgstr "%s Змены"
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr "Статут змен"
@@ -4819,7 +4977,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "звесці"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4830,9 +4990,21 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "Створана"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "Створана"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
@@ -4840,9 +5012,9 @@
 msgstr[1] "%s файлаў зменена"
 msgstr[2] "%s файла зменена"
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
@@ -4850,93 +5022,94 @@
 msgstr[1] "%s файла зменена: %s даданні, %s выдаленні"
 msgstr[2] "%s файлаў зменена: %s даданняў, %s выдаленняў"
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr "Паказаць поўны diff"
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "no revisions"
+msgid "No revisions"
 msgstr "няма рэвізій"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-msgid "Status change from pull request"
-msgstr "Змена статуту"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "Каментар у pull-запыце"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 msgid "No title"
 msgstr "Няма загалоўка"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr "Каментар у pull-запыце"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy
+#| msgid "No changesets"
+msgid "on this changeset"
+msgstr "Няма змен"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 msgid "Delete comment?"
 msgstr "Выдаліць каментар?"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Апошнія змены"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr "Каментар да радка {1}."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
-msgstr ""
-"Парсінг каментароў выкананы з выкарыстаннем сінтаксісу %s з падтрымкай %s."
-
-#: kallithea/templates/changeset/changeset_file_comment.html:70
-#: kallithea/templates/changeset/changeset_file_comment.html:165
+msgstr "Парсінг каментароў выкананы з выкарыстаннем сінтаксісу %s з падтрымкай %s."
+
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 "Выкарыстоўвайце @імя_карыстача ў тэксце, каб адправіць абвестку пэўнаму "
 "карыстачу"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
 msgstr "Папярэдні прагляд каментара"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:85
+#: kallithea/templates/changeset/changeset_file_comment.html:77
 msgid "Submitting ..."
 msgstr "Ужыванне..."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:80
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "Каментаваць"
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr "Прадпрагляд"
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr "Прадпрагляд"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr "Вам неабходна аўтарызавацца, каб пакідаць каментары."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr "Аўтарызавацца цяпер"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr "Схаваць"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -4944,7 +5117,7 @@
 msgstr[1] "%d каментара"
 msgstr[2] "%d каментароў"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
@@ -4952,7 +5125,7 @@
 msgstr[1] "%d да радкоў"
 msgstr[2] "%d да радкоў"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
@@ -4960,19 +5133,27 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+#, fuzzy
+#| msgid "Use @username inside this text to notify another user"
+msgid "Use @username inside this text to notify another user."
+msgstr ""
+"Выкарыстоўвайце @імя_карыстача ў тэксце, каб адправіць абвестку пэўнаму "
+"карыстачу"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 msgid "Set changeset status"
-msgstr "Змяніць статут рэвізіі"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+msgstr "Змяніць статус рэвізіі"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 msgid "No change"
 msgstr "Без змен"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 msgid "Close"
 msgstr "Зачыніць"
 
@@ -4991,7 +5172,7 @@
 msgstr "Паказаць поўны diff для гэтага файла"
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr "Паказаць поўны diff для гэтага файла"
@@ -5000,11 +5181,11 @@
 msgid "Show inline comments"
 msgstr "Паказаць каментары ў радках"
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr "Выдалены"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr "Пераназваны"
 
@@ -5016,29 +5197,41 @@
 msgid "Ancestor"
 msgstr "Продак"
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr "Паказаць merge diff"
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr "Агульны продак"
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr "адстае на"
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, python-format
 msgid "%s changesets"
 msgstr "%s змен"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr "ад"
 
@@ -5062,7 +5255,7 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
@@ -5070,49 +5263,36 @@
 msgstr[1] "Паказаць %s commit'а"
 msgstr[2] "Паказаць %s commit'аў"
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr "Няма файлаў"
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr "Паказаць поўны diff"
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Рэпазітар Mercurial"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Git рэпазітар"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "Публічны рэпазітар"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "Змен яшчэ не было"
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "Падпісацца на стужку RSS %s"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "Падпісацца на стужку Atom %s"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr "Ствараецца"
 
@@ -5128,20 +5308,20 @@
 
 #: kallithea/templates/email_templates/changeset_comment.html:12
 msgid "The changeset status was changed to"
-msgstr "Стан набору змен зменена на"
+msgstr "Стан набору змен зменены на"
 
 #: kallithea/templates/email_templates/main.html:6
 msgid "This is an automatic notification. Don't reply to this mail."
-msgstr ""
+msgstr "Гэта аўтаматычнае апавяшчэнне. Не адказвайце на гэтае паведамленне."
 
 #: kallithea/templates/email_templates/password_reset.html:4
 #, python-format
 msgid "Hello %s"
-msgstr "Дабрыдзень, %s"
+msgstr "Добры дзень, %s"
 
 #: kallithea/templates/email_templates/password_reset.html:6
 msgid "We received a request to create a new password for your account."
-msgstr "Мы адправілі запыт на стварэнне новага пароля для вашага акаўнта."
+msgstr "Мы атрымалі запыт на стварэнне новага пароля для вашага акаўнта."
 
 #: kallithea/templates/email_templates/password_reset.html:7
 msgid "You can generate it by clicking following URL"
@@ -5150,8 +5330,8 @@
 #: kallithea/templates/email_templates/password_reset.html:10
 msgid "Please ignore this email if you did not request a new password ."
 msgstr ""
-"Калі ласка, праігнаруйце дадзенае паведамленне, калі вы не запытвалі новы "
-"пароль."
+"Калі ласка, праігнаруйце дадзенае паведамленне, калі вы не запытвалі новы"
+" пароль."
 
 #: kallithea/templates/email_templates/pull_request.html:5
 #, python-format
@@ -5170,11 +5350,11 @@
 
 #: kallithea/templates/email_templates/pull_request_comment.html:9
 msgid "The comment closed the pull request with status"
-msgstr "Каментар зачыніў pull-запыт са статутам"
+msgstr "Каментар зачыніў pull-запыт са статусам"
 
 #: kallithea/templates/email_templates/pull_request_comment.html:11
 msgid "The comment was made with status"
-msgstr "Каментар пакінуты са статутам"
+msgstr "Каментар пакінуты са статусам"
 
 #: kallithea/templates/email_templates/registration.html:6
 msgid "View this user here"
@@ -5239,10 +5419,6 @@
 msgid "Commit Changes"
 msgstr "Ужыць змены"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr "рэвізія"
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr "Папярэдняя рэвізія"
@@ -5268,18 +5444,14 @@
 msgstr "Памер"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "Тып файла"
-
-#: kallithea/templates/files/files_browser.html:63
 msgid "Last Revision"
 msgstr "Апошняя версія"
 
-#: kallithea/templates/files/files_browser.html:64
+#: kallithea/templates/files/files_browser.html:63
 msgid "Last Modified"
 msgstr "Апошняя змена"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 msgid "Last Committer"
 msgstr "Аўтар апошняй рэвізіі"
 
@@ -5338,7 +5510,7 @@
 
 #: kallithea/templates/files/files_source.html:10
 msgid "Show Full History"
-msgstr ""
+msgstr "Паказаць ўсю гісторыю"
 
 #: kallithea/templates/files/files_source.html:11
 msgid "Show Authors"
@@ -5355,7 +5527,7 @@
 
 #: kallithea/templates/files/files_source.html:41
 msgid "Editing binary files not allowed"
-msgstr ""
+msgstr "Рэдагаванне бінарных файлаў забаронена"
 
 #: kallithea/templates/files/files_source.html:44
 msgid "Editing files allowed only when on branch head revision"
@@ -5392,8 +5564,8 @@
 msgstr "%s Назіральнікі"
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "Назіральнікі"
 
@@ -5413,7 +5585,8 @@
 #: kallithea/templates/forks/fork.html:62
 msgid "Default revision for files page, downloads, whoosh, and readme."
 msgstr ""
-"Рэвізія па змаўчанні, з якой будзе вырабляцца выгрузка файлаў пры спампоўцы."
+"Рэвізія па змаўчанні, з якой будзе вырабляцца выгрузка файлаў пры "
+"спампоўцы."
 
 #: kallithea/templates/forks/fork.html:68
 msgid "Private"
@@ -5445,8 +5618,8 @@
 msgstr "Форкі %s"
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr "Адгалінаванні"
 
@@ -5454,7 +5627,7 @@
 msgid "Forked"
 msgstr "Форкнута"
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "Форкі яшчэ не створаны"
 
@@ -5467,18 +5640,13 @@
 msgstr "Стужка часопіса RSS"
 
 #: kallithea/templates/journal/journal.html:56
-msgid "My Repos"
+msgid "My Repositories"
 msgstr "Мае рэпазітары"
 
-#: kallithea/templates/journal/journal_data.html:61
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr "Запісы адсутнічаюць"
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "Публічны часопіс"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "Агульная стужка часопіса ATOM"
@@ -5520,20 +5688,16 @@
 msgid "Destination repository"
 msgstr "Рэпазітар прызначэння"
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr "Рэцэнзенты pull-запытаў"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr "Запісы отсуствуют"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "адклікаць"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr "Ад"
@@ -5542,50 +5706,49 @@
 msgid "To"
 msgstr "Да"
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr "Апошняя адзнака: %s"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr "Ніхто не галасаваў"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr "Вы прагаласавалі: %s"
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr "Вы не галасавалі"
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr "Выдаліць pull-запыт"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr "Пацвердзіце выдаленне гэтага pull-request'а"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+msgstr "(няма загалоўка)"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr "Зачынена"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr "Выдаліць pull-запыт"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr "Пацвердзіце выдаленне гэтага pull-request'а"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this pull request"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "Пацвердзіце выдаленне гэтага pull-request'а"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
+#, fuzzy, python-format
+#| msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr "%s Pull-запыт #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
-#, python-format
-msgid "Pull request #%s from %s#%s"
+#, fuzzy, python-format
+#| msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr "Pull-запыты №%s ад %s#%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5601,11 +5764,11 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr "Яшчэ не разгледжаны"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
@@ -5613,75 +5776,75 @@
 msgstr[1] "%d рэцэнзента"
 msgstr[2] "%d рэцэнзентаў"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr "Запыт на занясенне змен быў разгледжаны ўсімі рэцэнзентамі"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 msgid "There are no reviewers"
 msgstr "Няма рэцэнзентаў"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 msgid "on"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+msgstr "на"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+msgstr "Цэль"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr "Прыняць змены"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr "Створана"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 msgid "Update"
 msgstr "Абнавіць"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr "уладальнік"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr "рэцэнзент"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr "Рэцэнзенты pull-запытаў"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 msgid "Remove reviewer"
 msgstr "Выдаліць рэцэнзента"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 msgid "Potential Reviewers"
 msgstr "Патэнцыйныя рэцэнзенты"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr "Захаваць змены"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 msgid "Cancel Changes"
 msgstr "Адмяніць змены"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 msgid "Pull Request Content"
 msgstr ""
 
@@ -5782,8 +5945,8 @@
 msgstr "RSS стужка рэпазітара %s"
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr "Уключана"
 
@@ -5791,45 +5954,45 @@
 msgid "Stats gathered: "
 msgstr "Атрыманая статыстыка: "
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "файлы"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr "Паказаць яшчэ"
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "commit'ы"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "файлы дададзены"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "файлы зменены"
+msgid "files added"
+msgstr "файлы дададзены"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "файлы зменены"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "файлы выдалены"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "commit"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "файл выдалены"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "файл зменены"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "файл выдалены"
 
@@ -5851,65 +6014,75 @@
 msgid "Fork of"
 msgstr "Форк ад"
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr "Паказаць па імі"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "Кланаваць з"
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
+msgstr "Спасылка для кланавання"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr "Паказаць па імі"
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr "Паказаць па ID"
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr "Папулярныя файлы"
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "Запампаваць"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "Спамповак яшчэ няма"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "Спампоўка адключана ў гэтым рэпазітары"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr "Запампаваць у zip"
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr "Адзначце для спампоўкі архіва з даччынымі рэпазітарамі"
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
+#: kallithea/templates/summary/summary.html:125
+#, fuzzy
+#| msgid "with subrepos"
+msgid "With subrepos"
 msgstr "з даччынымі рэпазітарамі"
 
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr "Памер рэпазітара"
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr "Стужка навін"
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 msgid "Latest Changes"
 msgstr "Апошнія змены"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr "Хуткі старт"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "Запампаваць %s як %s"
@@ -5922,3 +6095,282 @@
 #: kallithea/templates/tags/tags.html:26
 msgid "Compare Tags"
 msgstr "Параўнаць тэгі"
+
+#~ msgid "No comments."
+#~ msgstr "Няма каментароў."
+
+#~ msgid "public journal"
+#~ msgstr "агульнадаступны часопіс"
+
+#~ msgid "journal"
+#~ msgstr "часопіс"
+
+#~ msgid "Locked repository"
+#~ msgstr "Зачынены рэпазітар"
+
+#~ msgid "Unlocked repository"
+#~ msgstr "Адкрыты рэпазітар"
+
+#~ msgid "Unlocked"
+#~ msgstr "Разблакавана"
+
+#~ msgid "Locked"
+#~ msgstr "Заблакавана"
+
+#~ msgid "Repository has been %s"
+#~ msgstr "Рэпазітар %s"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "Вы не можаце рэдагаваць дадзенага карыстача"
+
+#~ msgid "No Files"
+#~ msgstr "Файлаў няма"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "Імя \"%(username)s\" адхілена"
+
+#~ msgid "invalid user name"
+#~ msgstr "няслушнае імя карыстача"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "Ваш акаўнт выключаны"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "няслушны URL для кланавання"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+#~ "Няслушны URL кланаванні, падайце карэктны "
+#~ "URL для кланавання ў фармаце "
+#~ "http(s)/svn+http(s)/ssh"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr "Рэвізіі %(revs)s ужо ўключаны ў pull-request ці маюць усталяваны статус"
+
+#~ msgid "Defaults"
+#~ msgstr "Значэнні па змаўчанні"
+
+#~ msgid "My Emails"
+#~ msgstr "Мае адрасы E-mail"
+
+#~ msgid "Watched"
+#~ msgstr "Прагледжана"
+
+#~ msgid "My Permissions"
+#~ msgstr "Мае прывілеі"
+
+#~ msgid "reset"
+#~ msgstr "cкінуць"
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr "выдаліць"
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "Кіраванне прывілеямі"
+
+#~ msgid "Overview"
+#~ msgstr "Агляд"
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr "Перазапісаць існыя налады"
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr "Белы спіс IP для ўсіх карыстачоў"
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "Агляд мае рацыю карыстачоў па змаўчанні"
+
+#~ msgid "none"
+#~ msgstr "нічога"
+
+#~ msgid "read"
+#~ msgstr "чытаць"
+
+#~ msgid "write"
+#~ msgstr "запісваць"
+
+#~ msgid "admin"
+#~ msgstr "адміністратар"
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "Апцыянальны URL, з якога патрабуецца скланаваць рэпазітар."
+
+#~ msgid "Remote URL"
+#~ msgstr "Спасылка для кланавання"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "Атрымаць змены з выдаленага боку"
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr "Нязменлівы id"
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "рэдагаваць"
+
+#~ msgid "new value"
+#~ msgstr "новае значэнне"
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr "SMTP-сервер"
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr "Знішчыць усе дадзеныя"
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "Стандартныя прывілеі"
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr "паказа́ць"
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "Змена статусу"
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid "revision"
+#~ msgstr "рэвізія"
+
+#~ msgid "Mimetype"
+#~ msgstr "Тып файла"
+
+#~ msgid "My Repos"
+#~ msgstr "Мае рэпазітары"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr "Апошняя адзнака: %s"
+
+#~ msgid "Nobody voted"
+#~ msgstr "Ніхто не галасаваў"
+
+#~ msgid "owner"
+#~ msgstr "уладальнік"
+
+#~ msgid "reviewer"
+#~ msgstr "рэцэнзент"
+
--- a/kallithea/i18n/cs/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/cs/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,9 +5,9 @@
 # #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2015-02-13 15:26+0200\n"
 "Last-Translator: Andrew Shadura <andrew@shadura.me>\n"
 "Language-Team: Czech "
@@ -19,19 +19,23 @@
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(zavřeno)"
 
@@ -46,51 +50,55 @@
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr ""
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "Taková revize neexistuje"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-#, fuzzy
-msgid "No comments."
-msgstr ""
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr ""
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy, python-format
+#| msgid "Unknown revision %s"
+msgid "No response"
+msgstr "Neznámá revize %s"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 
-#: kallithea/controllers/error.py:99
-msgid "Unauthorized access to resource"
-msgstr ""
-
-#: kallithea/controllers/error.py:101
-msgid "You don't have permission to view this page"
-msgstr "Nemáte oprávnění k zobrazení této stránky"
-
 #: kallithea/controllers/error.py:103
-msgid "The resource could not be found"
+msgid "Unauthorized access to resource"
 msgstr ""
 
 #: kallithea/controllers/error.py:105
+msgid "You don't have permission to view this page"
+msgstr "Nemáte oprávnění k zobrazení této stránky"
+
+#: kallithea/controllers/error.py:107
+msgid "The resource could not be found"
+msgstr ""
+
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -106,17 +114,17 @@
 msgid "%s %s feed"
 msgstr ""
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -194,45 +202,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Stahování vypnuto"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Neznámá revize %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Prázdný repozitář"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr ""
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Změny"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Větve"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Tagy"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
@@ -248,9 +254,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Repozitáře"
 
@@ -270,145 +276,163 @@
 msgstr "Záložka"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr ""
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr ""
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr ""
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+#, fuzzy
+#| msgid "bad captcha"
+msgid "Bad captcha"
 msgstr "špatná captcha"
 
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr ""
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr ""
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, fuzzy, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Záložky"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr ""
 
@@ -425,21 +449,21 @@
 msgid "An error occurred during search operation."
 msgstr "Došlo k chybě při vytváření gist"
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr ""
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -452,38 +476,38 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+msgid "Forever"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 minut"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 hodina"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 den"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 měsíc"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -497,7 +521,7 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+msgid "Unmodified"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:262
@@ -513,117 +537,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr "Úspěšně aktualizované heslo"
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr "Došlo k chybě při aktualizaci hesla uživatele"
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Došlo k chybě při ukládání e-mailové adresy"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr ""
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -631,11 +671,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -643,221 +683,213 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:297
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
-msgid "Removed repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:307
-#, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
+#: kallithea/controllers/admin/user_groups.py:340
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
-#: kallithea/controllers/admin/user_groups.py:340
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+msgid "Repository group permissions updated"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "Chyba při vytváření repozitáře %s"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:321
+#, python-format
+msgid "Cannot delete repository %s which still has forks"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "Nic"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been locked"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been unlocked"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "Odemčeno"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "Zamčeno"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr ""
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
@@ -873,7 +905,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 
 #: kallithea/controllers/admin/settings.py:213
@@ -950,83 +982,80 @@
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:745
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr ""
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr ""
 
@@ -1042,158 +1071,160 @@
 msgid "No changes detected"
 msgstr ""
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
-msgstr ""
-
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:677
+msgid "Compare view"
+msgstr ""
+
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr ""
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr ""
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:722
+#, python-format
+msgid "Fork name %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:742
+#, python-format
+msgid "Pull request %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr ""
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr ""
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr ""
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr ""
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1201,7 +1232,7 @@
 "repositories"
 msgstr ""
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
@@ -1209,7 +1240,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
@@ -1217,7 +1248,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
@@ -1225,7 +1256,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
@@ -1233,7 +1264,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
@@ -1241,7 +1272,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
@@ -1249,27 +1280,27 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr ""
 
@@ -1284,7 +1315,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr ""
 
@@ -1299,7 +1330,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr ""
 
@@ -1314,7 +1345,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr ""
 
@@ -1329,7 +1360,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr ""
 
@@ -1368,7 +1399,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr ""
 
@@ -1383,7 +1414,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr ""
 
@@ -1398,7 +1429,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr ""
 
@@ -1413,7 +1444,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr ""
 
@@ -1428,7 +1459,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr ""
 
@@ -1464,7 +1495,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr ""
 
@@ -1479,7 +1510,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr ""
 
@@ -1494,7 +1525,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr ""
 
@@ -1509,7 +1540,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr ""
 
@@ -1521,7 +1552,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr ""
 
@@ -1533,7 +1564,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr ""
 
@@ -1545,7 +1576,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr ""
 
@@ -1557,7 +1588,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr ""
 
@@ -1569,7 +1600,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr ""
 
@@ -1580,7 +1611,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr ""
 
@@ -1591,7 +1622,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr ""
 
@@ -1602,7 +1633,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr ""
 
@@ -1613,7 +1644,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr ""
 
@@ -1624,7 +1655,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr ""
 
@@ -1635,7 +1666,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr ""
 
@@ -1646,7 +1677,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr ""
 
@@ -1657,7 +1688,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr ""
 
@@ -1668,7 +1699,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr ""
 
@@ -1679,7 +1710,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr ""
 
@@ -1690,29 +1721,135 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr ""
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+msgid "Default user has read access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1669
+msgid "Default user has write access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+msgid "Only admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1683
+msgid "Non-admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1685
+msgid "Only admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1686
+msgid "Non-admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Chyba při vytváření repozitáře %s"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Chyba při vytváření repozitáře %s"
+
+#: kallithea/model/db.py:1698
+msgid "User registration with manual account activation"
+msgstr ""
+
+#: kallithea/model/db.py:1699
+msgid "User registration with automatic account activation"
+msgstr ""
+
+#: kallithea/model/db.py:2228
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Not reviewed"
+msgstr ""
+
+#: kallithea/model/db.py:2231
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Under review"
+msgstr ""
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr ""
@@ -1731,297 +1868,318 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
-#, python-format
-msgid "%(user)s commented on changeset at %(when)s"
-msgstr ""
-
-#: kallithea/model/notification.py:253
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
 #: kallithea/model/notification.py:254
 #, python-format
-msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:255
 #, python-format
-msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s sent message %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:256
 #, python-format
-msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:257
 #, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:258
+#, python-format
+msgid "%(user)s opened new pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:259
+#, python-format
+msgid "%(user)s commented on pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:266
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:267
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:268
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:269
+#, python-format
+msgid "%(user)s registered in Kallithea at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:270
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:271
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr ""
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr ""
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr ""
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr ""
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr ""
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr ""
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr ""
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:249
+msgid "You can't remove this user since it is crucial for the entire application"
+msgstr ""
+
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr ""
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr ""
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr ""
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr ""
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr ""
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, python-format
+msgid "Username \"%(username)s\" cannot be used"
+msgstr ""
+
+#: kallithea/model/validators.py:99
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
-msgstr ""
-
-#: kallithea/model/validators.py:132
+" dashes and must begin with an alphanumeric character or underscore"
+msgstr ""
+
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr ""
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr ""
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr ""
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
-msgstr ""
-
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr ""
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr ""
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
-msgstr ""
-
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:300
+msgid "Invalid username or password"
+msgstr ""
+
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr ""
+
+#: kallithea/model/validators.py:345
+#, python-format
+msgid "Repository name %(repo)s is not allowed"
+msgstr ""
+
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr ""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr ""
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "Unlock Repository"
+msgid "Invalid repository URL"
+msgstr "Prázdný repozitář"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr ""
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr ""
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr ""
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
-msgstr ""
-
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
-msgstr ""
-
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:705
+msgid "This email address is already in use"
+msgstr ""
+
+#: kallithea/model/validators.py:725
+#, python-format
+msgid "Email address \"%(email)s\" not found"
+msgstr ""
+
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr ""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr ""
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr ""
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2083,13 +2241,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2101,11 +2259,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr ""
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2126,11 +2284,11 @@
 msgid "Name"
 msgstr ""
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr ""
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2139,18 +2297,19 @@
 msgid "Tip"
 msgstr ""
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr ""
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2162,7 +2321,7 @@
 msgid "Click to sort ascending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2174,11 +2333,11 @@
 msgid "Click to sort descending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr ""
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2190,10 +2349,10 @@
 msgid "Data error."
 msgstr ""
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2203,7 +2362,7 @@
 msgstr ""
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr ""
 
@@ -2212,39 +2371,39 @@
 msgid "Log In to %s"
 msgstr ""
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr ""
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr ""
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr ""
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr ""
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr ""
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr ""
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr ""
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr ""
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr ""
@@ -2292,26 +2451,26 @@
 msgstr ""
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr ""
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr ""
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr ""
 
@@ -2421,109 +2580,95 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
+#: kallithea/templates/admin/defaults/defaults.html:11
+#: kallithea/templates/base/base.html:66
 #, fuzzy
 msgid "Repository Defaults"
 msgstr "Repozitáře"
 
-#: kallithea/templates/admin/defaults/defaults.html:11
-#: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr ""
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
@@ -2555,6 +2700,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr ""
 
@@ -2565,7 +2716,7 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+msgid "Never"
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2573,7 +2724,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
@@ -2596,12 +2747,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr ""
 
@@ -2627,25 +2778,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2675,11 +2828,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr ""
 
@@ -2688,9 +2852,18 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2716,7 +2889,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr ""
 
@@ -2725,26 +2898,33 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
+#: kallithea/templates/admin/my_account/my_account.html:36
+msgid "Email Addresses"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr ""
+#, fuzzy
+#| msgid "Repositories"
+msgid "Owned Repositories"
+msgstr "Repozitáře"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr ""
+#, fuzzy
+#| msgid "Repositories"
+msgid "Watched Repositories"
+msgstr "Repozitáře"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+msgid "Show Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
@@ -2752,56 +2932,42 @@
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
 #, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
+msgid "Confirm to reset this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+msgid "Expired"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
 #, python-format
-msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+msgid "Remove"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+msgid "New API key"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2814,19 +2980,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2847,19 +3000,24 @@
 msgid "Change Your Account Password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr ""
@@ -2880,13 +3038,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2924,7 +3076,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr ""
 
@@ -2942,20 +3094,14 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
+msgid "Default Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:28
@@ -2964,14 +3110,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr ""
@@ -2983,23 +3125,27 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Apply to all existing repositories"
+msgstr "Chyba při vytváření repozitáře %s"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
+msgid "Permissions for the Default user on new repositories."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr ""
@@ -3011,70 +3157,99 @@
 "will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+msgid "Apply to all existing repository groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
-msgid "Repository creation with group write access"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+msgid "Top level repository creation"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
+msgid "Repository creation with group write access"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+msgid ""
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm to delete this IP address: %s"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-msgid "Default User Permissions Overview"
+msgid "New IP address"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
@@ -3098,12 +3273,12 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3121,19 +3296,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "Nastavení"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr "Pokročilé"
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr ""
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3154,12 +3335,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3171,38 +3352,10 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+msgid "User/User Group"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3211,7 +3364,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+msgid "Default"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3220,12 +3373,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
+msgid "Revoke"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
@@ -3235,7 +3383,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+msgid "Apply to children"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3284,42 +3432,41 @@
 msgid "Number of Top-level Repositories"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Clone remote repository"
+msgstr "Prázdný repozitář"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr ""
 
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
+#: kallithea/templates/forks/fork.html:58
+msgid "Landing revision"
+msgstr ""
+
 #: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
-#: kallithea/templates/forks/fork.html:58
-msgid "Landing revision"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:72
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3366,8 +3513,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr ""
 
@@ -3389,48 +3536,48 @@
 msgid "Public Journal Visibility"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 msgid "Add to Public Journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 msgid "Change Locking"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 msgid "Confirm to unlock repository."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 #, fuzzy
 msgid "Unlock Repository"
 msgstr "Prázdný repozitář"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 #, fuzzy
 msgid "Confirm to lock repository."
 msgstr "Prázdný repozitář"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 #, fuzzy
 msgid "Lock Repository"
 msgstr "Prázdný repozitář"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3438,18 +3585,18 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr "Prázdný repozitář"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
@@ -3457,15 +3604,15 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3503,8 +3650,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr ""
@@ -3543,28 +3690,38 @@
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
-msgstr ""
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Private Repository"
+msgstr "Prázdný repozitář"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Remote repository URL"
+msgstr "Prázdný repozitář"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy, python-format
+#| msgid "Changes on %s repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "Změny na repozitáři %s"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to lock repository."
+msgid "Confirm to pull changes from remote repository."
+msgstr "Prázdný repozitář"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr ""
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Permanent Repository ID"
+msgstr "Prázdný repozitář"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3578,43 +3735,35 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Remote repository"
+msgstr "Prázdný repozitář"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Repository URL"
+msgstr "Repozitáře"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr ""
 
@@ -3672,55 +3821,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr ""
 
@@ -3794,13 +3899,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3821,7 +3926,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3848,38 +3953,42 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
-msgid "Git version"
+msgid "Platform"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:9
-msgid "Upgrade info endpoint"
+msgid "Git version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
+msgid "Upgrade info endpoint"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4032,11 +4141,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4044,8 +4153,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
-msgstr ""
+#, fuzzy
+#| msgid "Settings"
+msgid "Meta Tagging"
+msgstr "Nastavení"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
 msgid "Stylify recognised meta tags:"
@@ -4063,6 +4174,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4082,15 +4194,8 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
-#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
-#: kallithea/templates/admin/user_groups/user_groups.html:48
-msgid "Members"
+msgid "Show Members"
 msgstr ""
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
@@ -4098,8 +4203,14 @@
 msgid "User Group: %s"
 msgstr ""
 
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
+#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
+#: kallithea/templates/admin/user_groups/user_groups.html:48
+msgid "Members"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4124,10 +4235,6 @@
 msgid "User Groups Administration"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr ""
@@ -4153,11 +4260,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4167,7 +4270,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4177,11 +4280,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
@@ -4203,18 +4306,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr ""
 
@@ -4235,47 +4331,55 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr ""
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
-#: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
-msgid "Changelog"
-msgstr ""
-
 #: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:141
+#: kallithea/templates/changelog/changelog.html:14
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
+msgid "Changelog"
+msgstr ""
+
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr ""
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr ""
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4285,129 +4389,125 @@
 msgid "Compare"
 msgstr ""
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr ""
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
-#: kallithea/templates/forks/fork.html:9
-msgid "Fork"
+msgid "Follow"
 msgstr ""
 
 #: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
+#: kallithea/templates/forks/fork.html:9
+msgid "Fork"
+msgstr ""
+
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr ""
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr ""
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr ""
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr ""
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr ""
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr ""
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr ""
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Repozitáře"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4435,7 +4535,8 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:22
@@ -4462,7 +4563,7 @@
 msgstr ""
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr ""
 
@@ -4532,6 +4633,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr ""
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr ""
@@ -4561,6 +4670,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4590,10 +4700,6 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr ""
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4611,7 +4717,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4624,7 +4730,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4634,7 +4740,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4667,7 +4773,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr ""
 
@@ -4683,7 +4789,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4713,21 +4819,23 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
-msgstr ""
-
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Push new repository"
+msgstr "Prázdný repozitář"
+
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr ""
 
@@ -4737,15 +4845,15 @@
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr ""
@@ -4768,7 +4876,7 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+msgid "Merge"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4779,9 +4887,17 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+msgid "Replaced by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:149
+msgid "Preceded by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
@@ -4789,9 +4905,9 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
@@ -4799,91 +4915,93 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy, python-format
+#| msgid "Unknown revision %s"
+msgid "No revisions"
+msgstr "Neznámá revize %s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Status change from pull request"
+msgid "on pull request"
+msgstr "Změna stavu-> %s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
+msgid "No title"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset_file_comment.html:24
 #, fuzzy
-msgid "Status change from pull request"
-msgstr "Změna stavu-> %s"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
-msgid "No title"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#| msgid "No changes"
+msgid "on this changeset"
+msgstr "Žádné změny"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Změna stavu-> %s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
+msgid "Comment preview"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:77
+msgid "Submitting ..."
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
-msgid "Comment preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:85
-msgid "Submitting ..."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -4891,7 +5009,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
@@ -4899,7 +5017,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
@@ -4907,25 +5025,25 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-msgid "Use @username inside this text to send notification to another local user."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+msgid "Use @username inside this text to notify another user."
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "Změny"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "Žádné změny"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "(zavřeno)"
@@ -4945,7 +5063,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -4954,11 +5072,11 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr ""
 
@@ -4970,29 +5088,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr ""
 
@@ -5016,7 +5146,7 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
@@ -5024,49 +5154,36 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5192,10 +5309,6 @@
 msgid "Commit Changes"
 msgstr "Žádné změny"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5221,18 +5334,14 @@
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
+msgid "Last Revision"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
+msgid "Last Modified"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:64
-msgid "Last Modified"
-msgstr ""
-
-#: kallithea/templates/files/files_browser.html:65
 msgid "Last Committer"
 msgstr ""
 
@@ -5345,8 +5454,8 @@
 msgstr ""
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr ""
 
@@ -5397,8 +5506,8 @@
 msgstr ""
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr ""
 
@@ -5406,7 +5515,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr ""
 
@@ -5419,19 +5528,13 @@
 msgstr ""
 
 #: kallithea/templates/journal/journal.html:56
-#, fuzzy
-msgid "My Repos"
-msgstr "Prázdný repozitář"
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr ""
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr ""
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr ""
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr ""
@@ -5473,20 +5576,14 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+msgid "Vote"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5495,50 +5592,48 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
 #, python-format
-msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, python-format
-msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5554,11 +5649,11 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
@@ -5566,79 +5661,79 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "Zatím nejsou žádné soubory. %s"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 msgid "on"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 msgid "Update"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "Žádné změny"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 msgid "Pull Request Content"
 msgstr ""
 
@@ -5739,8 +5834,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5748,45 +5843,45 @@
 msgid "Stats gathered: "
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
-msgid "commits"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:390
-msgid "files added"
+msgid "commits"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
+msgid "files added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:394
-msgid "commit"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:395
-msgid "file added"
+msgid "commit"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:396
-msgid "file changed"
+msgid "file added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:397
+msgid "file changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr ""
 
@@ -5808,66 +5903,74 @@
 msgid "Fork of"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
 msgstr ""
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:125
+msgid "With subrepos"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "Změna stavu-> %s"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
@@ -5881,3 +5984,418 @@
 msgid "Compare Tags"
 msgstr ""
 
+#~ msgid "increase diff context to %(num)s lines"
+#~ msgstr ""
+
+#~ msgid "No comments."
+#~ msgstr ""
+
+#~ msgid "public journal"
+#~ msgstr ""
+
+#~ msgid "journal"
+#~ msgstr ""
+
+#~ msgid "forever"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Cannot delete %s it still contains attached forks"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked"
+#~ msgstr "Odemčeno"
+
+#~ msgid "Locked"
+#~ msgstr "Zamčeno"
+
+#~ msgid "Repository has been %s"
+#~ msgstr ""
+
+#~ msgid "You can't edit this user"
+#~ msgstr ""
+
+#~ msgid "compare view"
+#~ msgstr ""
+
+#~ msgid "fork name %s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s"
+#~ msgstr ""
+
+#~ msgid "No Files"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#~ msgstr ""
+
+#~ msgid "You can't remove this user since it's crucial for entire application"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Username may only contain alphanumeric "
+#~ "characters underscores, periods or dashes "
+#~ "and must begin with alphanumeric "
+#~ "character or underscore"
+#~ msgstr ""
+
+#~ msgid "invalid password"
+#~ msgstr ""
+
+#~ msgid "invalid user name"
+#~ msgstr ""
+
+#~ msgid "Your account is disabled"
+#~ msgstr ""
+
+#~ msgid "Repository name %(repo)s is disallowed"
+#~ msgstr ""
+
+#~ msgid "invalid clone URL"
+#~ msgstr ""
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+
+#~ msgid "This email address is already taken"
+#~ msgstr ""
+
+#~ msgid "email \"%(email)s\" does not exist."
+#~ msgstr ""
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr ""
+
+#~ msgid "never"
+#~ msgstr ""
+
+#~ msgid "My Emails"
+#~ msgstr ""
+
+#~ msgid "Watched"
+#~ msgstr ""
+
+#~ msgid "My Permissions"
+#~ msgstr ""
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr ""
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr ""
+
+#~ msgid "Overview"
+#~ msgstr ""
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "All default permissions on each user "
+#~ "group will be reset to chosen "
+#~ "permission, note that all custom default"
+#~ " permission on repository groups will "
+#~ "be lost"
+#~ msgstr ""
+
+#~ msgid "Repository creation"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Confirm to delete this ip: %s"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr ""
+
+#~ msgid "none"
+#~ msgstr ""
+
+#~ msgid "read"
+#~ msgstr ""
+
+#~ msgid "write"
+#~ msgstr ""
+
+#~ msgid "admin"
+#~ msgstr ""
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "default"
+#~ msgstr ""
+
+#~ msgid "revoke"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "apply to children"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr ""
+
+#~ msgid "private repository"
+#~ msgstr ""
+
+#~ msgid "Remote URL"
+#~ msgstr ""
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr ""
+
+#~ msgid "Confirm to pull changes from remote side."
+#~ msgstr ""
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr ""
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Meta-Tagging"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr ""
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "Push new repo"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "merge"
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Comment from pull request"
+#~ msgstr ""
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr ""
+
+#~ msgid "My Repos"
+#~ msgstr "Prázdný repozitář"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr ""
+
+#~ msgid "reviewer"
+#~ msgstr ""
+
+#~ msgid "with subrepos"
+#~ msgstr ""
+
--- a/kallithea/i18n/de/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/de/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,11 +5,11 @@
 # stephanj <info@stephan-jauernick.de>, 2013
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
-"PO-Revision-Date: 2015-05-13 15:13+0200\n"
-"Last-Translator: Peter Vitt <peter.vitt2@uni-siegen.de>\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
+"PO-Revision-Date: 2015-07-23 10:37+0200\n"
+"Last-Translator: Robert Martinez <ntttq@inboxen.org>\n"
 "Language-Team: German "
 "<https://hosted.weblate.org/projects/kallithea/kallithea/de/>\n"
 "Language: de\n"
@@ -17,22 +17,26 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.3-dev\n"
+"X-Generator: Weblate 2.4-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Es gibt noch keine Änderungssätze"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "Keine"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(geschlossen)"
 
@@ -46,21 +50,17 @@
 msgstr "Ignoriere unsichtbare Zeichen"
 
 #: kallithea/controllers/changeset.py:169
-#, python-format
-msgid "increase diff context to %(num)s lines"
+#, fuzzy, python-format
+#| msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr "diff-Kontext auf %(num)s Zeilen erhöhen"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "Die angegebene Version existiert nicht in diesem Repository"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Keine Kommentare."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
@@ -68,35 +68,45 @@
 "Eine Änderung des Status eines Änderungssatzes, der mit einem geschlossen"
 " Pull-Request assoziert ist, ist nicht erlaubt"
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr "Änderungssätze auswählen"
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
-"Ohne einen gemeinsamen Vorfahren ist ein Vergleich der Repositories nicht "
-"möglich"
-
-#: kallithea/controllers/error.py:96
+"Ohne einen gemeinsamen Vorfahren ist ein Vergleich der Repositories nicht"
+" möglich"
+
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "revisions"
+msgid "No response"
+msgstr "revisionen"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 "Die Anfrage konnte wegen ungültiger Syntax vom Server nicht ausgewertet "
 "werden."
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "Unauthorisierter Zugang zur Ressource"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "Du hast keine Rechte, um diese Seite zu betrachten"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "Die Ressource konnte nicht gefunden werden"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -114,17 +124,17 @@
 msgid "%s %s feed"
 msgstr "%s %s Feed"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr "Der Änderungssatz war zu groß und wurde abgeschnitten..."
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -202,45 +212,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr "Der Ort muss ein relativer Pfad sein und darf nicht .. enthalten"
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Downloads gesperrt"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Unbekannte Revision %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Leeres Repository"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "Unbekannter Archivtyp"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Änderungssätze"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Entwicklungszweige"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Tags"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Während des Forkens des Repositorys trat ein Fehler auf: %s"
@@ -256,9 +264,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Repositories"
 
@@ -278,26 +286,33 @@
 msgstr "Lesezeichen"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr "Öffentliches Logbuch"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
 msgstr "Logbuch"
 
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+#, fuzzy
+#| msgid "bad captcha"
+msgid "Bad captcha"
 msgstr "falsches Captcha"
 
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr "Sie haben sich erfolgreich bei Kallithea registriert"
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "Ihr Passwort Zurücksetzen link wurde versendet"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
@@ -305,124 +320,135 @@
 "Das Zurücksetzen des Passworted war erfolgreich, ein neues Passwort wurde"
 " an ihre EMail Addresse gesendet"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr "%s (geschlossen)"
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "Änderungssatz"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr "Spezial"
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Lesezeichen"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr "Fehler beim Erstellen des Pull-Requests: %s"
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr "Keine Beschreibung"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "Es wurde erfolgreich ein neuer Pullrequest eröffnet"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr "Während des Erstellens des Pull Requests trat ein Fehler auf"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr "Neue Changesets in %s %s seit dem letzten Pull Request:"
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
-"Dieser Pull Request basiert auf einer anderen %s Revision. Daher ist kein "
-"Simple Diff verfügbar."
-
-#: kallithea/controllers/pullrequests.py:421
+"Dieser Pull Request basiert auf einer anderen %s Revision. Daher ist kein"
+" Simple Diff verfügbar."
+
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr "Keine Änderungen seit der letzten Version gefunden in %s %s."
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr "Geschlossen, ersetzt durch %s."
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr "Pull Request Update erstellt"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr "Pull Request aktualisiert"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "Erfolgreich Pull-Request gelöscht"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr "Dieser Pull Request wurde bereits in %s integriert."
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 "Dieser Pull Request wurde geschlossen und kann daher nicht aktualisiert "
 "werden."
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr "Dieser Pull Request kann mit Änderungen in %s aktualisiert werden:"
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr "Keine Changesets gefunden, um den Pull Request zu aktualisieren."
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr "Hinweis: Branch %s hat einen anderen Head: %s."
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr "Git Pull Request unterstützen bisher keine Updates."
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr "Schließen."
 
@@ -438,21 +464,21 @@
 msgid "An error occurred during search operation."
 msgstr "Während der Suchoperation trat ein Fehler auf."
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr "Es stehen noch keine Daten zur Verfügung"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "Statistiken sind deaktiviert für dieses Repository"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr "Anmeldeeinstellungen erfolgreich geändert"
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr "Fehler bei der Änderung der Anmeldeeinstellungen aufgetreten"
 
@@ -465,38 +491,40 @@
 msgstr "Ein Fehler trat beim updaten der Standardeinstellungen auf"
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+#, fuzzy
+#| msgid "forever"
+msgid "Forever"
 msgstr "immer"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 Minuten"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 Stunde"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 Tag"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 Monat"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr "Lebenszeit"
 
@@ -510,7 +538,9 @@
 msgstr "gist %s gelöscht"
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+#, fuzzy
+#| msgid "unmodified"
+msgid "Unmodified"
 msgstr "ungeändert"
 
 #: kallithea/controllers/admin/gists.py:262
@@ -526,119 +556,135 @@
 msgid "Error occurred during update of gist %s"
 msgstr "Fehler beim Aktualisieren der Kerndaten %s"
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 "Sie können diesen Benutzer nicht editieren, da er von entscheidender "
 "Bedeutung für die ganze Applikation ist"
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "Ihr Account wurde erfolgreich aktualisiert"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr "Fehler beim Aktualisieren der Benutzer %s"
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr "Erfolgreich Kennwort geändert"
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr "Fehler bei der Änderung des Kennworts"
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "Die EMail Addresse %s wurde zum Benutzer hinzugefügt"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Währen der Speicherung der EMail Addresse trat ein Fehler auf"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "Die EMail Addresse wurde vom Benutzer entfernt"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
 msgstr "API Key wurde erfolgreich erstellt"
 
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
 msgstr "API-Schlüssel erfolgreich zurückgesetzt"
 
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
 msgstr "API-Schlüssel erfolgreich gelöscht"
 
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "Lesen"
+
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "Lesen"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "Schreiben"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "Schreiben"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "Admin"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "Deaktiviert"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr "Erlaubt mit manueller Kontoaktivierung"
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr "Erlaubt mit automatischer Kontoaktivierung"
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -646,11 +692,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr "Manuelle Aktivierung externen Kontos"
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -658,225 +704,216 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr "Automatische Aktivierung externen Kontos"
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "Aktiviert"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr "Globale Berechtigungen erfolgreich geändert"
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr "Fehler bei der Änderung der globalen Berechtigungen"
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr "Fehler bei der Erstellung der Repositoriumsgruppe %s"
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr "Repositoriumsgruppe %s erstellt"
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr "Fehler bei der Erstellung der Repositoriumsgruppe %s"
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr "Repositoriumsgruppe %s aktualisiert"
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "Fehler bei der Aktualisierung der Repositoriumsgruppe %s"
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "Die Gruppe enthält %s Repositorys und kann nicht gelöscht werden"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Diese Gruppe enthält %s Untergruppen und kann nicht gelöscht werden"
 
-#: kallithea/controllers/admin/repo_groups.py:302
+#: kallithea/controllers/admin/repo_groups.py:297
 #, python-format
 msgid "Removed repository group %s"
 msgstr "Repositoriumsgruppe %s entfernt"
 
-#: kallithea/controllers/admin/repo_groups.py:307
+#: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr "Fehler beim Löschen der Repositoriumsgruppe %s"
 
-#: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
 #: kallithea/controllers/admin/user_groups.py:340
 msgid "Cannot revoke permission for yourself as admin"
 msgstr "Als Administrator kann man sich keine Berechtigungen entziehen"
 
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
+#: kallithea/controllers/admin/repo_groups.py:420
+msgid "Repository group permissions updated"
 msgstr "Berechtigungen der Repositoriumsgruppe aktualisiert"
 
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr "Fehler beim Entzug der Berechtigungen"
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "Fehler beim Erstellen des Repositoriums %s"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr "Repositorium %s von %s erstellt"
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "Aufgespaltenes Repositorium %s zu %s"
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr "Repositorium erzeugt %s"
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Repository %s wurde erfolgreich aktualisiert"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "Fehler bei der Aktualisierung des Repositoriums %s"
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr "%s Spaltung abgetrennt"
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr "%s Spaltung gelöscht"
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr "Repositorium %s gelöscht"
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
+#: kallithea/controllers/admin/repos.py:321
+#, fuzzy, python-format
+#| msgid "Cannot delete %s it still contains attached forks"
+msgid "Cannot delete repository %s which still has forks"
 msgstr "%s konnte nicht gelöscht werden da es immernoch Forks enthält"
 
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Beim Löschen von %s trat ein Fehler auf"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr "Repositoriumsberechtigungen aktualisiert"
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr "Fehler während der Erzeugung des Feldes"
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr "Fehler beim Entfernen des Feldes"
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr "-- Keine Abspaltung --"
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "Sichtbarkeit des Repositorys im Öffentlichen Logbuch aktualisiert"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 "Es trat ein Fehler während der Aktualisierung der Sicherbarkeit dieses "
 "Repositorys im Öffentlichen Logbuch auf"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "Schlüssel  stimmt nicht überein"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "Nichts"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "Markiere Repository %s als Abzweig von Repository %s"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "Während dieser operation trat ein Fehler auf"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr "Gesperrtes Repositorium"
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr "Entsperrtes Repositorium"
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been locked"
+msgstr "Repository ist nicht gesperrt"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been unlocked"
+msgstr "Repository ist nicht gesperrt"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "Fehler beim Entsperren"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "Entsperrt"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "Gesperrt"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr "Cache Entfernung war erfolgreich"
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "Währen der Cache Invalidierung trat ein Fehler auf"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "Von entferntem Ort übertragen"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "Repositorium wurde %s"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr "Cache Entfernung war erfolgreich"
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "Währen der Cache Invalidierung trat ein Fehler auf"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "Von entferntem Ort übertragen"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr ""
 "Es trat ein Fehler auf während das Repository von einem Entfernten "
 "Speicherort übertragen wurde"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "Während des löschens der Repository Statistiken trat ein Fehler auf"
 
@@ -894,7 +931,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 "Ein Fehler ist während der Aktualisierung der Applikationseinstellungen "
 "aufgetreten"
@@ -903,7 +940,8 @@
 #, python-format
 msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 msgstr ""
-"Die Repositories wurden erfolgreich überprüft. Hinzugefügt: %s. Entfernt: %s."
+"Die Repositories wurden erfolgreich überprüft. Hinzugefügt: %s. Entfernt:"
+" %s."
 
 #: kallithea/controllers/admin/settings.py:270
 msgid "Updated application settings"
@@ -976,83 +1014,82 @@
 msgstr "Zielgruppe kann nicht die gleiche Gruppe sein"
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr "Berechtigungen der Benutzergruppe wurden aktualisiert"
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr "Berechtigungen wurden aktualisiert"
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "Es ist ein Fehler während des Speicherns der Berechtigungen aufgetreten"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr "Nutzer %s erstellt"
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr "Während des Erstellens des Benutzers %s ist ein Fehler aufgetreten"
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "Der Benutzer wurde erfolgreich aktualisiert"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr "Der Nutzer wurde erfolgreich gelöscht"
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "Während der Löschen des Benutzers trat ein Fehler auf"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "Sie können diesen Benutzer nicht editieren"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
 msgstr "Die IP-Adresse %s wurde zur Nutzerwhitelist hinzugefügt"
 
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
 msgstr "Während des Speicherns der IP-Adresse ist ein Fehler aufgetreten"
 
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
 msgstr "IP-Adresse wurde von der Nutzerwhitelist entfernt"
 
-#: kallithea/lib/auth.py:745
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr "IP-Adresse %s ist nicht erlaubt"
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+#, fuzzy
+#| msgid "New api key"
+msgid "Invalid API key"
+msgstr "Neuer API Key"
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "Sie müssen ein Registrierter Nutzer sein um diese Aktion durchzuführen"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "Sie müssen sich anmelden um diese Seite aufzurufen"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr "Das Repository konnte nicht im Filesystem gefunden werden"
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "Änderungssatz nicht gefunden"
 
@@ -1070,158 +1107,164 @@
 msgid "No changes detected"
 msgstr "Keine Änderungen erkannt"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "Branch %s gelöscht"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "Tag %s erstellt"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Zeige alle Kombinierten Änderungensätze %s->%s"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "vergleichsansicht"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "und"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "%s mehr"
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "revisionen"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "fork name %s"
+msgid "Fork name %s"
 msgstr "Fork Name %s"
 
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "Pull request %s"
 msgstr "Pull Request #%s"
 
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "[gelöscht] Repository"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "[erstellt] Repository"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "[erstellt] Repository als Fork"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "[forked] Repository"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "[aktualisiert] Repository"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr "Archiv von Repository [heruntergeladen]"
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "Repository [gelöscht]"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "Benutzer [erstellt]"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "Benutzer [akutalisiert]"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr "Benutzergruppe [erstellt]"
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr "Benutzergruppe [aktualisiert]"
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "Revision [kommentiert] in Repository"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "Pull Request [kommentiert] für"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "Pull Request [geschlossen] für"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[Pushed] in"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "[via Kallithea] in Repository [committed]"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "[Pulled von Remote] in Repository"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[Pulled] von"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "[Following gestartet] für Repository"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "[Following gestoppt] für Repository"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " und %s weitere"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "Keine Dateien"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr "neue Datei"
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr "mod"
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr "entf"
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr "umbenennen"
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr "chmod"
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1232,69 +1275,69 @@
 "es im Dateisystem erstellt oder umbenannt. Bitte starten sie die "
 "Applikation erneut um die Repositories neu zu Indizieren"
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d Jahr"
 msgstr[1] "%d Jahre"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d Monat"
 msgstr[1] "%d Monate"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d Tag"
 msgstr[1] "%d Tage"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d Stunde"
 msgstr[1] "%d Stunden"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d Minute"
 msgstr[1] "%d Minuten"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d Sekunde"
 msgstr[1] "%d Sekunden"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "in %s"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "vor %s"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "in %s und %s"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s und %s her"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "jetzt gerade"
 
@@ -1309,7 +1352,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "Kein Zugriff auf Repository"
 
@@ -1324,7 +1367,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "Lesender Zugriff auf Repository"
 
@@ -1339,7 +1382,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "Schreibdender Zugriff auf Repository"
 
@@ -1354,7 +1397,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "Administrativer Zugang zum Repository"
 
@@ -1393,7 +1436,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Kallithea Administrator"
 
@@ -1408,7 +1451,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "Erstellung eines Repositorys deaktiviert"
 
@@ -1423,7 +1466,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "Erstellung eines Repositorys aktiviert"
 
@@ -1438,7 +1481,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "Forking eines Repositorys deaktiviert"
 
@@ -1453,7 +1496,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "Forking eines Repositorys aktiviert"
 
@@ -1489,7 +1532,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "Nicht Begutachtet"
 
@@ -1504,7 +1547,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "Akzeptiert"
 
@@ -1519,7 +1562,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "Abgelehnt"
 
@@ -1534,7 +1577,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "In Begutachtung"
 
@@ -1546,7 +1589,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr "höchste Ebene"
 
@@ -1558,7 +1601,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr "Kein Zugriff für Repositorygruppe"
 
@@ -1570,7 +1613,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr "Lesezugriff für Repositorygruppe"
 
@@ -1582,7 +1625,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr "Schreibzugriff für Repositorygruppe"
 
@@ -1594,7 +1637,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr "Administrativer Zugriff für Repositorygruppe"
 
@@ -1605,7 +1648,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr "Kein Zugriff für Benutzergruppe"
 
@@ -1616,7 +1659,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr "Lesezugriff für Benutzergruppe"
 
@@ -1627,7 +1670,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr "Nutzergruppe Schreibzugriff"
 
@@ -1638,7 +1681,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr "Administrativer Zugriff für Benutzergruppe"
 
@@ -1649,7 +1692,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr "Erstellung von Repositorygruppen deaktiviert"
 
@@ -1660,7 +1703,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr "Erstellung von Repositorygruppen aktiviert"
 
@@ -1671,7 +1714,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr "Erstellung von Benutzergruppen deaktiviert"
 
@@ -1682,7 +1725,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr "Erstellung von Benutzergruppen aktiviert"
 
@@ -1693,7 +1736,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr "Registrierung deaktiviert"
 
@@ -1704,7 +1747,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr "Benutzerregistrierung mit manueller Kontoaktivierung"
 
@@ -1715,32 +1758,157 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr "Benutzerregistrierung mit automatische Kontoaktivierung"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
-"Erstellung von Repositories mit Schreibzugriff für Repositorygruppe aktiviert"
+"Erstellung von Repositories mit Schreibzugriff für Repositorygruppe "
+"aktiviert"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 "Erstellung von Repositories mit Schreibzugriff für Repositorygruppe "
 "deaktiviert"
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "in Zeile %s"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[Mention]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "Unauthorisierter Zugang zur Ressource"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "Unauthorisierter Zugang zur Ressource"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Only admins can create repository groups"
+msgstr "Repositoriumsgruppe %s erstellt"
+
+#: kallithea/model/db.py:1683
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Non-admins can create repository groups"
+msgstr "Repositoriumsgruppe %s erstellt"
+
+#: kallithea/model/db.py:1685
+#, fuzzy
+#| msgid "[created] user group"
+msgid "Only admins can create user groups"
+msgstr "Benutzergruppe [erstellt]"
+
+#: kallithea/model/db.py:1686
+#, fuzzy
+#| msgid "[created] user group"
+msgid "Non-admins can create user groups"
+msgstr "Benutzergruppe [erstellt]"
+
+#: kallithea/model/db.py:1688
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Only admins can create top level repositories"
+msgstr "Repositories oberster Ebene"
+
+#: kallithea/model/db.py:1689
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Non-admins can create top level repositories"
+msgstr "Repositories oberster Ebene"
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Ort der Repositories"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Ort der Repositories"
+
+#: kallithea/model/db.py:1698
+#, fuzzy
+#| msgid "User Registration with manual account activation"
+msgid "User registration with manual account activation"
+msgstr "Benutzerregistrierung mit manueller Kontoaktivierung"
+
+#: kallithea/model/db.py:1699
+#, fuzzy
+#| msgid "User Registration with automatic account activation"
+msgid "User registration with automatic account activation"
+msgstr "Benutzerregistrierung mit automatische Kontoaktivierung"
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "Nicht Begutachtet"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "In Begutachtung"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "Bitte einen Benutzernamen eingeben"
@@ -1759,122 +1927,161 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Bitte mindestens %(min)i Zeichen eingeben"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr "Name darf nicht nur Ziffern enthalten"
 
-#: kallithea/model/notification.py:252
+#: kallithea/model/notification.py:254
+#, fuzzy, python-format
+#| msgid "%(user)s commented on changeset at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
+msgstr "%(user)s hat am %(when)s ein Changeset kommentiert"
+
+#: kallithea/model/notification.py:255
+#, fuzzy, python-format
+#| msgid "%(user)s sent message at %(when)s"
+msgid "%(user)s sent message %(age)s"
+msgstr "%(user)s hat am %(when)s eine Nachricht gesendet"
+
+#: kallithea/model/notification.py:256
+#, fuzzy, python-format
+#| msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
+msgstr "%(user)s hat Sie am %(when)s erwähnt"
+
+#: kallithea/model/notification.py:257
+#, fuzzy, python-format
+#| msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr "%(user)s hat sich am %(when)s bei Kallithea registriert"
+
+#: kallithea/model/notification.py:258
+#, fuzzy, python-format
+#| msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "%(user)s hat am %(when)s einen neuen Pull Request eröffnet"
+
+#: kallithea/model/notification.py:259
+#, fuzzy, python-format
+#| msgid "%(user)s commented on pull request at %(when)s"
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "%(user)s hat am %(when)s einen Pull Request kommentiert"
+
+#: kallithea/model/notification.py:266
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s hat am %(when)s ein Changeset kommentiert"
 
-#: kallithea/model/notification.py:253
+#: kallithea/model/notification.py:267
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s hat am %(when)s eine Nachricht gesendet"
 
-#: kallithea/model/notification.py:254
+#: kallithea/model/notification.py:268
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s hat Sie am %(when)s erwähnt"
 
-#: kallithea/model/notification.py:255
+#: kallithea/model/notification.py:269
 #, python-format
 msgid "%(user)s registered in Kallithea at %(when)s"
 msgstr "%(user)s hat sich am %(when)s bei Kallithea registriert"
 
-#: kallithea/model/notification.py:256
+#: kallithea/model/notification.py:270
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s hat am %(when)s einen neuen Pull Request eröffnet"
 
-#: kallithea/model/notification.py:257
+#: kallithea/model/notification.py:271
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s hat am %(when)s einen Pull Request kommentiert"
 
-#: kallithea/model/notification.py:296
-#, python-format
+#: kallithea/model/notification.py:302
+#, fuzzy, python-format
+#| msgid "" "Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
+#| "%(comment_username)s"
 msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-"Kommentar für %(repo_name)s Changeset %(short_id)s in %(branch)s erstellt "
-"von %(comment_username)s"
-
-#: kallithea/model/notification.py:299
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+"Kommentar für %(repo_name)s Changeset %(short_id)s in %(branch)s erstellt"
+" von %(comment_username)s"
+
+#: kallithea/model/notification.py:305
 #, python-format
 msgid "New user %(new_username)s registered"
 msgstr "Neuer Benutzer %(new_username)s registriert"
 
-#: kallithea/model/notification.py:301
-#, python-format
+#: kallithea/model/notification.py:307
+#, fuzzy, python-format
+#| msgid "" "Review request on %(repo_name)s pull request #%(pr_id)s from
+#| %(ref)s by " "%(pr_username)s"
 msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
 msgstr ""
 "Review Request für %(repo_name)s Pull Request #%(pr_id)s von %(ref)s "
 "erstellt von %(pr_username)s"
 
-#: kallithea/model/notification.py:302
-#, python-format
+#: kallithea/model/notification.py:308
+#, fuzzy, python-format
+#| msgid "" "Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
+#| "%(comment_username)s"
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-"Kommentar von %(comment_username)s für %(repo_name)s Pull Request #%(pr_id)s "
-"von %(ref)s"
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+"Kommentar von %(comment_username)s für %(repo_name)s Pull Request "
+"#%(pr_id)s von %(ref)s"
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr "Schließen"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#: kallithea/model/pull_request.py:137
+#, fuzzy, python-format
+#| msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 msgstr "%(user)s möchte ein Review des Pull Request #%(pr_id)s: %(pr_title)s"
 
-#: kallithea/model/scm.py:808
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "Letzter Tip"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr "Neue Benutzerregistrierung"
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-"Sie können diesen Benutzer nicht editieren, da er von entscheidender "
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
+msgstr ""
+"Sie können diesen Benutzer nicht löschen, da er von entscheidender "
 "Bedeutung für die gesamte Applikation ist"
 
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
-msgstr ""
-"Sie können diesen Benutzer nicht löschen, da er von entscheidender Bedeutung "
-"für die gesamte Applikation ist"
-
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
-"Der Benutzer \"%s\" besitzt noch immer %s Repositories und kann daher nicht "
-"entfernt werden. Entweder muss der Besitzer geändert oder das Repository "
-"entfernt werden: %s"
-
-#: kallithea/model/user.py:268
+"Der Benutzer \"%s\" besitzt noch immer %s Repositories und kann daher "
+"nicht entfernt werden. Entweder muss der Besitzer geändert oder das "
+"Repository entfernt werden: %s"
+
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
-"Der Benutzer \"%s\" ist noch der Besitzer von %s Repositorygruppen und kann "
-"daher nicht entfernt werden. Entweder muss der Besitzer geändert oder die "
-"Repositorygruppen müssen entfernt werden: %s"
-
-#: kallithea/model/user.py:275
+"Der Benutzer \"%s\" ist noch der Besitzer von %s Repositorygruppen und "
+"kann daher nicht entfernt werden. Entweder muss der Besitzer geändert "
+"oder die Repositorygruppen müssen entfernt werden: %s"
+
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
@@ -1884,61 +2091,66 @@
 "nicht entfernt werden. Entweder muss der Besitzer geändert oder die "
 "Benutzergruppen müssen gelöscht werden: %s"
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr "Link zum Zurücksetzen des Passworts"
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr "Dein neues Passwort"
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr "Ihr neues Kallithea-Passwort: %s"
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "Eine leere Liste ist kein gültiger Wert"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "Benutezrname \"%(username)s\" existiert bereits"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "Benutzername \"%(username)s\" ist verboten"
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, fuzzy, python-format
+#| msgid "Username %(username)s is not valid"
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "Benutzername \"%(username)s\" ist ungültig"
+
+#: kallithea/model/validators.py:99
+#, fuzzy
+#| msgid "" "Username may only contain alphanumeric characters underscores,
+#| periods or" " dashes and must begin with alphanumeric character or
+#| underscore"
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
+" dashes and must begin with an alphanumeric character or underscore"
 msgstr ""
 "Der Benutzername darf nur alphanumerische Zeichen, Unterstriche, Punkte "
 "oder Bindestriche enthalten und muss mit einem alphanumerischen Zeichen "
 "oder einem Unterstrich beginnen"
 
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr "Die Eingabe ist nicht gültig"
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "Benutzername \"%(username)s\" ist ungültig"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr "Ungültiger Benutzergruppenname"
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr "Benutzergruppe \"%(usergroup)s\" existiert bereits"
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
@@ -1947,111 +2159,116 @@
 "Unterstriche, Punkte oder Bindestriche enthalten und muss mit einem "
 "alphanumerischen Zeichen beginnen"
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "Kann diese Gruppe nicht als vorgesetzt setzen"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "Gruppe \"%(group_name)s\" existiert bereits"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "Es gibt bereits ein Repository mit \"%(group_name)s\""
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "Üngültige(nicht ASCII) Zeichen im Passwort"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr "Ungültiges altes Passwort"
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "Die Passwörter stimmen nicht überein"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "Ungültiges Passwort"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "Ungültiger Benutzername"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "Ihr Account wurde Deaktiviert"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "Schlüssel  stimmt nicht überein"
+
+#: kallithea/model/validators.py:345
+#, fuzzy, python-format
+#| msgid "Repository name %(repo)s is disallowed"
+msgid "Repository name %(repo)s is not allowed"
 msgstr "Repository  Name \"%(repo)s\" ist verboten"
 
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "Es gibt bereits ein Repository mit \"%(repo)s\""
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr ""
 "Es gibt bereits ein Repository mit \"%(repo)s\" in der Gruppe "
 "\"%(group)s\""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr "Eine Repositorygruppe mit dem Namen \"%(repo)s\" existiert bereits"
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr "ungültige Clone-URL"
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-"Ungültige Clone-URL, gültige Clone-URL (http(s)/svn+http(s)/ssh) angeben"
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "privates Repository"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "Forke um den selben typ wie der Vorgesetze zu haben"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr ""
 "Du hast nicht die erforderlichen Berechtigungen, um in dieser Gruppe ein "
 "Repository zu erzeugen"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr "keine Berechtigung, um ein Repository auf höchster Ebene anzulegen"
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr "Sie haben keine Berechtigung, um an diesem Ort ein Repository anzulegen"
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr "Dieser Benutzername oder Benutzergruppenname ist nicht gültig"
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "Dies ist ein Ungültiger Pfad"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "Diese E-Mailaddresse ist bereits in Benutzung"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "E-MailAddresse \"%(email)s\" existiert nicht."
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
@@ -2059,40 +2276,33 @@
 "Das LDAP-Login-Attribut des CN muss angeben werden - Es ist der Name des "
 "Attributes äquivalent zu \"Benutzername\""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-"Die Revisionen %(revs)s sind bereits Bestandteil des Pull Requests oder "
-"haben den Status"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
 msgstr "Bitte eine gültige IPv4- oder IPv6-Adresse angeben"
 
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 "Die Größe (in Bits) des Netzwerks muss im Bereich 0-32 liegen (nicht "
 "%(bits)r)"
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
-"Der Name eines Schlüssels darf nur aus Buchstaben, Ziffern, Unterstrich und "
-"Bindestrich bestehen"
-
-#: kallithea/model/validators.py:865
+"Der Name eines Schlüssels darf nur aus Buchstaben, Ziffern, Unterstrich "
+"und Bindestrich bestehen"
+
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
-msgstr ""
-
-#: kallithea/model/validators.py:881
+msgstr "Dateiname darf kein Unterverzeichnis enthalten"
+
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
-"Die Plug-Ins %(loaded)s und %(next_to_load)s exportieren beide den selben "
-"Namen"
+"Die Plug-Ins %(loaded)s und %(next_to_load)s exportieren beide den selben"
+" Namen"
 
 #: kallithea/templates/about.html:4 kallithea/templates/about.html:17
 msgid "About"
@@ -2151,13 +2361,13 @@
 msgstr "Gruppenname"
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2169,11 +2379,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "Beschreibung"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2194,11 +2404,11 @@
 msgid "Name"
 msgstr "Name"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "Letzte Änderung"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2207,18 +2417,19 @@
 msgid "Tip"
 msgstr "Tipp"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "Besitzer"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2230,7 +2441,7 @@
 msgid "Click to sort ascending"
 msgstr "Klicken um Aufsteigend zu Sortieren"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2242,11 +2453,11 @@
 msgid "Click to sort descending"
 msgstr "Klicken um Absteigend zu Sortieren"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr "Keine Repositories gefunden."
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2258,10 +2469,10 @@
 msgid "Data error."
 msgstr "Datenfehler."
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2271,7 +2482,7 @@
 msgstr "Lade..."
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "Log In"
 
@@ -2280,39 +2491,39 @@
 msgid "Log In to %s"
 msgstr "Log In in %s"
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "Benutzername"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "Passwort"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "Login Speichern"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "Passowrt Vergessen?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "Kein Account?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "Einloggen"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "Passowrt Vergessen?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "Kein Account?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr "Passwort zurücksetzen"
@@ -2362,26 +2573,26 @@
 msgstr "Passwort erneut eingeben"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "Vorname"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "Nachname"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "E-Mail"
 
@@ -2491,113 +2702,103 @@
 msgstr "Aktivierte Plugins"
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
+#, fuzzy
+#| msgid "" "Comma separated list of plugins. Order of plugins is also order in
+#| which " "Kallithea will try to authenticate user"
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
-msgstr ""
-"Kommaseparierte Liste der Plug-Ins. Reihenfolge der Plug-Ins entspricht der "
-"Reihenfolge, in der Kallithea die Plug-Ins zur Authentifizierung des "
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
+msgstr ""
+"Kommaseparierte Liste der Plug-Ins. Reihenfolge der Plug-Ins entspricht "
+"der Reihenfolge, in der Kallithea die Plug-Ins zur Authentifizierung des "
 "Benutzers verwendet"
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr "Verfügbare mitgelieferte Plug-Ins"
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr "Aktiviert"
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr "Deaktiviert"
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr "Plugin"
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "Speichern"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
-msgid "Repository Defaults"
-msgstr "Repositorystandards"
-
 #: kallithea/templates/admin/defaults/defaults.html:11
 #: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr ""
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+msgid "Repository Defaults"
+msgstr "Repositorystandards"
+
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "Typ"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "Privates Repository"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr ""
-"Private Repositories sind nur für explizit hinzugefügte Mitarbeiter sichtbar."
-
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+"Private Repositories sind nur für explizit hinzugefügte Mitarbeiter "
+"sichtbar."
+
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "Aktiviere Statistiken"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "Statistik-Fenster in der Zusammenfassungsseite aktivieren."
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "Aktiviere Downloads"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "Download-Menü auf der Zusammenfassungsseite aktivieren."
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "Locking aktivieren"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
@@ -2612,16 +2813,18 @@
 "Gist was update since you started editing. Copy your changes and click "
 "%(here)s to reload new version."
 msgstr ""
+"Gist wurde während der Änderung aktualisiert. Änderungen kopieren und "
+"%(here)s klicken um die neue Version nachzuladen."
 
 #: kallithea/templates/admin/gists/edit.html:55
 #: kallithea/templates/admin/gists/new.html:39
 msgid "Gist description ..."
-msgstr ""
+msgstr "Gist Beschreibung ..."
 
 #: kallithea/templates/admin/gists/edit.html:57
 #: kallithea/templates/admin/gists/new.html:41
 msgid "Gist lifetime"
-msgstr ""
+msgstr "Gist Lebenszeit"
 
 #: kallithea/templates/admin/gists/edit.html:61
 #: kallithea/templates/admin/gists/edit.html:63
@@ -2629,6 +2832,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr "Verfällt"
 
@@ -2639,7 +2848,9 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+#, fuzzy
+#| msgid "never"
+msgid "Never"
 msgstr "nie"
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2647,7 +2858,7 @@
 msgstr "Gist aktualisieren"
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "Abbrechen"
 
@@ -2670,12 +2881,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr "Neuen Gist erstellen"
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr "Erstellt"
 
@@ -2701,25 +2912,27 @@
 msgstr "Öffentlichen Gist erstellen"
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2749,11 +2962,22 @@
 msgstr "Privater Gist"
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "Löschen"
 
@@ -2762,9 +2986,18 @@
 msgstr "Löschen des Gists bestätigen"
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2790,7 +3023,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "Mein Account"
 
@@ -2799,83 +3032,90 @@
 msgid "Profile"
 msgstr "Profil"
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
-msgstr "API Keys"
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "Neue E-Mailadresse"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
-msgstr "Meine E-Mails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
+msgstr "API Keys"
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr "Meine Repositories"
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "Repositories"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "Beobachtet"
+#, fuzzy
+#| msgid "repositories"
+msgid "Watched Repositories"
+msgstr "Repositories"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
-msgstr "Meine Erlaubnisse"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+#, fuzzy
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "Berechtigungen kopieren"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
 msgstr "Mitgeliefert"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr "verfällt"
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to reset this api key: %s"
+msgid "Confirm to reset this API key: %s"
 msgstr "Zurücksetzen des API Keys \"%s\" bestätigen"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr "Zurücksetzen"
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+#, fuzzy
+#| msgid "expired"
+msgid "Expired"
 msgstr "verfallen"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr "Entfernen des API Keys \"%s\" bestätigen"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+#, fuzzy
+#| msgid "remove"
+msgid "Remove"
 msgstr "entfernen"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+#, fuzzy
+#| msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr "Keine weiteren API Keys spezifiziert"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+#, fuzzy
+#| msgid "New api key"
+msgid "New API key"
 msgstr "Neuer API Key"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2888,19 +3128,6 @@
 msgid "Primary"
 msgstr "Primär"
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "löschen"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2921,22 +3148,27 @@
 msgid "Change Your Account Password"
 msgstr "Passwort des Benutzerkontos ändern"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr "Aktuelles Passwort"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "Neues Passwort"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr "Bestätige neues Passwort"
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
-msgstr ""
+msgstr "Benutzerbild ändern unter"
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:12
 #: kallithea/templates/admin/users/user_edit_profile.html:9
@@ -2954,15 +3186,11 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
+#, fuzzy
+#| msgid "current IP"
+msgid "Current IP"
 msgstr "Aktuelle IP-Adresse"
 
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
 msgid "Repositories You Own"
 msgstr "Repositories in Ihrem Besitz"
@@ -2996,7 +3224,7 @@
 msgstr "Kommentare"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr "Pull Requests"
 
@@ -3014,21 +3242,15 @@
 msgstr "Zeige Benachrichtigung"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "Benachrichtigungen"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr "Rechteverwaltung"
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "Rechte"
+msgid "Default Permissions"
+msgstr "Standardrechte"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -3036,14 +3258,10 @@
 msgstr "Global"
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr "IP Whitelist"
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr "Übersicht"
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "Anonymer Zugang"
@@ -3057,7 +3275,7 @@
 "Unauthentifizierten Zugriff auf Kallithea erlauben. Anonyme Benutzer "
 "verwenden %s Benutzerrechte."
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
@@ -3067,16 +3285,20 @@
 "gesetzt. Beachten Sie, dass alle spezifischen Standardrechte der "
 "Repositories verloren gehen"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repositories"
+msgstr "Bestehendes Repository importieren?"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
-msgstr "Bestehende Einstellungen überschreiben"
+msgid "Permissions for the Default user on new repositories."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "Repository Gruppe"
@@ -3087,79 +3309,122 @@
 "permission, note that all custom default permission on repository groups "
 "will be lost"
 msgstr ""
-"Alle Standardrechte jeder Repositorygruppe werden auf die gewählten Rechte "
-"gesetzt. Beachten Sie, dass all spezifischen Standardrechte der "
+"Alle Standardrechte jeder Repositorygruppe werden auf die gewählten "
+"Rechte gesetzt. Beachten Sie, dass all spezifischen Standardrechte der "
 "Repositorygruppen verloren gehen"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repository groups"
+msgstr "Bestehendes Repository importieren?"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+#, fuzzy
+#| msgid "Copy permission set from parent repository group."
+msgid "Permissions for the Default user on new repository groups."
+msgstr "Rechte der übergeordneten Repositorygruppe kopieren."
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr "Benutzergruppe"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
+#, fuzzy
+#| msgid "" "All default permissions on each user group will be reset to chosen
+#| " "permission, note that all custom default permission on repository groups
+#| " "will be lost"
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
 msgstr ""
 "Alle Standardrechte jeder Benutzergruppe werden auf die gewählten Rechte "
 "gesetzt. Beachten Sie, dass alle spezifischen Standardrechte der "
 "Benutzergruppen verloren gehen"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "Repository erstellung"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
-msgid "Repository creation with group write access"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
+msgid "Repository creation with group write access"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+#, fuzzy
+#| msgid "" "Write permission to a repository group allows creating
+#| repositories " "inside that group."
+msgid ""
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+"Schreibrechte einer Repository Gruppe erlauben innerhalb der Gruppe neue "
+"Repositorys zu erstellen."
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+msgstr "Benutzergruppen Erstellung"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "Registrierung"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
+msgstr "Bestätigen diese IP zu löschen: %s"
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+msgstr "Alle IP-Adressen sind zulässig."
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr "Neue IP-Adresse"
 
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-msgid "Default User Permissions Overview"
-msgstr "Übersicht der Standardbenutzerrechte"
-
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:105
@@ -3181,12 +3446,12 @@
 msgstr "Übergeordnete Gruppe"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr "Rechte der übergeordneten Gruppe kopieren"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr "Rechte der übergeordneten Repositorygruppe kopieren."
 
@@ -3204,19 +3469,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "Einstellungen"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr "Erweitert"
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "Rechte"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3237,12 +3508,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "Erstellt am"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3253,38 +3524,12 @@
 msgid "Delete this repository group"
 msgstr "Diese Repositorygruppe löschen"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "keine"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "lesen"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "schreiben"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "admin"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+#, fuzzy
+#| msgid "user/user group"
+msgid "User/User Group"
 msgstr "Benutzer/Benutzergruppe"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3293,7 +3538,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "standart"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3302,14 +3549,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "entziehen"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3317,7 +3561,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+msgid "Apply to children"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3365,44 +3609,43 @@
 msgid "Number of Top-level Repositories"
 msgstr "Anzahl der Repositories oberster Ebene"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr "Bestehendes Repository importieren?"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "Clone von"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr "Optionale http[s] URL, von welcher das Repository geclont werden soll."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "[erstellt] Repository"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
-"Halten Sie es kurz und prägnant. Benutzen Sie eine README-Datei für längere "
-"Beschreibungen."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+"Halten Sie es kurz und prägnant. Benutzen Sie eine README-Datei für "
+"längere Beschreibungen."
+
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "Repository Typ der erstellt werden soll."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "Start Revision"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3449,8 +3692,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "Statistiken"
 
@@ -3472,15 +3715,15 @@
 msgid "Public Journal Visibility"
 msgstr "Sichtbarkeit des öffentlichen Logbuches"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "Entferne aus dem Öffentlichen Logbuch"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 msgid "Add to Public Journal"
 msgstr "Zum öffentlichen Logbuch hinzufügen"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
@@ -3488,31 +3731,31 @@
 "Alle Aktionen, die in diesem Repository ausgeführt wurden, sind im "
 "öffentlichen Logbuch für jeden einsehbar."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 msgid "Change Locking"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 msgid "Confirm to unlock repository."
 msgstr "Entsperren des Repositorys bestätigen."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 msgid "Unlock Repository"
 msgstr "Repository entsperren"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 msgid "Confirm to lock repository."
 msgstr "Sperren des Repositorys bestätigen."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 msgid "Lock Repository"
 msgstr "Repository sperren"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "Repository ist nicht gesperrt"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3520,32 +3763,32 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "Löschen des Repositorys bestätigen: %s"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 msgid "Delete this Repository"
 msgstr "Dieses Repository löschen"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] "Dieses Repository hat %s Fork"
 msgstr[1] "Dieses Repository hat %s Forks"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr "Fork abtrennen"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr "Forks löschen"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3583,8 +3826,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "Aktiv"
@@ -3623,28 +3866,38 @@
 msgstr "Zusatzfelder sind deaktiviert."
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "privates Repository"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr "Remote URL"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr "Änderungen von entferntem Ort übertragen"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#, fuzzy, python-format
+#| msgid "Created repository %s"
+msgid "Remote repository URL"
+msgstr "Repositorium erzeugt %s"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "[Pulled von Remote] in Repository"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Confirm to pull changes from remote repository."
+msgstr "[Pulled von Remote] in Repository"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr ""
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "privates Repository"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3658,43 +3911,35 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr "Clone-URL"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "bearbeiten"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "[erstellt] Repository"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "Repository"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "Besitzer des Repositorys ändern."
 
@@ -3751,55 +3996,11 @@
 msgid "System Info"
 msgstr "Systeminfo"
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr "E-Mail-Präfix"
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr "SMTP-Server"
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr "SMTP-Benutzername"
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr "SMTP-Passwort"
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr "SMTP-Port"
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "Senden"
 
@@ -3872,13 +4073,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3899,7 +4100,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3926,39 +4127,46 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+#, fuzzy
+#| msgid "check for updates"
+msgid "Check for updates"
 msgstr "Auf Updates prüfen"
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
-msgstr "Python-Version"
+msgid "Kallithea configuration file"
+msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
+msgid "Python version"
+msgstr "Python-Version"
+
+#: kallithea/templates/admin/settings/settings_system.html:7
 msgid "Platform"
 msgstr "Plattform"
 
-#: kallithea/templates/admin/settings/settings_system.html:7
-msgid "Git version"
-msgstr "Git-Version"
-
 #: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:9
-msgid "Upgrade info endpoint"
-msgstr ""
+msgid "Git version"
+msgstr "Git-Version"
 
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
+msgid "Upgrade info endpoint"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
-"Hinweis: Bitte stellen Sie sicher, dass der Server auf die URL zugreifen kann"
-
-#: kallithea/templates/admin/settings/settings_system.html:14
+"Hinweis: Bitte stellen Sie sicher, dass der Server auf die URL zugreifen "
+"kann"
+
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr "Prüfe auf Updates..."
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4110,11 +4318,11 @@
 msgstr "Icons"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4122,8 +4330,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
-msgstr ""
+#, fuzzy
+#| msgid "Settings"
+msgid "Meta Tagging"
+msgstr "Einstellungen"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
 msgid "Stylify recognised meta tags:"
@@ -4141,6 +4351,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr "Benutzergruppen"
@@ -4160,24 +4371,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "Standart Rechte"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "mitglieder"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr "Benutzergruppe: %s"
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "Mitglieder"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr "Benutzergruppe: %s"
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4202,10 +4414,6 @@
 msgid "User Groups Administration"
 msgstr "Benutzergruppenverwaltung"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr "Benutzergruppen"
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "Benutzer hinzufügen"
@@ -4231,11 +4439,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr "Standardrechte"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4245,7 +4449,7 @@
 msgstr "Benutzer: %s"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4255,11 +4459,11 @@
 msgstr "Letzter Login"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr "Mitglieder der Benutzergruppe"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
@@ -4281,18 +4485,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr ""
 
@@ -4313,47 +4510,55 @@
 msgid "Support"
 msgstr "Support"
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Mercurial Repository"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Git Repository"
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr "Fork erstellen"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Zusammenfassung"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr ""
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "Dateien"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "Optionen"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr "Fork vergleichen"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4363,129 +4568,125 @@
 msgid "Compare"
 msgstr ""
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr ""
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
-#: kallithea/templates/forks/fork.html:9
-msgid "Fork"
+msgid "Follow"
 msgstr ""
 
 #: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
+#: kallithea/templates/forks/fork.html:9
+msgid "Fork"
+msgstr ""
+
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "Logbuch"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "Öffentliches Logbuch"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr "Meine Pull Requests"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr "Nicht eingeloggt"
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr ""
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "Passwort vergessen?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr ""
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr "Keine Übereinstimmungen gefunden"
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Repositorystandards"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4513,7 +4714,8 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:22
@@ -4539,7 +4741,7 @@
 msgstr "Einen weiteren Kommentar hinzufügen"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr ""
 
@@ -4609,6 +4811,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr "Widerruf der Rechte für {0}: {1} bestätigen?"
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr "Aktiviert"
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr "Deaktiviert"
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr "Changeset angeben"
@@ -4638,6 +4848,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4666,10 +4877,6 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr ""
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4686,7 +4893,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4699,7 +4906,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4709,7 +4916,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4742,7 +4949,7 @@
 msgid "Branch %s"
 msgstr "Branch %s"
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "Bisher gibt es keine Änderungen"
 
@@ -4758,7 +4965,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4788,21 +4995,23 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
-msgstr ""
-
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "private repository"
+msgid "Push new repository"
+msgstr "privates Repository"
+
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr ""
 
@@ -4812,15 +5021,15 @@
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr ""
@@ -4843,7 +5052,7 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+msgid "Merge"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4854,144 +5063,159 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "Erstellt von"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "Erstellt von"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-msgid "Status change from pull request"
-msgstr "Statusänderung durch Pull Request"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "revisions"
+msgid "No revisions"
+msgstr "revisionen"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "Kommentar von Pull Request"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 msgid "No title"
 msgstr "Kein Titel"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr "Kommentar von Pull Request"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy, python-format
+#| msgid "%s changesets"
+msgid "on this changeset"
+msgstr "%s Changesets"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 msgid "Delete comment?"
 msgstr "Kommentar löschen?"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Letzte Änderungen"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
+msgid "Comment preview"
+msgstr "Kommentarvorschau"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:77
+msgid "Submitting ..."
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
-msgid "Comment preview"
-msgstr "Kommentarvorschau"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:85
-msgid "Submitting ..."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "Kommentar"
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr "Vorschau"
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr "Vorschau"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] "%d Kommentar"
 msgstr[1] "%d Kommentare"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] "%d inline"
 msgstr[1] "%d inline"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] "%d generell"
 msgstr[1] "%d generell"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-msgid "Use @username inside this text to send notification to another local user."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+msgid "Use @username inside this text to notify another user."
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 msgid "Set changeset status"
 msgstr "Setze Changesetstatus"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 msgid "No change"
 msgstr "Keine Änderungen"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 msgid "Close"
 msgstr "Schließen"
 
@@ -5010,7 +5234,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -5019,11 +5243,11 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr "Gelöscht"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr "Umbenannt"
 
@@ -5035,29 +5259,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, python-format
 msgid "%s changesets"
 msgstr "%s Changesets"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr "zurück"
 
@@ -5081,56 +5317,43 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Mercurial Repository"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Git Repository"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "Öffenentliches Repository"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "Abonniere den %s RSS Feed"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "Abonniere den %s ATOM Feed"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5259,10 +5482,6 @@
 msgid "Commit Changes"
 msgstr "Änderungen einchecken"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5288,18 +5507,14 @@
 msgstr "Größe"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "MIME-Type"
+msgid "Last Revision"
+msgstr ""
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
-msgstr ""
+msgid "Last Modified"
+msgstr "Zuletzt geändert"
 
 #: kallithea/templates/files/files_browser.html:64
-msgid "Last Modified"
-msgstr "Zuletzt geändert"
-
-#: kallithea/templates/files/files_browser.html:65
 msgid "Last Committer"
 msgstr ""
 
@@ -5411,8 +5626,8 @@
 msgstr ""
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr ""
 
@@ -5463,8 +5678,8 @@
 msgstr ""
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr ""
 
@@ -5472,7 +5687,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr ""
 
@@ -5485,18 +5700,13 @@
 msgstr "RSS Logbuch Feed"
 
 #: kallithea/templates/journal/journal.html:56
-msgid "My Repos"
+msgid "My Repositories"
 msgstr "Meine Repositories"
 
-#: kallithea/templates/journal/journal_data.html:61
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr ""
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "Öffentliches Logbuch"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "ATOM Feed für das Öffentliche Logbuch"
@@ -5538,20 +5748,16 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr "Pull Request Reviewers"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "entziehen"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5560,50 +5766,50 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr "Letzte Stimmabgabe: %s"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr "Pull Request löschen"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr "Pull Request löschen"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "Löschen der Gruppe bestätigen: %s mit %s Repository"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "%s Pull Request %s"
+msgstr "Pull Request #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
-#, python-format
-msgid "Pull request #%s from %s#%s"
+#, fuzzy, python-format
+#| msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr "Pull Request #%s von %s#%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5619,86 +5825,86 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 msgid "There are no reviewers"
 msgstr "Es gibt keine Reviewers"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 msgid "on"
 msgstr "in"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr "Erstellt von"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 msgid "Update"
 msgstr "Aktualisierung"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr "Pull Request Reviewers"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 msgid "Remove reviewer"
 msgstr "Reviewer entfernen"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 msgid "Potential Reviewers"
 msgstr "Potentielle Reviewer"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr "Als neuen Pull Request speichern"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 msgid "Cancel Changes"
 msgstr "Änderungen verwerfen"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 msgid "Pull Request Content"
 msgstr "Inhalt des Pull Requests"
 
@@ -5799,8 +6005,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5808,45 +6014,45 @@
 msgid "Stats gathered: "
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
-msgid "commits"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:390
-msgid "files added"
+msgid "commits"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
+msgid "files added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:394
-msgid "commit"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:395
-msgid "file added"
+msgid "commit"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:396
-msgid "file changed"
+msgid "file added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:397
+msgid "file changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr ""
 
@@ -5868,65 +6074,73 @@
 msgid "Fork of"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr ""
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "Clone von"
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
+msgstr "Clone-URL"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:125
+msgid "With subrepos"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 msgid "Latest Changes"
 msgstr "Letzte Änderungen"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr "Schnelleinstieg"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
@@ -5939,3 +6153,288 @@
 #: kallithea/templates/tags/tags.html:26
 msgid "Compare Tags"
 msgstr "Tags vergleichen"
+
+#~ msgid "No comments."
+#~ msgstr "Keine Kommentare."
+
+#~ msgid "public journal"
+#~ msgstr "Öffentliches Logbuch"
+
+#~ msgid "journal"
+#~ msgstr "Logbuch"
+
+#~ msgid "Locked repository"
+#~ msgstr "Gesperrtes Repositorium"
+
+#~ msgid "Unlocked repository"
+#~ msgstr "Entsperrtes Repositorium"
+
+#~ msgid "Unlocked"
+#~ msgstr "Entsperrt"
+
+#~ msgid "Locked"
+#~ msgstr "Gesperrt"
+
+#~ msgid "Repository has been %s"
+#~ msgstr "Repositorium wurde %s"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "Sie können diesen Benutzer nicht editieren"
+
+#~ msgid "No Files"
+#~ msgstr "Keine Dateien"
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "Benutzername \"%(username)s\" ist verboten"
+
+#~ msgid "invalid user name"
+#~ msgstr "Ungültiger Benutzername"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "Ihr Account wurde Deaktiviert"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "ungültige Clone-URL"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+#~ "Ungültige Clone-URL, gültige Clone-URL"
+#~ " (http(s)/svn+http(s)/ssh) angeben"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+#~ "Die Revisionen %(revs)s sind bereits "
+#~ "Bestandteil des Pull Requests oder haben"
+#~ " den Status"
+
+#~ msgid "Defaults"
+#~ msgstr "Voreinstellungen"
+
+#~ msgid "My Emails"
+#~ msgstr "Meine E-Mails"
+
+#~ msgid "Watched"
+#~ msgstr "Beobachtet"
+
+#~ msgid "My Permissions"
+#~ msgstr "Meine Erlaubnisse"
+
+#~ msgid "expires"
+#~ msgstr "verfällt"
+
+#~ msgid "reset"
+#~ msgstr "Zurücksetzen"
+
+#~ msgid "delete"
+#~ msgstr "löschen"
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "Rechteverwaltung"
+
+#~ msgid "Overview"
+#~ msgstr "Übersicht"
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr "Bestehende Einstellungen überschreiben"
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr "Standardmäßige IP Whitelist für alle Benutzer"
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "Übersicht der Standardbenutzerrechte"
+
+#~ msgid "none"
+#~ msgstr "keine"
+
+#~ msgid "read"
+#~ msgstr "lesen"
+
+#~ msgid "write"
+#~ msgstr "schreiben"
+
+#~ msgid "admin"
+#~ msgstr "admin"
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "apply to children"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "Optionale http[s] URL, von welcher das Repository geclont werden soll."
+
+#~ msgid "Remote URL"
+#~ msgstr "Remote URL"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "Änderungen von entferntem Ort übertragen"
+
+#~ msgid "Confirm to pull changes from remote side."
+#~ msgstr ""
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "bearbeiten"
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr "E-Mail-Präfix"
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr "SMTP-Server"
+
+#~ msgid "SMTP username"
+#~ msgstr "SMTP-Benutzername"
+
+#~ msgid "SMTP password"
+#~ msgstr "SMTP-Passwort"
+
+#~ msgid "SMTP port"
+#~ msgstr "SMTP-Port"
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "Meta-Tagging"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "Standart Rechte"
+
+#~ msgid "user groups"
+#~ msgstr "Benutzergruppen"
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "Push new repo"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "merge"
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "Statusänderung durch Pull Request"
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr "MIME-Type"
+
+#~ msgid "My Repos"
+#~ msgstr "Meine Repositories"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr "Letzte Stimmabgabe: %s"
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr ""
+
+#~ msgid "reviewer"
+#~ msgstr ""
+
+#~ msgid "with subrepos"
+#~ msgstr ""
+
Binary file kallithea/i18n/en/LC_MESSAGES/kallithea.mo has changed
--- a/kallithea/i18n/fr/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/fr/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,11 +5,11 @@
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2011
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
-"PO-Revision-Date: 2015-05-11 23:05+0200\n"
-"Last-Translator: David Avigni <david.avigni@ankapi.com>\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
+"PO-Revision-Date: 2015-07-20 11:32+0200\n"
+"Last-Translator: Étienne Gilli <etienne.gilli@gmail.com>\n"
 "Language-Team: French "
 "<https://hosted.weblate.org/projects/kallithea/kallithea/fr/>\n"
 "Language: fr\n"
@@ -17,22 +17,26 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 2.3-dev\n"
+"X-Generator: Weblate 2.4-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Il n’y a aucun changement pour le moment"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "Aucun"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(fermé)"
 
@@ -46,21 +50,17 @@
 msgstr "Ignorer les espaces et tabulations"
 
 #: kallithea/controllers/changeset.py:169
-#, python-format
-msgid "increase diff context to %(num)s lines"
+#, fuzzy, python-format
+#| msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr "augmenter le contexte du diff à %(num)s lignes"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "Une telle révision n'existe pas pour ce dépôt"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Aucun commentaire."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
@@ -68,33 +68,43 @@
 "La modification de l'état sur un ensemble de modifications associé à une "
 "demande de tirage fermé n'est pas autorisé"
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr "Sélectionner le changeset"
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
-msgstr ""
-
-#: kallithea/controllers/error.py:96
+msgstr "Impossible de comparer des dépôts sans utiliser un ancêtre commun"
+
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "revisions"
+msgid "No response"
+msgstr "révisions"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 "Le serveur n’a pas pu interpréter la requête à cause d’une erreur de "
 "syntaxe."
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "Accès interdit à cette ressource"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "Vous n’avez pas la permission de voir cette page"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "Ressource introuvable"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -112,17 +122,17 @@
 msgid "%s %s feed"
 msgstr "Flux %s de %s"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr "Cet ensemble de changements était trop important et a été découpé…"
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr "%s a commité, le %s"
@@ -171,6 +181,8 @@
 #: kallithea/controllers/files.py:378
 msgid "You can only edit files with revision being a valid branch "
 msgstr ""
+"Vous pouvez modifier uniquement les fichiers dont la révision est dans "
+"une branche valide "
 
 #: kallithea/controllers/files.py:392
 #, python-format
@@ -204,45 +216,43 @@
 "Le chemin doit être un chemin relatif et ne doit pas contenir .. dans le "
 "chemin"
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Les téléchargements sont désactivés"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Révision %s inconnue"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Dépôt vide"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "Type d’archive inconnu"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Changesets"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Branches"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Tags"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Une erreur est survenue durant le fork du dépôt %s"
@@ -258,9 +268,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Dépôts"
 
@@ -280,26 +290,33 @@
 msgstr "Signet"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr "Journal public"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr "Journal"
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr "Historique"
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+#, fuzzy
+#| msgid "bad captcha"
+msgid "Bad captcha"
 msgstr "mauvais captcha"
 
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr "Vous vous êtes inscrits avec succès à Kallithea"
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "Un lien de rénitialisation de votre mot de passe vous a été envoyé"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
@@ -307,120 +324,135 @@
 "Votre mot de passe a été réinitialisé. Votre nouveau mot de passe vous a "
 "été envoyé par e-mail"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr "%s (fermé)"
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "Changements"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr "Spécial"
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr "Branches appairées"
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Signets"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr "Erreur de création de la demande de pull : %s"
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr "Aucune description"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "La requête de pull a été ouverte avec succès"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr "Une erreur est survenue durant la création de la pull request"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr "Changeset manquant depuis la précédente pull request :"
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr "Nouveau changeset sur %s %s depuis la précédente pull request :"
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
-
-#: kallithea/controllers/pullrequests.py:419
+"L'ancêtre n'a pas changé - montrer les différences avec la version "
+"précédente :"
+
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
-
-#: kallithea/controllers/pullrequests.py:421
+"Cette demande de pull est basée sur une autre révision %s et il n'y a pas"
+" de diff simple."
+
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr "Aucun changement constaté sur %s %s depuis la version précédente."
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr "Fermé, remplacé par %s."
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr "Mise à jour de la pull request créée"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr "Pull request mise à jour"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "La requête de pull a été supprimée avec succès"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr "Cette pull request a déjà été fusionnée à %s."
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr "Cette pull request a été fermée et ne peut pas être mise à jour."
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
-msgstr ""
-
-#: kallithea/controllers/pullrequests.py:600
+msgstr "Cette demande de pull peut être mise à jour avec les modifications de %s :"
+
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr "Fermeture."
 
@@ -438,21 +470,21 @@
 msgid "An error occurred during search operation."
 msgstr "Une erreur est survenue pendant la recherche."
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr "Aucune donnée actuellement disponible"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "La mise à jour des statistiques est désactivée pour ce dépôt"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr "Mise à jour des paramètres d'authentification effectuée avec succès"
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 "une erreur est survenue pendant la mise à jour des réglages "
@@ -467,38 +499,40 @@
 msgstr "Une erreur est survenue durant la mise à jour des réglages par défaut"
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+#, fuzzy
+#| msgid "forever"
+msgid "Forever"
 msgstr "pour toujours"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 minute"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 heure"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 jour"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 mois"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr "Toujours"
 
@@ -512,7 +546,9 @@
 msgstr "Gist %s supprimé"
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+#, fuzzy
+#| msgid "unmodified"
+msgid "Unmodified"
 msgstr "non modifié"
 
 #: kallithea/controllers/admin/gists.py:262
@@ -528,121 +564,137 @@
 msgid "Error occurred during update of gist %s"
 msgstr "Une erreur est survenue durant la mise à jour du gist %s"
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 "Vous ne pouvez pas éditer cet utilisateur ; il est nécessaire pour le bon"
 " fonctionnement de l’application"
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "Votre compte a été mis à jour avec succès"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr "Une erreur est survenue durant la mise à jour de l'utilisateur %s"
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr "Mot de passe mis à jour avec succès"
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 "Une erreur est survenue durant la mise à jour du mot de passe de "
 "l'utilisateur"
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "L’e-mail « %s » a été ajouté à l’utilisateur"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Une erreur est survenue durant l’enregistrement de l’e-mail"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "L’e-mail a été enlevé de l’utilisateur"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
 msgstr "Clé d'API créée avec succès"
 
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
 msgstr "Clé d'API remise à zéro avec succès"
 
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
 msgstr "Clé d'API supprimée avec succès"
 
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "Lire"
+
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "Lire"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "Écrire"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "Écrire"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "Administration"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "Interdite"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr "Autorisé avec activation de compte manuelle"
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr "Autorisé avec activation de compte automatique"
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -650,11 +702,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr "Activation manuelle du compte externe"
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -662,223 +714,214 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr "Activation automatique du compte externe"
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "Autorisée"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr "Permissions globales mises à jour avec succès"
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr "Une erreur est survenue durant la mise à jour des permissions"
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr "Une erreur est survenue durant la création du groupe de dépôts %s"
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr "Groupe de dépôts %s créé"
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr "Une erreur est survenue durant la création du groupe de dépôts %s"
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr "Groupe de dépôts %s mis à jour"
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "Une erreur est survenue durant la mise à jour du groupe de dépôts %s"
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "Ce groupe contient %s dépôts et ne peut être supprimé"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Ce groupe contient %s sous-groupes et ne peut pas être supprimé"
 
-#: kallithea/controllers/admin/repo_groups.py:302
+#: kallithea/controllers/admin/repo_groups.py:297
 #, python-format
 msgid "Removed repository group %s"
 msgstr "Groupe de dépôts %s supprimé"
 
-#: kallithea/controllers/admin/repo_groups.py:307
+#: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr "Une erreur est survenue durant la suppression du groupe de dépôts %s"
 
-#: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
 #: kallithea/controllers/admin/user_groups.py:340
 msgid "Cannot revoke permission for yourself as admin"
 msgstr "Impossible de révoquer votre permission d'administrateur"
 
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
+#: kallithea/controllers/admin/repo_groups.py:420
+msgid "Repository group permissions updated"
 msgstr "Permissions du groupe de dépôts mises à jour"
 
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr "Une erreur est survenue durant la révocation de la permission"
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "Erreur de création du dépôt %s"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr "Dépôt %s créé depuis %s"
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "dépôt %s forké en tant que %s"
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr "Dépôt %s créé"
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Dépôt %s mis à jour avec succès"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "Une erreur est survenue durant la mise à jour du dépôt %s"
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr "%s forks détachés"
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr "%s forks supprimés"
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr "Dépôt %s supprimé"
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
+#: kallithea/controllers/admin/repos.py:321
+#, fuzzy, python-format
+#| msgid "Cannot delete %s it still contains attached forks"
+msgid "Cannot delete repository %s which still has forks"
 msgstr "Impossible de supprimer le dépôt %s : Des forks y sont attachés"
 
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Erreur pendant la suppression de %s"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr "Permissions du dépôt mises à jour"
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr "Une erreur est survenue durant la création du champ"
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr "Une erreur est survenue durant la suppression du champ"
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr "-- Pas un fork --"
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "La visibilité du dépôt dans le journal public a été mise à jour"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 "Une erreur est survenue durant la configuration du journal public pour ce"
 " dépôt"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "Jeton d’authentification incorrect"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "[Aucun dépôt]"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "Le dépôt %s a été marké comme fork de %s"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "Une erreur est survenue durant cette opération"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr "Dépôt verrouillé"
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr "Dépôt non verrouillé"
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been locked"
+msgstr "Ce dépôt n’est pas verrouillé"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been unlocked"
+msgstr "Ce dépôt n’est pas verrouillé"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "Une erreur est survenue durant le déverrouillage"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "Non verrouillé"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "Verrouillé"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr "Invalidation du cache réalisée avec succès"
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "Une erreur est survenue durant l’invalidation du cache"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "Les changements distants ont été récupérés"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "Le dépôt a été %s"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr "Invalidation du cache réalisée avec succès"
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "Une erreur est survenue durant l’invalidation du cache"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "Les changements distants ont été récupérés"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr "Une erreur est survenue durant le pull depuis la source distante"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "Une erreur est survenue durant la suppression des statistiques du dépôt"
 
@@ -896,7 +939,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 "Une erreur est survenue durant la mise à jour des réglages de "
 "l'application"
@@ -977,83 +1020,82 @@
 msgstr "Le groupe cible ne peut pas être le même"
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr "Permissions du groupe d'utilisateurs mises à jour"
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr "Permissions mises à jour"
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "Une erreur est survenue durant l’enregistrement des permissions"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr "Utilisateur %s créé"
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr "Une erreur est survenue durant la création de l'utilisateur %s"
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "L’utilisateur a été mis à jour avec succès"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr "Utilisateur supprimé avec succès"
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "Une erreur est survenue durant la suppression de l’utilisateur"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "Vous ne pouvez pas éditer cet utilisateur"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
 msgstr "L'adresse IP %s a été ajoutée à la liste blanche"
 
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
 msgstr "Une erreur est survenue durant la sauvegarde d'IP"
 
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
 msgstr "L'adresse IP a été supprimée de la liste blanche"
 
-#: kallithea/lib/auth.py:745
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr "IP %s non autorisée"
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+#, fuzzy
+#| msgid "New api key"
+msgid "Invalid API key"
+msgstr "Nouvelle clé d'API"
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "Vous devez être un utilisateur enregistré pour effectuer cette action"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "Vous devez être connecté pour visualiser cette page"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "Ensemble de changements non trouvé"
 
@@ -1071,158 +1113,164 @@
 msgid "No changes detected"
 msgstr "Aucun changement détecté"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "Branche supprimée : %s"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "Étiquette créée : %s"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Afficher les changements combinés %s->%s"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "vue de comparaison"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "et"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "%s de plus"
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "révisions"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "fork name %s"
+msgid "Fork name %s"
 msgstr "nom du fork %s"
 
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "Pull request %s"
 msgstr "Requête de pull #%s"
 
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "[a supprimé] le dépôt"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "[a créé] le dépôt"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "[a créé] le dépôt en tant que fork"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "[a forké] le dépôt"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "[a mis à jour] le dépôt"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr "[téléchargée] archive depuis le dépôt"
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "[a supprimé] le dépôt"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "[a créé] l’utilisateur"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "[a mis à jour] l’utilisateur"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr "[créé] groupe d'utilisateurs"
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr "[mis à jour] groupe d'utilisateurs"
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "[a commenté] une révision du dépôt"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "[a commenté] la requête de pull pour"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "[a fermé] la requête de pull de"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[a pushé] dans"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "[a commité via Kallithea] dans le dépôt"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "[a pullé depuis un site distant] dans le dépôt"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[a pullé] depuis"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "[suit maintenant] le dépôt"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "[ne suit plus] le dépôt"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " et %s de plus"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "Aucun fichier"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr "nouveau fichier"
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr "mod"
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr "suppr."
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr "renommer"
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr "chmod"
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1233,69 +1281,69 @@
 "probablement été créé ou renommé manuellement. Veuillez relancer "
 "l’application pour rescanner les dépôts"
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d an"
 msgstr[1] "%d ans"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d mois"
 msgstr[1] "%d mois"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d jour"
 msgstr[1] "%d jours"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d heure"
 msgstr[1] "%d heures"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d minute"
 msgstr[1] "%d minutes"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d seconde"
 msgstr[1] "%d secondes"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "dans %s"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "Il y a %s"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "dans %s et %s"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "Il y a %s et %s"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "à l’instant"
 
@@ -1310,7 +1358,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "Aucun accès au dépôt"
 
@@ -1325,7 +1373,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "Accès en lecture au dépôt"
 
@@ -1340,7 +1388,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "Accès en écriture au dépôt"
 
@@ -1355,7 +1403,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "Accès administrateur au dépôt"
 
@@ -1394,7 +1442,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Administrateur Kallithea"
 
@@ -1409,7 +1457,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "Création de dépôt désactivée"
 
@@ -1424,7 +1472,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "Création de dépôt activée"
 
@@ -1439,7 +1487,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "Fork de dépôt désactivé"
 
@@ -1454,7 +1502,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "Fork de dépôt activé"
 
@@ -1490,7 +1538,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "Pas encore relue"
 
@@ -1505,7 +1553,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "Approuvée"
 
@@ -1520,7 +1568,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "Rejetée"
 
@@ -1535,7 +1583,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "En cours de relecture"
 
@@ -1547,7 +1595,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr "niveau supérieur"
 
@@ -1559,7 +1607,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr "Groupe de dépôts, pas d'accès"
 
@@ -1571,7 +1619,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr "Groupe de dépôts, accès en lecture"
 
@@ -1583,7 +1631,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr "Groupe de dépôts, accès en écriture"
 
@@ -1595,7 +1643,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr "Groupe de dépôts, accès d'administration"
 
@@ -1606,7 +1654,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr "Groupe d'utilisateurs, pas d'accès"
 
@@ -1617,7 +1665,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr "Groupe d'utilisateurs, accès en lecture"
 
@@ -1628,7 +1676,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr "Groupe d'utilisateurs, accès en écriture"
 
@@ -1639,7 +1687,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr "Groupe d'utilisateurs, accès d'administration"
 
@@ -1650,7 +1698,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr "Création de groupes de dépôts désactivée"
 
@@ -1661,7 +1709,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr "Création de groupes de dépôts activée"
 
@@ -1672,7 +1720,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr "Création de groupes d'utilisateurs désactivée"
 
@@ -1683,7 +1731,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr "Création de groupes d'utilisateurs activée"
 
@@ -1694,7 +1742,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr "Enregistrement désactivé"
 
@@ -1705,7 +1753,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr "Enregistrement des utilisateurs avec activation de compte manuelle"
 
@@ -1716,33 +1764,157 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr "Enregistrement des utilisateurs avec activation de compte automatique"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 "Création de dépôts activée avec l'accès en écriture vers un groupe de "
 "dépôts"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 "Création de dépôts désactivée avec l'accès en écriture vers un groupe de "
 "dépôts"
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "à la ligne %s"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[Mention]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "Accès interdit à cette ressource"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "Accès interdit à cette ressource"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Only admins can create repository groups"
+msgstr "Groupe de dépôts %s créé"
+
+#: kallithea/model/db.py:1683
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Non-admins can create repository groups"
+msgstr "Groupe de dépôts %s créé"
+
+#: kallithea/model/db.py:1685
+#, fuzzy
+#| msgid "[created] user group"
+msgid "Only admins can create user groups"
+msgstr "[créé] groupe d'utilisateurs"
+
+#: kallithea/model/db.py:1686
+#, fuzzy
+#| msgid "[created] user group"
+msgid "Non-admins can create user groups"
+msgstr "[créé] groupe d'utilisateurs"
+
+#: kallithea/model/db.py:1688
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Only admins can create top level repositories"
+msgstr "Dépôts de niveau supérieur"
+
+#: kallithea/model/db.py:1689
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Non-admins can create top level repositories"
+msgstr "Dépôts de niveau supérieur"
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Dépôts totaux"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Invalidate cache for all repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Invalider le cache pour tous les dépôts"
+
+#: kallithea/model/db.py:1698
+#, fuzzy
+#| msgid "User Registration with manual account activation"
+msgid "User registration with manual account activation"
+msgstr "Enregistrement des utilisateurs avec activation de compte manuelle"
+
+#: kallithea/model/db.py:1699
+#, fuzzy
+#| msgid "User Registration with automatic account activation"
+msgid "User registration with automatic account activation"
+msgstr "Enregistrement des utilisateurs avec activation de compte automatique"
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "Pas encore relue"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "En cours de relecture"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "Veuillez entrer un identifiant"
@@ -1761,116 +1933,149 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Entrez au moins %(min)i caractères"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr "Le nom ne doit pas contenir seulement des chiffres"
 
-#: kallithea/model/notification.py:252
+#: kallithea/model/notification.py:254
+#, fuzzy, python-format
+#| msgid "%(user)s commented on changeset at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
+msgstr "%(user)s a commenté sur le changeset à %(when)s"
+
+#: kallithea/model/notification.py:255
+#, fuzzy, python-format
+#| msgid "%(user)s sent message at %(when)s"
+msgid "%(user)s sent message %(age)s"
+msgstr "%(user)s a envoyé un message à %(when)s"
+
+#: kallithea/model/notification.py:256
+#, fuzzy, python-format
+#| msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
+msgstr "%(user)s vous a mentionné à %(when)s"
+
+#: kallithea/model/notification.py:257
+#, fuzzy, python-format
+#| msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr "%(user)s s'est enregistré sur Kallithea à %(when)s"
+
+#: kallithea/model/notification.py:258
+#, fuzzy, python-format
+#| msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "%(user)s a ouvert une nouvelle demande de pull à %(when)s"
+
+#: kallithea/model/notification.py:259
+#, fuzzy, python-format
+#| msgid "%(user)s commented on pull request at %(when)s"
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "%(user)s a commenté la demande de pull à %(when)s"
+
+#: kallithea/model/notification.py:266
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s a commenté sur le changeset à %(when)s"
 
-#: kallithea/model/notification.py:253
+#: kallithea/model/notification.py:267
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s a envoyé un message à %(when)s"
 
-#: kallithea/model/notification.py:254
+#: kallithea/model/notification.py:268
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s vous a mentionné à %(when)s"
 
-#: kallithea/model/notification.py:255
+#: kallithea/model/notification.py:269
 #, python-format
 msgid "%(user)s registered in Kallithea at %(when)s"
 msgstr "%(user)s s'est enregistré sur Kallithea à %(when)s"
 
-#: kallithea/model/notification.py:256
+#: kallithea/model/notification.py:270
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s a ouvert une nouvelle demande de pull à %(when)s"
 
-#: kallithea/model/notification.py:257
+#: kallithea/model/notification.py:271
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s a commenté la demande de pull à %(when)s"
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr "Nouvel utilisateur %(new_username)s enregistré"
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr "Nouvel utilisateur %(new_username)s enregistré"
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr "Fermeture"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#: kallithea/model/pull_request.py:137
+#, fuzzy, python-format
+#| msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 msgstr ""
 "%(user)s veut que vous regardiez la demande de pull #%(pr_id)s : "
 "%(pr_title)s"
 
-#: kallithea/model/scm.py:808
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "Dernier sommet"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr "Nouveau enregistrement d'utilisateur"
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-"Vous ne pouvez pas éditer cet utilisateur ; il est nécessaire pour le bon"
-" fonctionnement de l’application"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr ""
 "Vous ne pouvez pas supprimer cet utilisateur ; il est nécessaire pour le "
 "bon fonctionnement de l’application"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
-"L’utilisateur \"%s\" possède %s dépôts et ne peut être supprimé. Changez les "
-"propriétaires ou supprimez ces dépôts : %s"
-
-#: kallithea/model/user.py:268
+"L’utilisateur \"%s\" possède %s dépôts et ne peut être supprimé. Changez "
+"les propriétaires ou supprimez ces dépôts : %s"
+
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
-"L’utilisateur \"%s\" possède %s groupes de dépôt et ne peut être supprimé. "
-"Changez les propriétaires ou supprimez ces dépôts : %s"
-
-#: kallithea/model/user.py:275
+"L’utilisateur \"%s\" possède %s groupes de dépôt et ne peut être "
+"supprimé. Changez les propriétaires ou supprimez ces dépôts : %s"
+
+#: kallithea/model/user.py:266
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
@@ -1879,61 +2084,66 @@
 "L’utilisateur « %s » possède %s dépôts et ne peut être supprimé. Changez "
 "les propriétaires de ces dépôts. %s"
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr "Lien de remise à zéro du mot de passe"
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr "Votre nouveau mot de passe"
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr "Votre nouveau mot de passe Kallithea : %s"
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "Cette valeur ne peut être une liste vide"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "Le nom d’utilisateur « %(username)s » existe déjà"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "Le nom d’utilisateur « %(username)s » n’est pas autorisé"
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, fuzzy, python-format
+#| msgid "Username %(username)s is not valid"
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "Le nom d’utilisateur « %(username)s » n’est pas valide"
+
+#: kallithea/model/validators.py:99
+#, fuzzy
+#| msgid "" "Username may only contain alphanumeric characters underscores,
+#| periods or" " dashes and must begin with alphanumeric character or
+#| underscore"
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
+" dashes and must begin with an alphanumeric character or underscore"
 msgstr ""
 "Le pseudonyme ne peut contenir que des caractères alphanumériques, des "
 "tirets, points, traits d'union et doit commencer avec un caractère "
 "alphanumérique ou un trait d'union"
 
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr "L'entrée n'est pas valide"
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "Le nom d’utilisateur « %(username)s » n’est pas valide"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr "Nom de groupe d'utilisateurs invalide"
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr "Le groupe d'utilisateurs « %(usergroup)s » existe déjà"
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
@@ -1942,108 +2152,112 @@
 "alphanumériques, des tirets, des points, des traits d'union et doit "
 "commencer avec un caractère alphanumérique"
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "Impossible d’assigner ce groupe en tant que parent"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "Le groupe « %(group_name)s » existe déjà"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "Un dépôt portant le nom « %(group_name)s » existe déjà"
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "Caractères incorrects (non-ASCII) dans le mot de passe"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr "Ancien mot de passe invalide"
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "Les mots de passe ne correspondent pas"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "mot de passe invalide"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "nom d’utilisateur invalide"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "Votre compte est désactivé"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "Jeton d’authentification incorrect"
+
+#: kallithea/model/validators.py:345
+#, fuzzy, python-format
+#| msgid "Repository name %(repo)s is disallowed"
+msgid "Repository name %(repo)s is not allowed"
 msgstr "Le nom de dépôt « %(repo)s » n’est pas autorisé"
 
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "Un dépôt portant le nom « %(repo)s » existe déjà"
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr "Le dépôt « %(repo)s » existe déjà dans le groupe « %(group)s »"
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr "Un groupe de dépôts avec le nom « %(repo)s » existe déjà"
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr "URL de clonage invalide"
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-"URL à cloner invalide, veuillez fournir une URL à cloner valide "
-"http(s)/svn+http(s)/ssh"
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "Dépôt privé"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "Le fork doit être du même type que le parent"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr "Vous n’avez pas la permission de créer un dépôt dans ce"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr "pas de permission de créer un dépôt dans la racine"
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr "Vous n'avez pas les permissions pour créer un groupe dans cet endroit"
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr "Ce nom d'utilisateur ou nom de groupe d'utilisateurs n'est pas valide"
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "Ceci n’est pas un chemin valide"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "Cette adresse e-mail est déjà enregistrée"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "L’adresse e-mail « %(email)s » n’existe pas."
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
@@ -2051,33 +2265,26 @@
 "L’attribut Login du CN doit être spécifié. Cet attribut correspond au nom"
 " d’utilisateur"
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-"Les révisions %(revs)s font déjà partie de la requête de pull ou on des "
-"statuts définis"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
 msgstr "Veuillez entrer une adresse IPv4 ou IPv6 valide"
 
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr "La taille du réseau (bits) doit être entre 0 et 32 (et non %(bits)r)"
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 "Le nom de la clé ne peut consister que de letters, de traits d'union, de "
 "tirets ou de nombres"
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr "Le nom du fichier ne peut être à l'intérieur d'un répertoire"
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2141,13 +2348,13 @@
 msgstr "Nom du groupe"
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2159,11 +2366,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "Description"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2184,11 +2391,11 @@
 msgid "Name"
 msgstr "Nom"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "Dernière modification"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2197,18 +2404,19 @@
 msgid "Tip"
 msgstr "Sommet"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "Propriétaire"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2220,7 +2428,7 @@
 msgid "Click to sort ascending"
 msgstr "Tri ascendant"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2232,11 +2440,11 @@
 msgid "Click to sort descending"
 msgstr "Tri descendant"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr "Pas de dépôts trouvés."
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2248,10 +2456,10 @@
 msgid "Data error."
 msgstr "Erreur d’intégrité des données."
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2261,7 +2469,7 @@
 msgstr "Chargement…"
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "Connexion"
 
@@ -2270,39 +2478,39 @@
 msgid "Log In to %s"
 msgstr "Se connecter à %s"
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "Nom d’utilisateur"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "Mot de passe"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "Se souvenir de moi"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "Mot de passe oublié ?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "Vous n’avez pas de compte ?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "Connexion"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "Mot de passe oublié ?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "Vous n’avez pas de compte ?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr "Remettre le mot de passe à zéro"
@@ -2334,8 +2542,8 @@
 "Password reset link will be sent to the email address matching your "
 "username."
 msgstr ""
-"Le lien de réinitialisation du mot de passe sera envoyé à l'adresse e-mail "
-"correspondant à votre nom d'utilisateur."
+"Le lien de réinitialisation du mot de passe sera envoyé à l'adresse "
+"e-mail correspondant à votre nom d'utilisateur."
 
 #: kallithea/templates/register.html:5 kallithea/templates/register.html:14
 #: kallithea/templates/register.html:90
@@ -2352,26 +2560,26 @@
 msgstr "Confirmation"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "Prénom"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "Nom"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "E-mail"
 
@@ -2479,9 +2687,12 @@
 msgstr "Greffons activés"
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
+#, fuzzy
+#| msgid "" "Comma separated list of plugins. Order of plugins is also order in
+#| which " "Kallithea will try to authenticate user"
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 "Une liste séparée avec des virgules des greffons. L'ordre des greffons "
 "est aussi celui dans lequel Kallithea va essayer d'authentifier un "
@@ -2491,66 +2702,52 @@
 msgid "Available built-in plugins"
 msgstr "Greffons inclus disponibles"
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr "activé"
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr "désactivé"
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr "Greffon"
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "Enregistrer"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
-msgid "Repository Defaults"
-msgstr "Réglages par défaut du dépôt"
-
 #: kallithea/templates/admin/defaults/defaults.html:11
 #: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr "Par défaut"
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+msgid "Repository Defaults"
+msgstr "Réglages par défaut du dépôt"
+
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "Type"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "Dépôt privé"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
@@ -2559,34 +2756,34 @@
 "Les dépôts privés sont visibles seulement par les utilisateurs ajoutés "
 "comme collaborateurs."
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "Activer les statistiques"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "Afficher les statistiques sur la page du dépôt."
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "Activer les téléchargements"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "Afficher le menu de téléchargements sur la page du dépôt."
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "Activer le verrouillage"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr "Activer le verrouillage lors d’un pull sur le dépôt."
 
@@ -2620,6 +2817,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr "Expire le"
 
@@ -2630,7 +2833,9 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+#, fuzzy
+#| msgid "never"
+msgid "Never"
 msgstr "jamais"
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2638,7 +2843,7 @@
 msgstr "Mettre à jour le gist"
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "Annuler"
 
@@ -2661,12 +2866,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr "Créer un nouveau gist"
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr "Créé"
 
@@ -2692,25 +2897,27 @@
 msgstr "Créer un gist public"
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2740,11 +2947,22 @@
 msgstr "Gist privé"
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -2753,9 +2971,18 @@
 msgstr "Confirmer la supprisson de ce gist"
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2781,7 +3008,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "Mon compte"
 
@@ -2790,83 +3017,90 @@
 msgid "Profile"
 msgstr "Profil"
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
-msgstr "Clés de l'API"
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "Nouvelle adrese"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
-msgstr "Mes e-mails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
+msgstr "Clés de l'API"
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr "Mes dépôts"
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "Dépôts"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "Surveillé"
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "Création de dépôts"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
-msgstr "Mes permissions"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+#, fuzzy
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "Copier les permissions"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
 msgstr "Inclus"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr "expire le"
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to reset this api key: %s"
+msgid "Confirm to reset this API key: %s"
 msgstr "Confirmer la remise à zéro de cette clé d'API : %s"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr "remis à zéro"
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+#, fuzzy
+#| msgid "expired"
+msgid "Expired"
 msgstr "a expiré"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr "Confirmer la suppression de cette clé d'API : %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+#, fuzzy
+#| msgid "remove"
+msgid "Remove"
 msgstr "supprimer"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+#, fuzzy
+#| msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr "Pas de clés d'API supplémentaires spécifiées"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+#, fuzzy
+#| msgid "New api key"
+msgid "New API key"
 msgstr "Nouvelle clé d'API"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2879,19 +3113,6 @@
 msgid "Primary"
 msgstr "Primaire"
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "Supprimer"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2912,19 +3133,24 @@
 msgid "Change Your Account Password"
 msgstr "Changer le mot de passe de votre compte"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr "Mot de passe actuel"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "Nouveau mot de passe"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr "Confirmer le nouveau mot de passe"
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "Vous pouvez changer votre avatar sur"
@@ -2945,15 +3171,11 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
+#, fuzzy
+#| msgid "current IP"
+msgid "Current IP"
 msgstr "adresse IP actuelle"
 
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
 msgid "Repositories You Own"
 msgstr "Dépôts dont vous êtes le propriétaire"
@@ -2987,7 +3209,7 @@
 msgstr "Commentaires"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr "Demandes de pull"
 
@@ -3005,21 +3227,16 @@
 msgstr "Montrer Notification"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "Notifications"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr "Administration des permissions"
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "Permissions"
+#, fuzzy
+msgid "Default Permissions"
+msgstr "Permissions par défaut"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -3027,14 +3244,10 @@
 msgstr "Global"
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr "Liste blanche d'adresses IP"
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr "Vue d'ensemble"
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "Accès anonyme"
@@ -3048,23 +3261,27 @@
 "Autoriser l'accès à Kallithea sans le besoin de se connecter. Les "
 "utilisateurs anonymes ont les permissions de %s"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repositories"
+msgstr "Importer un dépôt existant ?"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
-msgstr "Écraser les paramètres existants"
+msgid "Permissions for the Default user on new repositories."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "Groupe de dépôt"
@@ -3076,75 +3293,105 @@
 "will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repository groups"
+msgstr "Importer un dépôt existant ?"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr "Groupe d'utilisateurs"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "Création de dépôt"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid ""
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr "Création de dépôts avec l'accès en écriture du groupe"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr "Création de groupes d'utilisateurs"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr "Fork de dépôt"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "Enregistrement"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-#, fuzzy
-msgid "Default IP Whitelist for All Users"
-msgstr "Liste blanche d'adresses IP par défaut pour tous les utilisateurs"
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
 msgstr "Confirmer la suppression de cette adresse IP : %s"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 #, fuzzy
 msgid "All IP addresses are allowed."
 msgstr "Toutes les adresses IP sont autorisées"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr "Nouvelle adresse IP"
 
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-#, fuzzy
-msgid "Default User Permissions Overview"
-msgstr "Vue d'ensemble des permissions utilisateur par défaut"
-
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:105
@@ -3166,12 +3413,12 @@
 msgstr "Parent du groupe"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr "Copier les permissions du groupe parent"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3189,19 +3436,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "Options"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr "Avancé"
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "Permissions"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3222,12 +3475,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "Créé le"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3238,38 +3491,12 @@
 msgid "Delete this repository group"
 msgstr "Supprimer ce groupe de dépôts"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "Aucune"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "Lecture"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "Écriture"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "Administration"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+#, fuzzy
+#| msgid "user/user group"
+msgid "User/User Group"
 msgstr "utilisateur/groupe d'utilisateurs"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3278,7 +3505,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "[Par défaut]"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3287,14 +3516,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "Révoquer"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr "administrateur délégué"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3302,7 +3528,9 @@
 msgstr "Ajouter un nouveau"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+#, fuzzy
+#| msgid "apply to children"
+msgid "Apply to children"
 msgstr "Appliquer aux enfants"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3355,45 +3583,43 @@
 msgid "Number of Top-level Repositories"
 msgstr "Nombre de sous-dépôts"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr "Importer un dépôt existant ?"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "Cloner depuis"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-#, fuzzy
-msgid "Optional URL from which repository should be cloned."
-msgstr "URL http(s) depuis laquelle le dépôt doit être cloné."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "[a créé] le dépôt"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 "Gardez cette description précise et concise. Utilisez un fichier README "
 "pour des descriptions plus détaillées."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr "Sélectionnez un groupe (optionel) dans lequel sera placé le dépôt."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "Type de dépôt à créer."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "Révision d’arrivée"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3440,8 +3666,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "Statistiques"
 
@@ -3466,16 +3692,16 @@
 msgid "Public Journal Visibility"
 msgstr "Journal public"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "Supprimer du journal public"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 #, fuzzy
 msgid "Add to Public Journal"
 msgstr "Journal public"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 #, fuzzy
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
@@ -3484,36 +3710,36 @@
 "Le descriptif des actions réalisées sur ce dépôt sera visible à tous "
 "depuis le journal public"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 #, fuzzy
 msgid "Change Locking"
 msgstr "Activer le verrouillage"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 #, fuzzy
 msgid "Confirm to unlock repository."
 msgstr "Veuillez confirmer le déverrouillage de ce dépôt"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 #, fuzzy
 msgid "Unlock Repository"
 msgstr "Dépôt non verrouillé"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 #, fuzzy
 msgid "Confirm to lock repository."
 msgstr "Veuillez confirmer le verrouillage de ce dépôt"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 #, fuzzy
 msgid "Lock Repository"
 msgstr "Dépôt non verrouillé"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "Ce dépôt n’est pas verrouillé"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3521,33 +3747,33 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "Voulez-vous vraiment supprimer le dépôt %s ?"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr "Supprimer ce groupe de dépôts"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3591,8 +3817,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "Actif"
@@ -3632,31 +3858,38 @@
 msgstr "Les avatars sont désactivés"
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "Dépôt privé"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-#, fuzzy
-msgid "Remote URL"
-msgstr "URL de clone"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Pull Changes from Remote Location"
-msgstr "Récupérer les changements depuis le site distant"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Confirm to pull changes from remote side."
+#, fuzzy, python-format
+#| msgid "Created repository %s"
+msgid "Remote repository URL"
+msgstr "Dépôt %s créé"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "[a pullé depuis un site distant] dans le dépôt"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to pull changes from remote side."
+msgid "Confirm to pull changes from remote repository."
 msgstr "Voulez-vous vraiment récupérer les changements depuis le site distant ?"
 
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr ""
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "Dépôt privé"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3670,46 +3903,37 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-#, fuzzy
-msgid "Clone URL"
-msgstr "URL de clone"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "éditer"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "[a créé] le dépôt"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "Dépôt"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 "Révision par défaut pour les pages de fichiers, de téléchargements, de "
 "recherche et de documentation"
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "Changer le propriétaire de ce dépôt."
 
@@ -3771,55 +3995,11 @@
 msgid "System Info"
 msgstr "Informations sytème"
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr "Préfixe courriel"
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr "Formulaire de courriel Kallithea"
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr "Formulaire de courriel d'erreur"
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr "Destinataires du courriel d'erreur"
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr "Serveur SMTP"
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr "Nom d'utilisateur SMTP"
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr "Mot de passe SMTP"
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr "Port SMTP"
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
-msgstr "Utiliser TLS pour SMTP"
+msgid "Send test email to"
+msgstr "Envoyer un courriel de test à"
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr "Utiliser SSL pour SMTP"
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr "Authentification SMTP"
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr "Envoyer un courriel de test à"
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "Envoyer"
 
@@ -3897,13 +4077,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
-msgstr "Détruire les anciennes données"
+msgid "Delete records of missing repositories"
+msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3925,7 +4105,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3952,41 +4132,47 @@
 msgstr "Version de Kallithea"
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+#, fuzzy
+#| msgid "check for updates"
+msgid "Check for updates"
 msgstr "vérifier les mises à jour"
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
-msgstr "Version de Python"
+msgid "Kallithea configuration file"
+msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
+msgid "Python version"
+msgstr "Version de Python"
+
+#: kallithea/templates/admin/settings/settings_system.html:7
 msgid "Platform"
 msgstr "Plateforme"
 
-#: kallithea/templates/admin/settings/settings_system.html:7
+#: kallithea/templates/admin/settings/settings_system.html:8
 #, fuzzy
 msgid "Git version"
 msgstr "Version de Git"
 
-#: kallithea/templates/admin/settings/settings_system.html:8
+#: kallithea/templates/admin/settings/settings_system.html:9
 #, fuzzy
 msgid "Git path"
 msgstr "Chemin de Git"
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 #, fuzzy
 msgid "Note: please make sure this server can access this URL"
 msgstr "Note : vérifiez que le serveur peut accéder cette URL"
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr "Vérification des mises à jour…"
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 #, fuzzy
 msgid "Python Packages"
 msgstr "Paquets Python"
@@ -4150,11 +4336,11 @@
 msgstr "Icônes"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr "Afficher l’icône de dépôt public sur les dépôts"
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr "Afficher l’icône de dépôt privé sur les dépôts"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4163,7 +4349,9 @@
 msgstr "Afficher l’icône de dépôt public sur les dépôts"
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+#, fuzzy
+#| msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr "Meta-tagging"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4182,6 +4370,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4201,24 +4390,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "Permissions par défaut"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "Membres"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "Membres"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4244,10 +4434,6 @@
 msgid "User Groups Administration"
 msgstr "Administration des groupes de dépôts"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "Ajouter un utilisateur"
@@ -4273,12 +4459,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-#, fuzzy
-msgid "Default Permissions"
-msgstr "Permissions par défaut"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4288,7 +4469,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4298,11 +4479,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Voulez-vous vraiment supprimer l’utilisateur « %s » ?"
@@ -4324,18 +4505,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "Confirmation du nouveau mot de passe"
 
@@ -4357,49 +4531,57 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Dépôt Mercurial"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Dépôt Git"
+
+#: kallithea/templates/base/base.html:126
 #, fuzzy
 msgid "Create Fork"
 msgstr "créé"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Résumé"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "Historique"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "Fichiers"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "Options"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 #, fuzzy
 msgid "Compare Fork"
 msgstr "Comparer le fork"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4409,134 +4591,130 @@
 msgid "Compare"
 msgstr "Comparer"
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "Rechercher"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+msgid "Follow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "Fork"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "Historique"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "Journal public"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 #, fuzzy
 msgid "All Public Gists"
 msgstr "Gists publics"
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 #, fuzzy
 msgid "My Public Gists"
 msgstr "Gists publics"
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 #, fuzzy
 msgid "My Private Gists"
 msgstr "Gist privé"
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 #, fuzzy
 msgid "My Pull Requests"
 msgstr "Requêtes de pull"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr ""
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 #, fuzzy
 msgid "Login to Your Account"
 msgstr "Connexion à votre compte"
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "Mot de passe oublié ?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "Se déconnecter"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Réglages par défaut du dépôt"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4564,8 +4742,9 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "Afficher"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4591,7 +4770,7 @@
 msgstr "%d commentaire"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "Arrêter de suivre ce dépôt"
 
@@ -4650,14 +4829,12 @@
 
 #: kallithea/templates/base/root.html:36
 #: kallithea/templates/changeset/diff_block.html:8
-#, fuzzy
 msgid "Collapse Diff"
-msgstr "Diff de fichier"
+msgstr "Replier le Diff"
 
 #: kallithea/templates/base/root.html:37
-#, fuzzy
 msgid "Expand Diff"
-msgstr "Diff de fichier"
+msgstr "Déplier le Diff"
 
 #: kallithea/templates/base/root.html:38
 msgid "Failed to revoke permission"
@@ -4668,6 +4845,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr "Impossible de révoquer votre permission d'administrateur"
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr "activé"
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr "désactivé"
+
 #: kallithea/templates/base/root.html:43
 #, fuzzy
 msgid "Specify changeset"
@@ -4698,6 +4883,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4726,10 +4912,6 @@
 msgstr[0] "Affichage de %d révision sur %d"
 msgstr[1] "Affichage de %d révisions sur %d"
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "Afficher"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4747,7 +4929,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4761,7 +4943,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4771,7 +4953,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4804,7 +4986,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "Il n’y a aucun changement pour le moment"
 
@@ -4820,7 +5002,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4850,21 +5032,23 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr "Ajouter ou téléverser des fichiers directement via Kallithea"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Push new repo"
+msgid "Push new repository"
 msgstr "Pusher le nouveau dépôt"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr "Le dépôt existe déjà ?"
 
@@ -4874,15 +5058,15 @@
 msgstr "Changeset de %s"
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr "Statut du changeset"
@@ -4905,7 +5089,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "Fusion"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4917,159 +5103,173 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "créé"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "créé"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-#, fuzzy
-msgid "Status change from pull request"
-msgstr "Changement de statut -> %s"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "revisions"
+msgid "No revisions"
+msgstr "révisions"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "[a commenté] la requête de pull pour"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 #, fuzzy
 msgid "No title"
 msgstr "nouveau fichier"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-#, fuzzy
-msgid "Comment from pull request"
-msgstr "[a commenté] la requête de pull pour"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy
+#| msgid "No changesets"
+msgid "on this changeset"
+msgstr "Aucun changeset"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr "%d commentaire"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "fichiers modifiés"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr "Commentaire sur la ligne {1}."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 "Les commentaires sont analysés avec la syntaxe %s, avec le support de la "
 "commande %s."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 #, fuzzy
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 "Utilisez @nomutilisateur dans ce texte pour envoyer une notification à "
 "l’utilisateur Kallithea en question"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:85
+#: kallithea/templates/changeset/changeset_file_comment.html:77
 #, fuzzy
 msgid "Submitting ..."
 msgstr "Envoi…"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:80
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "Commentaire"
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr "Vous devez être connecté pour poster des commentaires."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr "Se connecter maintenant"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr "Masquer"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] "%d commentaire"
 msgstr[1] "%d commentaires"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] "(et %d en ligne)"
 msgstr[1] "(et %d en ligne)"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-#, fuzzy
-msgid "Use @username inside this text to send notification to another local user."
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+#, fuzzy
+#| msgid "Use @username inside this text to notify another user"
+msgid "Use @username inside this text to notify another user."
 msgstr ""
 "Utilisez @nomutilisateur dans ce texte pour envoyer une notification à "
 "l’utilisateur Kallithea en question"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "Statut du changeset"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "Aucun changement"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "(fermé)"
@@ -5089,7 +5289,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -5098,12 +5298,12 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 #, fuzzy
 msgid "Deleted"
 msgstr "Supprimer"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 #, fuzzy
 msgid "Renamed"
 msgstr "renommer"
@@ -5114,32 +5314,44 @@
 
 #: kallithea/templates/compare/compare_cs.html:8
 msgid "Ancestor"
-msgstr ""
-
-#: kallithea/templates/compare/compare_cs.html:61
+msgstr "Ancêtre"
+
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
-msgstr ""
-
-#: kallithea/templates/compare/compare_cs.html:75
+msgstr "Ancêtre commun"
+
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
-msgstr ""
-
-#: kallithea/templates/compare/compare_cs.html:83
+msgstr "Aucun ancêtre commun trouvé - les dépôts n'ont aucun lien entre eux"
+
+#: kallithea/templates/compare/compare_cs.html:98
 #, fuzzy
 msgid "is"
 msgstr "Gist"
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr "Changesets de %s"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 #, fuzzy
 msgid "behind"
 msgstr "Mettre à jour l’index"
@@ -5164,56 +5376,43 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Dépôt Mercurial"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Dépôt Git"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "Dépôt public"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "Dépôt vide"
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "S’abonner au flux RSS de %s"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "S’abonner au flux ATOM de %s"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5340,10 +5539,6 @@
 msgid "Commit Changes"
 msgstr "Commiter les changements"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5369,19 +5564,15 @@
 msgstr "Taille"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "Type MIME"
+msgid "Last Revision"
+msgstr "Dernière révision"
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
-msgstr "Dernière révision"
-
-#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Modified"
 msgstr "Dernière modification"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Committer"
 msgstr "Dernier commiteur"
@@ -5494,8 +5685,8 @@
 msgstr "Followers de %s"
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "Followers"
 
@@ -5549,8 +5740,8 @@
 msgstr "Forks de %s"
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr "Forks"
 
@@ -5558,7 +5749,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "Il n’y a pas encore de forks"
 
@@ -5571,19 +5762,13 @@
 msgstr "Flux RSS du journal"
 
 #: kallithea/templates/journal/journal.html:56
-#, fuzzy
-msgid "My Repos"
+msgid "My Repositories"
 msgstr "Mes dépôts"
 
-#: kallithea/templates/journal/journal_data.html:61
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr "Aucune entrée pour le moment"
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "Journal public"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "Flux ATOM du journal public"
@@ -5626,22 +5811,17 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-#, fuzzy
-msgid "Pull Request Reviewers"
-msgstr "Relecteurs de la requête de pull"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 #, fuzzy
 msgid "No entries"
 msgstr "Aucune entrée pour le moment"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "Révoquer"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5650,52 +5830,51 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, fuzzy, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-#, fuzzy
-msgid "Delete Pull Request"
-msgstr "Nouvelle requête de pull"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr "Veuillez confirmer la suppression de cette requête de pull"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr "Fermée"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+#, fuzzy
+msgid "Delete Pull Request"
+msgstr "Nouvelle requête de pull"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr "Veuillez confirmer la suppression de cette requête de pull"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this pull request"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "Veuillez confirmer la suppression de cette requête de pull"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "%s Pull Request %s"
+msgstr "Requête de pull #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, fuzzy, python-format
-msgid "Pull request #%s from %s#%s"
-msgstr ""
+#| msgid "Pull Requests from %s'"
+msgid "Pull request %s from %s#%s"
+msgstr "Requête de pull #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
 #, fuzzy
@@ -5711,94 +5890,95 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr "Pas encore relue par"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] "%d relecteur"
 msgstr[1] "%d relecteurs"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "Aucune branche n’a été créée pour le moment"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy
 msgid "on"
 msgstr "Aucune"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 #, fuzzy
 msgid "Created by"
 msgstr "créé"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 #, fuzzy
 msgid "Update"
 msgstr "[a mis à jour] l’utilisateur"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr "Propriétaire"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+#, fuzzy
+msgid "Pull Request Reviewers"
+msgstr "Relecteurs de la requête de pull"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr "%d relecteur"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr "%d relecteur"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 #, fuzzy
 msgid "Save as New Pull Request"
 msgstr "Nouvelle requête de pull"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "Sélectionner le changeset"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 #, fuzzy
 msgid "Pull Request Content"
 msgstr "Requêtes de pull"
@@ -5903,8 +6083,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5912,45 +6092,45 @@
 msgid "Stats gathered: "
 msgstr "Statistiques obtenues : "
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "Fichiers"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "commits"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "fichiers ajoutés"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "fichiers modifiés"
+msgid "files added"
+msgstr "fichiers ajoutés"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "fichiers modifiés"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "fichiers supprimés"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "commit"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "fichier ajouté"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "fichié modifié"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "fichier supprimé"
 
@@ -5972,67 +6152,78 @@
 msgid "Fork of"
 msgstr "Fork de"
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr "Afficher par nom"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "Cloner depuis"
+
+#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+msgid "Clone URL"
+msgstr "URL de clone"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr "Afficher par nom"
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr "Afficher par ID"
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr "Populaires"
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "Téléchargements"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "Il n’y a pas encore de téléchargements proposés"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "Les téléchargements sont désactivés pour ce dépôt"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr "Télécharger en ZIP"
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr "Télécharger une archive contenant également les sous-dépôts éventuels"
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
+#: kallithea/templates/summary/summary.html:125
+#, fuzzy
+#| msgid "with subrepos"
+msgid "With subrepos"
 msgstr "avec les sous-dépôts"
 
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "fichiers modifiés"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 #, fuzzy
 msgid "Quick Start"
 msgstr "Démarrage rapide"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "Télécharger %s comme archive %s"
@@ -6046,3 +6237,309 @@
 #, fuzzy
 msgid "Compare Tags"
 msgstr "vue de comparaison"
+
+#~ msgid "No comments."
+#~ msgstr "Aucun commentaire."
+
+#~ msgid "public journal"
+#~ msgstr "Journal public"
+
+#~ msgid "journal"
+#~ msgstr "Journal"
+
+#~ msgid "Locked repository"
+#~ msgstr "Dépôt verrouillé"
+
+#~ msgid "Unlocked repository"
+#~ msgstr "Dépôt non verrouillé"
+
+#~ msgid "Unlocked"
+#~ msgstr "Non verrouillé"
+
+#~ msgid "Locked"
+#~ msgstr "Verrouillé"
+
+#~ msgid "Repository has been %s"
+#~ msgstr "Le dépôt a été %s"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "Vous ne pouvez pas éditer cet utilisateur"
+
+#~ msgid "No Files"
+#~ msgstr "Aucun fichier"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "Le nom d’utilisateur « %(username)s » n’est pas autorisé"
+
+#~ msgid "invalid user name"
+#~ msgstr "nom d’utilisateur invalide"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "Votre compte est désactivé"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "URL de clonage invalide"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+#~ "URL à cloner invalide, veuillez fournir"
+#~ " une URL à cloner valide "
+#~ "http(s)/svn+http(s)/ssh"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+#~ "Les révisions %(revs)s font déjà partie"
+#~ " de la requête de pull ou on"
+#~ " des statuts définis"
+
+#~ msgid "Defaults"
+#~ msgstr "Par défaut"
+
+#~ msgid "My Emails"
+#~ msgstr "Mes e-mails"
+
+#~ msgid "Watched"
+#~ msgstr "Surveillé"
+
+#~ msgid "My Permissions"
+#~ msgstr "Mes permissions"
+
+#~ msgid "expires"
+#~ msgstr "expire le"
+
+#~ msgid "reset"
+#~ msgstr "remis à zéro"
+
+#~ msgid "delete"
+#~ msgstr "Supprimer"
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "Administration des permissions"
+
+#~ msgid "Overview"
+#~ msgstr "Vue d'ensemble"
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr "Écraser les paramètres existants"
+
+#~ msgid ""
+#~ "All default permissions on each user "
+#~ "group will be reset to chosen "
+#~ "permission, note that all custom default"
+#~ " permission on repository groups will "
+#~ "be lost"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr "Liste blanche d'adresses IP par défaut pour tous les utilisateurs"
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "Vue d'ensemble des permissions utilisateur par défaut"
+
+#~ msgid "none"
+#~ msgstr "Aucune"
+
+#~ msgid "read"
+#~ msgstr "Lecture"
+
+#~ msgid "write"
+#~ msgstr "Écriture"
+
+#~ msgid "admin"
+#~ msgstr "Administration"
+
+#~ msgid "delegated admin"
+#~ msgstr "administrateur délégué"
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "URL http(s) depuis laquelle le dépôt doit être cloné."
+
+#~ msgid "Remote URL"
+#~ msgstr "URL de clone"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "Récupérer les changements depuis le site distant"
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "éditer"
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr "Préfixe courriel"
+
+#~ msgid "Kallithea email from"
+#~ msgstr "Formulaire de courriel Kallithea"
+
+#~ msgid "Error email from"
+#~ msgstr "Formulaire de courriel d'erreur"
+
+#~ msgid "Error email recipients"
+#~ msgstr "Destinataires du courriel d'erreur"
+
+#~ msgid "SMTP server"
+#~ msgstr "Serveur SMTP"
+
+#~ msgid "SMTP username"
+#~ msgstr "Nom d'utilisateur SMTP"
+
+#~ msgid "SMTP password"
+#~ msgstr "Mot de passe SMTP"
+
+#~ msgid "SMTP port"
+#~ msgstr "Port SMTP"
+
+#~ msgid "SMTP use TLS"
+#~ msgstr "Utiliser TLS pour SMTP"
+
+#~ msgid "SMTP use SSL"
+#~ msgstr "Utiliser SSL pour SMTP"
+
+#~ msgid "SMTP auth"
+#~ msgstr "Authentification SMTP"
+
+#~ msgid "Destroy old data"
+#~ msgstr "Détruire les anciennes données"
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "Permissions par défaut"
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "Changement de statut -> %s"
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+#~ "Utilisez @nomutilisateur dans ce texte "
+#~ "pour envoyer une notification à "
+#~ "l’utilisateur Kallithea en question"
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr "Type MIME"
+
+#~ msgid "My Repos"
+#~ msgstr "Mes dépôts"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr "Propriétaire"
+
+#~ msgid "reviewer"
+#~ msgstr ""
+
--- a/kallithea/i18n/how_to	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/how_to	Sun Sep 06 23:36:05 2015 +0200
@@ -9,6 +9,7 @@
 Registered users may contribute to the existing languages, or request a new
 language translations.
 
+
 Translating using Weblate
 -------------------------
 
@@ -26,6 +27,7 @@
 format parameters, untranslated strings copied into the translation. Please perform
 necessary corrections when they're needed, or override the false positives.
 
+
 Merging translations from Weblate
 ---------------------------------
 
@@ -41,6 +43,7 @@
 which case it should be manually convinced it has to discard the commits it created by
 using its administrative interface.
 
+
 Manual creation of a new language translation
 ---------------------------------------------
 
@@ -66,6 +69,7 @@
 
     python setup.py compile_catalog -l <new_language_code>
 
+
 Updating translations
 ---------------------
 
@@ -80,10 +84,11 @@
 Edit the new updated translation file. Repeat all steps after `init_catalog` step from
 new translation instructions
 
+
 Testing translations
 --------------------
 
-Edit test.ini file and set lang attribute to::
+Edit kallithea/tests/test.ini file and set lang attribute to::
 
     lang=<new_language_code>
 
--- a/kallithea/i18n/hu/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/hu/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,9 +5,9 @@
 # #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2015-04-11 00:59+0200\n"
 "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian "
@@ -20,19 +20,23 @@
 "X-Generator: Weblate 2.3-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr ""
 
@@ -47,50 +51,53 @@
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr ""
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr ""
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Nincsenek hozzászólások."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr ""
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+msgid "No response"
+msgstr ""
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 
-#: kallithea/controllers/error.py:99
-msgid "Unauthorized access to resource"
-msgstr ""
-
-#: kallithea/controllers/error.py:101
-msgid "You don't have permission to view this page"
-msgstr ""
-
 #: kallithea/controllers/error.py:103
-msgid "The resource could not be found"
+msgid "Unauthorized access to resource"
 msgstr ""
 
 #: kallithea/controllers/error.py:105
+msgid "You don't have permission to view this page"
+msgstr ""
+
+#: kallithea/controllers/error.py:107
+msgid "The resource could not be found"
+msgstr ""
+
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -106,17 +113,17 @@
 msgid "%s %s feed"
 msgstr ""
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -194,45 +201,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr ""
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr ""
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr ""
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr ""
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr ""
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr ""
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr ""
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
@@ -248,9 +253,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr ""
 
@@ -270,145 +275,161 @@
 msgstr ""
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr ""
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr ""
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr ""
-
-#: kallithea/controllers/login.py:194
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr ""
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr ""
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr ""
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr ""
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr ""
 
@@ -424,21 +445,21 @@
 msgid "An error occurred during search operation."
 msgstr ""
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr ""
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -451,38 +472,38 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+msgid "Forever"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -496,7 +517,7 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+msgid "Unmodified"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:262
@@ -512,117 +533,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr ""
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -630,11 +667,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -642,221 +679,213 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:297
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
-msgid "Removed repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:307
-#, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
+#: kallithea/controllers/admin/user_groups.py:340
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
-#: kallithea/controllers/admin/user_groups.py:340
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+msgid "Repository group permissions updated"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:321
+#, python-format
+msgid "Cannot delete repository %s which still has forks"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been locked"
+msgstr "Ennek a tárolónak %s elágazása van"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been unlocked"
+msgstr "Ennek a tárolónak %s elágazása van"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
 msgstr ""
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
@@ -872,7 +901,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 
 #: kallithea/controllers/admin/settings.py:213
@@ -949,83 +978,80 @@
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:745
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr ""
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr ""
 
@@ -1041,158 +1067,160 @@
 msgid "No changes detected"
 msgstr ""
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
-msgstr ""
-
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:677
+msgid "Compare view"
+msgstr ""
+
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr ""
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr ""
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:722
+#, python-format
+msgid "Fork name %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:742
+#, python-format
+msgid "Pull request %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr ""
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr ""
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr ""
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr ""
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1200,69 +1228,69 @@
 "repositories"
 msgstr ""
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr ""
 
@@ -1277,7 +1305,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr ""
 
@@ -1292,7 +1320,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr ""
 
@@ -1307,7 +1335,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr ""
 
@@ -1322,7 +1350,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr ""
 
@@ -1361,7 +1389,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr ""
 
@@ -1376,7 +1404,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr ""
 
@@ -1391,7 +1419,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr ""
 
@@ -1406,7 +1434,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr ""
 
@@ -1421,7 +1449,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr ""
 
@@ -1457,7 +1485,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr ""
 
@@ -1472,7 +1500,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr ""
 
@@ -1487,7 +1515,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr ""
 
@@ -1502,7 +1530,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr ""
 
@@ -1514,7 +1542,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr ""
 
@@ -1526,7 +1554,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr ""
 
@@ -1538,7 +1566,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr ""
 
@@ -1550,7 +1578,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr ""
 
@@ -1562,7 +1590,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr ""
 
@@ -1573,7 +1601,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr ""
 
@@ -1584,7 +1612,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr ""
 
@@ -1595,7 +1623,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr ""
 
@@ -1606,7 +1634,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr ""
 
@@ -1617,7 +1645,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr ""
 
@@ -1628,7 +1656,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr ""
 
@@ -1639,7 +1667,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr ""
 
@@ -1650,7 +1678,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr ""
 
@@ -1661,7 +1689,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr ""
 
@@ -1672,7 +1700,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr ""
 
@@ -1683,29 +1711,131 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr ""
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+msgid "Default user has read access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1669
+msgid "Default user has write access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+msgid "Only admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1683
+msgid "Non-admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1685
+msgid "Only admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1686
+msgid "Non-admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+msgid "Only admins can fork repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1695
+msgid "Non-admins can can fork repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1698
+msgid "User registration with manual account activation"
+msgstr ""
+
+#: kallithea/model/db.py:1699
+msgid "User registration with automatic account activation"
+msgstr ""
+
+#: kallithea/model/db.py:2228
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Not reviewed"
+msgstr ""
+
+#: kallithea/model/db.py:2231
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Under review"
+msgstr ""
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr ""
@@ -1724,297 +1854,316 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
-#, python-format
-msgid "%(user)s commented on changeset at %(when)s"
-msgstr ""
-
-#: kallithea/model/notification.py:253
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
 #: kallithea/model/notification.py:254
 #, python-format
-msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:255
 #, python-format
-msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s sent message %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:256
 #, python-format
-msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:257
 #, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:258
+#, python-format
+msgid "%(user)s opened new pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:259
+#, python-format
+msgid "%(user)s commented on pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:266
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:267
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:268
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:269
+#, python-format
+msgid "%(user)s registered in Kallithea at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:270
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:271
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr ""
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr ""
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr ""
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr ""
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr ""
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr ""
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr ""
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:249
+msgid "You can't remove this user since it is crucial for the entire application"
+msgstr ""
+
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr ""
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr ""
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr ""
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr ""
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr ""
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, python-format
+msgid "Username \"%(username)s\" cannot be used"
+msgstr ""
+
+#: kallithea/model/validators.py:99
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
-msgstr ""
-
-#: kallithea/model/validators.py:132
+" dashes and must begin with an alphanumeric character or underscore"
+msgstr ""
+
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr ""
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr ""
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr ""
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
-msgstr ""
-
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr ""
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr ""
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
-msgstr ""
-
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:300
+msgid "Invalid username or password"
+msgstr ""
+
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr ""
+
+#: kallithea/model/validators.py:345
+#, python-format
+msgid "Repository name %(repo)s is not allowed"
+msgstr ""
+
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr ""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr ""
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+msgid "Invalid repository URL"
+msgstr ""
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr ""
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr ""
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr ""
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
-msgstr ""
-
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
-msgstr ""
-
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:705
+msgid "This email address is already in use"
+msgstr ""
+
+#: kallithea/model/validators.py:725
+#, python-format
+msgid "Email address \"%(email)s\" not found"
+msgstr ""
+
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr ""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr ""
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr ""
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2076,13 +2225,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2094,11 +2243,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr ""
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2119,11 +2268,11 @@
 msgid "Name"
 msgstr ""
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr ""
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2132,18 +2281,19 @@
 msgid "Tip"
 msgstr ""
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr ""
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2155,7 +2305,7 @@
 msgid "Click to sort ascending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2167,11 +2317,11 @@
 msgid "Click to sort descending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr ""
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2183,10 +2333,10 @@
 msgid "Data error."
 msgstr ""
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2196,7 +2346,7 @@
 msgstr ""
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr ""
 
@@ -2205,39 +2355,39 @@
 msgid "Log In to %s"
 msgstr ""
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr ""
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr ""
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr ""
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr ""
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr ""
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr ""
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr ""
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr ""
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr ""
@@ -2285,26 +2435,26 @@
 msgstr ""
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr ""
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr ""
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr ""
 
@@ -2413,108 +2563,94 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
-msgid "Repository Defaults"
-msgstr ""
-
 #: kallithea/templates/admin/defaults/defaults.html:11
 #: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr ""
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+msgid "Repository Defaults"
+msgstr ""
+
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
@@ -2546,6 +2682,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr ""
 
@@ -2556,7 +2698,7 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+msgid "Never"
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2564,7 +2706,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
@@ -2587,12 +2729,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr ""
 
@@ -2618,25 +2760,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2666,11 +2810,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr ""
 
@@ -2679,9 +2834,18 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2707,7 +2871,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr ""
 
@@ -2716,26 +2880,29 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
+#: kallithea/templates/admin/my_account/my_account.html:36
+msgid "Email Addresses"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
+msgid "Owned Repositories"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
+msgid "Watched Repositories"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+msgid "Show Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
@@ -2743,56 +2910,44 @@
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group"
+msgid "Confirm to reset this API key: %s"
+msgstr "A csoport törlésének megerősítése"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+msgid "Expired"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group"
+msgid "Confirm to remove this API key: %s"
+msgstr "A csoport törlésének megerősítése"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+msgid "Remove"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+msgid "New API key"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2805,19 +2960,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2838,19 +2980,24 @@
 msgid "Change Your Account Password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr ""
@@ -2871,13 +3018,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2913,7 +3054,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr ""
 
@@ -2931,20 +3072,14 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
+msgid "Default Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:28
@@ -2953,14 +3088,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr ""
@@ -2972,23 +3103,25 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+msgid "Apply to all existing repositories"
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
+msgid "Permissions for the Default user on new repositories."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr ""
@@ -3000,70 +3133,98 @@
 "will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+msgid "Apply to all existing repository groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
-msgid "Repository creation with group write access"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+msgid "Top level repository creation"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
+msgid "Repository creation with group write access"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+msgid ""
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group"
+msgid "Confirm to delete this IP address: %s"
+msgstr "A csoport törlésének megerősítése"
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-msgid "Default User Permissions Overview"
+msgid "New IP address"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
@@ -3087,12 +3248,12 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3110,19 +3271,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr ""
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr ""
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3143,12 +3310,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3159,38 +3326,10 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+msgid "User/User Group"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3199,7 +3338,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+msgid "Default"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3208,12 +3347,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
+msgid "Revoke"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
@@ -3223,7 +3357,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+msgid "Apply to children"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3271,42 +3405,41 @@
 msgid "Number of Top-level Repositories"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "Delete this Repository"
+msgid "Clone remote repository"
+msgstr "Tároló törlése"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr ""
 
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
+#: kallithea/templates/forks/fork.html:58
+msgid "Landing revision"
+msgstr ""
+
 #: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
-#: kallithea/templates/forks/fork.html:58
-msgid "Landing revision"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:72
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3353,8 +3486,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr ""
 
@@ -3376,45 +3509,45 @@
 msgid "Public Journal Visibility"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 msgid "Add to Public Journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 msgid "Change Locking"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 msgid "Confirm to unlock repository."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 msgid "Unlock Repository"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 msgid "Confirm to lock repository."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 msgid "Lock Repository"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3422,32 +3555,32 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 msgid "Delete this Repository"
 msgstr "Tároló törlése"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] "Ennek a tárolónak %s elágazása van"
 msgstr[1] "Ennek a tárolónak %s elágazása van"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3485,8 +3618,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr ""
@@ -3525,27 +3658,31 @@
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
-msgstr ""
+#, fuzzy
+#| msgid "Delete this Repository"
+msgid "Private Repository"
+msgstr "Tároló törlése"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#, fuzzy
+#| msgid "Delete this Repository"
+msgid "Remote repository URL"
+msgstr "Tároló törlése"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+msgid "Pull Changes from Remote Repository"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+msgid "Confirm to pull changes from remote repository."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
+msgid "Permanent Repository ID"
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
@@ -3560,43 +3697,33 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "Delete this Repository"
+msgid "Remote repository"
+msgstr "Tároló törlése"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+msgid "Repository URL"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr ""
 
@@ -3653,55 +3780,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr ""
 
@@ -3774,13 +3857,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3801,7 +3884,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3828,38 +3911,42 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
-msgid "Git version"
+msgid "Platform"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:9
-msgid "Upgrade info endpoint"
+msgid "Git version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
+msgid "Upgrade info endpoint"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4011,11 +4098,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4023,7 +4110,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4042,6 +4129,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4061,15 +4149,8 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
-#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
-#: kallithea/templates/admin/user_groups/user_groups.html:48
-msgid "Members"
+msgid "Show Members"
 msgstr ""
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
@@ -4077,8 +4158,14 @@
 msgid "User Group: %s"
 msgstr ""
 
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
+#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
+#: kallithea/templates/admin/user_groups/user_groups.html:48
+msgid "Members"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4103,10 +4190,6 @@
 msgid "User Groups Administration"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr ""
@@ -4132,11 +4215,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4146,7 +4225,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4156,11 +4235,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
@@ -4182,18 +4261,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr ""
 
@@ -4214,47 +4286,55 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr ""
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
-#: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
-msgid "Changelog"
-msgstr ""
-
 #: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:141
+#: kallithea/templates/changelog/changelog.html:14
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
+msgid "Changelog"
+msgstr ""
+
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr ""
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr ""
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4264,129 +4344,123 @@
 msgid "Compare"
 msgstr ""
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr ""
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
-#: kallithea/templates/forks/fork.html:9
-msgid "Fork"
+msgid "Follow"
 msgstr ""
 
 #: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
+#: kallithea/templates/forks/fork.html:9
+msgid "Fork"
+msgstr ""
+
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr ""
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr ""
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr ""
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr ""
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr ""
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr ""
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr ""
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
+msgid "Inherit defaults"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4414,7 +4488,8 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:22
@@ -4440,7 +4515,7 @@
 msgstr "Egy másik hozzászólás hozzáadása"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr ""
 
@@ -4510,6 +4585,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr ""
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr ""
@@ -4539,6 +4622,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4567,10 +4651,6 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr ""
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4587,7 +4667,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4600,7 +4680,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4610,7 +4690,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4643,7 +4723,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr ""
 
@@ -4659,7 +4739,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4689,21 +4769,21 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
-msgstr ""
-
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+msgid "Push new repository"
+msgstr ""
+
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr ""
 
@@ -4713,15 +4793,15 @@
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr ""
@@ -4744,7 +4824,7 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+msgid "Merge"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4755,144 +4835,151 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+msgid "Replaced by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:149
+msgid "Preceded by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+msgid "No revisions"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+msgid "on pull request"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
+msgid "No title"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset_file_comment.html:24
-msgid "Status change from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
-msgid "No title"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#, fuzzy, python-format
+#| msgid "%s changesets"
+msgid "on this changeset"
+msgstr "%s módosításcsomag"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 msgid "Delete comment?"
 msgstr "Hozzászólás törlése?"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy, python-format
+#| msgid "%s changesets"
+msgid "Status change"
+msgstr "%s módosításcsomag"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
+msgid "Comment preview"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:77
+msgid "Submitting ..."
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
-msgid "Comment preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:85
-msgid "Submitting ..."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] "%d sorközi"
 msgstr[1] "%d sorközi"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-msgid "Use @username inside this text to send notification to another local user."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+msgid "Use @username inside this text to notify another user."
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 msgid "Set changeset status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 msgid "No change"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 msgid "Close"
 msgstr ""
 
@@ -4911,7 +4998,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -4920,11 +5007,11 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr ""
 
@@ -4936,29 +5023,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, python-format
 msgid "%s changesets"
 msgstr "%s módosításcsomag"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr ""
 
@@ -4982,56 +5081,43 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5156,10 +5242,6 @@
 msgid "Commit Changes"
 msgstr ""
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5185,18 +5267,14 @@
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
+msgid "Last Revision"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
+msgid "Last Modified"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:64
-msgid "Last Modified"
-msgstr ""
-
-#: kallithea/templates/files/files_browser.html:65
 msgid "Last Committer"
 msgstr ""
 
@@ -5308,8 +5386,8 @@
 msgstr ""
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr ""
 
@@ -5360,8 +5438,8 @@
 msgstr ""
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr ""
 
@@ -5369,7 +5447,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr ""
 
@@ -5382,18 +5460,13 @@
 msgstr ""
 
 #: kallithea/templates/journal/journal.html:56
-msgid "My Repos"
-msgstr ""
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr ""
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr ""
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr ""
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr ""
@@ -5435,20 +5508,14 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+msgid "Vote"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5457,50 +5524,48 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
 #, python-format
-msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, python-format
-msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5516,86 +5581,86 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 msgid "There are no reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 msgid "on"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 msgid "Update"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 msgid "Remove reviewer"
 msgstr "Átnéző eltávolítása"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 msgid "Potential Reviewers"
 msgstr "Lehetséges átnézők"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 msgid "Cancel Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 msgid "Pull Request Content"
 msgstr ""
 
@@ -5696,8 +5761,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5705,45 +5770,45 @@
 msgid "Stats gathered: "
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
-msgid "commits"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:390
-msgid "files added"
+msgid "commits"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
+msgid "files added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:394
-msgid "commit"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:395
-msgid "file added"
+msgid "commit"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:396
-msgid "file changed"
+msgid "file added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:397
+msgid "file changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr ""
 
@@ -5765,65 +5830,73 @@
 msgid "Fork of"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
 msgstr ""
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:125
+msgid "With subrepos"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 msgid "Latest Changes"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
@@ -5836,3 +5909,425 @@
 #: kallithea/templates/tags/tags.html:26
 msgid "Compare Tags"
 msgstr ""
+
+#~ msgid "increase diff context to %(num)s lines"
+#~ msgstr ""
+
+#~ msgid "No comments."
+#~ msgstr "Nincsenek hozzászólások."
+
+#~ msgid "public journal"
+#~ msgstr ""
+
+#~ msgid "journal"
+#~ msgstr ""
+
+#~ msgid "bad captcha"
+#~ msgstr ""
+
+#~ msgid "forever"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Cannot delete %s it still contains attached forks"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked"
+#~ msgstr ""
+
+#~ msgid "Locked"
+#~ msgstr ""
+
+#~ msgid "Repository has been %s"
+#~ msgstr ""
+
+#~ msgid "You can't edit this user"
+#~ msgstr ""
+
+#~ msgid "compare view"
+#~ msgstr ""
+
+#~ msgid "fork name %s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s"
+#~ msgstr ""
+
+#~ msgid "No Files"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#~ msgstr ""
+
+#~ msgid "You can't remove this user since it's crucial for entire application"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Username may only contain alphanumeric "
+#~ "characters underscores, periods or dashes "
+#~ "and must begin with alphanumeric "
+#~ "character or underscore"
+#~ msgstr ""
+
+#~ msgid "invalid password"
+#~ msgstr ""
+
+#~ msgid "invalid user name"
+#~ msgstr ""
+
+#~ msgid "Your account is disabled"
+#~ msgstr ""
+
+#~ msgid "Repository name %(repo)s is disallowed"
+#~ msgstr ""
+
+#~ msgid "invalid clone URL"
+#~ msgstr ""
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+
+#~ msgid "This email address is already taken"
+#~ msgstr ""
+
+#~ msgid "email \"%(email)s\" does not exist."
+#~ msgstr ""
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr ""
+
+#~ msgid "never"
+#~ msgstr ""
+
+#~ msgid "My Emails"
+#~ msgstr ""
+
+#~ msgid "Watched"
+#~ msgstr ""
+
+#~ msgid "My Permissions"
+#~ msgstr ""
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr ""
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr ""
+
+#~ msgid "Overview"
+#~ msgstr ""
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "All default permissions on each user "
+#~ "group will be reset to chosen "
+#~ "permission, note that all custom default"
+#~ " permission on repository groups will "
+#~ "be lost"
+#~ msgstr ""
+
+#~ msgid "Repository creation"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Confirm to delete this ip: %s"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr ""
+
+#~ msgid "none"
+#~ msgstr ""
+
+#~ msgid "read"
+#~ msgstr ""
+
+#~ msgid "write"
+#~ msgstr ""
+
+#~ msgid "admin"
+#~ msgstr ""
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "default"
+#~ msgstr ""
+
+#~ msgid "revoke"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "apply to children"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr ""
+
+#~ msgid "private repository"
+#~ msgstr ""
+
+#~ msgid "Remote URL"
+#~ msgstr ""
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr ""
+
+#~ msgid "Confirm to pull changes from remote side."
+#~ msgstr ""
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr ""
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Meta-Tagging"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr ""
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "Push new repo"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "merge"
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr ""
+
+#~ msgid "Comment from pull request"
+#~ msgstr ""
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr ""
+
+#~ msgid "My Repos"
+#~ msgstr ""
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr ""
+
+#~ msgid "reviewer"
+#~ msgstr ""
+
+#~ msgid "with subrepos"
+#~ msgstr ""
+
--- a/kallithea/i18n/ja/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/ja/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -10,9 +10,9 @@
 # whosaysni <whosaysni@gmail.com>, 2014
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2015-01-31 02:07+0200\n"
 "Last-Translator: kobanari <kobanari@nifty.com>\n"
 "Language-Team: Japanese "
@@ -24,19 +24,23 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "まだチェンジセットがありません"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "なし"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(閉鎖済み)"
 
@@ -50,52 +54,57 @@
 msgstr "空白を無視"
 
 #: kallithea/controllers/changeset.py:169
-#, python-format
-msgid "increase diff context to %(num)s lines"
+#, fuzzy, python-format
+#| msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr "diff コンテキストを %(num)s 行増やす"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "お探しのリビジョンはこのリポジトリにはありません"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-#, fuzzy
-msgid "No comments."
-msgstr "%d 個のコメント"
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr "クローズしたプルリクエストに関連するチェンジセットのステータスを変更することは許可されていません"
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr "リビジョンを選択"
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "no revisions"
+msgid "No response"
+msgstr "リビジョンなし"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr "形式が間違っているため、サーバーはリクエストを処理できませんでした。"
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "リソースにアクセスする権限がありません"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "このページを閲覧する権限がありません"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "リソースが見つかりません"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -111,17 +120,17 @@
 msgid "%s %s feed"
 msgstr "%s %s フィード"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr "チェンジセットが大きすぎるため、省略しました"
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr "%s が %s にコミット"
@@ -199,45 +208,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr "場所には相対パスかつ .. を含まないパスを入力してください"
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "ダウンロードは無効化されています"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "%s は未知のリビジョンです"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "空のリポジトリ"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "未知のアーカイブ種別です"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "チェンジセット"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "ブランチ"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "タグ"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "リポジトリ %s のフォーク中にエラーが発生しました"
@@ -253,9 +260,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "リポジトリ"
 
@@ -275,149 +282,169 @@
 msgstr "ブックマーク"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr "公開ジャーナル"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
 msgstr "ジャーナル"
 
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+#, fuzzy
+#| msgid "bad captcha"
+msgid "Bad captcha"
 msgstr "キャプチャが一致しません"
 
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr "Kallitheaへの登録を受け付けました"
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "パスワードリセットのリンクを送信しました"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr "パスワードをリセットに成功しました。新しいパスワードをあなたのメールアドレスに送りました"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, fuzzy, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "チェンジセット"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr "スペシャル"
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr "相手のブランチ"
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "ブックマーク"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr "プルリクエスト作成中にエラーが発生しました: %s"
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 #, fuzzy
 msgid "No description"
 msgstr "説明"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "新しいプルリクエストの作成に成功しました"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 #, fuzzy
 msgid "Error occurred while creating pull request"
 msgstr "プルリクエストの作成中にエラーが発生しました"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 #, fuzzy
 msgid "Pull request update created"
 msgstr "プルリクエストレビュアー"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 #, fuzzy
 msgid "Pull request updated"
 msgstr "%s へのプルリクエスト"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "プルリクエストの削除に成功しました"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+#, fuzzy
+#| msgid "Vote for pull request status"
+msgid "No permission to change pull request status"
+msgstr "プルリクエストステータスの投票"
+
+#: kallithea/controllers/pullrequests.py:715
 #, fuzzy
 msgid "Closing."
 msgstr "読み込み中..."
@@ -435,22 +462,22 @@
 msgid "An error occurred during search operation."
 msgstr "検索を実行する際にエラーが発生しました"
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 #, fuzzy
 msgid "No data ready yet"
 msgstr "まだデータが読み込まれていません"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "このリポジトリの統計は無効化されています"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr "認証設定の更新に成功しました"
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr "認証設定の更新中にエラーが発生しました"
 
@@ -463,38 +490,40 @@
 msgstr "デフォルト設定の更新中にエラーが発生しました"
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+#, fuzzy
+#| msgid "forever"
+msgid "Forever"
 msgstr "無期限"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 分"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 時間"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 日"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 ヶ月"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr "有効期間"
 
@@ -508,7 +537,9 @@
 msgstr "gist %s を削除しました"
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+#, fuzzy
+#| msgid "unmodified"
+msgid "Unmodified"
 msgstr "変更なし"
 
 #: kallithea/controllers/admin/gists.py:262
@@ -524,117 +555,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr "Gist %s の更新中にエラーが発生しました"
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr "このユーザーを編集できません。このユーザーはアプリケーションにとって必要不可欠です。"
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "アカウントの更新に成功しました"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr "ユーザー %s の更新中にエラーが発生しました"
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr "パスワードを更新しました"
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr "パスワードの更新中にエラーが発生しました"
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "ユーザーにメールアドレス %s を追加しました"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "メールの保存時にエラーが発生しました"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "ユーザーからメールアドレスを削除しました"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
 msgstr "APIキーの作成に成功しました"
 
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
 msgstr "APIキーのリセットに成功しました"
 
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
 msgstr "APIキーの削除に成功しました"
 
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "読込"
+
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "読込"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "書込"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "書込"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "管理"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "無効"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr "手動でアカウントをアクティベートする"
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr "自動でアカウントをアクティベートする"
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -642,11 +689,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr "外部アカウントを手動でアクティベートする"
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -654,221 +701,212 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr "外部アカウントを自動でアクティベートする"
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "有効"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr "全般の権限の更新に成功しました"
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr "権限の更新中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr "リポジトリグループ %s の作成中にエラーが発生しました"
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr "リポジトリグループ %s を作成しました"
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr "リポジトリグループ %s の作成中にエラーが発生しました"
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr "リポジトリグループ %s を更新しました"
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "リポジトリグループ %s の更新中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "このグループは %s 個のリポジトリを含んでいるため削除できません"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "このグループは %s 個のサブグループを含んでいるため削除できません"
 
-#: kallithea/controllers/admin/repo_groups.py:302
+#: kallithea/controllers/admin/repo_groups.py:297
 #, python-format
 msgid "Removed repository group %s"
 msgstr "リポジトリグループ %s を削除しました"
 
-#: kallithea/controllers/admin/repo_groups.py:307
+#: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr "リポジトリグループ %s の削除中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
 #: kallithea/controllers/admin/user_groups.py:340
 msgid "Cannot revoke permission for yourself as admin"
 msgstr "自分自身の管理者としての権限を取り消すことはできません"
 
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
+#: kallithea/controllers/admin/repo_groups.py:420
+msgid "Repository group permissions updated"
 msgstr "リポジトリグループ権限を更新しました"
 
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr "権限の取消中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "リポジトリ %s の作成中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr "リポジトリ %s を %s から作成しました"
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "リポジトリ %s を %s としてフォークしました"
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr "リポジトリ %s を作成しました"
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "リポジトリ %s の更新に成功しました"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "リポジトリ %s の更新中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr "%s 個のフォークを切り離しました"
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr "%s 個のフォークを削除しました"
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr "リポジトリ %s を削除しました"
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
+#: kallithea/controllers/admin/repos.py:321
+#, fuzzy, python-format
+#| msgid "Cannot delete %s it still contains attached forks"
+msgid "Cannot delete repository %s which still has forks"
 msgstr "フォークしたリポジトリが存在するため、 %s は削除できません"
 
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "%s の削除中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr "リポジトリ権限を更新しました"
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr "フィールドの作成中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr "フィールドの削除中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr "-- フォークではありません --"
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "公開ジャーナルでのリポジトリの可視性を更新しました"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr "このリポジトリの公開ジャーナルの設定中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "トークンが一致しません"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "ありません"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "%s リポジトリを %s のフォークとする"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "操作中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr "リポジトリをロックしました"
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr "リポジトリのロックを解除しました"
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been locked"
+msgstr "リポジトリはロックされていません"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been unlocked"
+msgstr "リポジトリはロックされていません"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "アンロック中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "アンロック"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "ロック"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr "キャッシュの無効化に成功しました"
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "キャッシュの無効化中にエラーが発生しました"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "リモートから取得"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "リポジトリは %s されています"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr "キャッシュの無効化に成功しました"
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "キャッシュの無効化中にエラーが発生しました"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "リモートから取得"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr "リモートから取得中にエラーが発生しました"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "リポジトリステートの削除中にエラーが発生しました"
 
@@ -884,7 +922,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr "アプリケーション設定の更新中にエラーが発生しました"
 
 #: kallithea/controllers/admin/settings.py:213
@@ -961,83 +999,82 @@
 msgstr "対象に同じ物を選ぶことはできません"
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr "ユーザーグループ権限を更新しました"
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr "権限を更新しました"
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "権限の保存時にエラーが発生しました"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr "ユーザー %s を作成しました"
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr "ユーザー %s の作成中にエラーが発生しました"
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "ユーザーの更新に成功しました"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr "ユーザーの削除に成功しました"
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "ユーザーの削除中にエラーが発生しました"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "このユーザーは編集できません"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
 msgstr "ユーザーホワイトリストにIP %s を追加しました"
 
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
 msgstr "IPアドレスの保存中にエラーが発生しました"
 
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
 msgstr "ユーザーホワイトリストからIPアドレスを削除しました"
 
-#: kallithea/lib/auth.py:745
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr "IPアドレス %s は許可されません"
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+#, fuzzy
+#| msgid "New api key"
+msgid "Invalid API key"
+msgstr "新しいAPIキー"
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "このアクションを実行するためには登録済みのユーザーである必要があります"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "このページを閲覧するためにはサインインが必要です"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "リビジョンが見つかりません"
 
@@ -1053,158 +1090,164 @@
 msgid "No changes detected"
 msgstr "検出された変更はありません"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "削除されたブランチ: %s"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "作成したタグ: %s"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "%s から %s までのすべてのチェンジセットを表示"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "比較ビュー"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "と"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "%s 以上"
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "リビジョン"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "fork name %s"
+msgid "Fork name %s"
 msgstr "フォーク名 %s"
 
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "Pull request %s"
 msgstr "プルリクエスト #%s"
 
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "リポジトリを[削除]"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "リポジトリを[作成]"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "フォークしてリポジトリを[作成]"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "リポジトリを[フォーク]"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "リポジトリを[更新]"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr "リポジトリからアーカイブを[ダウンロード]"
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "リポジトリを[削除]"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "ユーザーを[作成]"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "ユーザーを[更新]"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr "ユーザーグループを[作成]"
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr "ユーザーグループを[更新]"
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "リポジトリのリビジョンに[コメント]"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "プルリクエストに[コメント]"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "プルリクエストを[クローズ]"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[プッシュ]"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "リポジトリに[Kallithea経由でコミット]"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "リポジトリに[リモートからプル]"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[プル]"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "リポジトリの[フォローを開始]"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "リポジトリの[フォローを停止]"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " と %s 以上"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "ファイルなし"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr "ファイルはありません"
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr "新しいファイル"
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr "変更"
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr "削除"
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr "リネーム"
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr "chmod"
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1214,63 +1257,63 @@
 "%s "
 "リポジトリはDB内に見つかりませんでした。おそらくファイルシステム上で作られたか名前が変更されたためです。リポジトリをもう一度チェックするためにアプリケーションを立ち上げ直してください。"
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d 年"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d ヶ月"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d 日"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d 時間"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d 分"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d 秒"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "%s 以内"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "%s 前"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "%s と %s の間"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s と %s 前"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "たったいま"
 
@@ -1285,7 +1328,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "リポジトリへのアクセス権限無し"
 
@@ -1300,7 +1343,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "リポジトリに読込権限でアクセス"
 
@@ -1315,7 +1358,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "リポジトリに書込権限でアクセス"
 
@@ -1330,7 +1373,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "リポジトリに管理権限でアクセス"
 
@@ -1369,7 +1412,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Kallithea 管理者"
 
@@ -1384,7 +1427,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "リポジトリの作成を有効にする"
 
@@ -1399,7 +1442,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "リポジトリの作成を有効にする"
 
@@ -1414,7 +1457,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "リポジトリのフォークを無効にする"
 
@@ -1429,7 +1472,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "リポジトリのフォークを有効にする"
 
@@ -1465,7 +1508,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "未レビュー"
 
@@ -1480,7 +1523,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "承認"
 
@@ -1495,7 +1538,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "却下"
 
@@ -1510,7 +1553,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "レビュー中"
 
@@ -1522,7 +1565,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr "top level"
 
@@ -1534,7 +1577,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr "リポジトリグループへのアクセス権限なし"
 
@@ -1546,7 +1589,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr "リポジトリグループに読込権限でアクセス"
 
@@ -1558,7 +1601,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr "リポジトリグループに書込権限でアクセス"
 
@@ -1570,7 +1613,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr "リポジトリグループに管理権限でアクセス"
 
@@ -1581,7 +1624,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr "ユーザーグループへのアクセス権限なし"
 
@@ -1592,7 +1635,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr "ユーザーグループに読込権限でアクセス"
 
@@ -1603,7 +1646,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr "ユーザーグループに書込権限でアクセス"
 
@@ -1614,7 +1657,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr "ユーザーグループに管理権限でアクセス"
 
@@ -1625,7 +1668,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr "リポジトリグループの作成を無効にする"
 
@@ -1636,7 +1679,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr "リポジトリグループの作成を有効にする"
 
@@ -1647,7 +1690,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr "ユーザーグループの作成を無効にする"
 
@@ -1658,7 +1701,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr "ユーザーグループの作成を有効にする"
 
@@ -1669,7 +1712,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr "新規登録を無効にする"
 
@@ -1680,7 +1723,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr "ユーザーの新規登録時に手動でアカウントをアクティベートする"
 
@@ -1691,29 +1734,153 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr "ユーザーの新規登録時に自動でアカウントをアクティベートする"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr "リポジトリグループの書き込みパーミッションを使ったリポジトリ作成が有効です"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr "リポジトリグループの書き込みパーミッションを使ったリポジトリ作成は無効です"
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "%s 行目"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[Mention]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "リソースにアクセスする権限がありません"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "リソースにアクセスする権限がありません"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Only admins can create repository groups"
+msgstr "リポジトリグループ %s を作成しました"
+
+#: kallithea/model/db.py:1683
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Non-admins can create repository groups"
+msgstr "リポジトリグループ %s を作成しました"
+
+#: kallithea/model/db.py:1685
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Only admins can create user groups"
+msgstr "ユーザーグループを作成"
+
+#: kallithea/model/db.py:1686
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Non-admins can create user groups"
+msgstr "ユーザーグループを作成"
+
+#: kallithea/model/db.py:1688
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Only admins can create top level repositories"
+msgstr "トップレベルリポジトリ数"
+
+#: kallithea/model/db.py:1689
+#, fuzzy
+#| msgid "Top level repositories"
+msgid "Non-admins can create top level repositories"
+msgstr "トップレベルリポジトリ数"
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "リポジトリ総数"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Invalidate cache for all repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "すべてのリポジトリのキャッシュを無効化する"
+
+#: kallithea/model/db.py:1698
+#, fuzzy
+#| msgid "User Registration with manual account activation"
+msgid "User registration with manual account activation"
+msgstr "ユーザーの新規登録時に手動でアカウントをアクティベートする"
+
+#: kallithea/model/db.py:1699
+#, fuzzy
+#| msgid "User Registration with automatic account activation"
+msgid "User registration with automatic account activation"
+msgstr "ユーザーの新規登録時に自動でアカウントをアクティベートする"
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "未レビュー"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "レビュー中"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "ログイン名を入力してください"
@@ -1732,165 +1899,205 @@
 msgid "Enter %(min)i characters or more"
 msgstr "%(min)i 文字以上必要です"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr "数字だけの名前は使えません"
 
-#: kallithea/model/notification.py:252
+#: kallithea/model/notification.py:254
+#, fuzzy, python-format
+#| msgid "%(user)s commented on changeset at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
+msgstr "%(user)s がチェンジセットにコメント %(when)s"
+
+#: kallithea/model/notification.py:255
+#, fuzzy, python-format
+#| msgid "%(user)s sent message at %(when)s"
+msgid "%(user)s sent message %(age)s"
+msgstr "%(user)s がメッセージを送信 %(when)s"
+
+#: kallithea/model/notification.py:256
+#, fuzzy, python-format
+#| msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
+msgstr "%(user)s がにあなたにメンション %(when)s"
+
+#: kallithea/model/notification.py:257
+#, fuzzy, python-format
+#| msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr "%(user)s がKallitheaに登録 %(when)s"
+
+#: kallithea/model/notification.py:258
+#, fuzzy, python-format
+#| msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "%(user)s が新しいプルリクエストを作成 %(when)s"
+
+#: kallithea/model/notification.py:259
+#, fuzzy, python-format
+#| msgid "%(user)s commented on pull request at %(when)s"
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "%(user)s がプルリクエストにコメント %(when)s"
+
+#: kallithea/model/notification.py:266
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s がチェンジセットにコメント %(when)s"
 
-#: kallithea/model/notification.py:253
+#: kallithea/model/notification.py:267
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s がメッセージを送信 %(when)s"
 
-#: kallithea/model/notification.py:254
+#: kallithea/model/notification.py:268
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s がにあなたにメンション %(when)s"
 
-#: kallithea/model/notification.py:255
+#: kallithea/model/notification.py:269
 #, python-format
 msgid "%(user)s registered in Kallithea at %(when)s"
 msgstr "%(user)s がKallitheaに登録 %(when)s"
 
-#: kallithea/model/notification.py:256
+#: kallithea/model/notification.py:270
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s が新しいプルリクエストを作成 %(when)s"
 
-#: kallithea/model/notification.py:257
+#: kallithea/model/notification.py:271
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s がプルリクエストにコメント %(when)s"
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, fuzzy, python-format
-msgid "New user %(new_username)s registered"
-msgstr "ユーザー名 %(new_username)s は不正です"
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
 msgstr ""
 
-#: kallithea/model/notification.py:315
+#: kallithea/model/notification.py:305
+#, fuzzy, python-format
+msgid "New user %(new_username)s registered"
+msgstr "ユーザー名 %(new_username)s は不正です"
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 #, fuzzy
 msgid "Closing"
 msgstr "メールアドレス:"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#: kallithea/model/pull_request.py:137
+#, fuzzy, python-format
+#| msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 msgstr "%(user)s がプリリクエスト #%(pr_id)s: %(pr_title)s のレビューを求めています"
 
-#: kallithea/model/scm.py:808
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "最新のtip"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr "新規ユーザー登録"
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr "このユーザーを編集できません。このユーザーはアプリケーションにとって必要不可欠です。"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr "このユーザーを削除できません。このユーザーはアプリケーションにとって必要不可欠です。"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr "ユーザー \"%s\" はまだ %s 個のリポジトリの所有者のため削除することはできません。リポジトリの所有者を変更するか削除してください。 %s"
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr "ユーザー \"%s\" はまだ %s 個のリポジトリの所有者のため削除することはできません。リポジトリの所有者を変更するか削除してください。 %s"
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr "ユーザー \"%s\" はまだ %s 個のリポジトリの所有者のため削除することはできません。リポジトリの所有者を変更するか削除してください。 %s"
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr "パスワードリセットのリンク"
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr "新しいパスワード"
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr "新しいKallitheaパスワード:%s"
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "空のリストにはできません"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "ユーザー名 \"%(username)s\" はすでに使われています"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "ユーザー名 \"%(username)s\" は許可されていません"
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, fuzzy, python-format
+#| msgid "Username %(username)s is not valid"
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "ユーザー名 %(username)s は不正です"
+
+#: kallithea/model/validators.py:99
+#, fuzzy
+#| msgid "" "Username may only contain alphanumeric characters underscores,
+#| periods or" " dashes and must begin with alphanumeric character or
+#| underscore"
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
+" dashes and must begin with an alphanumeric character or underscore"
 msgstr "ユーザー名はアルファベット、アンダースコア(_)、ピリオド(.)、ダッシュ(-)しか使えません。また、アルファベットまたはアンダースコア(_)から始まる必要があります"
 
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr "入力が正しくありません"
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "ユーザー名 %(username)s は不正です"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr "不正なユーザーグループ名です"
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr "ユーザーグループ \"%(usergroup)s\" はすでに存在します"
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
@@ -1898,136 +2105,135 @@
 "ユーザーグループ名はアルファベット、アンダースコア(_)、ピリオド(.)、ダッシュ(-)しか使えません。また、アルファベットから始まる必要があります"
 " "
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "このグループは親にできません"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "グループ \"%(group_name)s\" はすでに存在します"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "グループ名 \"%(group_name)s\" を持つリポジトリはすでに存在します"
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "パスワードに利用出来ない文字列(non-ascii)です"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr "古いpasswordが間違っています"
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "パスワードが一致しません"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "不正なパスワードです"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "不正なユーザー名です"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "アカウントは無効です"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "トークンが一致しません"
+
+#: kallithea/model/validators.py:345
+#, fuzzy, python-format
+#| msgid "Repository name %(repo)s is disallowed"
+msgid "Repository name %(repo)s is not allowed"
 msgstr "リポジトリ名 %(repo)s は許可されていません"
 
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "リポジトリ %(repo)s はすでに存在します"
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr "リポジトリ \"%(repo)s\" は グループ \"%(group)s\" にすでに存在します"
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr "リポジトリグループ名 \"%(repo)s\" はすでに存在します"
 
-#: kallithea/model/validators.py:474
-#, fuzzy
-msgid "invalid clone URL"
-msgstr "無効なクローンURIです"
-
-#: kallithea/model/validators.py:475
-#, fuzzy
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr "無効なクローンURIです。有効な http(s)/svn+http(s) のURIを指定してください"
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "非公開リポジトリ"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "フォークは親と同じ種別の必要があります"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr "このグループにリポジトリを作成する権限がありません"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr "ルートにリポジトリを作成する権限がありません"
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr "この場所にグループを作成する権限がありません"
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr "ユーザー名かユーザーグループが不正です"
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "不正なパスです"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "このメールアドレスはすでに取得されています"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "メールアドレス \"%(email)s\" は存在しません"
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr "LDAPのこのCNに対するログイン属性は必須です。 - これは \"ユーザー名\" と同じです"
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr "リビジョン %(revs)s はすでにプルリクエストの一部かステータスが設定されています"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
 msgstr "有効なIPv4かIPv6のアドレスを入力してください"
 
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr "ネットワークサイズ (bits) は0-32の範囲にする必要があります ( %(bits)r は不正です)"
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr "キー名はアルファベット、アンダースコア(_)、ピリオド(.)、ダッシュ(-)、数字しか使えません。"
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr "ファイル名はディレクトリ内にすることはできません"
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr "%(loaded)s プラグインと %(next_to_load)s プラグインで同じ名前が使われています"
@@ -2089,13 +2295,13 @@
 msgstr "グループ名"
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2107,11 +2313,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "説明"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2132,11 +2338,11 @@
 msgid "Name"
 msgstr "名前"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "最後の変更点"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2145,18 +2351,19 @@
 msgid "Tip"
 msgstr "Tip"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "所有者"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2168,7 +2375,7 @@
 msgid "Click to sort ascending"
 msgstr "昇順で並び換え"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2180,11 +2387,11 @@
 msgid "Click to sort descending"
 msgstr "降順で並び替え"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr "リポジトリが見つかりません"
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2196,10 +2403,10 @@
 msgid "Data error."
 msgstr "データエラー"
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2209,7 +2416,7 @@
 msgstr "読み込み中..."
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "ログイン"
 
@@ -2218,39 +2425,39 @@
 msgid "Log In to %s"
 msgstr "%s へログイン"
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "ユーザー名"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "パスワード"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "次回から自動的にサインイン"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "パスワードを忘れた?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "アカウントを持っていない?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "サインイン"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "パスワードを忘れた?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "アカウントを持っていない?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr "パスワードリセット"
@@ -2301,26 +2508,26 @@
 msgstr "パスワード再入力"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "名前"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "名字"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "メールアドレス"
 
@@ -2429,110 +2636,99 @@
 msgstr "有効なプラグイン"
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
+#, fuzzy
+#| msgid "" "Comma separated list of plugins. Order of plugins is also order in
+#| which " "Kallithea will try to authenticate user"
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr "カンマ区切りのプラグインの一覧です。プラグインの並び順はKallitheaがユーザー認証を試す順番でもあります。"
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr "有効な組み込みプラグイン"
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr "有効"
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr "無効"
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr "プラグイン"
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "保存"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
+#: kallithea/templates/admin/defaults/defaults.html:11
+#: kallithea/templates/base/base.html:66
 #, fuzzy
 msgid "Repository Defaults"
 msgstr "リポジトリのデフォルト設定"
 
-#: kallithea/templates/admin/defaults/defaults.html:11
-#: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr "デフォルト設定"
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "リポジトリの種別"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "非公開リポジトリ"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr "非公開リポジトリはコラボレーターとして明示的に追加された人でないと見つけられません"
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "統計を有効にする"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "概要ページの統計ウィンドウを有効にします"
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "ダウンロードを有効にする"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "概要ページのダウンロードメニューを有効にします"
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "ロックを有効にする"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr "リポジトリのpullのロックを有効にします"
 
@@ -2566,6 +2762,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr "失効"
 
@@ -2576,7 +2778,9 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+#, fuzzy
+#| msgid "never"
+msgid "Never"
 msgstr "無し"
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2584,7 +2788,7 @@
 msgstr "Gistを更新"
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "キャンセル"
 
@@ -2607,12 +2811,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr "新しい Gist を作成"
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr "作成日"
 
@@ -2638,25 +2842,27 @@
 msgstr "公開 Gist を作成"
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2686,11 +2892,22 @@
 msgstr "非公開 Gist"
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "削除"
 
@@ -2699,9 +2916,18 @@
 msgstr "このGistを削除してもよろしいですか?"
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2727,7 +2953,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "アカウント"
 
@@ -2736,85 +2962,91 @@
 msgid "Profile"
 msgstr "プロフィール"
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "新しいメールアドレス"
+
+#: kallithea/templates/admin/my_account/my_account.html:38
+#: kallithea/templates/admin/users/user_edit.html:31
 #, fuzzy
 msgid "API Keys"
 msgstr "新しいAPIキー"
 
-#: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
-msgstr "メールアドレス"
-
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
 msgstr "リポジトリ"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "ウォッチ中"
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "リポジトリを作成する"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-#, fuzzy
-msgid "My Permissions"
-msgstr "権限"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+#, fuzzy
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "権限のコピー"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
 msgstr "ビルトイン"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr "失効"
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to reset this api key: %s"
+msgid "Confirm to reset this API key: %s"
 msgstr "このAPIキーをリセットしてもよろしいですか?: %s"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr "リセット"
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+#, fuzzy
+#| msgid "expired"
+msgid "Expired"
 msgstr "失効済み"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr "このAPIキーを削除してもよろしいですか?: %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+#, fuzzy
+#| msgid "remove"
+msgid "Remove"
 msgstr "削除"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+#, fuzzy
+#| msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr "API キーが指定されていません"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+#, fuzzy
+#| msgid "New api key"
+msgid "New API key"
 msgstr "新しいAPIキー"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2827,19 +3059,6 @@
 msgid "Primary"
 msgstr "プライマリ"
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "削除"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2862,19 +3081,24 @@
 msgid "Change Your Account Password"
 msgstr "パスワードを変更してください"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr "現在のパスワード"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "新しいパスワード"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr "新しいパスワードの確認"
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "アバターを変更できます : "
@@ -2895,15 +3119,11 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
+#, fuzzy
+#| msgid "current IP"
+msgid "Current IP"
 msgstr "現在の IP"
 
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
-msgstr "ユーザーは外部の Source of Record  に属しているため、ここでは詳細を管理できません"
-
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
 #, fuzzy
 msgid "Repositories You Own"
@@ -2939,7 +3159,7 @@
 msgstr "コメント"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr "プルリクエスト"
 
@@ -2959,22 +3179,16 @@
 msgstr "通知を表示"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "通知"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-#, fuzzy
-msgid "Permissions Administration"
-msgstr "権限管理"
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "権限設定"
+#, fuzzy
+msgid "Default Permissions"
+msgstr "デフォルトの権限"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -2982,15 +3196,11 @@
 msgstr "全般"
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 #, fuzzy
 msgid "IP Whitelist"
 msgstr "IPアドレスのホワイトリスト"
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr "概要"
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "匿名アクセス"
@@ -3002,23 +3212,27 @@
 "%s user permissions."
 msgstr "ログインしなくても Kallithea にアクセスできるようにします。匿名ユーザーは %s ユーザーパーミッションを使います"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr "選択したパーミッションで、各リポジトリのデフォルトパーミッションをリセットします。各リポジトリの既存のカスタムデフォルトパーミッション設定は無くなるので注意してください"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repositories"
+msgstr "既存のリポジトリを import しますか?"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
-msgstr "現在の設定を上書きする"
+msgid "Permissions for the Default user on new repositories."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "リポジトリグループ"
@@ -3030,76 +3244,114 @@
 "will be lost"
 msgstr "選択したパーミッションで、各リポジトリグループのデフォルトパーミッションをリセットします。各リポジトリグループの既存のカスタムデフォルトパーミッション設定は無くなるので注意してください"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy
+#| msgid "Import existing repository ?"
+msgid "Apply to all existing repository groups"
+msgstr "既存のリポジトリを import しますか?"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+#, fuzzy
+#| msgid "Copy permission set from parent repository group."
+msgid "Permissions for the Default user on new repository groups."
+msgstr "親のリポジトリグループにセットされているパーミッションをコピーします。"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr "ユーザーグループ"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
+#, fuzzy
+#| msgid "" "All default permissions on each user group will be reset to chosen
+#| " "permission, note that all custom default permission on repository groups
+#| " "will be lost"
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
 msgstr "選択したパーミッションで、各ユーザーグループのデフォルトパーミッションをリセットします。各ユーザーグループの既存のカスタムデフォルトパーミッション設定は無くなるので注意してください"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "リポジトリ作成"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid ""
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr "グループ書き込み権限でのリポジトリ作成"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
-#, fuzzy
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+#, fuzzy
+#| msgid "" "Write permission to a repository group allows creating
+#| repositories " "inside that group."
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
 msgstr "リポジトリグループに書き込みパーミッションを付与すると、グループ内にリポジトリを作成できるようになります"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr "ユーザーグループ作成"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr "リポジトリのフォーク"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "新規登録"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr "外部認証アカウントのアクティベート"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-#, fuzzy
-msgid "Default IP Whitelist for All Users"
-msgstr "全てのユーザーに設定されるデフォルトのIPアドレスのホワイトリスト"
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
 msgstr "このIPアドレスを削除してもよろしいですか? : %s"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 #, fuzzy
 msgid "All IP addresses are allowed."
 msgstr "すべてのIPアドレスが許可されています"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr "新しいIPアドレス"
 
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-#, fuzzy
-msgid "Default User Permissions Overview"
-msgstr "デフォルトのユーザー権限の概要"
-
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:105
@@ -3121,12 +3373,12 @@
 msgstr "親グループ"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr "親グループのパーミッションをコピー"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr "親のリポジトリグループにセットされているパーミッションをコピーします。"
 
@@ -3144,19 +3396,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "設定"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr "高度な設定"
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "権限設定"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3177,12 +3435,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "作成日"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3192,38 +3450,12 @@
 msgid "Delete this repository group"
 msgstr "このリポジトリグループを削除"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "なし"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "読込"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "書込"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "管理"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+#, fuzzy
+#| msgid "user/user group"
+msgid "User/User Group"
 msgstr "ユーザー/ユーザーグループ"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3232,7 +3464,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "default"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3241,14 +3475,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "取消"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr "代理 admin"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3256,7 +3487,9 @@
 msgstr "新規追加"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+#, fuzzy
+#| msgid "apply to children"
+msgid "Apply to children"
 msgstr "子要素にも適用"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3308,43 +3541,41 @@
 msgid "Number of Top-level Repositories"
 msgstr "トップレベルリポジトリ数"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr "既存のリポジトリを import しますか?"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "クローン元"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-#, fuzzy
-msgid "Optional URL from which repository should be cloned."
-msgstr "オプション:クローンするリポジトリのHTTP[S]のURLを指定します"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "リポジトリを[作成]"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr "短く要点を絞ってください。長い説明にはREADMEファイルを利用してください。"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr "オプション:このリポジトリが属するグループを選択します"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "作成するリポジトリの種別を指定します"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "ランディングリビジョン"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3392,8 +3623,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "統計"
 
@@ -3418,52 +3649,52 @@
 msgid "Public Journal Visibility"
 msgstr "公開ジャーナルでの可視性"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "公開ジャーナルから削除する"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 #, fuzzy
 msgid "Add to Public Journal"
 msgstr "公開ジャーナルへ追加"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 #, fuzzy
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr "公開ジャーナルでは、このリポジトリに対して行った操作のすべてが公開されます"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 #, fuzzy
 msgid "Change Locking"
 msgstr "ロック"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 #, fuzzy
 msgid "Confirm to unlock repository."
 msgstr "このリポジトリのロックを解除しますか?"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 #, fuzzy
 msgid "Unlock Repository"
 msgstr "リポジトリのロックを解除"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 #, fuzzy
 msgid "Confirm to lock repository."
 msgstr "このリポジトリをロックしますか?"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 #, fuzzy
 msgid "Lock Repository"
 msgstr "リポジトリのロックを解除"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "リポジトリはロックされていません"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3471,32 +3702,32 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "このリポジトリを削除してもよろしいですか? : %s"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr "このリポジトリを削除"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] "%s 個のフォークがあります"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr "フォークの切り離し"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr "フォークも削除"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3538,8 +3769,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "アクティブ"
@@ -3579,32 +3810,40 @@
 msgstr "拡張フィールドは無効化されています"
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "非公開リポジトリ"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-#, fuzzy
-msgid "Remote URL"
-msgstr "リモート URL"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Pull Changes from Remote Location"
-msgstr "リモートから変更を取り込む"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Confirm to pull changes from remote side."
+#, fuzzy, python-format
+#| msgid "Created repository %s"
+msgid "Remote repository URL"
+msgstr "リポジトリ %s を作成しました"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "リポジトリに[リモートからプル]"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to pull changes from remote side."
+msgid "Confirm to pull changes from remote repository."
 msgstr "リモートから変更を取り込んでもよろしいですか?"
 
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-#, fuzzy
-msgid "This repository does not have a remote URL set."
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+#, fuzzy
+#| msgid "This repository does not have a remote URL set."
+msgid "This repository does not have a remote repository URL."
 msgstr "このリポジトリにリモート URLは設定されていません"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr "変更不能ID"
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "非公開リポジトリ"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 #, fuzzy
@@ -3617,51 +3856,46 @@
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:14
 #, fuzzy
+#| msgid "" "In case this repository is renamed or moved into another group the
+#| " "repository URL changes.\n" "                               Using the
+#| above URL guarantees that this " "repository will always be accessible under
+#| such URL.\n" "                               Useful for CI systems, or any
+#| other cases " "that you need to hardcode the URL into 3rd party service."
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 "通常、リポジトリの名前を変更したり、別のグループに移動すると、リポジトリのURLが変わります。\n"
 "上のURLを使えば、常にリポジトリにアクセスできます。\n"
 "この機能は、CIを使っている場合や、3rd pirtyのサービス向けにURLをハードコードしたいときに便利です。"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-#, fuzzy
-msgid "Clone URL"
-msgstr "クローンURL"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "編集"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr "新しい値"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-#, fuzzy
-msgid "URL used for doing remote pulls."
-msgstr "remote pull で使う http[s] url です。"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "リポジトリを[作成]"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "リポジトリ"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr "ファイルページ、ダウンロード、検索、READMEのデフォルトのリビジョンを指定します"
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "リポジトリの所有者を変更"
 
@@ -3724,55 +3958,11 @@
 msgid "System Info"
 msgstr "システム情報"
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr "メールアドレスプレフィックス"
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr "Kallithea メールのFrom"
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr "エラーメールのFrom"
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr "エラーメールの宛先"
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr "SMTP サーバー"
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr "SMTP ユーザー名"
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr "SMTP パスワード"
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr "SMTP ポート"
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
-msgstr "SMTP TLSの使用"
+msgid "Send test email to"
+msgstr "テストメールの送信"
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr "SMTP SSLの使用"
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr "SMTP 認証"
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr "テストメールの送信"
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "送信"
 
@@ -3849,13 +4039,15 @@
 msgstr "再スキャンオプション"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
-msgstr "古いデータを削除する"
+#, fuzzy
+#| msgid "Search in repositories"
+msgid "Delete records of missing repositories"
+msgstr "リポジトリから検索"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3879,7 +4071,7 @@
 "Current hooks will be updated to the latest version."
 msgstr "各リポジトリに Kallitheas の GIT フックがインストールされているか確認してください。現在のフックは最新版に更新されます"
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr "リポジトリを再スキャン"
 
@@ -3907,41 +4099,47 @@
 msgstr "Kallithea バージョン"
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+#, fuzzy
+#| msgid "check for updates"
+msgid "Check for updates"
 msgstr "更新を確認"
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
-msgstr "Python バージョン"
+msgid "Kallithea configuration file"
+msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
+msgid "Python version"
+msgstr "Python バージョン"
+
+#: kallithea/templates/admin/settings/settings_system.html:7
 msgid "Platform"
 msgstr "プラットフォーム"
 
-#: kallithea/templates/admin/settings/settings_system.html:7
+#: kallithea/templates/admin/settings/settings_system.html:8
 #, fuzzy
 msgid "Git version"
 msgstr "GIT バージョン"
 
-#: kallithea/templates/admin/settings/settings_system.html:8
+#: kallithea/templates/admin/settings/settings_system.html:9
 #, fuzzy
 msgid "Git path"
 msgstr "GIT パス"
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
 msgstr "更新情報のエンドポイント"
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 #, fuzzy
 msgid "Note: please make sure this server can access this URL"
 msgstr "ノート: サーバーがこのURLにアクセスできることを確認して下さい"
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr "更新を確認中..."
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 #, fuzzy
 msgid "Python Packages"
 msgstr "Python パッケージ"
@@ -4122,11 +4320,11 @@
 msgstr "アイコン"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr "公開リポジトリのアイコンを表示する"
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr "非公開リポジトリのアイコンを表示する"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4135,7 +4333,9 @@
 msgstr "リポジトリ名の横に公開/非公開アイコンを表示します。"
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+#, fuzzy
+#| msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr "メタタグ"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4155,6 +4355,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr "ユーザーグループ"
@@ -4174,15 +4375,10 @@
 msgid "%s user group settings"
 msgstr "%s ユーザーグループ設定"
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "デフォルトの権限"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
-#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
-#: kallithea/templates/admin/user_groups/user_groups.html:48
-msgid "Members"
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
 msgstr "メンバー"
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
@@ -4190,8 +4386,14 @@
 msgid "User Group: %s"
 msgstr "ユーサーグループ: %s"
 
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
+#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
+#: kallithea/templates/admin/user_groups/user_groups.html:48
+msgid "Members"
+msgstr "メンバー"
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "このユーザーグループを削除してもよろしいですか?: %s"
@@ -4217,10 +4419,6 @@
 msgid "User Groups Administration"
 msgstr "ユーザーグループ管理"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr "ユーザーグループ"
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "ユーザーを追加"
@@ -4246,12 +4444,7 @@
 msgid "%s user settings"
 msgstr "%s ユーザー設定"
 
-#: kallithea/templates/admin/users/user_edit.html:32
-#, fuzzy
-msgid "Default Permissions"
-msgstr "デフォルトの権限"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr "メールアドレス"
 
@@ -4261,7 +4454,7 @@
 msgstr "ユーザー: %s"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr "アカウントのソース"
 
@@ -4271,11 +4464,11 @@
 msgstr "最終ログイン日時"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr "グループのメンバー数"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "このユーザーを削除してもよろしいですか? : %s"
@@ -4297,18 +4490,11 @@
 msgid "Missing email, please update this user email address."
 msgstr "メールアドレスがありません。このユーザーのメールアドレスを更新してください。"
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr "このユーザーは外部の Source of Record (%s) に属しています。ここでは詳細を管理できません。"
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr "アカウントのソースでの名前"
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "新しいパスワード 再入力"
 
@@ -4331,49 +4517,57 @@
 msgid "Support"
 msgstr "サポート"
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Mercurialリポジトリ"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Gitリポジトリ"
+
+#: kallithea/templates/base/base.html:126
 #, fuzzy
 msgid "Create Fork"
 msgstr "フォークを作成"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "要約"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "履歴"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "ファイル"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr "ブランチの切り替え"
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "オプション"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 #, fuzzy
 msgid "Compare Fork"
 msgstr "フォークを比較"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4383,138 +4577,132 @@
 msgid "Compare"
 msgstr "比較"
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "検索"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr "アンロック"
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr "ロック"
 
-#: kallithea/templates/base/base.html:176
+#: kallithea/templates/base/base.html:180
 msgid "Follow"
 msgstr "フォロー"
 
-#: kallithea/templates/base/base.html:177
+#: kallithea/templates/base/base.html:181
 msgid "Unfollow"
 msgstr "アンフォロー"
 
-#: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "フォーク"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr "プルリクエストを作成"
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr "%s のプルリクエストを表示"
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr "最近の活動を表示"
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "ジャーナル"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "公開ジャーナル"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr "公開 gists を表示"
 
-#: kallithea/templates/base/base.html:237
+#: kallithea/templates/base/base.html:241
 msgid "Gists"
 msgstr "Gists"
 
-#: kallithea/templates/base/base.html:241
+#: kallithea/templates/base/base.html:245
 #, fuzzy
 msgid "All Public Gists"
 msgstr "すべての公開 gists"
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 #, fuzzy
 msgid "My Public Gists"
 msgstr "公開 gists"
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 #, fuzzy
 msgid "My Private Gists"
 msgstr "非公開 gists"
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr "リポジトリから検索"
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 #, fuzzy
 msgid "My Pull Requests"
 msgstr "プルリクエスト"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 #, fuzzy
 msgid "Not Logged In"
 msgstr "ログインしていません"
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 #, fuzzy
 msgid "Login to Your Account"
 msgstr "ログイン"
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "パスワードを忘れた?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "ログアウト"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr "一致するものが見つかりません"
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr "キーボードショートカット"
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr "サイト全体"
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
+#, fuzzy
+#| msgid "Inherit from defaults"
+msgid "Inherit defaults"
 msgstr "デフォルト権限を継承"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
 
 #: kallithea/templates/base/default_perms_box.html:28
 msgid "Create repositories"
@@ -4541,8 +4729,9 @@
 msgstr "ユーザーにリポジトリのフォークを許可する場合はこのオプションを選んでください"
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "表示"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4568,7 +4757,7 @@
 msgstr "別のコメントを追加"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "このリポジトリのフォローをやめる"
 
@@ -4646,6 +4835,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr "権限 {0}: {1} を取り消してもよろしいですか?"
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr "有効"
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr "無効"
+
 #: kallithea/templates/base/root.html:43
 #, fuzzy
 msgid "Specify changeset"
@@ -4676,6 +4873,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4703,10 +4901,6 @@
 msgid_plural "showing %d out of %d revisions"
 msgstr[0] "%d / %d リビジョンを表示"
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "表示"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr "選択を解除"
@@ -4724,7 +4918,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, fuzzy, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr "フォーク元(%s)とフォークを比較"
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4735,10 +4929,12 @@
 
 #: kallithea/templates/changelog/changelog.html:92
 #: kallithea/templates/changelog/changelog_summary_data.html:20
-#, python-format
+#, fuzzy, python-format
+#| msgid "" "Changeset status: %s\n" "Click to open associated pull request
+#| #%s"
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 "チェンジセットステータス: %s\n"
 "関連するプルリクエスト #%s を開く"
@@ -4750,7 +4946,7 @@
 msgstr "チェンジセットステータス: %s"
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr "コミットメッセージを展開"
 
@@ -4783,7 +4979,7 @@
 msgid "Branch %s"
 msgstr "ブランチ %s"
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "まだ変更がありません"
 
@@ -4799,7 +4995,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr "追加"
 
@@ -4829,21 +5025,23 @@
 msgid "Refs"
 msgstr "Refs"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr "Kallithea経由で直接ファイルを追加またはアップロード"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr "新しいファイルを追加"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Push new repo"
+msgid "Push new repository"
 msgstr "新しいリポジトリをプッシュ"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr "存在するリポジトリをプッシュ"
 
@@ -4853,15 +5051,19 @@
 msgstr "%s チェンジセット"
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+#, fuzzy
+#| msgid "parent rev."
+msgid "Parent rev."
 msgstr "親リビジョン"
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+#, fuzzy
+#| msgid "child rev."
+msgid "Child rev."
 msgstr "子リビジョン"
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr "チェンジセットステータス"
@@ -4884,7 +5086,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "マージ"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4896,149 +5100,163 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "作成日"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "作成日"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] "%s ファイルに影響"
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] "%s ファイルに影響。 %s 個の追加と %s 個の削除"
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 #, fuzzy
 msgid "Show full diff anyway"
 msgstr "すべての差分を表示"
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "no revisions"
+msgid "No revisions"
 msgstr "リビジョンなし"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-#, fuzzy
-msgid "Status change from pull request"
-msgstr "チェンジセットのステータスを変更"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "プルリクエスト #%s にコメント"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 #, fuzzy
 msgid "No title"
 msgstr "新しいファイル"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-#, fuzzy
-msgid "Comment from pull request"
-msgstr "プルリクエスト #%s にコメント"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr "チェンジセットのステータスを変更"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr "チェンジセットにコメント"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy
+#| msgid "No changesets"
+msgid "on this changeset"
+msgstr "チェンジセットはありません"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr "%d 個のコメント"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "最近の変更点"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr "{1} 行目にコメント"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr "コメントには %s 構文 ( %s サポートつき ) が利用出来ます"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 #, fuzzy
 msgid "Use @username inside this text to notify another user"
 msgstr "テキスト内で @username を使うと、その Kallithea のユーザーに通知を送信します"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
 msgstr "コメントのプレビュー"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:85
+#: kallithea/templates/changeset/changeset_file_comment.html:77
 #, fuzzy
 msgid "Submitting ..."
 msgstr "送信中..."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:80
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "コメント"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
 msgid "Preview"
 msgstr "プレビュー"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "You need to be logged in to comment."
 msgstr "コメントするにはログインが必要です"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr "今すぐログインする"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr "隠す"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] "%d 個のコメント"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] "(%d インライン)"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, fuzzy, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-#, fuzzy
-msgid "Use @username inside this text to send notification to another local user."
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+#, fuzzy
+#| msgid "Use @username inside this text to notify another user"
+msgid "Use @username inside this text to notify another user."
 msgstr "テキスト内で @username を使うと、その Kallithea のユーザーに通知を送信します"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr "プルリクエストステータスの投票"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "リビジョンステータスを変更"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "変更点なし"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "(閉鎖済み)"
@@ -5058,7 +5276,7 @@
 msgstr "このファイルのすべての差分を表示"
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr "このファイルの差分を並べて表示"
@@ -5067,12 +5285,12 @@
 msgid "Show inline comments"
 msgstr "インラインコメントを表示"
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 #, fuzzy
 msgid "Deleted"
 msgstr "削除"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 #, fuzzy
 msgid "Renamed"
 msgstr "リネーム"
@@ -5085,32 +5303,44 @@
 msgid "Ancestor"
 msgstr "祖先"
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 #, fuzzy
 msgid "Show merge diff"
 msgstr "すべての差分を表示"
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 #, fuzzy
 msgid "Common ancestor"
 msgstr "チェンジセットにコメント"
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 #, fuzzy
 msgid "is"
 msgstr "Gist"
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr "%s チェンジセット"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 #, fuzzy
 msgid "behind"
 msgstr "再インデックス"
@@ -5136,55 +5366,42 @@
 msgstr "リビジョン、ブランチ、ブックマークもしくはタグの比較を行います。"
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] "%s コミットを表示"
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr "ファイルはありません"
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr "すべての差分を表示"
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Mercurialリポジトリ"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Gitリポジトリ"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "公開リポジトリ"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr "リポジトリを作成しています..."
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "まだチェンジセットがありません"
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "%s の RSS フィードを購読"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "%s の ATOM フィードを購読"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr "作成中"
 
@@ -5312,10 +5529,6 @@
 msgid "Commit Changes"
 msgstr "変更をコミット"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr "リビジョン"
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr "前のリビジョン"
@@ -5341,19 +5554,15 @@
 msgstr "サイズ"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "Mimetype"
+msgid "Last Revision"
+msgstr "最後のリビジョン"
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
-msgstr "最後のリビジョン"
-
-#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Modified"
 msgstr "最終更新日"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Committer"
 msgstr "最後の作成者"
@@ -5465,8 +5674,8 @@
 msgstr "%s フォロワー"
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "フォロワー"
 
@@ -5518,8 +5727,8 @@
 msgstr "%s フォーク"
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr "フォーク"
 
@@ -5527,7 +5736,7 @@
 msgid "Forked"
 msgstr "フォークしました"
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "まだフォークがありません"
 
@@ -5540,19 +5749,13 @@
 msgstr "RSS ジャーナルフィード"
 
 #: kallithea/templates/journal/journal.html:56
-#, fuzzy
-msgid "My Repos"
+msgid "My Repositories"
 msgstr "リポジトリ"
 
-#: kallithea/templates/journal/journal_data.html:61
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr "まだエントリがありません"
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "公開ジャーナル"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "ATOM 公開ジャーナルフィード"
@@ -5595,22 +5798,17 @@
 msgid "Destination repository"
 msgstr "相手のリポジトリ"
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-#, fuzzy
-msgid "Pull Request Reviewers"
-msgstr "プルリクエストレビュアー"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 #, fuzzy
 msgid "No entries"
 msgstr "まだエントリがありません"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "取消"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5619,52 +5817,51 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, fuzzy, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-#, fuzzy
-msgid "Delete Pull Request"
-msgstr "新しいプルリクエスト"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr "このプルリクエストを削除してもよろしいですか?"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr "クローズ"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+#, fuzzy
+msgid "Delete Pull Request"
+msgstr "新しいプルリクエスト"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr "このプルリクエストを削除してもよろしいですか?"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this pull request"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "このプルリクエストを削除してもよろしいですか?"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
+#, fuzzy, python-format
+#| msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr "%s プルリクエスト #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, fuzzy, python-format
-msgid "Pull request #%s from %s#%s"
-msgstr ""
+#| msgid "Pull Requests from %s'"
+msgid "Pull request %s from %s#%s"
+msgstr "%s からのプルリクエスト"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
 #, fuzzy
@@ -5680,93 +5877,94 @@
 msgid "Pull request status calculated from votes"
 msgstr "投票からプルリクエストのステータスを計算"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr "未レビュー"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] "%d 人のレビュアー"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr "プルリクエストはすべてのレビュアーにレビューされました"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "まだブランチがありません"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy
 msgid "on"
 msgstr "なし"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr "変更を取得:"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 #, fuzzy
 msgid "Created by"
 msgstr "作成日"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 #, fuzzy
 msgid "Update"
 msgstr "ユーザーを[更新]"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr "所有者"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr "レビュアー"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+#, fuzzy
+msgid "Pull Request Reviewers"
+msgstr "プルリクエストレビュアー"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr "レビュアー"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr "コメントのプレビュー"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr "変更を保存"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 #, fuzzy
 msgid "Save as New Pull Request"
 msgstr "新しいプルリクエストを作成"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "最近の変更点"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 #, fuzzy
 msgid "Pull Request Content"
 msgstr "プルリクエストを以下のステータスに変更しました:"
@@ -5872,8 +6070,8 @@
 msgstr "%s RSS フィード"
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr "有効にする"
 
@@ -5881,45 +6079,45 @@
 msgid "Stats gathered: "
 msgstr "収集した統計情報: "
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "ファイル"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr "もっと表示"
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "コミット"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "追加されたファイル"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "変更されたファイル"
+msgid "files added"
+msgstr "追加されたファイル"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "変更されたファイル"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "削除されたファイル"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "コミット"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "追加されたファイル"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "変更されたファイル"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "削除されたファイル"
 
@@ -5941,67 +6139,78 @@
 msgid "Fork of"
 msgstr "フォーク元"
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr "名前で表示"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "クローン元"
+
+#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+msgid "Clone URL"
+msgstr "クローンURL"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr "名前で表示"
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr "IDで表示"
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr "トレンドファイル"
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "ダウンロード"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "まだダウンロードがありません"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "このリポジトリのダウンロードは無効化されています"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr "ZIPでダウンロード"
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr "チェックするとダウンロードアーカイブにサブリポジトリが含まれます"
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
+#: kallithea/templates/summary/summary.html:125
+#, fuzzy
+#| msgid "with subrepos"
+msgid "With subrepos"
 msgstr "サブリポジトリを含める"
 
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr "リポジトリサイズ"
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr "フィード"
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "最近の変更点"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 #, fuzzy
 msgid "Quick Start"
 msgstr "クイックスタート"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr "リビジョン %s:%s の README ファイル"
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "%s を %s でダウンロード"
@@ -6016,3 +6225,251 @@
 msgid "Compare Tags"
 msgstr "タグを比較"
 
+#~ msgid "No comments."
+#~ msgstr "%d 個のコメント"
+
+#~ msgid "public journal"
+#~ msgstr "公開ジャーナル"
+
+#~ msgid "journal"
+#~ msgstr "ジャーナル"
+
+#~ msgid "Locked repository"
+#~ msgstr "リポジトリをロックしました"
+
+#~ msgid "Unlocked repository"
+#~ msgstr "リポジトリのロックを解除しました"
+
+#~ msgid "Unlocked"
+#~ msgstr "アンロック"
+
+#~ msgid "Locked"
+#~ msgstr "ロック"
+
+#~ msgid "Repository has been %s"
+#~ msgstr "リポジトリは %s されています"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "このユーザーは編集できません"
+
+#~ msgid "No Files"
+#~ msgstr "ファイルなし"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "ユーザー名 \"%(username)s\" は許可されていません"
+
+#~ msgid "invalid user name"
+#~ msgstr "不正なユーザー名です"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "アカウントは無効です"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "無効なクローンURIです"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr "無効なクローンURIです。有効な http(s)/svn+http(s) のURIを指定してください"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr "リビジョン %(revs)s はすでにプルリクエストの一部かステータスが設定されています"
+
+#~ msgid "Defaults"
+#~ msgstr "デフォルト設定"
+
+#~ msgid "My Emails"
+#~ msgstr "メールアドレス"
+
+#~ msgid "Watched"
+#~ msgstr "ウォッチ中"
+
+#~ msgid "My Permissions"
+#~ msgstr "権限"
+
+#~ msgid "expires"
+#~ msgstr "失効"
+
+#~ msgid "reset"
+#~ msgstr "リセット"
+
+#~ msgid "delete"
+#~ msgstr "削除"
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr "ユーザーは外部の source of record  に属しているため、ここでは詳細を管理できません"
+
+#~ msgid "Permissions Administration"
+#~ msgstr "権限管理"
+
+#~ msgid "Overview"
+#~ msgstr "概要"
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr "現在の設定を上書きする"
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr "全てのユーザーに設定されるデフォルトのIPアドレスのホワイトリスト"
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "デフォルトのユーザー権限の概要"
+
+#~ msgid "none"
+#~ msgstr "なし"
+
+#~ msgid "read"
+#~ msgstr "読込"
+
+#~ msgid "write"
+#~ msgstr "書込"
+
+#~ msgid "admin"
+#~ msgstr "管理"
+
+#~ msgid "delegated admin"
+#~ msgstr "代理 admin"
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "オプション:クローンするリポジトリのHTTP[S]のURLを指定します"
+
+#~ msgid "Remote URL"
+#~ msgstr "リモート URL"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "リモートから変更を取り込む"
+
+#~ msgid "Non-changeable id"
+#~ msgstr "変更不能ID"
+
+#~ msgid "edit"
+#~ msgstr "編集"
+
+#~ msgid "new value"
+#~ msgstr "新しい値"
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr "remote pull で使う http[s] url です。"
+
+#~ msgid "Email prefix"
+#~ msgstr "メールアドレスプレフィックス"
+
+#~ msgid "Kallithea email from"
+#~ msgstr "Kallithea メールのFrom"
+
+#~ msgid "Error email from"
+#~ msgstr "エラーメールのFrom"
+
+#~ msgid "Error email recipients"
+#~ msgstr "エラーメールの宛先"
+
+#~ msgid "SMTP server"
+#~ msgstr "SMTP サーバー"
+
+#~ msgid "SMTP username"
+#~ msgstr "SMTP ユーザー名"
+
+#~ msgid "SMTP password"
+#~ msgstr "SMTP パスワード"
+
+#~ msgid "SMTP port"
+#~ msgstr "SMTP ポート"
+
+#~ msgid "SMTP use TLS"
+#~ msgstr "SMTP TLSの使用"
+
+#~ msgid "SMTP use SSL"
+#~ msgstr "SMTP SSLの使用"
+
+#~ msgid "SMTP auth"
+#~ msgstr "SMTP 認証"
+
+#~ msgid "Destroy old data"
+#~ msgstr "古いデータを削除する"
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "デフォルトの権限"
+
+#~ msgid "user groups"
+#~ msgstr "ユーザーグループ"
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr "このユーザーは外部の source of record (%s) に属しています。ここでは詳細を管理できません。"
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "チェンジセットのステータスを変更"
+
+#~ msgid "Status change on changeset"
+#~ msgstr "チェンジセットのステータスを変更"
+
+#~ msgid "Comment on changeset"
+#~ msgstr "チェンジセットにコメント"
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr "テキスト内で @username を使うと、その Kallithea のユーザーに通知を送信します"
+
+#~ msgid "revision"
+#~ msgstr "リビジョン"
+
+#~ msgid "Mimetype"
+#~ msgstr "Mimetype"
+
+#~ msgid "My Repos"
+#~ msgstr "リポジトリ"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr "所有者"
+
+#~ msgid "reviewer"
+#~ msgstr "レビュアー"
+
--- a/kallithea/i18n/kallithea.pot	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/kallithea.pot	Sun Sep 06 23:36:05 2015 +0200
@@ -2,12 +2,13 @@
 # Copyright (C) 2015 Various authors, licensing as GPLv3
 # This file is distributed under the same license as the Kallithea project.
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
-##, fuzzy
+#
+#, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea 0.2.2\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-07-12 18:32+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,19 +17,23 @@
 "Content-Transfer-Encoding: 8bit\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr ""
 
@@ -43,48 +48,51 @@
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr ""
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:745
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr ""
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr ""
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid "Changing status on a changeset associated with a closed pull request is not allowed"
 msgstr ""
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr ""
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+msgid "No response"
+msgstr ""
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 
-#: kallithea/controllers/error.py:99
-msgid "Unauthorized access to resource"
-msgstr ""
-
-#: kallithea/controllers/error.py:101
-msgid "You don't have permission to view this page"
-msgstr ""
-
 #: kallithea/controllers/error.py:103
-msgid "The resource could not be found"
+msgid "Unauthorized access to resource"
 msgstr ""
 
 #: kallithea/controllers/error.py:105
+msgid "You don't have permission to view this page"
+msgstr ""
+
+#: kallithea/controllers/error.py:107
+msgid "The resource could not be found"
+msgstr ""
+
+#: kallithea/controllers/error.py:109
 msgid "The server encountered an unexpected condition which prevented it from fulfilling the request."
 msgstr ""
 
@@ -98,17 +106,17 @@
 msgid "%s %s feed"
 msgstr ""
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -186,45 +194,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr ""
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr ""
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr ""
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr ""
 
-#: kallithea/controllers/files.py:774
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr ""
 
-#: kallithea/controllers/files.py:775 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr ""
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr ""
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
@@ -241,8 +247,8 @@
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
 #: kallithea/templates/base/base.html:131
-#: kallithea/templates/base/base.html:394
-#: kallithea/templates/base/base.html:566
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr ""
 
@@ -262,141 +268,157 @@
 msgstr ""
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr ""
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr ""
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr ""
-
-#: kallithea/controllers/login.py:194
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr ""
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr ""
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr ""
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr ""
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid "Your password reset was successful, new password has been sent to your email"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid "This pull request is based on another %s revision and there is no simple diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr ""
 
@@ -412,21 +434,21 @@
 msgid "An error occurred during search operation."
 msgstr ""
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:388
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr ""
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:102
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -439,38 +461,38 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+msgid "Forever"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -484,7 +506,7 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+msgid "Unmodified"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:262
@@ -500,117 +522,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr ""
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
 #: kallithea/templates/base/base.html:259
 #: kallithea/templates/base/base.html:260
 #: kallithea/templates/base/base.html:266
 #: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -618,11 +656,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -630,217 +668,207 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:297
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
-msgid "Removed repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:307
-#, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
+#: kallithea/controllers/admin/user_groups.py:340
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
-#: kallithea/controllers/admin/user_groups.py:340
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:429
+msgid "Repository group permissions updated"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:162
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:237
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:246
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:249
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:289
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:308
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:335
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:338
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:343
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:346
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:351
+#: kallithea/controllers/admin/repos.py:321
+#, python-format
+msgid "Cannot delete repository %s which still has forks"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:405
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:461
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:475
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr ""
 
+#: kallithea/controllers/admin/repos.py:460
+msgid "-- Not a fork --"
+msgstr ""
+
 #: kallithea/controllers/admin/repos.py:491
-msgid "-- Not a fork --"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:522
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
+#: kallithea/controllers/admin/repos.py:512
+msgid "Nothing"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:521
+msgid "An error occurred during this operation"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+msgid "Repository has been locked"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+msgid "Repository has been unlocked"
+msgstr ""
+
 #: kallithea/controllers/admin/repos.py:543
-msgid "Nothing"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:545
-#, python-format
-msgid "Marked repo %s as fork of %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:552
-msgid "An error occurred during this operation"
-msgstr ""
-
 #: kallithea/controllers/admin/repos.py:568
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:571
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:574
-#: kallithea/controllers/admin/repos.py:601
 msgid "An error occurred during unlocking"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:592
-msgid "Unlocked"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:595
-msgid "Locked"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:597
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:615
+#: kallithea/controllers/admin/repos.py:582
 msgid "Cache invalidation successful"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:619
+#: kallithea/controllers/admin/repos.py:586
 msgid "An error occurred during cache invalidation"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:634
+#: kallithea/controllers/admin/repos.py:601
 msgid "Pulled from remote location"
 msgstr ""
 
+#: kallithea/controllers/admin/repos.py:604
+msgid "An error occurred during pull from remote location"
+msgstr ""
+
 #: kallithea/controllers/admin/repos.py:637
-msgid "An error occurred during pull from remote location"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:670
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
@@ -854,7 +882,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 
 #: kallithea/controllers/admin/settings.py:213
@@ -931,83 +959,80 @@
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:746
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: kallithea/lib/auth.py:814
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 
-#: kallithea/lib/auth.py:851
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr ""
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:626
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr ""
 
@@ -1023,225 +1048,227 @@
 msgid "No changes detected"
 msgstr ""
 
-#: kallithea/lib/helpers.py:610
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:613
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:676
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:682
-msgid "compare view"
-msgstr ""
-
-#: kallithea/lib/helpers.py:701
+#: kallithea/lib/helpers.py:677
+msgid "Compare view"
+msgstr ""
+
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr ""
 
-#: kallithea/lib/helpers.py:702
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:703 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr ""
 
-#: kallithea/lib/helpers.py:727
-#, python-format
-msgid "fork name %s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "Pull request #%s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:754
+#: kallithea/lib/helpers.py:722
+#, python-format
+msgid "Fork name %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:742
+#, python-format
+msgid "Pull request %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:756 kallithea/lib/helpers.py:768
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:758
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr ""
 
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
+msgid "[forked] repository"
+msgstr ""
+
 #: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
-msgid "[forked] repository"
-msgstr ""
-
-#: kallithea/lib/helpers.py:762 kallithea/lib/helpers.py:772
 msgid "[updated] repository"
 msgstr ""
 
+#: kallithea/lib/helpers.py:762
+msgid "[downloaded] archive from repository"
+msgstr ""
+
 #: kallithea/lib/helpers.py:764
-msgid "[downloaded] archive from repository"
-msgstr ""
-
-#: kallithea/lib/helpers.py:766
 msgid "[delete] repository"
 msgstr ""
 
+#: kallithea/lib/helpers.py:772
+msgid "[created] user"
+msgstr ""
+
 #: kallithea/lib/helpers.py:774
-msgid "[created] user"
+msgid "[updated] user"
 msgstr ""
 
 #: kallithea/lib/helpers.py:776
-msgid "[updated] user"
+msgid "[created] user group"
 msgstr ""
 
 #: kallithea/lib/helpers.py:778
-msgid "[created] user group"
+msgid "[updated] user group"
 msgstr ""
 
 #: kallithea/lib/helpers.py:780
-msgid "[updated] user group"
+msgid "[commented] on revision in repository"
 msgstr ""
 
 #: kallithea/lib/helpers.py:782
-msgid "[commented] on revision in repository"
+msgid "[commented] on pull request for"
 msgstr ""
 
 #: kallithea/lib/helpers.py:784
-msgid "[commented] on pull request for"
+msgid "[closed] pull request for"
 msgstr ""
 
 #: kallithea/lib/helpers.py:786
-msgid "[closed] pull request for"
+msgid "[pushed] into"
 msgstr ""
 
 #: kallithea/lib/helpers.py:788
-msgid "[pushed] into"
+msgid "[committed via Kallithea] into repository"
 msgstr ""
 
 #: kallithea/lib/helpers.py:790
-msgid "[committed via Kallithea] into repository"
+msgid "[pulled from remote] into repository"
 msgstr ""
 
 #: kallithea/lib/helpers.py:792
-msgid "[pulled from remote] into repository"
+msgid "[pulled] from"
 msgstr ""
 
 #: kallithea/lib/helpers.py:794
-msgid "[pulled] from"
+msgid "[started following] repository"
 msgstr ""
 
 #: kallithea/lib/helpers.py:796
-msgid "[started following] repository"
-msgstr ""
-
-#: kallithea/lib/helpers.py:798
 msgid "[stopped following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1127
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1131
-msgid "No Files"
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
+msgid "new file"
 msgstr ""
 
 #: kallithea/lib/helpers.py:1197
-msgid "new file"
+msgid "mod"
 msgstr ""
 
 #: kallithea/lib/helpers.py:1200
-msgid "mod"
+msgid "del"
 msgstr ""
 
 #: kallithea/lib/helpers.py:1203
-msgid "del"
-msgstr ""
-
-#: kallithea/lib/helpers.py:1206
 msgid "rename"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1211
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1443
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid "%s repository is not mapped to db perhaps it was created or renamed from the filesystem please run the application again in order to rescan repositories"
 msgstr ""
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr ""
 
@@ -1256,7 +1283,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr ""
 
@@ -1271,7 +1298,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr ""
 
@@ -1286,7 +1313,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr ""
 
@@ -1301,7 +1328,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr ""
 
@@ -1340,7 +1367,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr ""
 
@@ -1355,7 +1382,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr ""
 
@@ -1370,7 +1397,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr ""
 
@@ -1385,7 +1412,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr ""
 
@@ -1400,7 +1427,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr ""
 
@@ -1436,7 +1463,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr ""
 
@@ -1451,7 +1478,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr ""
 
@@ -1466,7 +1493,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr ""
 
@@ -1481,7 +1508,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr ""
 
@@ -1493,7 +1520,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr ""
 
@@ -1505,7 +1532,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr ""
 
@@ -1517,7 +1544,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr ""
 
@@ -1529,7 +1556,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr ""
 
@@ -1541,7 +1568,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr ""
 
@@ -1552,7 +1579,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr ""
 
@@ -1563,7 +1590,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr ""
 
@@ -1574,7 +1601,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr ""
 
@@ -1585,7 +1612,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr ""
 
@@ -1596,7 +1623,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr ""
 
@@ -1607,7 +1634,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr ""
 
@@ -1618,7 +1645,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr ""
 
@@ -1629,7 +1656,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr ""
 
@@ -1640,7 +1667,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr ""
 
@@ -1651,7 +1678,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr ""
 
@@ -1662,29 +1689,125 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:165
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr ""
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+msgid "Default user has read access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1669
+msgid "Default user has write access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+msgid "Only admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1683
+msgid "Non-admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1685
+msgid "Only admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1686
+msgid "Non-admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+msgid "Only admins can fork repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1695
+msgid "Non-admins can can fork repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1698
+msgid "User registration with manual account activation"
+msgstr ""
+
+#: kallithea/model/db.py:1699
+msgid "User registration with automatic account activation"
+msgstr ""
+
+#: kallithea/model/db.py:2228
+msgid "Not reviewed"
+msgstr ""
+
+#: kallithea/model/db.py:2231
+msgid "Under review"
+msgstr ""
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr ""
@@ -1703,283 +1826,296 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
-#, python-format
-msgid "%(user)s commented on changeset at %(when)s"
-msgstr ""
-
-#: kallithea/model/notification.py:253
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
 #: kallithea/model/notification.py:254
 #, python-format
-msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:255
 #, python-format
-msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s sent message %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:256
 #, python-format
-msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:257
 #, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:258
+#, python-format
+msgid "%(user)s opened new pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:259
+#, python-format
+msgid "%(user)s commented on pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:266
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:267
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:268
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:269
+#, python-format
+msgid "%(user)s registered in Kallithea at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:270
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:271
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid "Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by %(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr ""
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid "Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by %(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
-msgid "Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by %(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+msgid "[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr ""
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid "[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid "[Comment from %(comment_username)s] %(repo_name)s pull request %(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr ""
 
-#: kallithea/model/pull_request.py:133
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr ""
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr ""
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr ""
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr ""
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:249
+msgid "You can't remove this user since it is crucial for the entire application"
+msgstr ""
+
+#: kallithea/model/user.py:254
 #, python-format
 msgid "User \"%s\" still owns %s repositories and cannot be removed. Switch owners or remove those repositories: %s"
 msgstr ""
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, python-format
 msgid "User \"%s\" still owns %s repository groups and cannot be removed. Switch owners or remove those repository groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, python-format
 msgid "User \"%s\" still owns %s user groups and cannot be removed. Switch owners or remove those user groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr ""
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr ""
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr ""
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr ""
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr ""
-
-#: kallithea/model/validators.py:105
-msgid "Username may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character or underscore"
-msgstr ""
-
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:97
+#, python-format
+msgid "Username \"%(username)s\" cannot be used"
+msgstr ""
+
+#: kallithea/model/validators.py:99
+msgid "Username may only contain alphanumeric characters underscores, periods or dashes and must begin with an alphanumeric character or underscore"
+msgstr ""
+
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr ""
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid "user group name may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr ""
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr ""
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
-msgstr ""
-
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr ""
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr ""
-
-#: kallithea/model/validators.py:340
+#: kallithea/model/validators.py:300
+msgid "Invalid username or password"
+msgstr ""
+
+#: kallithea/model/validators.py:331
 msgid "Token mismatch"
 msgstr ""
 
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
-msgstr ""
-
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:345
+#, python-format
+msgid "Repository name %(repo)s is not allowed"
+msgstr ""
+
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr ""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr ""
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+msgid "Invalid repository URL"
+msgstr ""
+
+#: kallithea/model/validators.py:466
+msgid "Invalid repository URL. It must be a valid http, https, ssh, svn+http or svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr ""
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr ""
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr ""
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
-msgstr ""
-
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
-msgstr ""
-
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:705
+msgid "This email address is already in use"
+msgstr ""
+
+#: kallithea/model/validators.py:725
+#, python-format
+msgid "Email address \"%(email)s\" not found"
+msgstr ""
+
+#: kallithea/model/validators.py:762
 msgid "The LDAP Login attribute of the CN must be specified - this is the name of the attribute that is equivalent to \"username\""
 msgstr ""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr ""
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr ""
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2041,13 +2177,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2063,7 +2199,7 @@
 msgid "Description"
 msgstr ""
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2084,11 +2220,11 @@
 msgid "Name"
 msgstr ""
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr ""
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2097,18 +2233,19 @@
 msgid "Tip"
 msgstr ""
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:138
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr ""
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2120,7 +2257,7 @@
 msgid "Click to sort ascending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2132,11 +2269,11 @@
 msgid "Click to sort descending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr ""
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2148,7 +2285,7 @@
 msgid "Data error."
 msgstr ""
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
 #: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
@@ -2170,39 +2307,39 @@
 msgid "Log In to %s"
 msgstr ""
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
 #: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr ""
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
 #: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr ""
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr ""
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr ""
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr ""
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr ""
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr ""
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:329
-msgid "Don't have an account ?"
-msgstr ""
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr ""
@@ -2248,26 +2385,26 @@
 msgstr ""
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr ""
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr ""
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr ""
 
@@ -2375,104 +2512,91 @@
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
-msgid "Comma separated list of plugins. Order of plugins is also order in which Kallithea will try to authenticate user"
+msgid "Comma-separated list of plugins; Kallithea will try user authentication in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
 #: kallithea/templates/admin/defaults/defaults.html:82
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-msgid "Repository Defaults"
-msgstr ""
-
 #: kallithea/templates/admin/defaults/defaults.html:11
 #: kallithea/templates/base/base.html:66
-msgid "Defaults"
+msgid "Repository Defaults"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:33
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:42
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
 #: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:46
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid "Private repositories are only visible to people explicitly added as collaborators."
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:53
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:57
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:63
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:67
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
@@ -2502,6 +2626,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr ""
 
@@ -2512,7 +2642,7 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+msgid "Never"
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2520,7 +2650,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
@@ -2574,25 +2704,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
 #: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2622,11 +2754,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:75
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr ""
 
@@ -2635,10 +2778,19 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
 #: kallithea/templates/data_table/_dt_elements.html:165
+#: kallithea/templates/data_table/_dt_elements.html:167
 #: kallithea/templates/data_table/_dt_elements.html:181
+#: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
 #: kallithea/templates/files/files_source.html:44
@@ -2672,26 +2824,29 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
+#: kallithea/templates/admin/my_account/my_account.html:36
+msgid "Email Addresses"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
+msgid "Owned Repositories"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
+msgid "Watched Repositories"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+msgid "Show Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
@@ -2699,56 +2854,42 @@
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
 #, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
+msgid "Confirm to reset this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+msgid "Expired"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
 #, python-format
-msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+msgid "Remove"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+msgid "New API key"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
 #: kallithea/templates/admin/permissions/permissions_ips.html:38
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2761,19 +2902,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:12
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:129
-#: kallithea/templates/data_table/_dt_elements.html:157
-#: kallithea/templates/data_table/_dt_elements.html:173
-#: kallithea/templates/data_table/_dt_elements.html:189
-msgid "delete"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2794,19 +2922,24 @@
 msgid "Change Your Account Password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr ""
@@ -2827,11 +2960,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid "Your user is in an external Source of Record; some details cannot be managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2890,15 +3019,9 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
+msgid "Default Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:28
@@ -2907,14 +3030,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr ""
@@ -2924,19 +3043,21 @@
 msgid "Allow access to Kallithea without needing to log in. Anonymous users use %s user permissions."
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
+msgid "All default permissions on each repository will be reset to chosen permission, note that all custom default permission on repositories will be lost"
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:26
-msgid "All default permissions on each repository will be reset to chosen permission, note that all custom default permission on repositories will be lost"
+msgid "Apply to all existing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
+msgid "Permissions for the Default user on new repositories."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
 #: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
@@ -2946,47 +3067,79 @@
 msgid "All default permissions on each repository group will be reset to chosen permission, note that all custom default permission on repository groups will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+msgid "Apply to all existing repository groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
 #: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
-msgid "All default permissions on each user group will be reset to chosen permission, note that all custom default permission on repository groups will be lost"
+msgid "All default permissions on each user group will be reset to chosen permission, note that all custom default permission on user groups will be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+msgid "Top level repository creation"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid "Note: This will also give all users API access to create repositories everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
-msgid "Write permission to a repository group allows creating repositories inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+msgid "With this, write permission to a repository group allows creating repositories inside that group. Without this, group write permissions mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
 #, python-format
-msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_ips.html:19
@@ -2996,7 +3149,7 @@
 
 #: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
@@ -3020,12 +3173,12 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3052,10 +3205,16 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr ""
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr ""
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3076,7 +3235,7 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr ""
 
@@ -3092,38 +3251,10 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+msgid "User/User Group"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3132,7 +3263,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+msgid "Default"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3141,12 +3272,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
+msgid "Revoke"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
@@ -3156,7 +3282,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+msgid "Apply to children"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3200,42 +3326,37 @@
 msgid "Number of Top-level Repositories"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+msgid "Clone remote repository"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid "Optional: URL of a remote repository. If set, the repository will be created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr ""
 
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
+#: kallithea/templates/forks/fork.html:58
+msgid "Landing revision"
+msgstr ""
+
 #: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
-#: kallithea/templates/forks/fork.html:58
-msgid "Landing revision"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:72
 msgid "Default revision for files page, downloads, full text search index and readme generation"
 msgstr ""
 
@@ -3276,8 +3397,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:175
-#: kallithea/templates/summary/summary.html:176
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr ""
 
@@ -3397,8 +3518,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr ""
@@ -3437,23 +3558,23 @@
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+msgid "Private Repository"
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+msgid "Remote repository URL"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+msgid "Pull Changes from Remote Repository"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+msgid "Confirm to pull changes from remote repository."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
@@ -3476,36 +3597,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:122
-#: kallithea/templates/data_table/_dt_elements.html:123
-#: kallithea/templates/data_table/_dt_elements.html:150
-#: kallithea/templates/data_table/_dt_elements.html:151
-#: kallithea/templates/data_table/_dt_elements.html:167
-#: kallithea/templates/data_table/_dt_elements.html:183
-msgid "edit"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+msgid "Remote repository"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+msgid "Repository URL"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid "Optional: URL of a remote repository. If set, the repository can be pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr ""
 
@@ -3562,55 +3669,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr ""
 
@@ -3677,11 +3740,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
-msgid "Check this option to remove references to repositories that no longer exist in on the filesystem."
+msgid "Check this option to remove all comments, pull requests and other records related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3700,7 +3763,7 @@
 msgid "Verify if Kallithea's Git hooks are installed for each repository. Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3725,38 +3788,42 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
-msgid "Git version"
+msgid "Platform"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:9
-msgid "Upgrade info endpoint"
+msgid "Git version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
+msgid "Upgrade info endpoint"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -3883,11 +3950,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -3895,7 +3962,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -3912,6 +3979,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -3931,15 +3999,8 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
-#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
-#: kallithea/templates/admin/user_groups/user_groups.html:48
-msgid "Members"
+msgid "Show Members"
 msgstr ""
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
@@ -3947,6 +4008,12 @@
 msgid "User Group: %s"
 msgstr ""
 
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
+#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
+#: kallithea/templates/admin/user_groups/user_groups.html:48
+msgid "Members"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
 #: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
@@ -3973,10 +4040,6 @@
 msgid "User Groups Administration"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr ""
@@ -4002,11 +4065,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4016,7 +4075,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4026,7 +4085,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
@@ -4052,16 +4111,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid "This user is in an external Source of Record (%s); some details cannot be managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr ""
 
@@ -4184,12 +4238,6 @@
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:229
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr ""
-
 #: kallithea/templates/base/base.html:234
 #: kallithea/templates/base/base.html:235
 msgid "Public journal"
@@ -4238,29 +4286,29 @@
 msgid "Forgot password ?"
 msgstr ""
 
-#: kallithea/templates/base/base.html:351
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr ""
 
-#: kallithea/templates/base/base.html:399
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:528
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:537
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
+msgid "Inherit defaults"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
-msgid "Select to inherit permissions from %s permissions settings, and default IP address whitelist."
+msgid "Select to inherit global settings, IP whitelist and permissions from the %s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4288,7 +4336,8 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:22
@@ -4384,6 +4433,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr ""
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr ""
@@ -4413,6 +4470,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4441,10 +4499,6 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr ""
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4461,7 +4515,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4474,7 +4528,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4484,7 +4538,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4517,7 +4571,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr ""
 
@@ -4533,7 +4587,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4574,7 +4628,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog_summary_data.html:90
-msgid "Push new repo"
+msgid "Push new repository"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog_summary_data.html:98
@@ -4587,15 +4641,15 @@
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr ""
@@ -4618,7 +4672,7 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+msgid "Merge"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4629,144 +4683,147 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+msgid "Replaced by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:149
+msgid "Preceded by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+msgid "No revisions"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+msgid "on pull request"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
+msgid "No title"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset_file_comment.html:24
-msgid "Status change from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
-msgid "No title"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+msgid "on this changeset"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 msgid "Delete comment?"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+msgid "Status change"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
+msgid "Comment preview"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:77
+msgid "Submitting ..."
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
-msgid "Comment preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:85
-msgid "Submitting ..."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
+#: kallithea/templates/changeset/changeset_file_comment.html:150
 msgid "Use @username inside this text to notify another user."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 msgid "Set changeset status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 msgid "No change"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 msgid "Close"
 msgstr ""
 
@@ -4785,7 +4842,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -4794,11 +4851,11 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr ""
 
@@ -4810,29 +4867,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, python-format
 msgid "%s changesets"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr ""
 
@@ -4856,18 +4925,13 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
@@ -5022,10 +5086,6 @@
 msgid "Commit Changes"
 msgstr ""
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5051,18 +5111,14 @@
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
+msgid "Last Revision"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
+msgid "Last Modified"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:64
-msgid "Last Modified"
-msgstr ""
-
-#: kallithea/templates/files/files_browser.html:65
 msgid "Last Committer"
 msgstr ""
 
@@ -5174,8 +5230,8 @@
 msgstr ""
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:146
-#: kallithea/templates/summary/summary.html:147
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr ""
 
@@ -5226,8 +5282,8 @@
 msgstr ""
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:152
-#: kallithea/templates/summary/summary.html:153
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr ""
 
@@ -5248,18 +5304,13 @@
 msgstr ""
 
 #: kallithea/templates/journal/journal.html:56
-msgid "My Repos"
+msgid "My Repositories"
 msgstr ""
 
 #: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr ""
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr ""
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr ""
@@ -5301,20 +5352,14 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+msgid "Vote"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5323,50 +5368,46 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, python-format
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
 #, python-format
-msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, python-format
-msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5382,86 +5423,86 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 msgid "There are no reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 msgid "on"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 msgid "Update"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 msgid "Remove reviewer"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 msgid "Potential Reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 msgid "Cancel Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 msgid "Pull Request Content"
 msgstr ""
 
@@ -5562,8 +5603,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:104
-#: kallithea/templates/summary/summary.html:120
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5572,12 +5613,12 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:89
-#: kallithea/templates/summary/summary.html:353
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:113
-#: kallithea/templates/summary/summary.html:377
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
@@ -5631,6 +5672,14 @@
 msgid "Fork of"
 msgstr ""
 
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
+msgstr ""
+
 #: kallithea/templates/summary/summary.html:78
 msgid "Show by Name"
 msgstr ""
@@ -5639,57 +5688,57 @@
 msgid "Show by ID"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:96
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr ""
 
+#: kallithea/templates/summary/summary.html:108
+msgid "Download"
+msgstr ""
+
 #: kallithea/templates/summary/summary.html:112
-msgid "Download"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:116
 msgid "There are no downloads yet"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:118
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:124
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:129
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:129
-msgid "with subrepos"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:160
+#: kallithea/templates/summary/summary.html:125
+msgid "With subrepos"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:167
-#: kallithea/templates/summary/summary.html:169
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:190
+#: kallithea/templates/summary/summary.html:186
 msgid "Latest Changes"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:192
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:206
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:297
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
--- a/kallithea/i18n/nl_BE/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/nl_BE/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,9 +5,9 @@
 # #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version:  Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2015-05-28 22:41+0200\n"
 "Last-Translator: Sam Jaques <sam.jaques@me.com>\n"
 "Language-Team: Dutch (Belgium) "
@@ -20,19 +20,23 @@
 "X-Generator: Weblate 2.3-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Er zijn nog geen changesets"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "Geen"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(gesloten)"
 
@@ -48,52 +52,56 @@
 
 #: kallithea/controllers/changeset.py:169
 #, fuzzy, python-format
-msgid "increase diff context to %(num)s lines"
+#| msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr "vergroot de diff context met %(num)s lijnen"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "Deze revisie bestaat niet in deze repository"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Geen kommentaar."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
-"Het is niet toegestaan de status te wijzigen van een changeset geassocieerd "
-"met een gesloten pull request"
-
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+"Het is niet toegestaan de status te wijzigen van een changeset "
+"geassocieerd met een gesloten pull request"
+
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr "Selecteer de changeset"
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+msgid "No response"
+msgstr ""
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 
-#: kallithea/controllers/error.py:99
-msgid "Unauthorized access to resource"
-msgstr ""
-
-#: kallithea/controllers/error.py:101
-msgid "You don't have permission to view this page"
-msgstr ""
-
 #: kallithea/controllers/error.py:103
-msgid "The resource could not be found"
+msgid "Unauthorized access to resource"
 msgstr ""
 
 #: kallithea/controllers/error.py:105
+msgid "You don't have permission to view this page"
+msgstr ""
+
+#: kallithea/controllers/error.py:107
+msgid "The resource could not be found"
+msgstr ""
+
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -109,17 +117,17 @@
 msgid "%s %s feed"
 msgstr ""
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -197,45 +205,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr ""
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr ""
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr ""
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr ""
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr ""
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr ""
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr ""
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
@@ -251,9 +257,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr ""
 
@@ -273,145 +279,161 @@
 msgstr ""
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr ""
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr ""
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr ""
-
-#: kallithea/controllers/login.py:194
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr ""
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr ""
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr ""
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr ""
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, fuzzy, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr ""
 
@@ -427,21 +449,21 @@
 msgid "An error occurred during search operation."
 msgstr ""
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr ""
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -454,38 +476,38 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+msgid "Forever"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -499,7 +521,7 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+msgid "Unmodified"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:262
@@ -515,117 +537,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr ""
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -633,11 +671,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -645,221 +683,213 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:297
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
-msgid "Removed repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:307
-#, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
+#: kallithea/controllers/admin/user_groups.py:340
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
-#: kallithea/controllers/admin/user_groups.py:340
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+msgid "Repository group permissions updated"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:321
+#, python-format
+msgid "Cannot delete repository %s which still has forks"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been locked"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been unlocked"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
 msgstr ""
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
@@ -875,7 +905,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 
 #: kallithea/controllers/admin/settings.py:213
@@ -952,83 +982,80 @@
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:745
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr ""
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr ""
 
@@ -1044,158 +1071,160 @@
 msgid "No changes detected"
 msgstr ""
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
-msgstr ""
-
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:677
+msgid "Compare view"
+msgstr ""
+
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr ""
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr ""
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:722
+#, python-format
+msgid "Fork name %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:742
+#, python-format
+msgid "Pull request %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr ""
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr ""
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr ""
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr ""
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1203,69 +1232,69 @@
 "repositories"
 msgstr ""
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr ""
 
@@ -1280,7 +1309,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr ""
 
@@ -1295,7 +1324,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr ""
 
@@ -1310,7 +1339,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr ""
 
@@ -1325,7 +1354,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr ""
 
@@ -1364,7 +1393,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr ""
 
@@ -1379,7 +1408,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr ""
 
@@ -1394,7 +1423,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr ""
 
@@ -1409,7 +1438,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr ""
 
@@ -1424,7 +1453,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr ""
 
@@ -1460,7 +1489,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr ""
 
@@ -1475,7 +1504,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr ""
 
@@ -1490,7 +1519,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr ""
 
@@ -1505,7 +1534,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr ""
 
@@ -1517,7 +1546,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr ""
 
@@ -1529,7 +1558,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr ""
 
@@ -1541,7 +1570,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr ""
 
@@ -1553,7 +1582,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr ""
 
@@ -1565,7 +1594,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr ""
 
@@ -1576,7 +1605,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr ""
 
@@ -1587,7 +1616,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr ""
 
@@ -1598,7 +1627,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr ""
 
@@ -1609,7 +1638,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr ""
 
@@ -1620,7 +1649,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr ""
 
@@ -1631,7 +1660,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr ""
 
@@ -1642,7 +1671,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr ""
 
@@ -1653,7 +1682,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr ""
 
@@ -1664,7 +1693,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr ""
 
@@ -1675,7 +1704,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr ""
 
@@ -1686,29 +1715,131 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr ""
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+msgid "Default user has read access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1669
+msgid "Default user has write access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+msgid "Only admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1683
+msgid "Non-admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1685
+msgid "Only admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1686
+msgid "Non-admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+msgid "Only admins can fork repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1695
+msgid "Non-admins can can fork repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1698
+msgid "User registration with manual account activation"
+msgstr ""
+
+#: kallithea/model/db.py:1699
+msgid "User registration with automatic account activation"
+msgstr ""
+
+#: kallithea/model/db.py:2228
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Not reviewed"
+msgstr ""
+
+#: kallithea/model/db.py:2231
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Under review"
+msgstr ""
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr ""
@@ -1727,297 +1858,316 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
-#, python-format
-msgid "%(user)s commented on changeset at %(when)s"
-msgstr ""
-
-#: kallithea/model/notification.py:253
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
 #: kallithea/model/notification.py:254
 #, python-format
-msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:255
 #, python-format
-msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s sent message %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:256
 #, python-format
-msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:257
 #, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:258
+#, python-format
+msgid "%(user)s opened new pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:259
+#, python-format
+msgid "%(user)s commented on pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:266
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:267
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:268
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:269
+#, python-format
+msgid "%(user)s registered in Kallithea at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:270
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:271
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr ""
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr ""
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr ""
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr ""
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr ""
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr ""
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr ""
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:249
+msgid "You can't remove this user since it is crucial for the entire application"
+msgstr ""
+
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr ""
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr ""
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr ""
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr ""
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr ""
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, python-format
+msgid "Username \"%(username)s\" cannot be used"
+msgstr ""
+
+#: kallithea/model/validators.py:99
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
-msgstr ""
-
-#: kallithea/model/validators.py:132
+" dashes and must begin with an alphanumeric character or underscore"
+msgstr ""
+
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr ""
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr ""
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr ""
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
-msgstr ""
-
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr ""
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr ""
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
-msgstr ""
-
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:300
+msgid "Invalid username or password"
+msgstr ""
+
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr ""
+
+#: kallithea/model/validators.py:345
+#, python-format
+msgid "Repository name %(repo)s is not allowed"
+msgstr ""
+
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr ""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr ""
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+msgid "Invalid repository URL"
+msgstr ""
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr ""
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr ""
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr ""
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
-msgstr ""
-
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
-msgstr ""
-
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:705
+msgid "This email address is already in use"
+msgstr ""
+
+#: kallithea/model/validators.py:725
+#, python-format
+msgid "Email address \"%(email)s\" not found"
+msgstr ""
+
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr ""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr ""
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr ""
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2079,13 +2229,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2097,11 +2247,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr ""
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2122,11 +2272,11 @@
 msgid "Name"
 msgstr ""
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr ""
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2135,18 +2285,19 @@
 msgid "Tip"
 msgstr ""
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr ""
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2158,7 +2309,7 @@
 msgid "Click to sort ascending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2170,11 +2321,11 @@
 msgid "Click to sort descending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr ""
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2186,10 +2337,10 @@
 msgid "Data error."
 msgstr ""
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2199,7 +2350,7 @@
 msgstr ""
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr ""
 
@@ -2208,39 +2359,39 @@
 msgid "Log In to %s"
 msgstr ""
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr ""
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr ""
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr ""
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr ""
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr ""
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr ""
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr ""
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr ""
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr ""
@@ -2288,26 +2439,26 @@
 msgstr ""
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr ""
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr ""
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr ""
 
@@ -2416,108 +2567,94 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
-msgid "Repository Defaults"
-msgstr ""
-
 #: kallithea/templates/admin/defaults/defaults.html:11
 #: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr ""
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+msgid "Repository Defaults"
+msgstr ""
+
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
@@ -2549,6 +2686,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr ""
 
@@ -2559,7 +2702,7 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+msgid "Never"
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2567,7 +2710,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
@@ -2590,12 +2733,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr ""
 
@@ -2621,25 +2764,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2669,11 +2814,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr ""
 
@@ -2682,9 +2838,18 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2710,7 +2875,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr ""
 
@@ -2719,26 +2884,29 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
+#: kallithea/templates/admin/my_account/my_account.html:36
+msgid "Email Addresses"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
+msgid "Owned Repositories"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
+msgid "Watched Repositories"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+msgid "Show Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
@@ -2746,56 +2914,42 @@
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
 #, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
+msgid "Confirm to reset this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+msgid "Expired"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
 #, python-format
-msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+msgid "Remove"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+msgid "New API key"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2808,19 +2962,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2841,19 +2982,24 @@
 msgid "Change Your Account Password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr ""
@@ -2874,13 +3020,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2916,7 +3056,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr ""
 
@@ -2934,20 +3074,14 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
+msgid "Default Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:28
@@ -2956,14 +3090,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr ""
@@ -2975,23 +3105,25 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+msgid "Apply to all existing repositories"
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
+msgid "Permissions for the Default user on new repositories."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr ""
@@ -3003,70 +3135,99 @@
 "will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+msgid "Apply to all existing repository groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
-msgid "Repository creation with group write access"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+msgid "Top level repository creation"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
+msgid "Repository creation with group write access"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+msgid ""
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm to delete this IP address: %s"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-msgid "Default User Permissions Overview"
+msgid "New IP address"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
@@ -3090,12 +3251,12 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3113,19 +3274,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr ""
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr ""
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3146,12 +3313,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3162,38 +3329,10 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+msgid "User/User Group"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3202,7 +3341,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+msgid "Default"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3211,12 +3350,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
+msgid "Revoke"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
@@ -3226,7 +3360,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+msgid "Apply to children"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3275,42 +3409,39 @@
 msgid "Number of Top-level Repositories"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+msgid "Clone remote repository"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr ""
 
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
+#: kallithea/templates/forks/fork.html:58
+msgid "Landing revision"
+msgstr ""
+
 #: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
-#: kallithea/templates/forks/fork.html:58
-msgid "Landing revision"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:72
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3357,8 +3488,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr ""
 
@@ -3380,45 +3511,45 @@
 msgid "Public Journal Visibility"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 msgid "Add to Public Journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 msgid "Change Locking"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 msgid "Confirm to unlock repository."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 msgid "Unlock Repository"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 msgid "Confirm to lock repository."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 msgid "Lock Repository"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3426,33 +3557,33 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3490,8 +3621,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr ""
@@ -3530,27 +3661,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+msgid "Private Repository"
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+msgid "Remote repository URL"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+msgid "Pull Changes from Remote Repository"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+msgid "Confirm to pull changes from remote repository."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
+msgid "Permanent Repository ID"
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
@@ -3565,43 +3696,31 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+msgid "Remote repository"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+msgid "Repository URL"
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr ""
 
@@ -3658,55 +3777,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr ""
 
@@ -3779,13 +3854,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3806,7 +3881,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3833,38 +3908,42 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
-msgid "Git version"
+msgid "Platform"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:9
-msgid "Upgrade info endpoint"
+msgid "Git version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
+msgid "Upgrade info endpoint"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4016,11 +4095,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4028,7 +4107,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4047,6 +4126,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4066,15 +4146,8 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
-#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
-#: kallithea/templates/admin/user_groups/user_groups.html:48
-msgid "Members"
+msgid "Show Members"
 msgstr ""
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
@@ -4082,8 +4155,14 @@
 msgid "User Group: %s"
 msgstr ""
 
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
+#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
+#: kallithea/templates/admin/user_groups/user_groups.html:48
+msgid "Members"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4108,10 +4187,6 @@
 msgid "User Groups Administration"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr ""
@@ -4137,11 +4212,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4151,7 +4222,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4161,11 +4232,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
@@ -4187,18 +4258,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr ""
 
@@ -4219,47 +4283,55 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr ""
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
-#: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
-msgid "Changelog"
-msgstr ""
-
 #: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:141
+#: kallithea/templates/changelog/changelog.html:14
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
+msgid "Changelog"
+msgstr ""
+
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr ""
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr ""
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4269,129 +4341,123 @@
 msgid "Compare"
 msgstr ""
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr ""
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
-#: kallithea/templates/forks/fork.html:9
-msgid "Fork"
+msgid "Follow"
 msgstr ""
 
 #: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
+#: kallithea/templates/forks/fork.html:9
+msgid "Fork"
+msgstr ""
+
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr ""
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr ""
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr ""
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr ""
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr ""
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr ""
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr ""
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
+msgid "Inherit defaults"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4419,7 +4485,8 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:22
@@ -4446,7 +4513,7 @@
 msgstr ""
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr ""
 
@@ -4517,6 +4584,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr ""
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 #, fuzzy
 msgid "Specify changeset"
@@ -4547,6 +4622,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4575,10 +4651,6 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr ""
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4595,7 +4667,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4608,7 +4680,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4618,7 +4690,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4651,7 +4723,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr ""
 
@@ -4667,7 +4739,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4697,21 +4769,21 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
-msgstr ""
-
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+msgid "Push new repository"
+msgstr ""
+
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr ""
 
@@ -4721,15 +4793,15 @@
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr ""
@@ -4752,7 +4824,7 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+msgid "Merge"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4763,147 +4835,155 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+msgid "Replaced by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:149
+msgid "Preceded by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+msgid "No revisions"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Status change from pull request"
+msgid "on pull request"
+msgstr "Statuswijziging -> %s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
+msgid "No title"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset_file_comment.html:24
 #, fuzzy
-msgid "Status change from pull request"
-msgstr "Statuswijziging -> %s"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
-msgid "No title"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#| msgid "Select changeset"
+msgid "on this changeset"
+msgstr "Selecteer de changeset"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Statuswijziging -> %s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
+msgid "Comment preview"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:77
+msgid "Submitting ..."
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
-msgid "Comment preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:85
-msgid "Submitting ..."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-msgid "Use @username inside this text to send notification to another local user."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+msgid "Use @username inside this text to notify another user."
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "Selecteer de changeset"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 msgid "No change"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "(gesloten)"
@@ -4923,7 +5003,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -4932,11 +5012,11 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr ""
 
@@ -4948,29 +5028,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr ""
 
@@ -4994,56 +5086,43 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5169,10 +5248,6 @@
 msgid "Commit Changes"
 msgstr "Selecteer de changeset"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5198,18 +5273,14 @@
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
+msgid "Last Revision"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
+msgid "Last Modified"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:64
-msgid "Last Modified"
-msgstr ""
-
-#: kallithea/templates/files/files_browser.html:65
 msgid "Last Committer"
 msgstr ""
 
@@ -5321,8 +5392,8 @@
 msgstr ""
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr ""
 
@@ -5373,8 +5444,8 @@
 msgstr ""
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr ""
 
@@ -5382,7 +5453,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr ""
 
@@ -5395,18 +5466,13 @@
 msgstr ""
 
 #: kallithea/templates/journal/journal.html:56
-msgid "My Repos"
-msgstr ""
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr ""
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr ""
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr ""
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr ""
@@ -5448,20 +5514,14 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+msgid "Vote"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5470,50 +5530,48 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
 #, python-format
-msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, python-format
-msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5529,89 +5587,89 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 msgid "There are no reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 msgid "on"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 msgid "Update"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "Selecteer de changeset"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 msgid "Pull Request Content"
 msgstr ""
 
@@ -5712,8 +5770,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5721,45 +5779,45 @@
 msgid "Stats gathered: "
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
-msgid "commits"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:390
-msgid "files added"
+msgid "commits"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
+msgid "files added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:394
-msgid "commit"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:395
-msgid "file added"
+msgid "commit"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:396
-msgid "file changed"
+msgid "file added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:397
+msgid "file changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr ""
 
@@ -5781,66 +5839,74 @@
 msgid "Fork of"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
 msgstr ""
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:125
+msgid "With subrepos"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "Statuswijziging -> %s"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
@@ -5853,3 +5919,419 @@
 #: kallithea/templates/tags/tags.html:26
 msgid "Compare Tags"
 msgstr ""
+
+#~ msgid "No comments."
+#~ msgstr "Geen kommentaar."
+
+#~ msgid "public journal"
+#~ msgstr ""
+
+#~ msgid "journal"
+#~ msgstr ""
+
+#~ msgid "bad captcha"
+#~ msgstr ""
+
+#~ msgid "forever"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Cannot delete %s it still contains attached forks"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked"
+#~ msgstr ""
+
+#~ msgid "Locked"
+#~ msgstr ""
+
+#~ msgid "Repository has been %s"
+#~ msgstr ""
+
+#~ msgid "You can't edit this user"
+#~ msgstr ""
+
+#~ msgid "compare view"
+#~ msgstr ""
+
+#~ msgid "fork name %s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s"
+#~ msgstr ""
+
+#~ msgid "No Files"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#~ msgstr ""
+
+#~ msgid "You can't remove this user since it's crucial for entire application"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Username may only contain alphanumeric "
+#~ "characters underscores, periods or dashes "
+#~ "and must begin with alphanumeric "
+#~ "character or underscore"
+#~ msgstr ""
+
+#~ msgid "invalid password"
+#~ msgstr ""
+
+#~ msgid "invalid user name"
+#~ msgstr ""
+
+#~ msgid "Your account is disabled"
+#~ msgstr ""
+
+#~ msgid "Repository name %(repo)s is disallowed"
+#~ msgstr ""
+
+#~ msgid "invalid clone URL"
+#~ msgstr ""
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+
+#~ msgid "This email address is already taken"
+#~ msgstr ""
+
+#~ msgid "email \"%(email)s\" does not exist."
+#~ msgstr ""
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr ""
+
+#~ msgid "never"
+#~ msgstr ""
+
+#~ msgid "My Emails"
+#~ msgstr ""
+
+#~ msgid "Watched"
+#~ msgstr ""
+
+#~ msgid "My Permissions"
+#~ msgstr ""
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr ""
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr ""
+
+#~ msgid "Overview"
+#~ msgstr ""
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "All default permissions on each user "
+#~ "group will be reset to chosen "
+#~ "permission, note that all custom default"
+#~ " permission on repository groups will "
+#~ "be lost"
+#~ msgstr ""
+
+#~ msgid "Repository creation"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Confirm to delete this ip: %s"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr ""
+
+#~ msgid "none"
+#~ msgstr ""
+
+#~ msgid "read"
+#~ msgstr ""
+
+#~ msgid "write"
+#~ msgstr ""
+
+#~ msgid "admin"
+#~ msgstr ""
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "default"
+#~ msgstr ""
+
+#~ msgid "revoke"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "apply to children"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr ""
+
+#~ msgid "private repository"
+#~ msgstr ""
+
+#~ msgid "Remote URL"
+#~ msgstr ""
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr ""
+
+#~ msgid "Confirm to pull changes from remote side."
+#~ msgstr ""
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr ""
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Meta-Tagging"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr ""
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "Push new repo"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "merge"
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Comment from pull request"
+#~ msgstr ""
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr ""
+
+#~ msgid "My Repos"
+#~ msgstr ""
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr ""
+
+#~ msgid "reviewer"
+#~ msgstr ""
+
+#~ msgid "with subrepos"
+#~ msgstr ""
+
--- a/kallithea/i18n/pl/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/pl/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -9,9 +9,9 @@
 # Nemcio <areczek01@gmail.com>, 2012-2013
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2015-04-04 09:08+0200\n"
 "Last-Translator: Andrew Shadura <andrew@shadura.me>\n"
 "Language-Team: Polish "
@@ -25,19 +25,23 @@
 "X-Generator: Weblate 2.3-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Brak zestawienia zmian"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "Brak"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(zamknięty)"
 
@@ -52,20 +56,15 @@
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr ""
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr ""
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Brak komentarzy."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
@@ -73,33 +72,43 @@
 "Zmiana statusu na grupy zmian powiązania łączy zamkniętego wniosku jest "
 "niedozwolona"
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr "Wybrane zmiany"
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "revisions"
+msgid "No response"
+msgstr "rewizja"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 "Wniosek nie może być rozumiany przez serwer z powodu zniekształconej "
 "składni."
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "Nieautoryzowany dostęp do zasobów"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "Nie masz uprawnień do przeglądania tej strony"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "Zasób nie został znaleziony"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -117,17 +126,17 @@
 msgid "%s %s feed"
 msgstr "%s %s zasilać"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr "Lista zmian była zbyt duża i została ucięta..."
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr "%s zakomitowal w %s"
@@ -205,45 +214,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr "Lokalizacja musi być ścieżką względną i nie może zawierać .. ścieżki"
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Pobieranie wyłączone"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Nieznana wersja %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Puste repozytorium"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "Nieznany typ archiwum"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Różnice"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Gałęzie"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Etykiety"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Wystąpił błąd podczas rozgałęzienia %s repozytorium"
@@ -259,9 +266,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Repozytoria"
 
@@ -281,146 +288,164 @@
 msgstr "Bookmark"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
-msgstr "Dziennik publiczny"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
+msgstr "Dziennik Publiczny"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr "dziennik"
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr ""
-
-#: kallithea/controllers/login.py:194
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr "Dziennik"
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr ""
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr "Udało Ci się zarejestrować na stronie"
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "Twój link zresetowania hasła został wysłany"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr "Twoje hasło zostało zresetowane, nowe hasło zostanie wysłane na e-mail"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr "%s (zamknięty)"
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "Grupy zmian"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr "Specjalne"
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr "gałęzie"
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Zakładki"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr "Brak opisu"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "Prośba o wykonanie połączenia gałęzi została wykonana prawidłowo"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr "Wystąpił błąd podczas prośby o połączenie gałęzi"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr "Recenzje wniosków połączenia gałęzi"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 #, fuzzy
 msgid "Pull request updated"
 msgstr "Połączone gałęzie"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "Prośba o skasowanie połączenia gałęzi została wykonana prawidłowo"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+#, fuzzy
+#| msgid "Vote for pull request status"
+msgid "No permission to change pull request status"
+msgstr "Zagłosuj na żądanie na grupę zmian"
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr "Zamknięcie."
 
@@ -436,22 +461,22 @@
 msgid "An error occurred during search operation."
 msgstr "Wystąpił błąd podczas operacji wyszukiwania."
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 #, fuzzy
 msgid "No data ready yet"
 msgstr "Żadne dane nie zostały załadowane"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "Statystyki są wyłączone dla tego repozytorium"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr "Ustawienia autentykacji poprawnie zaktualizowane"
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr "wystapił błąd podczas uaktualniania ustawień autentykacji"
 
@@ -464,38 +489,40 @@
 msgstr "wystąpił błąd podczas aktualizacji wartości domyślnych"
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+#, fuzzy
+#| msgid "forever"
+msgid "Forever"
 msgstr "na zawsze"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 minut"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 godzina"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 dzień"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 miesiąc"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr "Czas życia"
 
@@ -509,8 +536,10 @@
 msgstr "Usuń gist %s"
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
-msgstr ""
+#, fuzzy
+#| msgid "Last Modified"
+msgid "Unmodified"
+msgstr "Ostatnio modyfikowany"
 
 #: kallithea/controllers/admin/gists.py:262
 msgid "Successfully updated gist content"
@@ -525,119 +554,135 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 "Nie możesz edytować tego użytkownika ponieważ jest kluczowy dla całej "
 "aplikacji"
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "Twoje konto zostało pomyślnie zaktualizowane"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr "wystąpił błąd podczas aktualizacji użytkownika %s"
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "Dodano e-mail %s do użytkownika"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Wystąpił błąd podczas zapisywania e-maila"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "Usunięto e-mail użytkownikowi"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
-msgstr ""
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "Odczyt"
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "Odczyt"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "Zapis"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "Zapis"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "Administracja"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "Wyłączone"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr "Dozwolona z ręczną aktywacją konta"
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr "Dozwolona z automatyczną aktywacją konta"
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -645,11 +690,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr "Ręczna aktywacja nowego konta"
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -657,221 +702,212 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr "Automatyczna aktywacja nowego konta"
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "Włączone"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr "Globalne uprawnienia zaktualizowane poprawnie"
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr "Wystąpił błąd podczas aktualizacji uprawnień"
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr "Wystąpił błąd podczas tworzenia grupy repo %s"
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr "Utworzono grupę repo %s"
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr "Wystąpił błąd podczas tworzenia grupy repo %s"
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr "Zaktualizowano grupę repo %s"
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "Wystąpił błąd podczas aktualizacji grupy repo %s"
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "Ta grupa zawiera %s repozytorium i nie może być usunięta"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Ta grupa zawiera %s repozytorium i nie może być usunięta"
 
-#: kallithea/controllers/admin/repo_groups.py:302
+#: kallithea/controllers/admin/repo_groups.py:297
 #, python-format
 msgid "Removed repository group %s"
 msgstr "Usunięto grupę repo %s"
 
-#: kallithea/controllers/admin/repo_groups.py:307
+#: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr "Wystąpił błąd podczas usuwania z repozytorium grupy %s"
 
-#: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
 #: kallithea/controllers/admin/user_groups.py:340
 msgid "Cannot revoke permission for yourself as admin"
 msgstr "Nie można cofnąć zezwolenia dla admina jako admin"
 
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
+#: kallithea/controllers/admin/repo_groups.py:420
+msgid "Repository group permissions updated"
 msgstr "Aktualizacja uprawnień grup repozytorium"
 
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr "Wystąpił błąd podczas cofania zezwolenia"
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "utworzone repozytorium %s"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr "utworzone repozytorium %s z %s"
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "Gałęzi %s w repozytorium %s"
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr "Utworzone repozytorium %s"
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Repozytorium %s zostało pomyślnie zaktualizowane"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "Wystąpił błąd podczas aktualizacji repozytorium %s"
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr "Oderwane rozgałęzienie %s"
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr "Usunięte repozytorium %s"
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr "Usunięte repozytorium %s"
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
+#: kallithea/controllers/admin/repos.py:321
+#, fuzzy, python-format
+#| msgid "Cannot delete %s it still contains attached forks"
+msgid "Cannot delete repository %s which still has forks"
 msgstr "Nie można usunąć %s nadal zawiera załączniki rozgałęzienia"
 
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Wystąpił błąd podczas usuwania %s"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr "Uprawnienia repozytorium zostały zaktualizowane"
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr "Wystąpił błąd podczas tworzenia użytkownika %s"
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr "Wystąpił błąd podczas zapisywania e-maila"
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr "-- Brak rozgalezienia --"
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "Zaktualizowano widoczność stron w publicznym dzienniku"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr "Wystąpił błąd podczas ustawiania tego repozytorium w dzienniku publicznym"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "Niezgodność tokenu"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "Brak"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "Oznaczono %s repo jako rozwidlenie %s"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "Wystąpił błąd podczas tej operacji"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr "Zablokowane repozytorium"
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr "Odblokowane repozytorium"
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been locked"
+msgstr "Repozytorium nie jest zablokowane"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been unlocked"
+msgstr "Repozytorium nie jest zablokowane"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "Wystąpił błąd podczas odblokowywania"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "Odblokowany"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "Zablokowany"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr "Cache wyczyszczony poprawnie"
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "Wystąpił błąd podczas unieważniania cache"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "Pobieranie z lokalizacji zdalnej"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "Repozytoriów jest %s"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr "Cache wyczyszczony poprawnie"
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "Wystąpił błąd podczas unieważniania cache"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "Pobieranie z lokalizacji zdalnej"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr "Wystąpił błąd podczas pobierania z lokalizacji zdalnej"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "Wystąpił błąd podczas usuwania z repozytorium statystyk"
 
@@ -887,15 +923,15 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr "Wystąpił błąd podczas aktualizacji ustawień aplikacji"
 
 #: kallithea/controllers/admin/settings.py:213
 #, python-format
 msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 msgstr ""
-"Repozytoria z powodzeniem zostały ponownie zeskanowane dodano: %s, usunięto: "
-"%s."
+"Repozytoria z powodzeniem zostały ponownie zeskanowane dodano: %s, "
+"usunięto: %s."
 
 #: kallithea/controllers/admin/settings.py:270
 msgid "Updated application settings"
@@ -966,83 +1002,80 @@
 msgstr "Grupa docelowa nie może być taka sama"
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr "Aktualizacja uprawnień grupy użytkowników"
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr "Aktualizacja uprawnień"
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "Wystąpił błąd podczas zapisywania uprawnień"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr "Utworzono użytkownika %s"
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr "Wystąpił błąd podczas tworzenia użytkownika %s"
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "Użytkownik został zaktualizowany"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr "Użytkownik został usunięty"
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "Wystąpił błąd podczas usuwania użytkownika"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "Nie możesz edytować tego użytkownika"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
 msgstr "Dodano ip %s do listy dozwolonych adresów użytkownia"
 
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
 msgstr "Wystąpił błąd podczas zapisywania e-maila"
 
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
 msgstr "Usunięto adres ip z listy dozwolonych adresów dla użytkownika"
 
-#: kallithea/lib/auth.py:745
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr "Obserwatorzy %s"
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "Musisz być zarejestrowanym użytkownikiem, żeby wykonać to działanie"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "Musisz być zalogowany, żeby oglądać stronę"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "Nie znaleziono changeset"
 
@@ -1060,158 +1093,164 @@
 msgid "No changes detected"
 msgstr "Nie wykryto zmian"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "Usunięta gałąź: %s"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "Utworzony tag: %s"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Pokaż wszystkie zestawienia zmian changesets %s->%s"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "Wyświetl porównanie"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "i"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "%s więcej"
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "rewizja"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "fork name %s"
+msgid "Fork name %s"
 msgstr "nazwa rozgałęzienia %s"
 
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "Pull request %s"
 msgstr "Połączonych gałęzi #%s"
 
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "[usunięte] repozytorium"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "[utworzone] repozytorium"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "[utworzone] repozytorium jako rozgałęzienie"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "[rozgałęzione] repozytorium"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "[zaktualizowane] repozytorium"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr "[pobierz] archiwum z repozytorium"
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "[skasowane] repozytorium"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "[utworzony] użytkownik"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "[zaktualizowany] użytkownik"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr "[utworzona] grupa użytkowników"
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr "[zaktualizowana] grupa użytkowników"
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "[komentarz] do zmiany w repozytorium"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "[komentarz] wniosek o połączenie gałęzi"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "[zamknięty] wniosek o połączenie gałęzi"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[wysłane zmiany] w"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "[synchronizacja przez Kallithea] z repozytorium"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "[pobieranie z zdalnego] do repozytorium"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[pobrano]"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "[start następnego] repozytorium"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "[zatrzymany po] repozytorium"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " i %s więcej"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "Brak Plików"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr "Brak plików"
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr "nowy plik"
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr "modyfikuj"
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr "kasuj"
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr "zmień nazwę"
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr "chmod"
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1222,7 +1261,7 @@
 "zmienione z systemie plików proszę uruchomić aplikację ponownie, aby "
 "ponownie przeskanować repozytoria"
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
@@ -1230,7 +1269,7 @@
 msgstr[1] "%d lata"
 msgstr[2] "%d lat"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
@@ -1238,7 +1277,7 @@
 msgstr[1] "%d miesięcy"
 msgstr[2] "%d miesięcy"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
@@ -1246,7 +1285,7 @@
 msgstr[1] "%d dni"
 msgstr[2] "%d dni"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
@@ -1254,7 +1293,7 @@
 msgstr[1] "%d godziny"
 msgstr[2] "%d godzin"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
@@ -1262,7 +1301,7 @@
 msgstr[1] "%d minuty"
 msgstr[2] "%d minut"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
@@ -1270,27 +1309,27 @@
 msgstr[1] "%d sekund"
 msgstr[2] "%d sekund"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "w %s"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "%s temu"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "w %s i %s"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s i %s temu"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "przed chwilą"
 
@@ -1305,7 +1344,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "Brak dostępu do repozytorium"
 
@@ -1320,7 +1359,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "Repozytorium do odczytu"
 
@@ -1335,7 +1374,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "Repozytorium do zapisu"
 
@@ -1350,7 +1389,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "Administracja dostępu do repozytorium"
 
@@ -1389,7 +1428,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Administrator Repo"
 
@@ -1404,7 +1443,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "Tworzenie repozytorium jest wyłączone"
 
@@ -1419,7 +1458,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "Tworzenie repozytorium jest włączone"
 
@@ -1434,7 +1473,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "Rozwidlenie repozytorium wyłączone"
 
@@ -1449,7 +1488,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "Rozwidlenie repozytorium włączone"
 
@@ -1485,7 +1524,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "Brak Korekty"
 
@@ -1500,7 +1539,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "Zaakceptowano"
 
@@ -1515,7 +1554,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "Odrzucono"
 
@@ -1530,7 +1569,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "Objęty Przeglądem"
 
@@ -1542,7 +1581,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr "najwyższy poziom"
 
@@ -1554,7 +1593,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr "Grupy repozytoriów brak dostępu"
 
@@ -1566,7 +1605,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr "Grupy repozytoriów dostęp do odczytu"
 
@@ -1578,7 +1617,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr "Grupy repozytoriów dostęp do zapisu"
 
@@ -1590,7 +1629,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr "Repozytoria Grupy dostęp administratora"
 
@@ -1601,7 +1640,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr "Ta grupa użytkowników nie ma dostępu"
 
@@ -1612,7 +1651,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr "Dostęp do grupy parametrów użytkownika"
 
@@ -1623,7 +1662,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr "Ta grupa użytkowników ma prawo do zapisu"
 
@@ -1634,7 +1673,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr "Ta grupa użytkowników ma uprawnienia administratora"
 
@@ -1645,7 +1684,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr "Tworzenie grup repozytoriów wyłączone"
 
@@ -1656,7 +1695,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr "Tworzenie grup repozytoriów włączone"
 
@@ -1667,7 +1706,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr "Tworzenie grup użytkowników wyłączone"
 
@@ -1678,7 +1717,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr "Tworzenie grup użytkowników właczone"
 
@@ -1689,7 +1728,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr "Rejestracja wyłączona"
 
@@ -1700,7 +1739,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr "Rejestracja użytkownika z ręczną aktywacją konta"
 
@@ -1711,29 +1750,149 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr "Rejestracja użytkownika z automatyczną aktywacją konta"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "widziany %s"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[Wymieniony]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "Nieautoryzowany dostęp do zasobów"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "Nieautoryzowany dostęp do zasobów"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Only admins can create repository groups"
+msgstr "Utworzono grupę repo %s"
+
+#: kallithea/model/db.py:1683
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Non-admins can create repository groups"
+msgstr "Utworzono grupę repo %s"
+
+#: kallithea/model/db.py:1685
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Only admins can create user groups"
+msgstr "Tworzenie grup użytkowników"
+
+#: kallithea/model/db.py:1686
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Non-admins can create user groups"
+msgstr "Tworzenie grup użytkowników"
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Ogólna liczba repozytoriów"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Invalidate cache for all repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Unieważnia cache dla wszystkich repozytoriów"
+
+#: kallithea/model/db.py:1698
+#, fuzzy
+#| msgid "User Registration with manual account activation"
+msgid "User registration with manual account activation"
+msgstr "Rejestracja użytkownika z ręczną aktywacją konta"
+
+#: kallithea/model/db.py:1699
+#, fuzzy
+#| msgid "User Registration with automatic account activation"
+msgid "User registration with automatic account activation"
+msgstr "Rejestracja użytkownika z automatyczną aktywacją konta"
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "Brak Korekty"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "Objęty Przeglądem"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "Wpisz login"
@@ -1752,97 +1911,130 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Wpisz %(min)i lub więcej znaków"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
+#: kallithea/model/notification.py:254
+#, fuzzy, python-format
+#| msgid "%(user)s commented on changeset at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
+msgstr "%(user)s skomentował zatwierdzenie %(when)s"
+
+#: kallithea/model/notification.py:255
+#, fuzzy, python-format
+#| msgid "%(user)s sent message at %(when)s"
+msgid "%(user)s sent message %(age)s"
+msgstr "%(user)s wysłał wiadomość do %(when)s"
+
+#: kallithea/model/notification.py:256
+#, fuzzy, python-format
+#| msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
+msgstr "%(user)s wspomniał o Tobie w %(when)s"
+
+#: kallithea/model/notification.py:257
+#, fuzzy, python-format
+#| msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr "%(user)s zarejestrował na stronie w %(when)s"
+
+#: kallithea/model/notification.py:258
+#, fuzzy, python-format
+#| msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "%(user)s otworzył nowe połączenie gałęzi w %(when)s"
+
+#: kallithea/model/notification.py:259
+#, fuzzy, python-format
+#| msgid "%(user)s commented on pull request at %(when)s"
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "%(user)s skomentował nowe połączenie gałęzi w %(when)s"
+
+#: kallithea/model/notification.py:266
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s skomentował zatwierdzenie %(when)s"
 
-#: kallithea/model/notification.py:253
+#: kallithea/model/notification.py:267
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s wysłał wiadomość do %(when)s"
 
-#: kallithea/model/notification.py:254
+#: kallithea/model/notification.py:268
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s wspomniał o Tobie w %(when)s"
 
-#: kallithea/model/notification.py:255
+#: kallithea/model/notification.py:269
 #, python-format
 msgid "%(user)s registered in Kallithea at %(when)s"
 msgstr "%(user)s zarejestrował na stronie w %(when)s"
 
-#: kallithea/model/notification.py:256
+#: kallithea/model/notification.py:270
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s otworzył nowe połączenie gałęzi w %(when)s"
 
-#: kallithea/model/notification.py:257
+#: kallithea/model/notification.py:271
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s skomentował nowe połączenie gałęzi w %(when)s"
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, fuzzy, python-format
-msgid "New user %(new_username)s registered"
-msgstr "Użytkownik %(new_username)s zarejestrował"
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, fuzzy, python-format
+msgid "New user %(new_username)s registered"
+msgstr "Użytkownik %(new_username)s zarejestrował"
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 #, fuzzy
 msgid "Closing"
 msgstr "Używa:"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#: kallithea/model/pull_request.py:137
+#, fuzzy, python-format
+#| msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 msgstr "%(user)s chce żeby przejrzeć nowe gałęzie #%(pr_id)s: %(pr_title)s"
 
-#: kallithea/model/scm.py:808
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "ostatni tip"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr "nowy użytkownik się zarejestrował"
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-"Nie możesz edytować tego użytkownika ponieważ jest kluczowy dla całej "
-"aplikacji"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr ""
 "Nie możesz usunąć tego użytkownika ponieważ jest kluczowy dla całej "
 "aplikacji"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
@@ -1851,7 +2043,7 @@
 "użytkownik \"%s\" wciąż posiada repozytoria następujące %s i nie może "
 "zostać usunięty. Zmień właściciela lub usuń te repozytoria. %s"
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
@@ -1860,7 +2052,7 @@
 "użytkownik \"%s\" wciąż posiada repozytoria następujące %s i nie może "
 "zostać usunięty. Zmień właściciela lub usuń te repozytoria. %s"
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
@@ -1869,61 +2061,66 @@
 "użytkownik \"%s\" wciąż posiada repozytoria następujące %s i nie może "
 "zostać usunięty. Zmień właściciela lub usuń te repozytoria. %s"
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr "łącze resetowania hasła"
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr "Nowe hasło"
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr "Nowe hasło do strony: %s"
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "Wartość listy nie może być pusta"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "Użytkownik \"%(username)s\" już istnieje"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "Nazwa użytkownika \"%(username)s\" jest zabroniona"
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, fuzzy, python-format
+#| msgid "Username %(username)s is not valid"
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "Nazwa użytkownika %(username)s jest nieprawidłowa"
+
+#: kallithea/model/validators.py:99
+#, fuzzy
+#| msgid "" "Username may only contain alphanumeric characters underscores,
+#| periods or" " dashes and must begin with alphanumeric character or
+#| underscore"
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
+" dashes and must begin with an alphanumeric character or underscore"
 msgstr ""
 "Nazwa użytkownika może zawierać tylko znaki alfanumeryczne, podkreślenia,"
 " kropki lub myślniki i muszą zaczynać się znakiem alfanumerycznym lub "
 "podkreśleniem"
 
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "Nazwa użytkownika %(username)s jest nieprawidłowa"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr "Niewłaściwa nazwa grupy"
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr "Nazwa grupy \"%(usergroup)s\" już istnieje"
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
@@ -1931,108 +2128,112 @@
 "nazwa grupy może zawierać tylko znaki alfanumeryczne, podkreślenia, "
 "kropki lub myślniki i musi zaczynać się znakiem alfanumerycznym"
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "Nie można przypisać do tej grupy jako rodzic"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "Nazwa grupy \"%(group_name)s\" już istnieje"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "Repozytorium o nazwie \"%(group_name)s\" już istnieje"
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "Nieprawidłowe znaki (nie-ascii) w haśle"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "Hasła różnią się"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "nieprawidłowe hasło"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "niepoprawna nazwa użytkownika"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "Twoje konto jest wyłączone"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "Niezgodność tokenu"
+
+#: kallithea/model/validators.py:345
+#, fuzzy, python-format
+#| msgid "Repository name %(repo)s is disallowed"
+msgid "Repository name %(repo)s is not allowed"
 msgstr "Nazwa repozytorium  %(repo)s jest zabroniona"
 
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "Repozytorium o nazwie %(repo)s już istnieje"
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr "Repozytorium  \"%(repo)s\" już istnieje w grupie \"%(group)s\""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr "Grupa repozytoriów z nazwą \"%(repo)s\" już istnieje"
 
-#: kallithea/model/validators.py:474
-#, fuzzy
-msgid "invalid clone URL"
-msgstr "nieprawidłowe url klonowania"
-
-#: kallithea/model/validators.py:475
-#, fuzzy
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr "Nieprawidłowe url klonowania, wstaw prawidłowy url http(s)/svn+http(s)"
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "prywatne repozytorium"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "Fork musi być tego samego typu, jak rodzic"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr "Nie masz uprawnień do tworzenia repozytorium w tej grupie"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr "nie masz uprawnień do tworzenia repozytorium w tej grupie"
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr "Nie masz uprawnień do tworzenia repozytorium w tej grupie"
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr "Ta nazwa użytkownika lub grupy użytkowników nie jest prawidłowa"
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "To nie jest prawidłowa ścieżka"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "Ten adres e-mail jest już zajęty"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "e-mail \"%(email)s\" nie istnieje."
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
@@ -2040,31 +2241,26 @@
 "Atrybut logowania CN do LDAP należy określić, jest to nazwa atrybutu, "
 "który jest odpowiednikiem  \"username\""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr "Rewizja  %(revs)s jest już częścią  nowej gałęzi więc określ jego status"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
 msgstr "Proszę podać poprawny adres IPv4 lub IPv6"
 
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr "Rozmiar sieci (bits) może mieścić się w zakresie od 0-32 (nie %(bits)r)"
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 "Klucz nazwy może składać się tylko z liter, podkreślenia, myślnika lub "
 "numerów"
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr "Nazwa pliku nie może znajdować się w katalogu"
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2126,13 +2322,13 @@
 msgstr "Nazwa Grupy"
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2144,11 +2340,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "Opis"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2169,11 +2365,11 @@
 msgid "Name"
 msgstr "Nazwa"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "Ostatnia akytwność"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2182,18 +2378,19 @@
 msgid "Tip"
 msgstr "Ostatnia zmiana"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "Właściciel"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2205,7 +2402,7 @@
 msgid "Click to sort ascending"
 msgstr "Kliknij, aby posortować rosnąco"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2217,11 +2414,11 @@
 msgid "Click to sort descending"
 msgstr "Kliknij, aby posortować malejąco"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr "Nie znaleziono repozytorium."
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2233,10 +2430,10 @@
 msgid "Data error."
 msgstr "Błąd danych."
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2246,7 +2443,7 @@
 msgstr "Wczytywanie..."
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "Zaloguj się"
 
@@ -2255,39 +2452,39 @@
 msgid "Log In to %s"
 msgstr "Zaloguj się do %s"
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "Nazwa użytkownika"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "Hasło"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "Zapamiętaj mnie"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "Zapomniałeś hasła?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "Nie masz konta?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "Zaloguj się"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "Zapomniałeś hasła?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "Nie masz konta?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr "Łącze resetowania hasła"
@@ -2338,26 +2535,26 @@
 msgstr "Ponownie wprowadź hasło"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "Imię"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "Nazwisko"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "E-mail"
 
@@ -2469,75 +2666,61 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr "Wtyczka"
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "Zapisz"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
+#: kallithea/templates/admin/defaults/defaults.html:11
+#: kallithea/templates/base/base.html:66
 #, fuzzy
 msgid "Repository Defaults"
 msgstr "Repozytoria domyślne"
 
-#: kallithea/templates/admin/defaults/defaults.html:11
-#: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr "Domyślne"
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "Typ"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "Prywatne repozytorium"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
@@ -2546,34 +2729,34 @@
 "Prywatne repozytoria są widoczne tylko dla osób bezpośrednio dodanych "
 "jako współpracownicy."
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "Włącz statystyki"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "Włącz okno statystyk na stronie podsumowania."
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "Włącz pobieranie"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "Włącz menu pobierania na stronie podsumowania."
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "Włącz blokowanie"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr "Włącz blokowanie pobierania w repozytorium."
 
@@ -2605,6 +2788,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr "Wygasa"
 
@@ -2615,7 +2804,9 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+#, fuzzy
+#| msgid "never"
+msgid "Never"
 msgstr "nigdy"
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2623,7 +2814,7 @@
 msgstr "Zaktualizuj Gist"
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "Anuluj"
 
@@ -2646,12 +2837,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr "Utwórz Nowy Gist"
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr "Utworzono"
 
@@ -2677,25 +2868,27 @@
 msgstr "Utwórz Publiczny Gist"
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2725,11 +2918,22 @@
 msgstr "Prywatny Gist"
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "Usuń"
 
@@ -2738,9 +2942,18 @@
 msgstr "Potwierdź aby usunąć ten Gist"
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2766,7 +2979,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "Moje konto"
 
@@ -2775,84 +2988,90 @@
 msgid "Profile"
 msgstr "Profil"
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
-msgstr ""
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "Nowy adres e-mail"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
-msgstr "Moje Emaile"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
+msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr "Moje Repozytoria"
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "repozytoria"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "Obserwowane"
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "Utwórz repozytorium"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-#, fuzzy
-msgid "My Permissions"
-msgstr "Moje uprawnienia"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+#, fuzzy
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "Skopiuj uprawnienia"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to reset this API key: %s"
+msgstr "Potwierdź, aby usunąć to ip: %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
-msgstr ""
+#, fuzzy
+#| msgid "Expires"
+msgid "Expired"
+msgstr "Wygasa"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to remove this API key: %s"
+msgstr "Potwierdź, aby usunąć to ip: %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
-msgstr ""
+#, fuzzy
+#| msgid "Removed"
+msgid "Remove"
+msgstr "Usunięto"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
-msgstr ""
+#, fuzzy
+#| msgid "No additional emails specified."
+msgid "No additional API keys specified"
+msgstr "Brak dodatkowych emaili"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
-msgstr ""
+#, fuzzy
+#| msgid "New field key"
+msgid "New API key"
+msgstr "Nowe pole klucza"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2865,19 +3084,6 @@
 msgid "Primary"
 msgstr "Główny"
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "usuń"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2900,19 +3106,24 @@
 msgid "Change Your Account Password"
 msgstr "Nowe hasło"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "Nowe hasło"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "Zmiana awataru na"
@@ -2933,13 +3144,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2977,7 +3182,7 @@
 msgstr "Komentarze"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr "Połączone gałęzie"
 
@@ -2997,22 +3202,16 @@
 msgstr "Pokaż powiadomienia"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "Powiadomienia"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-#, fuzzy
-msgid "Permissions Administration"
-msgstr "Uprawnienia administracji"
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "Uprawnienia"
+#, fuzzy
+msgid "Default Permissions"
+msgstr "Domyślne uprawnienia"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -3020,15 +3219,11 @@
 msgstr "Globalne"
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 #, fuzzy
 msgid "IP Whitelist"
 msgstr "Lista dozwolonych adresów IP"
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr "Podgląd"
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "Dostęp anonimowy"
@@ -3040,26 +3235,30 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 "Wszystkie uprawnienia domyślne każdego repozytorium zostaną przywrócone. "
-"Wybrane uprawnienie zostaną skasowane. Pamiętaj, że wszystkie niestandardowe "
-"uprawnienia w repozytoriach zostaną utracone"
+"Wybrane uprawnienie zostaną skasowane. Pamiętaj, że wszystkie "
+"niestandardowe uprawnienia w repozytoriach zostaną utracone"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Existing repository?"
+msgid "Apply to all existing repositories"
+msgstr "Istniejące repozytorium?"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
-msgstr "Nadpisz ustawienia"
+msgid "Permissions for the Default user on new repositories."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "Repozytorium grupy"
@@ -3071,81 +3270,116 @@
 "will be lost"
 msgstr ""
 "Wszystkie uprawnienia domyślne każdego repozytorium zostaną przywrócone. "
-"Wybrane uprawnienie zostaną skasowane. Pamiętaj, że wszystkie niestandardowe "
-"uprawnienia w repozytoriach zostaną utracone"
+"Wybrane uprawnienie zostaną skasowane. Pamiętaj, że wszystkie "
+"niestandardowe uprawnienia w repozytoriach zostaną utracone"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy
+#| msgid "Delete this repository group"
+msgid "Apply to all existing repository groups"
+msgstr "Usuń ta grupę repozytoriów"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr "Grupa użytkownika"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
+#, fuzzy
+#| msgid "" "All default permissions on each user group will be reset to chosen
+#| " "permission, note that all custom default permission on repository groups
+#| " "will be lost"
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
 msgstr ""
 "Wszystkie Uprawnienia domyślne każdej grupy użytkowników zostaną "
 "przywrócone do wybranego zezwolenia, trzeba pamiętać, że wszystkie "
 "niestandardowe uprawnienia domyślne dla grup repozytorium zostaną "
 "utracone"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "Tworzenie repozytorium"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid ""
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr "Tworzenie grupy użytkowników"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr "Rozwidlanie repozytorium"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "Rejestracja"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr "Autoryzacja aktywacji zewnętrznego konta"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
 msgstr "Potwierdź, aby usunąć to ip: %s"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 #, fuzzy
 msgid "All IP addresses are allowed."
 msgstr "Wszystkie adresy IP są dozwolone"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr "Nowy adres ip"
 
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-#, fuzzy
-msgid "Default User Permissions Overview"
-msgstr "Domyślne uprawnienia"
-
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:105
@@ -3167,12 +3401,12 @@
 msgstr "Rodzic gropy"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3190,19 +3424,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "Ustawienia"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr "Zaawansowane"
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "Uprawnienia"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3223,12 +3463,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "Utworzono"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3240,38 +3480,12 @@
 msgid "Delete this repository group"
 msgstr "Usuń ta grupę repozytoriów"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "brak"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "odczyt"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "zapis"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "administracja"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+#, fuzzy
+#| msgid "user/user group"
+msgid "User/User Group"
 msgstr "użytkownik/grupa użytkowników"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3280,7 +3494,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "domyślny"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3289,14 +3505,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "odwołane"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3304,7 +3517,9 @@
 msgstr "Dodaj nowe"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+#, fuzzy
+#| msgid "apply to children"
+msgid "Apply to children"
 msgstr "dotyczy dzieci"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3358,43 +3573,41 @@
 msgid "Number of Top-level Repositories"
 msgstr "Liczba najwyższego poziomu repozytorium"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "Klonuj z"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-#, fuzzy
-msgid "Optional URL from which repository should be cloned."
-msgstr "Opcjonalnie http[s] url z którego repozytorium powinno być klonowane."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "[utworzone] repozytorium"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr "Powinna być krótka i na temat. Użyj pliku README dla dłuższych opisów."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr "Opcjonalnie wybierz grupę do wprowadzenia tego repozytorium."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "Rodzaj repozytorium do stworzenia."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "Docelowa rewizja"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3442,8 +3655,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "Statystyki"
 
@@ -3468,16 +3681,16 @@
 msgid "Public Journal Visibility"
 msgstr "Dziennik publiczny"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "Usuń z dziennika publicznego"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 #, fuzzy
 msgid "Add to Public Journal"
 msgstr "Dziennik publiczny"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 #, fuzzy
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
@@ -3486,36 +3699,36 @@
 "Wszystkie działania wykonywane na tym repozytorium będą dostępne dla "
 "wszystkich w dzienniku publicznym"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 #, fuzzy
 msgid "Change Locking"
 msgstr "Włącz blokowanie"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 #, fuzzy
 msgid "Confirm to unlock repository."
 msgstr "Potwierdź odblokowanie repozytorium"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 #, fuzzy
 msgid "Unlock Repository"
 msgstr "Odblokowane repozytorium"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 #, fuzzy
 msgid "Confirm to lock repository."
 msgstr "Potwierdź blokowanie repozytorium"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 #, fuzzy
 msgid "Lock Repository"
 msgstr "Odblokowane repozytorium"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "Repozytorium nie jest zablokowane"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3523,18 +3736,18 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "Potwierdź usunięcie repozytorium: %s"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr "Usuń ta grupę repozytoriów"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
@@ -3542,15 +3755,15 @@
 msgstr[1] "to repozytorium ma %s forki"
 msgstr[2] "to repozytorium ma %s forków"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr "Ustaw jako rozwidlenie"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr "Usuń rozwidlenie"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3594,8 +3807,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "Aktywny"
@@ -3635,31 +3848,38 @@
 msgstr "Avatary są wyłączone"
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "prywatne repozytorium"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-#, fuzzy
-msgid "Remote URL"
-msgstr "Url klonowania"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Pull Changes from Remote Location"
-msgstr "Pobierz z zdalnej lokalizacji"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Confirm to pull changes from remote side."
+#, fuzzy, python-format
+#| msgid "Created repository %s"
+msgid "Remote repository URL"
+msgstr "Utworzone repozytorium %s"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "[pobieranie z zdalnego] do repozytorium"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to pull changes from remote side."
+msgid "Confirm to pull changes from remote repository."
 msgstr "Potwierdź pull z zdalnej strony"
 
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr "Brak zmiennej id"
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "prywatne repozytorium"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3673,44 +3893,35 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-#, fuzzy
-msgid "Clone URL"
-msgstr "Url klonowania"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "edycja"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "[utworzone] repozytorium"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "Repozytorium"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr "Wersja domyślna dla plików stronicowania, pobierania plików, readme"
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "Zmiana właściciela tego repozytorium."
 
@@ -3771,55 +3982,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "Wyślij"
 
@@ -3894,13 +4061,15 @@
 msgstr "ponowne skanowanie opcji"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
-msgstr "Zniszcz stare dane"
+#, fuzzy
+#| msgid "Search in repositories"
+msgid "Delete records of missing repositories"
+msgstr "Szukaj we wszystkich repozytoriach"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3922,7 +4091,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3949,39 +4118,43 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
+msgid "Platform"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:8
 #, fuzzy
 msgid "Git version"
 msgstr "Edycja Uprawnień"
 
-#: kallithea/templates/admin/settings/settings_system.html:8
+#: kallithea/templates/admin/settings/settings_system.html:9
 msgid "Git path"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4137,11 +4310,11 @@
 msgstr "Ikony"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr "Pokazuj w publicznym repo ikonę w repozytoriach"
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr "Pokazuj w prywatnym repo ikonę w repozytoriach"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4150,7 +4323,9 @@
 msgstr "Pokazuj w publicznym repo ikonę w repozytoriach"
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+#, fuzzy
+#| msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr "Tagowanie meta"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4169,6 +4344,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4188,24 +4364,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "Domyślne uprawnienia"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "użytkownik"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "Użytkownik"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "Potwierdź usunięcie grupy użytkowników: %s"
@@ -4231,10 +4408,6 @@
 msgid "User Groups Administration"
 msgstr "Użytkownicy grupy administracji"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "Dodaj użytkownika"
@@ -4260,12 +4433,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-#, fuzzy
-msgid "Default Permissions"
-msgstr "Domyślne uprawnienia"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4275,7 +4443,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4285,11 +4453,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Potwierdź usunięcie tego użytkownika: %s"
@@ -4311,18 +4479,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "Potwierdzenie nowego hasła"
 
@@ -4344,49 +4505,57 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Repozytorium mercurial"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Repozytorium git"
+
+#: kallithea/templates/base/base.html:126
 #, fuzzy
 msgid "Create Fork"
 msgstr "Usuń rozwidlenie"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Podsumowanie"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "Dziennik zmian"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "Pliki"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr "Przełącz do"
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "Opcje"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 #, fuzzy
 msgid "Compare Fork"
 msgstr "Porównaj rozwidlenie"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4396,135 +4565,131 @@
 msgid "Compare"
 msgstr "Porównaj"
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "Szukaj"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr "Odblokowany"
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr "zablokowane"
 
-#: kallithea/templates/base/base.html:176
+#: kallithea/templates/base/base.html:180
 msgid "Follow"
 msgstr "Obserwuj"
 
-#: kallithea/templates/base/base.html:177
+#: kallithea/templates/base/base.html:181
 msgid "Unfollow"
 msgstr "Nie obserwuj"
 
-#: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "Gałąź"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr "Stwórz nowe żądanie połączenia gałęzi"
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr "Pokaż Prośby Pobrania %s"
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr "Pokaż ostatnią aktywność"
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "Dziennik"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "Dziennik publiczny"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr "Wyświetl publiczne gists"
 
-#: kallithea/templates/base/base.html:237
+#: kallithea/templates/base/base.html:241
 msgid "Gists"
 msgstr "Gists"
 
-#: kallithea/templates/base/base.html:241
+#: kallithea/templates/base/base.html:245
 #, fuzzy
 msgid "All Public Gists"
 msgstr "Wszystkie publiczne gists"
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 #, fuzzy
 msgid "My Public Gists"
 msgstr "Moje publiczne gists"
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 #, fuzzy
 msgid "My Private Gists"
 msgstr "Moje prywatne gists"
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr "Szukaj we wszystkich repozytoriach"
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 #, fuzzy
 msgid "My Pull Requests"
 msgstr "Połączone gałęzie"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 #, fuzzy
 msgid "Not Logged In"
 msgstr "Zaloguj się"
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 #, fuzzy
 msgid "Login to Your Account"
 msgstr "Zaloguj się do swojego konta"
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "Nie pamiętasz hasła?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "Wyloguj się"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Repozytoria domyślne"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4558,8 +4723,9 @@
 "użytkownika"
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "Wyświetl"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4585,7 +4751,7 @@
 msgstr "Dodaj kolejny komentarz"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "Zakończyć obserwację tego repozytorium"
 
@@ -4663,6 +4829,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr "potwierdzić odwołanie pozwolenie na {0}: {1} ?"
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 #, fuzzy
 msgid "Specify changeset"
@@ -4693,6 +4867,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4722,10 +4897,6 @@
 msgstr[1] "pokazano %d z  %d rewizji"
 msgstr[2] "pokazano %d z  %d rewizji"
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "Wyświetl"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr "Wyczyść zaznaczenie"
@@ -4743,7 +4914,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, fuzzy, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr "porównaj gałęzie %s"
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4754,10 +4925,12 @@
 
 #: kallithea/templates/changelog/changelog.html:92
 #: kallithea/templates/changelog/changelog_summary_data.html:20
-#, python-format
+#, fuzzy, python-format
+#| msgid "" "Changeset status: %s\n" "Click to open associated pull request
+#| #%s"
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr "Status grupy zmian: %s⏎ Kliknij, aby otworzyć prośby pobrania #%s"
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4767,7 +4940,7 @@
 msgstr "Status grupy zmian: %s"
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4800,7 +4973,7 @@
 msgid "Branch %s"
 msgstr "Gałęzie %s"
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "Nie ma jeszcze zmian"
 
@@ -4816,7 +4989,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr "Dodana"
 
@@ -4846,21 +5019,23 @@
 msgid "Refs"
 msgstr "Gałąź/Etykieta"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr "Dodaj lub prześlij pliki bezpośrednio przez stronę"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Push new repo"
+msgid "Push new repository"
 msgstr "Wyślij zmiany do nowego repo"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr "Istniejące repozytorium?"
 
@@ -4870,15 +5045,15 @@
 msgstr "%s Grupy zmian"
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr "Status grupy zmian"
@@ -4901,7 +5076,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "połącz"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4913,9 +5090,21 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "utworzono"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "utworzono"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
@@ -4923,9 +5112,9 @@
 msgstr[1] "%s pliki zostały zmienione"
 msgstr[2] "%s plików zostało zmienionych"
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
@@ -4933,98 +5122,99 @@
 msgstr[1] "%s plików zostało zmienionych z %s inercjami i %s usunięciami"
 msgstr[2] "%s plików zostało zmienionych z %s inercjami i %s usunięciami"
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 #, fuzzy
 msgid "Show full diff anyway"
 msgstr "Pokaż pełną historię"
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-#, fuzzy
-msgid "Status change from pull request"
-msgstr "Zmiana statusu w grupie zmian"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "revisions"
+msgid "No revisions"
+msgstr "rewizja"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "Komentarz połączenia gałęzi %s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 #, fuzzy
 msgid "No title"
 msgstr "nowy plik"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-#, fuzzy
-msgid "Comment from pull request"
-msgstr "Komentarz połączenia gałęzi %s"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr "Zmiana statusu w grupie zmian"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr "Skomentuj grupę zmian"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy
+#| msgid "No changesets"
+msgid "on this changeset"
+msgstr "Brak zestawienia zmian"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr "%d komentarz"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Ostatnia aktywność"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr "Komentując linię {1}."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr "Komentarze analizowane za pomocą %s składni od %s wsparcia."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 #, fuzzy
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 "Użyj @username wewnątrz tego tekstu, aby wysłać powiadomienie do "
 "użytkownika strony"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
 msgstr "Podgląd komentarza"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:85
+#: kallithea/templates/changeset/changeset_file_comment.html:77
 #, fuzzy
 msgid "Submitting ..."
 msgstr "Przesyłanie..."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:80
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "Komentarz"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
 msgid "Preview"
 msgstr "Podgląd"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "You need to be logged in to comment."
 msgstr "Musisz być zalogowany żeby komentarz."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr "Zaloguj się teraz"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr "Ukryj"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -5032,7 +5222,7 @@
 msgstr[1] "%d komentarzy"
 msgstr[2] "%d komentarzy"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
@@ -5040,7 +5230,7 @@
 msgstr[1] "(%d linii)"
 msgstr[2] "(%d linii)"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, fuzzy, python-format
 msgid "%d general"
 msgid_plural "%d general"
@@ -5048,28 +5238,29 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-#, fuzzy
-msgid "Use @username inside this text to send notification to another local user."
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+#, fuzzy
+#| msgid "Use @username inside this text to notify another user"
+msgid "Use @username inside this text to notify another user."
 msgstr ""
 "Użyj @username wewnątrz tego tekstu, aby wysłać powiadomienie do "
 "użytkownika strony"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr "Zagłosuj na żądanie na grupę zmian"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "Zmiana statusu grupy zmian"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "Bez zmian"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "(zamknięty)"
@@ -5089,7 +5280,7 @@
 msgstr "Pokaż pełną edycję tego pliku"
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr "Pokaż pełną listę zmian i różnic obok siebie"
@@ -5098,12 +5289,12 @@
 msgid "Show inline comments"
 msgstr "Pokaż online komentarz"
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 #, fuzzy
 msgid "Deleted"
 msgstr "usuń"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 #, fuzzy
 msgid "Renamed"
 msgstr "zmień nazwę"
@@ -5116,32 +5307,44 @@
 msgid "Ancestor"
 msgstr "Przodek"
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 #, fuzzy
 msgid "Show merge diff"
 msgstr "Pokaż pełną historię"
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 #, fuzzy
 msgid "Common ancestor"
 msgstr "Skomentuj grupę zmian"
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 #, fuzzy
 msgid "is"
 msgstr "Gist"
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr "%s Zestawienie zmian"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 #, fuzzy
 msgid "behind"
 msgstr "Indeksuj ponownie"
@@ -5166,7 +5369,7 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
@@ -5174,49 +5377,36 @@
 msgstr[1] "Pokaż %s komentarze"
 msgstr[2] "Pokaż %s komentarze"
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr "Brak plików"
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr "Pokaż pełną historię"
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Repozytorium mercurial"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Repozytorium git"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "Publiczne repozytorium"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "Nie ma jeszcze zestawienia zmian"
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "Subskrybuj %s kanał rss"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "Subskrybuj %s kanał atom"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5344,10 +5534,6 @@
 msgid "Commit Changes"
 msgstr "Zatwierdź zmiany"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr "rewizja"
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr "poprzednia wersja"
@@ -5373,19 +5559,15 @@
 msgstr "Rozmiar"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "Typ MIME"
+msgid "Last Revision"
+msgstr "Rewizja"
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
-msgstr "Rewizja"
-
-#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Modified"
 msgstr "Ostatnio modyfikowany"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Committer"
 msgstr "Autor"
@@ -5501,8 +5683,8 @@
 msgstr "Obserwatorzy %s"
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "Obserwuje"
 
@@ -5554,8 +5736,8 @@
 msgstr "Gałąź %s"
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr "Gałęzie"
 
@@ -5563,7 +5745,7 @@
 msgid "Forked"
 msgstr "Rozgałęziony"
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "Nie ma jeszcze gałęzi"
 
@@ -5576,19 +5758,13 @@
 msgstr "Dziennik kanału RSS"
 
 #: kallithea/templates/journal/journal.html:56
-#, fuzzy
-msgid "My Repos"
-msgstr "Moje repo"
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr "Moje Repozytoria"
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr "Brak wpisów jeszcze"
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "Dziennik Publiczny"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "Publiczny dziennik kanału ATOM"
@@ -5631,22 +5807,17 @@
 msgid "Destination repository"
 msgstr "Repozytorium docelowe"
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-#, fuzzy
-msgid "Pull Request Reviewers"
-msgstr "Recenzje wniosków połączenia gałęzi"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 #, fuzzy
 msgid "No entries"
 msgstr "Brak wpisów jeszcze"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "odwołane"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5655,52 +5826,51 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, fuzzy, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-#, fuzzy
-msgid "Delete Pull Request"
-msgstr "Nowa prośba o połączenie gałęzi"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr "Potwierdź usunięcie połączenia gałęzi"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr "Zamknięte"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+#, fuzzy
+msgid "Delete Pull Request"
+msgstr "Nowa prośba o połączenie gałęzi"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr "Potwierdź usunięcie połączenia gałęzi"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this pull request"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "Potwierdź usunięcie połączenia gałęzi"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
+#, fuzzy, python-format
+#| msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr "%s Połączonych gałęzi #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, fuzzy, python-format
-msgid "Pull request #%s from %s#%s"
-msgstr ""
+#| msgid "Pull Requests from %s'"
+msgid "Pull request %s from %s#%s"
+msgstr "Połączonych gałęzi #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
 #, fuzzy
@@ -5716,11 +5886,11 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr "Nie ma jeszcze recenzenta"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
@@ -5728,83 +5898,84 @@
 msgstr[1] "%d recenzenci"
 msgstr[2] "%d recenzentów"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr "Połączenie gałęzi zostało zweryfikowane przez wszystkich recenzentów"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "Nie ma jeszcze gałęzi"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy
 msgid "on"
 msgstr "brak"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr "Pobierz zmiany"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 #, fuzzy
 msgid "Created by"
 msgstr "utworzono"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 #, fuzzy
 msgid "Update"
 msgstr "[zaktualizowany] użytkownik"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr "właściciel"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr "recenzent"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+#, fuzzy
+msgid "Pull Request Reviewers"
+msgstr "Recenzje wniosków połączenia gałęzi"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr "recenzent"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr "Podgląd komentarza"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 #, fuzzy
 msgid "Save as New Pull Request"
 msgstr "Otwórz nową prośbę o połączenie gałęzi"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "Ostatnia aktywność"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 #, fuzzy
 msgid "Pull Request Content"
 msgstr "Wniosek połączenia zmienił status"
@@ -5909,8 +6080,8 @@
 msgstr "%s RSS"
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr "Włącz"
 
@@ -5918,45 +6089,45 @@
 msgid "Stats gathered: "
 msgstr "Statystyki zebrane: "
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "pliki"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr "Pokaż więcej"
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "komunikaty"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "pliki dodane"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "pliki zmienione"
+msgid "files added"
+msgstr "pliki dodane"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "pliki zmienione"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "pliki usunięte"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "komunikaty"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "plik dodany"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "plik zmieniony"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "plik usunięty"
 
@@ -5978,67 +6149,78 @@
 msgid "Fork of"
 msgstr "Gałąź z"
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr "Pokaż nazwę"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "Klonuj z"
+
+#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+msgid "Clone URL"
+msgstr "Url klonowania"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr "Pokaż nazwę"
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr "Pokaż ID"
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr "Statystyki"
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "Pobierz"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "Nie pobrano jeszcze plików"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "Pliki do pobrania są zostały wyłączone dla tego repozytorium"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr "Pobierz jako zip"
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr "Zaznacz tu żeby pobrać archiwum z subrepozytorium"
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
+#: kallithea/templates/summary/summary.html:125
+#, fuzzy
+#| msgid "with subrepos"
+msgid "With subrepos"
 msgstr "z subrepozytorium"
 
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr "Rozmiar Repozytorium"
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr "Kanał RSS"
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "Ostatnia aktywność"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 #, fuzzy
 msgid "Quick Start"
 msgstr "Szybki start"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "Pobierz %s jak %s"
@@ -6052,3 +6234,331 @@
 #, fuzzy
 msgid "Compare Tags"
 msgstr "Porównaj tagi"
+
+#~ msgid "increase diff context to %(num)s lines"
+#~ msgstr ""
+
+#~ msgid "No comments."
+#~ msgstr "Brak komentarzy."
+
+#~ msgid "public journal"
+#~ msgstr "Dziennik publiczny"
+
+#~ msgid "journal"
+#~ msgstr "dziennik"
+
+#~ msgid "bad captcha"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr "Zablokowane repozytorium"
+
+#~ msgid "Unlocked repository"
+#~ msgstr "Odblokowane repozytorium"
+
+#~ msgid "Unlocked"
+#~ msgstr "Odblokowany"
+
+#~ msgid "Locked"
+#~ msgstr "Zablokowany"
+
+#~ msgid "Repository has been %s"
+#~ msgstr "Repozytoriów jest %s"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "Nie możesz edytować tego użytkownika"
+
+#~ msgid "No Files"
+#~ msgstr "Brak Plików"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "Nazwa użytkownika \"%(username)s\" jest zabroniona"
+
+#~ msgid "invalid user name"
+#~ msgstr "niepoprawna nazwa użytkownika"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "Twoje konto jest wyłączone"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "nieprawidłowe url klonowania"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr "Nieprawidłowe url klonowania, wstaw prawidłowy url http(s)/svn+http(s)"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+#~ "Rewizja  %(revs)s jest już częścią  "
+#~ "nowej gałęzi więc określ jego status"
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr "Domyślne"
+
+#~ msgid "My Emails"
+#~ msgstr "Moje Emaile"
+
+#~ msgid "Watched"
+#~ msgstr "Obserwowane"
+
+#~ msgid "My Permissions"
+#~ msgstr "Moje uprawnienia"
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr "usuń"
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "Uprawnienia administracji"
+
+#~ msgid "Overview"
+#~ msgstr "Podgląd"
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr "Nadpisz ustawienia"
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "Domyślne uprawnienia"
+
+#~ msgid "none"
+#~ msgstr "brak"
+
+#~ msgid "read"
+#~ msgstr "odczyt"
+
+#~ msgid "write"
+#~ msgstr "zapis"
+
+#~ msgid "admin"
+#~ msgstr "administracja"
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "Opcjonalnie http[s] url z którego repozytorium powinno być klonowane."
+
+#~ msgid "Remote URL"
+#~ msgstr "Url klonowania"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "Pobierz z zdalnej lokalizacji"
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr "Brak zmiennej id"
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "edycja"
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr "Zniszcz stare dane"
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "Domyślne uprawnienia"
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "Zmiana statusu w grupie zmian"
+
+#~ msgid "Status change on changeset"
+#~ msgstr "Zmiana statusu w grupie zmian"
+
+#~ msgid "Comment on changeset"
+#~ msgstr "Skomentuj grupę zmian"
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+#~ "Użyj @username wewnątrz tego tekstu, aby"
+#~ " wysłać powiadomienie do użytkownika strony"
+
+#~ msgid "revision"
+#~ msgstr "rewizja"
+
+#~ msgid "Mimetype"
+#~ msgstr "Typ MIME"
+
+#~ msgid "My Repos"
+#~ msgstr "Moje repo"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr "właściciel"
+
+#~ msgid "reviewer"
+#~ msgstr "recenzent"
+
--- a/kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -6,7 +6,7 @@
 # gnustavo <gustavo@gnustavo.com>, 2013
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
 "POT-Creation-Date: 2015-04-01 03:17+0200\n"
 "PO-Revision-Date: 2014-02-13 14:34+0000\n"
@@ -19,19 +19,23 @@
 "Content-Transfer-Encoding: 8bit\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Não há nenhum changeset ainda"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "Nenhum"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(fechado)"
 
@@ -46,53 +50,57 @@
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr ""
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr ""
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-#, fuzzy
-msgid "No comments."
-msgstr "%d comentário"
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr "Mudar o estado de um changeset associado a um pull request não é permitido"
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr ""
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "revisions"
+msgid "No response"
+msgstr "revisões"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 "A requisição não pôde ser compreendida pelo servidor devido à sintaxe mal"
 " formada."
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "Acesso não autorizado ao recurso"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "Você não tem permissão para ver esta página"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "O recurso não pôde ser encontrado"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -110,17 +118,17 @@
 msgid "%s %s feed"
 msgstr "%s - feed %s"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr "Conjunto de mudanças era grande demais e foi cortado..."
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr "%s commitados em %s"
@@ -198,45 +206,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr "O caminho deve ser relativo e não pode conter .."
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Downloads desabilitados"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Revisão desconhecida %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Repositório vazio"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "Tipo de arquivo desconhecido"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Conjuntos de mudanças"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Ramos"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Etiquetas"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Ocorreu um erro ao bifurcar o repositório %s"
@@ -252,9 +258,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Repositórios"
 
@@ -274,26 +280,31 @@
 msgstr ""
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
-msgstr "diário público"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
+msgstr "Diário Público"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr "diário"
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr ""
-
-#: kallithea/controllers/login.py:194
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr "Diário"
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr ""
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr "Você foi registrado no Kallithea com sucesso"
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "Seu link de reinicialização de senha foi enviado"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
@@ -301,124 +312,137 @@
 "Sua reinicialização de senha foi bem sucedida, sua senha foi enviada ao "
 "seu e-mail"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, fuzzy, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "Conjunto de Mudanças"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr "Especial"
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr "Ramos pares"
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Marcadores"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 #, fuzzy
 msgid "No description"
 msgstr "Descrição"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "Novo pull request criado com sucesso"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 #, fuzzy
 msgid "Error occurred while creating pull request"
 msgstr "Ocorreu um erro durante o envio do pull request"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 #, fuzzy
 msgid "Pull request update created"
 msgstr "Revisores do pull request"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 #, fuzzy
 msgid "Pull request updated"
 msgstr "Pull requests para %s"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "Pull request excluído com sucesso"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+#, fuzzy
+#| msgid "Vote for pull request status"
+msgid "No permission to change pull request status"
+msgstr "Vote para estado do pull request"
+
+#: kallithea/controllers/pullrequests.py:715
 #, fuzzy
 msgid "Closing."
 msgstr "carregando ..."
@@ -436,22 +460,22 @@
 msgid "An error occurred during search operation."
 msgstr "Ocorreu um erro durante essa operação de busca"
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 #, fuzzy
 msgid "No data ready yet"
 msgstr "Ainda não há dados carregados"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "As estatísticas estão desabillitadas para este repositório"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -464,38 +488,40 @@
 msgstr "Ocorreu um erro durnge a atualização dos padrões"
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+#, fuzzy
+#| msgid "forever"
+msgid "Forever"
 msgstr "para sempre"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "cinco minutos"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "uma hora"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "um dia"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "um mês"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -509,8 +535,10 @@
 msgstr "Gist %s excluído"
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
-msgstr ""
+#, fuzzy
+#| msgid "Last Modified"
+msgid "Unmodified"
+msgstr "Última alteração"
 
 #: kallithea/controllers/admin/gists.py:262
 msgid "Successfully updated gist content"
@@ -525,117 +553,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr "Você não pode editar esse usuário pois ele é crucial para toda a aplicação"
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "Sua conta foi atualizada com sucesso"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr "Ocorreu um erro durante a atualização do usuário %s"
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "Email %s adicionado ao usuário"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Ocorreu um erro durante o salvamento do email"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "Email removido do usuário"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
-msgstr ""
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "Ler"
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "Ler"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "Gravar"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "Gravar"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "Administrador"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "Desabilitado"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr "Permitido com ativação manual de conta"
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr "Permitido com ativação automática de conta"
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -643,11 +687,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr "Ativação manual de conta externa"
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -655,221 +699,212 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr "Ativação automática de conta externa"
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "Habilitado"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr "Ocorreu um erro durante a atualização das permissões"
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr "Ocorreu um erro durante a criação do grupo de repositórios %s"
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr "Grupo de repositórios %s criado"
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr "Ocorreu um erro durante a criação do grupo de repositórios %s"
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr "Grupo de repositórios %s atualizado"
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "Ocorreu um erro durante a atualização do grupo de repositórios %s"
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "Esse grupo contém %s repositórios e não pode ser excluído"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Este grupo contém %s subgrupos e não pode ser excluído"
 
-#: kallithea/controllers/admin/repo_groups.py:302
+#: kallithea/controllers/admin/repo_groups.py:297
 #, python-format
 msgid "Removed repository group %s"
 msgstr "Grupo de repositórios %s excluído"
 
-#: kallithea/controllers/admin/repo_groups.py:307
+#: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr "Ocorreu um erro durante a exclusão do grupo de repositórios %s"
 
-#: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
 #: kallithea/controllers/admin/user_groups.py:340
 msgid "Cannot revoke permission for yourself as admin"
 msgstr "Você não pode revocar sua própria permissão de administrador"
 
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
+#: kallithea/controllers/admin/repo_groups.py:420
+msgid "Repository group permissions updated"
 msgstr "Permissões atualizadas do Grupo de Repositórios"
 
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr "Ocorreu um erro durante a revocação das permissões"
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "Erro ao criar repositório %s"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr "Repositório %s criado de %s"
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "Repositório %s bifurcado como %s"
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr "Repositório %s criado"
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Repositório %s atualizado com sucesso"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "Ocorreu um erro durante a atualização do repositório %s"
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr "%s bifurcações excluídas"
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr "Repositório %s excluído"
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
+#: kallithea/controllers/admin/repos.py:321
+#, fuzzy, python-format
+#| msgid "Cannot delete %s it still contains attached forks"
+msgid "Cannot delete repository %s which still has forks"
 msgstr "Nao é possível excluir %s pois ele ainda contém bifurcações vinculadas"
 
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Ocorreu um erro durante a exclusão de %s"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr "Permissões do repositório atualizadas"
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr "Ocorreu um erro durante a criação do campo"
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr "Ocorreu um erro durante a remoção do campo"
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "Atualizada a visibilidade do repositório no diário público"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr "Ocorreu um erro ao ajustar esse repositório no diário público"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "Descompasso de Token"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "Nada"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "Marcado repositório %s como bifurcação de %s"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "Ocorreu um erro durante essa operação"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been locked"
+msgstr "Repositório não está travado"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been unlocked"
+msgstr "Repositório não está travado"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "Ocorreu um erro durante o destravamento"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "Destravado"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "Travado"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "Ocorreu um erro ao invalidar o cache"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "Realizado pull de localização remota"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "O repositório foi %s"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "Ocorreu um erro ao invalidar o cache"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "Realizado pull de localização remota"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr "Ocorreu um erro ao realizar pull de localização remota"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "Ocorreu um erro ao excluir estatísticas de repositório"
 
@@ -885,7 +920,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr "Ocorreu um erro durante a atualização das configurações da aplicação"
 
 #: kallithea/controllers/admin/settings.py:213
@@ -962,83 +997,80 @@
 msgstr "O grupo destino não pode ser o mesmo"
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr "Permissões do Grupo de Usuários atualizadas"
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr "Permissões atualizadas"
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "Ocorreu um erro durante o salvamento das permissões"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr "Usuário %s criado"
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr "Ocorreu um erro durante a criação do usuário %s"
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "Usuário atualizado com sucesso"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr "Usuário excluído com sucesso"
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "Ocorreu um erro ao excluir o usuário"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "Você não pode editar esse usuário"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
 msgstr "Ocorreu um erro durante o salvamento do IP"
 
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:745
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr "IP %s não permitido"
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "Você precisa ser um usuário registrado para realizar essa ação"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "Você precisa estar logado para ver essa página"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "Conjunto de alterações não encontrado"
 
@@ -1056,158 +1088,164 @@
 msgid "No changes detected"
 msgstr "Nenhuma alteração detectada"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "Excluído ramo: %s"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "Tag criada: %s"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Ver todos os conjuntos de mudanças combinados %s->%s"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "comparar exibir"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "e"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "%s mais"
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "revisões"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "fork name %s"
+msgid "Fork name %s"
 msgstr "nome da bifurcação %s"
 
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "Pull request %s"
 msgstr "Pull request #%s"
 
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "repositório [excluído]"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "repositório [criado]"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "repositório [criado] como uma bifurcação"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "repositório [bifurcado]"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "repositório [atualizado]"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr "[baixado] archive do repositório"
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "[excluir] repositório"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "usuário [criado]"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "usuário [atualizado]"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr "[criado] grupo de usuários"
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr "[atualizado] grupo de usuários"
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "[comentado] em revisão no repositório"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "[comentado] no pull request para"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "[fechado] pull request para"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[realizado push] para"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "[commitado via Kallithea] no repositório"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "[pulled do remote] no repositório"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[realizado pull] a partir de"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "[passou a seguir] o repositório"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "[parou de seguir] o repositório"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " e mais %s"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "Nenhum Arquivo"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr "Nenhum arquivo"
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr "novo arquivo"
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr "mod"
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr "excluir"
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr "renomear"
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr "chmod"
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1218,69 +1256,69 @@
 "renomeado a partir do sistema de arquivos. Por favor, execute a aplicação"
 " outra vez para varrer novamente por repositórios"
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d ano"
 msgstr[1] "%d anos"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d mês"
 msgstr[1] "%d meses"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d dia"
 msgstr[1] "%d dias"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d hora"
 msgstr[1] "%d horas"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d minuto"
 msgstr[1] "%d minutos"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d segundo"
 msgstr[1] "%d segundos"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "em %s"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "%s atrás"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "em %s e %s"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s e %s atrás"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "agora há pouco"
 
@@ -1295,7 +1333,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "Nenhum acesso ao repositório"
 
@@ -1310,7 +1348,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "Acesso de leitura ao repositório"
 
@@ -1325,7 +1363,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "Acesso de escrita ao repositório"
 
@@ -1340,7 +1378,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "Acesso administrativo ao repositório"
 
@@ -1379,7 +1417,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Administrador do Kallithea"
 
@@ -1394,7 +1432,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "Criação de repositórios desabilitada"
 
@@ -1409,7 +1447,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "Criação de repositórios habilitada"
 
@@ -1424,7 +1462,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "Bifurcação de repositórios desabilitada"
 
@@ -1439,7 +1477,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "Bifurcação de repositórios habilitada"
 
@@ -1475,7 +1513,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "Não Revisado"
 
@@ -1490,7 +1528,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "Aprovado"
 
@@ -1505,7 +1543,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "Rejeitado"
 
@@ -1520,7 +1558,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "Sob Revisão"
 
@@ -1532,7 +1570,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr "nível superior"
 
@@ -1544,7 +1582,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr "Sem acesso ao grupo de repositórios"
 
@@ -1556,7 +1594,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr "Acesso de leitura ao grupo de repositórios"
 
@@ -1568,7 +1606,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr "Acesso de escrita ao grupo de repositórios"
 
@@ -1580,7 +1618,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr "Acesso administrativo ao grupo de repositórios"
 
@@ -1591,7 +1629,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr "Sem acesso ao grupo de usuários"
 
@@ -1602,7 +1640,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr "Acesso de leitura ao grupo de usuários"
 
@@ -1613,7 +1651,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr "Acesso de escrita ao grupo de usuários"
 
@@ -1624,7 +1662,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr "Acesso administrativo ao grupo de usuários"
 
@@ -1635,7 +1673,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr "Criação de Grupo de Repositórios desatilibada"
 
@@ -1646,7 +1684,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr "Criação de Grupo de Repositórios habilitada"
 
@@ -1657,7 +1695,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr "Criação de Grupo de Usuários desabilitada"
 
@@ -1668,7 +1706,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr "Criação de Grupo de Usuários habilitada"
 
@@ -1679,7 +1717,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr "Registro desatilitado"
 
@@ -1690,7 +1728,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr "Registro de Usuário com ativação manual de conta"
 
@@ -1701,29 +1739,149 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr "Registro de Usuário com ativação automática de conta"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "na linha %s"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[Menção]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "Acesso não autorizado ao recurso"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "Acesso não autorizado ao recurso"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Only admins can create repository groups"
+msgstr "Grupo de repositórios %s criado"
+
+#: kallithea/model/db.py:1683
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Non-admins can create repository groups"
+msgstr "Grupo de repositórios %s criado"
+
+#: kallithea/model/db.py:1685
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Only admins can create user groups"
+msgstr "Criar grupos de usuários"
+
+#: kallithea/model/db.py:1686
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Non-admins can create user groups"
+msgstr "Criar grupos de usuários"
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Criar repositórios"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Invalidate cache for all repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Invalidar o cache para todos os repositórios"
+
+#: kallithea/model/db.py:1698
+#, fuzzy
+#| msgid "User Registration with manual account activation"
+msgid "User registration with manual account activation"
+msgstr "Registro de Usuário com ativação manual de conta"
+
+#: kallithea/model/db.py:1699
+#, fuzzy
+#| msgid "User Registration with automatic account activation"
+msgid "User registration with automatic account activation"
+msgstr "Registro de Usuário com ativação automática de conta"
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "Não Revisado"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "Sob Revisão"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "Por favor entre um login"
@@ -1742,97 +1900,130 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Entre com %(min)i caracteres ou mais"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
+#: kallithea/model/notification.py:254
+#, fuzzy, python-format
+#| msgid "%(user)s commented on changeset at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
+msgstr "%(user)s comentou no changeset em %(when)s"
+
+#: kallithea/model/notification.py:255
+#, fuzzy, python-format
+#| msgid "%(user)s sent message at %(when)s"
+msgid "%(user)s sent message %(age)s"
+msgstr "%(user)s enviou mensagem em %(when)s"
+
+#: kallithea/model/notification.py:256
+#, fuzzy, python-format
+#| msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
+msgstr "%(user)s mencionou-o em %(when)s"
+
+#: kallithea/model/notification.py:257
+#, fuzzy, python-format
+#| msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr "%(user)s registrou-se no Kallithea em %(when)s"
+
+#: kallithea/model/notification.py:258
+#, fuzzy, python-format
+#| msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "%(user)s abriu um novo pull request em %(when)s"
+
+#: kallithea/model/notification.py:259
+#, fuzzy, python-format
+#| msgid "%(user)s commented on pull request at %(when)s"
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "%(user)s comentou no pull request em %(when)s"
+
+#: kallithea/model/notification.py:266
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s comentou no changeset em %(when)s"
 
-#: kallithea/model/notification.py:253
+#: kallithea/model/notification.py:267
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s enviou mensagem em %(when)s"
 
-#: kallithea/model/notification.py:254
+#: kallithea/model/notification.py:268
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s mencionou-o em %(when)s"
 
-#: kallithea/model/notification.py:255
+#: kallithea/model/notification.py:269
 #, python-format
 msgid "%(user)s registered in Kallithea at %(when)s"
 msgstr "%(user)s registrou-se no Kallithea em %(when)s"
 
-#: kallithea/model/notification.py:256
+#: kallithea/model/notification.py:270
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s abriu um novo pull request em %(when)s"
 
-#: kallithea/model/notification.py:257
+#: kallithea/model/notification.py:271
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s comentou no pull request em %(when)s"
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, fuzzy, python-format
-msgid "New user %(new_username)s registered"
-msgstr "O username \"%(new_username)s\" não é válido"
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, fuzzy, python-format
+msgid "New user %(new_username)s registered"
+msgstr "O username \"%(new_username)s\" não é válido"
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 #, fuzzy
 msgid "Closing"
 msgstr "Usando"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#: kallithea/model/pull_request.py:137
+#, fuzzy, python-format
+#| msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 msgstr "%(user)s solicita sua revisão no pull request $%(pr_id)s: %(pr_title)s"
 
-#: kallithea/model/scm.py:808
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "tip mais recente"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr "Novo registro de usuário"
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-"Você não pode Editar esse usuário, pois ele é crucial para toda a "
-"aplicação"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr ""
 "Você não pode remover esse usuário, pois ele é crucial para toda a "
 "aplicação"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
@@ -1841,7 +2032,7 @@
 "usuário \"%s\" ainda é dono de %s repositórios e não pode ser removido. "
 "Troque os donos ou remova esses repositórios. %s"
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
@@ -1850,7 +2041,7 @@
 "usuário \"%s\" ainda é dono de %s repositórios e não pode ser removido. "
 "Troque os donos ou remova esses repositórios. %s"
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
@@ -1859,60 +2050,65 @@
 "usuário \"%s\" ainda é dono de %s repositórios e não pode ser removido. "
 "Troque os donos ou remova esses repositórios. %s"
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr "Link para trocar senha"
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr "Sua nova senha"
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr "Sua nova senha no Kallithea: %s"
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "O valor não pode ser uma lista vazia"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "O username \\\"%(username)s\\\" já existe"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "O username \\\"%(username)s\\\" é proibido"
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, fuzzy, python-format
+#| msgid "Username %(username)s is not valid"
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "O username \"%(username)s\" não é válido"
+
+#: kallithea/model/validators.py:99
+#, fuzzy
+#| msgid "" "Username may only contain alphanumeric characters underscores,
+#| periods or" " dashes and must begin with alphanumeric character or
+#| underscore"
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
+" dashes and must begin with an alphanumeric character or underscore"
 msgstr ""
 "Nome de usuário pode conter somente caracteres alfanuméricos, sublinha, "
 "pontos e hífens e deve iniciar com caractere alfanumérico"
 
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "O username \"%(username)s\" não é válido"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr "Nome inválido de grupo de usuários"
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr "O grupo de usuários \"%(usergroup)s\" já existe"
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
@@ -1921,108 +2117,112 @@
 "underscores, pontos ou hífens, e deve começar om um caractere alfa-"
 "numérico"
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "Não é possível associar esse grupo como progenitor"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "O grupo \\\"%(group_name)s\\\" já existe"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "Um repositório com o nome \"%(group_name)s\" já existe"
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "Caracteres inválidos (não-ascii) na senha"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "Senhas não conferem"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "senha inválida"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "nome de usuário inválido"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "Sua conta está desabilitada"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "Descompasso de Token"
+
+#: kallithea/model/validators.py:345
+#, fuzzy, python-format
+#| msgid "Repository name %(repo)s is disallowed"
+msgid "Repository name %(repo)s is not allowed"
 msgstr "O nome de repositório %(repo)s não é permitido"
 
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "Um repositório chamado %(repo)s já existe"
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr "Um repositório \"%(repo)s\" já existe no grupo \"%(group)s\""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr "Um Grupo de Repositórios chamado \"%(repo)s\" já existe"
 
-#: kallithea/model/validators.py:474
-#, fuzzy
-msgid "invalid clone URL"
-msgstr "URL de clonagem inválida"
-
-#: kallithea/model/validators.py:475
-#, fuzzy
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr "URL inválida, por favor, forneça uma URL de clone http(s)/svn+http(s)"
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "repositório privado"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "A bifurcação deve ser do mesmo tipo que o pai"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr "Você não tem permissão para criar um repositório neste grupo"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr "você não tem permissão para criar um repositório na raiz"
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr "Você não tem permissão para criar um grupo neste local"
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr "Este nome de usuário ou de grupo de usuários não é válido"
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "Esse não é um caminho válido"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "Esse endereço de e-mail já está tomado"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "o e-mail \"%(email)s\" não existe."
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
@@ -2030,31 +2230,24 @@
 "O atributo de login LDAP do CN deve ser especificado - isto é o nome do "
 "atributo que é equivalente ao 'nome de usuário'"
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-"As revisões %(revs)s já fazem parte de um pull request ou já setaram o "
-"estado"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
 msgstr "Por favor, forneça um endereço válido IPv4 ou IPv6"
 
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr "O tamanho da rede (bits) deve estar no intervalo 0-32 (não %(bits)r)"
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr "O nome da chave só pode conter letras, underscore, hífen ou dígitos"
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr "O nome de arquivo não pode estar dentro de um diretório"
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2116,13 +2309,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2134,11 +2327,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "Descrição"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2159,11 +2352,11 @@
 msgid "Name"
 msgstr "Nome"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "Última Alteração"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2172,18 +2365,19 @@
 msgid "Tip"
 msgstr "Ponta"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "Dono"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2195,7 +2389,7 @@
 msgid "Click to sort ascending"
 msgstr "Clique para ordenar em ordem crescente"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2207,11 +2401,11 @@
 msgid "Click to sort descending"
 msgstr "Clique para ordenar em ordem descrescente"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr "Nenhum repositório encontrado."
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2223,10 +2417,10 @@
 msgid "Data error."
 msgstr "Erro de dados."
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2236,7 +2430,7 @@
 msgstr "Carregando..."
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "Entrar"
 
@@ -2245,39 +2439,39 @@
 msgid "Log In to %s"
 msgstr "Log in em %s"
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "Nome de usuário"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "Senha"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "Lembre-se de mim"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "Esqueceu sua senha ?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "Não possui uma conta ?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "Entrar"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "Esqueceu sua senha ?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "Não possui uma conta ?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr "Senha Trocada"
@@ -2330,26 +2524,26 @@
 msgstr "Repita a senha"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "Primeiro Nome"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "Último Nome"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "E-mail"
 
@@ -2460,75 +2654,61 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "Salvar"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
+#: kallithea/templates/admin/defaults/defaults.html:11
+#: kallithea/templates/base/base.html:66
 #, fuzzy
 msgid "Repository Defaults"
 msgstr "Padrões de repositórios"
 
-#: kallithea/templates/admin/defaults/defaults.html:11
-#: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr "Padrões"
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "Tipo"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "Repositório privado"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
@@ -2537,34 +2717,34 @@
 "Repositórios privados são visíveis somente por pessoas explicitamente "
 "adicionadas como colaboradores."
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "Habilitar estatísticas"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "Habilitar janela de estatísticas na página de sumário."
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "Habilitar downloads"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "Habilitar menu de descarregar na página de sumário."
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "Habilitar travas"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr "Habilitar trava-por-pulling no repositório."
 
@@ -2596,6 +2776,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr "Expira"
 
@@ -2606,7 +2792,9 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+#, fuzzy
+#| msgid "never"
+msgid "Never"
 msgstr "nunca"
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2614,7 +2802,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "Cancelar"
 
@@ -2637,12 +2825,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr "Criado"
 
@@ -2668,25 +2856,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2716,11 +2906,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "Excluir"
 
@@ -2729,9 +2930,18 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2757,7 +2967,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "Minha Conta"
 
@@ -2766,84 +2976,88 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
-msgstr ""
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "Novo endereço de email"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr ""
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "repositórios"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "Seguindo"
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "Criar repositórios"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-#, fuzzy
-msgid "My Permissions"
-msgstr "Minhas permissões"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+#, fuzzy
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "Copiar permissões"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to reset this API key: %s"
+msgstr "Confirme para excluir este IP: %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
-msgstr ""
+#, fuzzy
+#| msgid "Expires"
+msgid "Expired"
+msgstr "Expira"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to remove this API key: %s"
+msgstr "Confirme para excluir este IP: %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
-msgstr ""
+#, fuzzy
+#| msgid "Removed"
+msgid "Remove"
+msgstr "Removido"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
-msgstr ""
+#, fuzzy
+#| msgid "New field key"
+msgid "New API key"
+msgstr "Próxima chave de campo"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2856,19 +3070,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "excluir"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2890,19 +3091,24 @@
 msgid "Change Your Account Password"
 msgstr "Sua nova senha"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "Nova senha"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "Altere o seu avatar em"
@@ -2923,13 +3129,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2967,7 +3167,7 @@
 msgstr "Comentários"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr "Pull Requests"
 
@@ -2987,22 +3187,16 @@
 msgstr "Mostrar notificação"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "Notificações"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-#, fuzzy
-msgid "Permissions Administration"
-msgstr "Administração de permissões"
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "Permissões"
+#, fuzzy
+msgid "Default Permissions"
+msgstr "Permissões padrão"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -3010,14 +3204,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "Acesso anônimo"
@@ -3029,7 +3219,7 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
@@ -3039,16 +3229,20 @@
 "permissão escolhida, note que todas as permissões padrão customizadas nos"
 " repositórios serão perdidas"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Existing repository?"
+msgid "Apply to all existing repositories"
+msgstr "Repositório existente?"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
-msgstr "Sobrescrever as configurações existentes"
+msgid "Permissions for the Default user on new repositories."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "Grupo de repositórios"
@@ -3063,77 +3257,112 @@
 "modificadas para a permissão escolhida, note que todas as permissões "
 "padrão customizadas em grupos de repositórios serão perdidas"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy, python-format
+#| msgid "Updated repository group %s"
+msgid "Apply to all existing repository groups"
+msgstr "Grupo de repositórios %s atualizado"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr "Grupo de usuários"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
+#, fuzzy
+#| msgid "" "All default permissions on each user group will be reset to chosen
+#| " "permission, note that all custom default permission on repository groups
+#| " "will be lost"
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
 msgstr ""
 "Todas as permissões padrão em cada repositório serão reinicializadas para"
 " as permissões escolhidas. Note que todas as permissões padrão "
 "customizadas nos repositórios serão perdidas"
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "Criação de repositório"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid ""
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr "Criação de grupo de usuários"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr "Bifurcação de repositório"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "Registro"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr "Ativação de autenticação de conta externa"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
 msgstr "Confirme para excluir este IP: %s"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 #, fuzzy
 msgid "All IP addresses are allowed."
 msgstr "Todos os endereços IP são permitidos"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr "Novo endereço IP"
 
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-#, fuzzy
-msgid "Default User Permissions Overview"
-msgstr "Permissões padrão"
-
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:105
@@ -3155,12 +3384,12 @@
 msgstr "Progenitor do grupo"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3178,19 +3407,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "Configurações"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr ""
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "Permissões"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3211,12 +3446,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "Criado em"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3227,39 +3462,13 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "nenhum"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "ler"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "escrever"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "administrador"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
-msgstr ""
+#, fuzzy
+#| msgid "User group"
+msgid "User/User Group"
+msgstr "Grupo de usuários"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:45
@@ -3267,7 +3476,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "padrão"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3276,14 +3487,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "revogar"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3291,7 +3499,9 @@
 msgstr "Adicionar novo"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+#, fuzzy
+#| msgid "apply to children"
+msgid "Apply to children"
 msgstr "aplicar aos filhos"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3345,45 +3555,43 @@
 msgid "Number of Top-level Repositories"
 msgstr "Número de repositórios de nível superior"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "Clonar de"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-#, fuzzy
-msgid "Optional URL from which repository should be cloned."
-msgstr "URL opcional http[s] da qual o repositório deve ser clonado."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "repositório [criado]"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 "Seja sucinto e objetivo. Use um arquivo README para descrições mais "
 "longas."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr "Opcionalmente selecione um grupo no qual colocar esse repositório."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "Tipo de repositório a criar."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "Revisão de pouso"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3431,8 +3639,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "Estatísticas"
 
@@ -3459,16 +3667,16 @@
 msgid "Public Journal Visibility"
 msgstr "diário público"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "Remover do diário público"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 #, fuzzy
 msgid "Add to Public Journal"
 msgstr "diário público"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 #, fuzzy
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
@@ -3477,36 +3685,36 @@
 "Todas as ações feitas nesse repositório serão acessíveis a todos no "
 "diário público"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 #, fuzzy
 msgid "Change Locking"
 msgstr "Habilitar travas"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 #, fuzzy
 msgid "Confirm to unlock repository."
 msgstr "Confirme para destravar repositório"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 #, fuzzy
 msgid "Unlock Repository"
 msgstr "Repositório público"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 #, fuzzy
 msgid "Confirm to lock repository."
 msgstr "Confirme para travar repositório"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 #, fuzzy
 msgid "Lock Repository"
 msgstr "Repositório público"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "Repositório não está travado"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3514,33 +3722,33 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "Confirma excluir esse repositório: %s"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr "[excluir] repositório"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] "este repositório tem %s bifurcação"
 msgstr[1] "este repositório tem %s bifurcações"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr "Desassociar bifurcações"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr "Excluir bifurcações"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3584,8 +3792,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "Ativo"
@@ -3625,31 +3833,38 @@
 msgstr "Registro desabilitado"
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "repositório privado"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-#, fuzzy
-msgid "Remote URL"
-msgstr "URL de clonagem"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Pull Changes from Remote Location"
-msgstr "Realizar pull de alterações a partir de localização remota"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-#, fuzzy
-msgid "Confirm to pull changes from remote side."
+#, fuzzy, python-format
+#| msgid "Created repository %s"
+msgid "Remote repository URL"
+msgstr "Repositório %s criado"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "[pulled do remote] no repositório"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to pull changes from remote side."
+msgid "Confirm to pull changes from remote repository."
 msgstr "Confirma realizar pull de alterações a partir de lado remoto"
 
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr "ID inalterável"
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "repositório privado"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3663,44 +3878,35 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-#, fuzzy
-msgid "Clone URL"
-msgstr "URL de clonagem"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "editar"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "repositório [criado]"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "Repositório"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr "Revisão padrão para página de arquivos, downloads, whoosh e readme"
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "Mudar o dono desse repositório."
 
@@ -3761,55 +3967,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "Enviar"
 
@@ -3884,13 +4046,15 @@
 msgstr "Opção de varredura"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
-msgstr "Destruir dados antigos"
+#, fuzzy
+#| msgid "Search in repositories"
+msgid "Delete records of missing repositories"
+msgstr "Buscar nos repositórios"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3912,7 +4076,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3939,39 +4103,43 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
+msgid "Platform"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:8
 #, fuzzy
 msgid "Git version"
 msgstr "Editar Permissão"
 
-#: kallithea/templates/admin/settings/settings_system.html:8
+#: kallithea/templates/admin/settings/settings_system.html:9
 msgid "Git path"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4127,11 +4295,11 @@
 msgstr "Ícones"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr "Mostrar ícone de repositório público nos repositórios"
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr "Mostrar ícone de repositório privado nos repositórios"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4140,7 +4308,9 @@
 msgstr "Mostrar ícone de repositório público nos repositórios"
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+#, fuzzy
+#| msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr "Meta-Tagging"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4159,6 +4329,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4178,24 +4349,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "Permissões padrão"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "membros"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "Membros"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "Confirme para excluir este grupo de usuário: %s"
@@ -4221,10 +4393,6 @@
 msgid "User Groups Administration"
 msgstr "Administração de grupos de usuários"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "Adicionar usuário"
@@ -4250,12 +4418,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-#, fuzzy
-msgid "Default Permissions"
-msgstr "Permissões padrão"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4265,7 +4428,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4275,11 +4438,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Confirma excluir este usuário: %s"
@@ -4301,18 +4464,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "Confirmação de nova senha"
 
@@ -4334,49 +4490,57 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Repositório Mercurial"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Repositório Git"
+
+#: kallithea/templates/base/base.html:126
 #, fuzzy
 msgid "Create Fork"
 msgstr "Excluir bifurcações"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Sumário"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "Registro de alterações"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "Arquivos"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr "Trocar Para"
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "Opções"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 #, fuzzy
 msgid "Compare Fork"
 msgstr "Compare bifurcação"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4386,135 +4550,131 @@
 msgid "Compare"
 msgstr "Compare"
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "Pesquisar"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr "Destravar"
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr "Travar"
 
-#: kallithea/templates/base/base.html:176
+#: kallithea/templates/base/base.html:180
 msgid "Follow"
 msgstr "Seguir"
 
-#: kallithea/templates/base/base.html:177
+#: kallithea/templates/base/base.html:181
 msgid "Unfollow"
 msgstr "Parar de seguir"
 
-#: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "Bifurcação"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr "Criar Pull Request"
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr "Mostrar Pull Requests para %s"
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr "Mostrar atividade recente"
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "Diário"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "Diário público"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr "Mostrar gists públicos"
 
-#: kallithea/templates/base/base.html:237
+#: kallithea/templates/base/base.html:241
 msgid "Gists"
 msgstr "Gists"
 
-#: kallithea/templates/base/base.html:241
+#: kallithea/templates/base/base.html:245
 #, fuzzy
 msgid "All Public Gists"
 msgstr "Todos os gists públicos"
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 #, fuzzy
 msgid "My Public Gists"
 msgstr "Meus gists públicos"
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 #, fuzzy
 msgid "My Private Gists"
 msgstr "Meus gists privados"
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr "Buscar nos repositórios"
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 #, fuzzy
 msgid "My Pull Requests"
 msgstr "Pull requests"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 #, fuzzy
 msgid "Not Logged In"
 msgstr "Não logado"
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 #, fuzzy
 msgid "Login to Your Account"
 msgstr "Entrar com sua conta"
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "Esqueceu a senha ?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "Sair"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Padrões de repositórios"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4548,8 +4708,9 @@
 " usuário"
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "Mostrar"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4575,7 +4736,7 @@
 msgstr "Adicionar outro comentário"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "Parar de seguir este repositório"
 
@@ -4653,6 +4814,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr "confirme para revogar permissão para {0}: {1} ?"
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 #, fuzzy
 msgid "Specify changeset"
@@ -4683,6 +4852,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4711,10 +4881,6 @@
 msgstr[0] "mostrando %d de %d revisão"
 msgstr[1] "mostrando %d de %d revisões"
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "Mostrar"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr "Deselecionar seleção"
@@ -4732,7 +4898,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, fuzzy, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr "Comparar bifurcação com %s"
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4743,10 +4909,12 @@
 
 #: kallithea/templates/changelog/changelog.html:92
 #: kallithea/templates/changelog/changelog_summary_data.html:20
-#, python-format
+#, fuzzy, python-format
+#| msgid "" "Changeset status: %s\n" "Click to open associated pull request
+#| #%s"
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 "Estado do changeset: %s\n"
 "Clique para abrir os pull request #%s associado"
@@ -4758,7 +4926,7 @@
 msgstr "Estado do changeset: %s"
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4791,7 +4959,7 @@
 msgid "Branch %s"
 msgstr "Ramo %s"
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "Ainda não há alteações"
 
@@ -4807,7 +4975,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr "Adicionado"
 
@@ -4837,21 +5005,23 @@
 msgid "Refs"
 msgstr "Refs"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr "Adicionar ou enviar arquivos diretamente pelo Kallithea"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Push new repo"
+msgid "Push new repository"
 msgstr "Fazer push de novo repositório"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr "Repositório existente?"
 
@@ -4861,15 +5031,15 @@
 msgstr "%s Changeset"
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr "Estado do changeset"
@@ -4892,7 +5062,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "mesclar"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4904,158 +5076,172 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "criado"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "criado"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] "%s arquivo modificado"
 msgstr[1] "%s arquivos modificados"
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] "%s arquivo modificado com %s inserções e %s exclusões"
 msgstr[1] "%s arquivos modificados com %s inserções e %s exclusões"
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 #, fuzzy
 msgid "Show full diff anyway"
 msgstr "Mostrar diff completo"
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-#, fuzzy
-msgid "Status change from pull request"
-msgstr "Alteração de estado no changeset"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "revisions"
+msgid "No revisions"
+msgstr "revisões"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "Comentar no pull request #%s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 #, fuzzy
 msgid "No title"
 msgstr "novo arquivo"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-#, fuzzy
-msgid "Comment from pull request"
-msgstr "Comentar no pull request #%s"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr "Alteração de estado no changeset"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr "Comentário no changeset"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy
+#| msgid "No changesets"
+msgid "on this changeset"
+msgstr "Nenhum changeset"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr "%d comentário"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Mudanças mais recentes"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr "Comentando a linha {1}."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr "Comentários interpretados usando a sintaxe %s com suporte a %s."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 #, fuzzy
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 "Use @nomedeusuário dentro desse texto para enviar notificação a este "
 "usuário do Kallithea"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
 msgstr "Visualizar comentário"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:85
+#: kallithea/templates/changeset/changeset_file_comment.html:77
 #, fuzzy
 msgid "Submitting ..."
 msgstr "Enviando..."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:80
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "Comentário"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
 msgid "Preview"
 msgstr "Visualizar"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "You need to be logged in to comment."
 msgstr "Você precisa estar logado para comentar."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr "Entrar agora"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr "Ocultar"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] "%d comentário"
 msgstr[1] "%d comentários"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] "(%d em linha)"
 msgstr[1] "(%d em linha)"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, fuzzy, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 msgstr[1] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-#, fuzzy
-msgid "Use @username inside this text to send notification to another local user."
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+#, fuzzy
+#| msgid "Use @username inside this text to notify another user"
+msgid "Use @username inside this text to notify another user."
 msgstr ""
 "Use @nomedeusuário dentro desse texto para enviar notificação a este "
 "usuário do Kallithea"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr "Vote para estado do pull request"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "Altere o estado do changeset"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "Sem modificações"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "(fechado)"
@@ -5075,7 +5261,7 @@
 msgstr "Mostrar diff completo para este arquivo"
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr "Mostrar diff completo lado-a-lado para este arquivo"
@@ -5084,12 +5270,12 @@
 msgid "Show inline comments"
 msgstr "Mostrar comentários inline"
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 #, fuzzy
 msgid "Deleted"
 msgstr "excluir"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 #, fuzzy
 msgid "Renamed"
 msgstr "renomear"
@@ -5102,32 +5288,44 @@
 msgid "Ancestor"
 msgstr "Antecessor"
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 #, fuzzy
 msgid "Show merge diff"
 msgstr "Mostrar diff completo"
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 #, fuzzy
 msgid "Common ancestor"
 msgstr "Comentário no changeset"
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 #, fuzzy
 msgid "is"
 msgstr "Gist"
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr "%s Changesets"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 #, fuzzy
 msgid "behind"
 msgstr "Reindexar"
@@ -5152,56 +5350,43 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] "Mostrando %s commit"
 msgstr[1] "Mostrando %s commits"
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr "Nenhum arquivo"
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr "Mostrar diff completo"
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Repositório Mercurial"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Repositório Git"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "Repositório público"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "Nenhum conjunto de alterações ainda."
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "Assinar o feed rss de %s"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "Assinar o feed atom de %s"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5329,10 +5514,6 @@
 msgid "Commit Changes"
 msgstr "Realizar commit das alterações"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr "Revisão anterior"
@@ -5358,19 +5539,15 @@
 msgstr "Tamanho"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "Mimetype"
+msgid "Last Revision"
+msgstr "Última revisão"
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
-msgstr "Última revisão"
-
-#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Modified"
 msgstr "Última alteração"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Committer"
 msgstr "Último commiter"
@@ -5485,8 +5662,8 @@
 msgstr "%s Seguidores"
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "Seguidores"
 
@@ -5538,8 +5715,8 @@
 msgstr "%s Bifurcações"
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr "Bifurcações"
 
@@ -5547,7 +5724,7 @@
 msgid "Forked"
 msgstr "Bifurcado"
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "Ainda não há bifurcações"
 
@@ -5560,19 +5737,13 @@
 msgstr "RSS feed do diário"
 
 #: kallithea/templates/journal/journal.html:56
-#, fuzzy
-msgid "My Repos"
-msgstr "Meus repositórios"
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr ""
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr "Ainda não há entradas"
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "Diário Público"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "ATOM feed do diário público"
@@ -5615,22 +5786,17 @@
 msgid "Destination repository"
 msgstr "Repositório de destino"
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-#, fuzzy
-msgid "Pull Request Reviewers"
-msgstr "Revisores do pull request"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 #, fuzzy
 msgid "No entries"
 msgstr "Ainda não há entradas"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "revogar"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5639,52 +5805,51 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, fuzzy, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-#, fuzzy
-msgid "Delete Pull Request"
-msgstr "Novo pull request"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr "Confirme para excluir este pull request"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr "Fechado"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+#, fuzzy
+msgid "Delete Pull Request"
+msgstr "Novo pull request"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr "Confirme para excluir este pull request"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this pull request"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "Confirme para excluir este pull request"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
+#, fuzzy, python-format
+#| msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr "%s Pull Request #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, fuzzy, python-format
-msgid "Pull request #%s from %s#%s"
-msgstr ""
+#| msgid "Pull Requests from %s'"
+msgid "Pull request %s from %s#%s"
+msgstr "Pull requests de %s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
 #, fuzzy
@@ -5700,94 +5865,95 @@
 msgid "Pull request status calculated from votes"
 msgstr "Estado do pull request calculado a partir dos votos"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr "Ainda não revisado por"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] "%d revisor"
 msgstr[1] "%d revisores"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr "O pull request foi revisado por todos os revisores"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "Ainda não há ramos"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy
 msgid "on"
 msgstr "nenhum"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr "Puxar mudanças"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 #, fuzzy
 msgid "Created by"
 msgstr "criado"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 #, fuzzy
 msgid "Update"
 msgstr "usuário [atualizado]"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr "dono"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr "revisor"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+#, fuzzy
+msgid "Pull Request Reviewers"
+msgstr "Revisores do pull request"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr "revisor"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr "Visualizar comentário"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 #, fuzzy
 msgid "Save as New Pull Request"
 msgstr "Crie novo pull request"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "Mudanças mais recentes"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 #, fuzzy
 msgid "Pull Request Content"
 msgstr "O pull request mudou de estado"
@@ -5893,8 +6059,8 @@
 msgstr "%s RSS feed"
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr "Habilitar"
 
@@ -5902,45 +6068,45 @@
 msgid "Stats gathered: "
 msgstr "Estatísticas coletadas:"
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "arquivos"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr "Mostrar mais"
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "commits"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "arquivos adicionados"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "arquivos alterados"
+msgid "files added"
+msgstr "arquivos adicionados"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "arquivos alterados"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "arquivos removidos"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "commit"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "arquivo adicionado"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "arquivo alterado"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "arquivo removido"
 
@@ -5962,67 +6128,78 @@
 msgid "Fork of"
 msgstr "Bifurcação de"
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr "Mostrar por Nome"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "Clonar de"
+
+#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+msgid "Clone URL"
+msgstr "URL de clonagem"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr "Mostrar por Nome"
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr "Mostrar por ID"
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr "Tendências em arquivos"
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "Download"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "Ainda não há downloads"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "Downloads estão desabilitados para este repositório"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr "Download como zip"
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr "Marque isto para descarregar arquivo com subrepositórios"
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
+#: kallithea/templates/summary/summary.html:125
+#, fuzzy
+#| msgid "with subrepos"
+msgid "With subrepos"
 msgstr "com subrepositórios"
 
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr "Tamanho do Repositório"
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr "Feed"
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "Mudanças mais recentes"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 #, fuzzy
 msgid "Quick Start"
 msgstr "Início rápido"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "Descarregar %s como %s"
@@ -6037,3 +6214,335 @@
 msgid "Compare Tags"
 msgstr "Comparar tags"
 
+#~ msgid "increase diff context to %(num)s lines"
+#~ msgstr ""
+
+#~ msgid "No comments."
+#~ msgstr "%d comentário"
+
+#~ msgid "public journal"
+#~ msgstr "diário público"
+
+#~ msgid "journal"
+#~ msgstr "diário"
+
+#~ msgid "bad captcha"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked"
+#~ msgstr "Destravado"
+
+#~ msgid "Locked"
+#~ msgstr "Travado"
+
+#~ msgid "Repository has been %s"
+#~ msgstr "O repositório foi %s"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "Você não pode editar esse usuário"
+
+#~ msgid "No Files"
+#~ msgstr "Nenhum Arquivo"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "O username \\\"%(username)s\\\" é proibido"
+
+#~ msgid "invalid user name"
+#~ msgstr "nome de usuário inválido"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "Sua conta está desabilitada"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "URL de clonagem inválida"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr "URL inválida, por favor, forneça uma URL de clone http(s)/svn+http(s)"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+#~ "As revisões %(revs)s já fazem parte "
+#~ "de um pull request ou já setaram"
+#~ " o estado"
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr "Padrões"
+
+#~ msgid "My Emails"
+#~ msgstr ""
+
+#~ msgid "Watched"
+#~ msgstr "Seguindo"
+
+#~ msgid "My Permissions"
+#~ msgstr "Minhas permissões"
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr "excluir"
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "Administração de permissões"
+
+#~ msgid "Overview"
+#~ msgstr ""
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr "Sobrescrever as configurações existentes"
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "Permissões padrão"
+
+#~ msgid "none"
+#~ msgstr "nenhum"
+
+#~ msgid "read"
+#~ msgstr "ler"
+
+#~ msgid "write"
+#~ msgstr "escrever"
+
+#~ msgid "admin"
+#~ msgstr "administrador"
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "URL opcional http[s] da qual o repositório deve ser clonado."
+
+#~ msgid "Remote URL"
+#~ msgstr "URL de clonagem"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "Realizar pull de alterações a partir de localização remota"
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr "ID inalterável"
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "editar"
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr "Destruir dados antigos"
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "Permissões padrão"
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "Alteração de estado no changeset"
+
+#~ msgid "Status change on changeset"
+#~ msgstr "Alteração de estado no changeset"
+
+#~ msgid "Comment on changeset"
+#~ msgstr "Comentário no changeset"
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+#~ "Use @nomedeusuário dentro desse texto "
+#~ "para enviar notificação a este usuário"
+#~ " do Kallithea"
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr "Mimetype"
+
+#~ msgid "My Repos"
+#~ msgstr "Meus repositórios"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr "dono"
+
+#~ msgid "reviewer"
+#~ msgstr "revisor"
+
--- a/kallithea/i18n/ru/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/ru/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -16,9 +16,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2015-04-13 20:18+0200\n"
 "Last-Translator: Andrew Shadura <andrew@shadura.me>\n"
 "Language-Team: Russian "
@@ -32,19 +32,23 @@
 "X-Generator: Weblate 2.3-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Ещё не было изменений"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "Ничего"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(закрыто)"
 
@@ -58,21 +62,17 @@
 msgstr "Игнорировать пробелы"
 
 #: kallithea/controllers/changeset.py:169
-#, python-format
-msgid "increase diff context to %(num)s lines"
+#, fuzzy, python-format
+#| msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr "увеличить контекст до %(num)s строк"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "Нет такой ревизии в этом репозитории"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Нет комментариев."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
@@ -80,31 +80,41 @@
 "Нельзя редактировать статус изменений, связанных с закрытыми pull-"
 "request'ами"
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr "Выбрать набор изменений"
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr "Невозможно сравнивать репозитории без общего предка"
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "revisions"
+msgid "No response"
+msgstr "версии"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr "Запрос не распознан сервером из-за неправильного синтаксиса."
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "Несанкционированный доступ к ресурсу"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "У вас нет прав для просмотра этой страницы"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "Ресурс не найден"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -120,17 +130,17 @@
 msgid "%s %s feed"
 msgstr "Лента новостей %s %s"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr "Изменения оказались слишком большими и были вырезаны..."
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr "%s выполнил коммит в %s"
@@ -212,45 +222,43 @@
 "Расположение должно быть относительным путем, и не должно содержать "
 "\"..\" в пути"
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Возможность скачивать отключена"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Неизвестная ревизия %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Пустой репозиторий"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "Неизвестный тип архива"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Набор изменений"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Ветки"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Метки"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Произошла ошибка во время создания форка репозитория %s"
@@ -266,9 +274,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Репозитории"
 
@@ -288,145 +296,163 @@
 msgstr "Закладки"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
-msgstr "общедоступный журнал"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
+msgstr "Публичный журнал"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr "журнал"
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr "Журнал"
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+#, fuzzy
+#| msgid "bad captcha"
+msgid "Bad captcha"
 msgstr "неверная капча"
 
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr "Регистрация в Kallithea прошла успешно"
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "Ссылка для сброса пароля отправлена"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr "Сброс пароля произведён, новый пароль был отправлен на ваш email"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr "%s (закрыта)"
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "Изменения"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr "Специальный"
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr "Ветки участника"
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Закладки"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr "Ошибка при создании pull-запроса: %s"
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr "Нет описания"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "Pull-запрос создан успешно"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr "Произошла ошибка при создании pull-запроса"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr "Отсутствующие ревизии относительно предыдущего pull-запроса:"
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr "Новые ревизии на %s %s относительно предыдущего pull-запроса"
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr "Этот pull-запрос основан на другой ревизии %s, простой diff невозможен"
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr "Нет изменений на %s %s относительно предыдущей версии."
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr "Закрыт, замещён %s ."
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr "Обновление для pull-запроса создано"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr "Pull-запрос обновлён"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "Pull-запрос успешно удалён"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr "Этот pull-запрос уже принят на ветку %s."
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr "Этот pull-запрос был закрыт и не может быть обновлён."
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr "Этот pull-запрос может быть обновлён из %s:"
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr "Нет изменений для обновления этого pull-запроса."
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr "Внимание: Ветка %s имеет ещё одну верхушку: %s."
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr "Обновление pull-запросы git не поддерживается."
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr "Закрыт."
 
@@ -442,21 +468,21 @@
 msgid "An error occurred during search operation."
 msgstr "Произошла ошибка при выполнении этого поиска."
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr "Нет данных"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "Статистические данные отключены для этого репозитария"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr "Настройки авторизации успешно обновлены"
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr "произошла ошибка при обновлении настроек авторизации"
 
@@ -469,38 +495,40 @@
 msgstr "Произошла ошибка при обновлении стандартных настроек"
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+#, fuzzy
+#| msgid "forever"
+msgid "Forever"
 msgstr "навсегда"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 минут"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 час"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 день"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 месяц"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr "Срок"
 
@@ -514,8 +542,10 @@
 msgstr "Gist-запись %s удалена"
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
-msgstr ""
+#, fuzzy
+#| msgid "Last Modified"
+msgid "Unmodified"
+msgstr "Последнее изменение"
 
 #: kallithea/controllers/admin/gists.py:262
 msgid "Successfully updated gist content"
@@ -530,119 +560,135 @@
 msgid "Error occurred during update of gist %s"
 msgstr "Произошла ошибка при обновлении gist-записи %s"
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 "Вы не можете изменить данные этого пользователя, поскольку он важен для "
 "работы всего приложения"
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "Ваша учетная запись успешно обновлена"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr "Произошла ошибка при обновлении пользователя %s"
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr "Пароль обновлён"
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr "Ошибка при обновлении пароля"
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "Пользователю добавлен e-mail %s"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Произошла ошибка при сохранении e-mail"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "E-mail пользователя удалён"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
 msgstr "API-ключ успешно создан"
 
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
 msgstr "API-ключ успешно сброшен"
 
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
 msgstr "API-ключ успешно удалён"
 
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "Чтение"
+
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "Чтение"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "Запись"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "Запись"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "Администратор"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "Отключено"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr "Разрешена, с ручной активацией учётной записи"
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr "Разрешена, с автоматической активацией учётной записи"
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -650,11 +696,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr "Ручная активация внешней учетной записи"
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -662,221 +708,212 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr "Автоматическая активация внешней учетной записи"
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "Включено"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr "Глобальные привилегии успешно обновлены"
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr "Произошла ошибка во время обновления привилегий"
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr "Произошла ошибка при создании группы репозиториев %s"
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr "Создана новая группа репозиториев %s"
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr "Произошла ошибка при создании группы репозиториев %s"
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr "Группа репозиториев %s обновлена"
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "Произошла ошибка при обновлении группы репозиториев %s"
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "Данная группа содержит %s репозитариев и не может быть удалена"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Группа содержит в себе %s подгрупп и не может быть удалён"
 
-#: kallithea/controllers/admin/repo_groups.py:302
+#: kallithea/controllers/admin/repo_groups.py:297
 #, python-format
 msgid "Removed repository group %s"
 msgstr "Группа репозиториев %s удалена"
 
-#: kallithea/controllers/admin/repo_groups.py:307
+#: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr "Произошла ошибка при удалении группы репозиториев %s"
 
-#: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
 #: kallithea/controllers/admin/user_groups.py:340
 msgid "Cannot revoke permission for yourself as admin"
 msgstr "Администратор не может отозвать свои привелегии"
 
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
+#: kallithea/controllers/admin/repo_groups.py:420
+msgid "Repository group permissions updated"
 msgstr "Привилегии группы репозиториев обновлены"
 
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr "Произошла ошибка при отзыве привелегии"
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr "Произошла ошибка при создании репозитория %s"
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr "Репозиторий %s создан из %s"
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "Сделан форк(копия) репозитория %s на %s"
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr "Репозиторий %s создан"
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Репозитарий %s успешно обновлён"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "Произошла ошибка во время обновления репозитория %s"
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr "Форки %s отсоединены"
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr "Удалены форки репозитория %s"
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr "Репозиторий %s удалён"
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
+#: kallithea/controllers/admin/repos.py:321
+#, fuzzy, python-format
+#| msgid "Cannot delete %s it still contains attached forks"
+msgid "Cannot delete repository %s which still has forks"
 msgstr "Невозможно удалить %s, он всё-ещё содержит форки"
 
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Произошла ошибка во время удаления %s"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr "Привилегии репозитория обновлены"
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr "Произошла ошибка при создании поля"
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr "Произошла ошибка при удалении поля"
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr "-- Не форк --"
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "Видимость репозитория в публичном журнале обновлена"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr "Произошла ошибка при установке репозитария в общедоступный журнал"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "Несовпадение токенов"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "Ничего"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "Репозиторий %s отмечен как форк %s"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "Произошла ошибка при выполнении операции"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr "Закрытый репозиторий"
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr "Открытый репозиторий"
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been locked"
+msgstr "Репозиторий не заблокирован"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been unlocked"
+msgstr "Репозиторий не заблокирован"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "Произошла ошибка во время разблокирования"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr "Разблокировано"
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr "Заблокировано"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr "Кэш сброшен"
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "Произошла ошибка при очистке кэша"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "Внесены изменения из удалённого репозитория"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "Репозиторий %s"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr "Кэш сброшен"
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "Произошла ошибка при очистке кэша"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "Внесены изменения из удалённого репозитория"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr "Произошла ошибка при внесении изменений из удалённого репозитория"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "Произошла ошибка при удалении статистики репозитория"
 
@@ -894,7 +931,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr "Произошла ошибка при обновлении настроек приложения"
 
 #: kallithea/controllers/admin/settings.py:213
@@ -971,85 +1008,82 @@
 msgstr "Целевая группа не может быть такой же"
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr "Привилегии группы пользователей обновлены"
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr "Обновлены привилегии"
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "Произошла ошибка при сохранении привилегий"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr "Пользователь %s создан"
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr "Произошла ошибка при создании пользователя %s"
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "Пользователь успешно обновлён"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr "Пользователь успешно удалён"
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "Произошла ошибка при удалении пользователя"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "Вы не можете редактировать данного пользователя"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
 msgstr "Добавлен IP %s в белый список пользователя"
 
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
 msgstr "Произошла ошибка при сохранении IP"
 
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
 msgstr "Удален IP %s из белого списка пользователя"
 
-#: kallithea/lib/auth.py:745
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr "IP %s заблокирован"
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 "Вы должны быть зарегистрированным пользователем, чтобы выполнить это "
 "действие"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "Страница доступна только авторизованным пользователям"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr "Репозиторий не найден на файловой системе"
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "Набор изменений не найден"
 
@@ -1067,158 +1101,164 @@
 msgid "No changes detected"
 msgstr "Изменений не обнаружено"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "Удалена ветка: %s"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "Создан тег: %s"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Показать отличия вместе %s->%s"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "сравнение"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "и"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "на %s больше"
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "версии"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "fork name %s"
+msgid "Fork name %s"
 msgstr "имя форка %s"
 
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "Pull request %s"
 msgstr "Pull-запрос #%s"
 
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "[удален] репозиторий"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "[создан] репозиторий"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "[создан] репозиторий как форк"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "[форкнут] репозиторий"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "[обновлён] репозиторий"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr "[загружен] архив из репозитория"
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "[удален] репозиторий"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "[создан] пользователь"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "[обновлён] пользователь"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr "[создана] группа пользователей"
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr "[обновлена] группа пользователей"
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "[комментарий] к ревизии в репозитории"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "[прокомментировано] в запросе на внесение изменений для"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "[закрыт] Pull-запрос для"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[отправлено] в"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "[внесены изменения с помощью Kallithea] в репозитории"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "[внесены изменения из удалённого репозитория] в репозиторий"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[внесены изменения] из"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "[добавлен в наблюдения] репозиторий"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "[удалён из наблюдения] репозиторий"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " и на %s больше"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "Файлов нет"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr "Нет файлов"
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr "новый файл"
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr "изменён"
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr "удалён"
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr "переименован"
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr "chmod"
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1229,7 +1269,7 @@
 "переименован из файловой системы. Пожалуйста, перезапустите приложение "
 "для сканирования репозиториев"
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
@@ -1237,7 +1277,7 @@
 msgstr[1] "%d лет"
 msgstr[2] "%d года"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
@@ -1245,7 +1285,7 @@
 msgstr[1] "%d месяца"
 msgstr[2] "%d месяцев"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
@@ -1253,7 +1293,7 @@
 msgstr[1] "%d дня"
 msgstr[2] "%d дней"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
@@ -1261,7 +1301,7 @@
 msgstr[1] "%d часов"
 msgstr[2] "%d часа"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
@@ -1269,7 +1309,7 @@
 msgstr[1] "%d минут"
 msgstr[2] "%d минуты"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
@@ -1277,27 +1317,27 @@
 msgstr[1] "%d секунды"
 msgstr[2] "%d секунды"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "в %s"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "%s назад"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "в %s и %s"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s и %s назад"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "прямо сейчас"
 
@@ -1312,7 +1352,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "Репозитарий - нет доступа"
 
@@ -1327,7 +1367,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "Репозитарий - доступ на чтение"
 
@@ -1342,7 +1382,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "Репозитарий - доступ на запись"
 
@@ -1357,7 +1397,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "Репозитарий - администрирование"
 
@@ -1396,7 +1436,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Администратор Kallithea"
 
@@ -1411,7 +1451,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "Создание репозиториев отключено"
 
@@ -1426,7 +1466,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "Создание репозиториев включено"
 
@@ -1441,7 +1481,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "Возможность создавать форк репозитория отключена"
 
@@ -1456,7 +1496,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "Возможность создавать форк репозитория включена"
 
@@ -1492,7 +1532,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "Не просмотрено"
 
@@ -1507,7 +1547,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "Одобрено"
 
@@ -1522,7 +1562,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "Отклонено"
 
@@ -1537,7 +1577,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "На рассмотрении"
 
@@ -1549,7 +1589,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr "верхний уровень"
 
@@ -1561,7 +1601,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr "Группа Репозиториев - нет доступа"
 
@@ -1573,7 +1613,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr "Группа репозиториев - доступ на чтение"
 
@@ -1585,7 +1625,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr "Группа репозиториев - доступ на запись"
 
@@ -1597,7 +1637,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr "Группа репозиториев - администрирование"
 
@@ -1608,7 +1648,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr "Группа пользователей - нет доступа"
 
@@ -1619,7 +1659,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr "Группа пользователей - доступ на чтение"
 
@@ -1630,7 +1670,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr "Группа пользователей - доступ на запись"
 
@@ -1641,7 +1681,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr "Группа пользователей - администрирование"
 
@@ -1652,7 +1692,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr "Создание групп репозиториев отключено"
 
@@ -1663,7 +1703,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr "Создание групп репозиториев включено"
 
@@ -1674,7 +1714,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr "Создание групп пользователей отключено"
 
@@ -1685,7 +1725,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr "Создание групп пользователей включено"
 
@@ -1696,7 +1736,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr "Регистрация отключена"
 
@@ -1707,7 +1747,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr "Регистрация пользователя с ручной активацией учётной записи"
 
@@ -1718,29 +1758,149 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr "Регистрация пользователя с автоматической активацией"
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "на строке %s"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[Упоминание]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "Несанкционированный доступ к ресурсу"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "Несанкционированный доступ к ресурсу"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Only admins can create repository groups"
+msgstr "Создана новая группа репозиториев %s"
+
+#: kallithea/model/db.py:1683
+#, fuzzy, python-format
+#| msgid "Created repository group %s"
+msgid "Non-admins can create repository groups"
+msgstr "Создана новая группа репозиториев %s"
+
+#: kallithea/model/db.py:1685
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Only admins can create user groups"
+msgstr "Создавать группы пользователей"
+
+#: kallithea/model/db.py:1686
+#, fuzzy
+#| msgid "Create user groups"
+msgid "Non-admins can create user groups"
+msgstr "Создавать группы пользователей"
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Местонахождение репозиториев"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Invalidate cache for all repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Сбросить кэш для всех репозиториев"
+
+#: kallithea/model/db.py:1698
+#, fuzzy
+#| msgid "User Registration with manual account activation"
+msgid "User registration with manual account activation"
+msgstr "Регистрация пользователя с ручной активацией учётной записи"
+
+#: kallithea/model/db.py:1699
+#, fuzzy
+#| msgid "User Registration with automatic account activation"
+msgid "User registration with automatic account activation"
+msgstr "Регистрация пользователя с автоматической активацией"
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "Не просмотрено"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "На рассмотрении"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "Пожалуйста, введите логин"
@@ -1759,177 +1919,217 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Введите не менее %(min)i символов"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
+#: kallithea/model/notification.py:254
+#, fuzzy, python-format
+#| msgid "%(user)s commented on changeset at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
+msgstr "%(user)s оставил комментарий к набору изменений %(when)s"
+
+#: kallithea/model/notification.py:255
+#, fuzzy, python-format
+#| msgid "%(user)s sent message at %(when)s"
+msgid "%(user)s sent message %(age)s"
+msgstr "%(user)s отправил сообщение %(when)s"
+
+#: kallithea/model/notification.py:256
+#, fuzzy, python-format
+#| msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
+msgstr "%(user)s упомянул вас %(when)s"
+
+#: kallithea/model/notification.py:257
+#, fuzzy, python-format
+#| msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr "%(user)s зарегистрировался в Kallithea %(when)s"
+
+#: kallithea/model/notification.py:258
+#, fuzzy, python-format
+#| msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "%(user)s открыл новый pull-запрос %(when)s"
+
+#: kallithea/model/notification.py:259
+#, fuzzy, python-format
+#| msgid "%(user)s commented on pull request at %(when)s"
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "%(user)s оставил комментарий к pull-запросу %(when)s"
+
+#: kallithea/model/notification.py:266
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s оставил комментарий к набору изменений %(when)s"
 
-#: kallithea/model/notification.py:253
+#: kallithea/model/notification.py:267
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s отправил сообщение %(when)s"
 
-#: kallithea/model/notification.py:254
+#: kallithea/model/notification.py:268
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s упомянул вас %(when)s"
 
-#: kallithea/model/notification.py:255
+#: kallithea/model/notification.py:269
 #, python-format
 msgid "%(user)s registered in Kallithea at %(when)s"
 msgstr "%(user)s зарегистрировался в Kallithea %(when)s"
 
-#: kallithea/model/notification.py:256
+#: kallithea/model/notification.py:270
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s открыл новый pull-запрос %(when)s"
 
-#: kallithea/model/notification.py:257
+#: kallithea/model/notification.py:271
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s оставил комментарий к pull-запросу %(when)s"
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr "Новый пользователь \"%(new_username)s\" зарегистрирован"
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr "Новый пользователь \"%(new_username)s\" зарегистрирован"
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr "Закрыт"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#: kallithea/model/pull_request.py:137
+#, fuzzy, python-format
+#| msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 msgstr "%(user)s просит вас рассмотреть pull request #%(pr_id)s: %(pr_title)s"
 
-#: kallithea/model/scm.py:808
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "последняя версия"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr "Регистрация нового пользователя"
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-"Вы не можете редактировать пользователя, поскольку это критично для "
-"работы всего приложения"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr ""
 "Вы не можете удалить пользователя, поскольку это критично для работы "
 "всего приложения"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
-"Пользователь \"%s\" всё ещё является владельцем %s репозиториев и поэтому не "
-"может быть удалён. Смените владельца или удалите эти репозитории: %s"
-
-#: kallithea/model/user.py:268
+"Пользователь \"%s\" всё ещё является владельцем %s репозиториев и поэтому"
+" не может быть удалён. Смените владельца или удалите эти репозитории: %s"
+
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
 "Пользователь \"%s\" всё ещё является владельцем %s групп репозиториев и "
-"поэтому не может быть удалён. Смените владельца или удалите данные группы: %s"
-
-#: kallithea/model/user.py:275
+"поэтому не может быть удалён. Смените владельца или удалите данные "
+"группы: %s"
+
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr ""
 "Пользователь \"%s\" всё ещё является владельцем %s групп пользователей и "
-"поэтому не может быть удалён. Смените владельца или удалите данные группы: %s"
-
-#: kallithea/model/user.py:305
+"поэтому не может быть удалён. Смените владельца или удалите данные "
+"группы: %s"
+
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr "Ссылка сброса пароля"
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr "Ваш новый пароль"
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr "Ваш новый пароль от Kallithea: %s"
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "Значение не может быть пустым списком"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "Пользователь с именем \"%(username)s\" уже существует"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "Имя \"%(username)s\" отклонено"
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, fuzzy, python-format
+#| msgid "Username %(username)s is not valid"
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "Имя \"%(username)s\" недопустимо"
+
+#: kallithea/model/validators.py:99
+#, fuzzy
+#| msgid "" "Username may only contain alphanumeric characters underscores,
+#| periods or" " dashes and must begin with alphanumeric character or
+#| underscore"
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
+" dashes and must begin with an alphanumeric character or underscore"
 msgstr ""
 "Имя пользователя может содержать только буквы, цифры, символы "
 "подчеркивания, точки и тире; а так же должно начинаться с буквы, цифры "
 "либо с символа подчеркивания"
 
-#: kallithea/model/validators.py:132
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "Имя \"%(username)s\" недопустимо"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr "Неверное имя группы пользователей"
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr "Группа пользователей \"%(usergroup)s\" уже существует"
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
@@ -1937,108 +2137,112 @@
 "имя группы пользователей может содержать только буквы, цифры, символы "
 "подчеркивания, точки и тире; а так же должно начинаться с буквы или цифры"
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "Невозможно использовать эту группу как родителя"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "Группа \"%(group_name)s\" уже существует"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "Репозитарий с  именем \"%(group_name)s\" уже существует"
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "Недопустимые символы (не ascii) в пароле"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr "Неверно задан старый пароль"
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "Пароли не совпадают"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "неверный пароль"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "неверное имя пользователя"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "Ваш аккаунт выключен"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "Несовпадение токенов"
+
+#: kallithea/model/validators.py:345
+#, fuzzy, python-format
+#| msgid "Repository name %(repo)s is disallowed"
+msgid "Repository name %(repo)s is not allowed"
 msgstr "Имя репозитория %(repo)s запрещено"
 
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "Репозитарий %(repo)s уже существует"
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr "Репозитарий \"%(repo)s\" уже существует в группе \"%(group)s\""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr "Группа репозиториев \"%(repo)s\" уже существует"
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr "неверный URL для клонирования"
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-"Неверный URL клонирования, предоставьте корректный URL для клонирования в "
-"формате http(s)/svn+http(s)/ssh"
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "приватный репозиторий"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "Тип форка будет совпадать с родительским"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr "У вас недостаточно прав для создания репозиториев в этой группе"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr "недостаточно прав для создания репозитория в корневом каталоге"
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr "У Вас недостаточно привилегий для создания группы в этом месте"
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr "Данное имя пользователя или группы пользователей недопустимо"
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "Этот путь ошибочен"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "Этот E-mail уже занят"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "\"%(email)s\" не существует."
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
@@ -2046,35 +2250,28 @@
 "Для входа по LDAP должно быть указано значение аттрибута CN - это "
 "эквивалент имени пользователя"
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-"Ревизии %(revs)s уже включены в pull-request или имеют установленный "
-"статус"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr "Пожалуйста, введите существующий IPv4 или IpV6 адре"
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr "Пожалуйста, введите существующий IPv4 или IPv6 адре"
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 "Значение маски подсети должно быть в пределах от 0 до 32 (%(bits)r - "
 "неверно)"
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 "Ключевое имя может только состоять из букв, символа подчеркивания, тире "
 "или чисел"
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr "Файла нет в каталоге"
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2136,13 +2333,13 @@
 msgstr "Имя группы"
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2154,11 +2351,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "Описание"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2179,11 +2376,11 @@
 msgid "Name"
 msgstr "Имя"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "Последнее изменение"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2192,18 +2389,19 @@
 msgid "Tip"
 msgstr "Состояние"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "Владелец"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2215,7 +2413,7 @@
 msgid "Click to sort ascending"
 msgstr "По возрастанию"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2227,11 +2425,11 @@
 msgid "Click to sort descending"
 msgstr "По убыванию"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr "Репозитарии не найдены."
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2243,10 +2441,10 @@
 msgid "Data error."
 msgstr "Ошибка данных."
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2256,7 +2454,7 @@
 msgstr "Загрузка..."
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "Войти"
 
@@ -2265,39 +2463,39 @@
 msgid "Log In to %s"
 msgstr "Войти в %s"
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "Имя пользователя"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "Пароль"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "Запомнить"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "Забыли пароль?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "Нет аккаунта?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "Войти"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "Забыли пароль?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "Нет аккаунта?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr "Сброс пароля"
@@ -2345,26 +2543,26 @@
 msgstr "Повторите пароль"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "Имя"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "Фамилия"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "E-mail"
 
@@ -2473,9 +2671,12 @@
 msgstr "Включенные плагины"
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
+#, fuzzy
+#| msgid "" "Comma separated list of plugins. Order of plugins is also order in
+#| which " "Kallithea will try to authenticate user"
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 "Список плагинов, разделенных запятой. Kallithea будет пробовать "
 "аутентифицировать пользователя в порядке указания плагинов"
@@ -2484,100 +2685,86 @@
 msgid "Available built-in plugins"
 msgstr "Доступные встроенные плагины"
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr "включено"
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr "отключено"
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr "Плагин"
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "Сохранить"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
-msgid "Repository Defaults"
-msgstr "Значения по умолчанию"
-
 #: kallithea/templates/admin/defaults/defaults.html:11
 #: kallithea/templates/base/base.html:66
-msgid "Defaults"
+msgid "Repository Defaults"
 msgstr "Значения по умолчанию"
 
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "Тип"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "Приватный репозиторий"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr "Приватные репозитории видны только их участникам."
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "Включить статистику"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "Включить окно статистики на странице «Общие сведения»."
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "Включить скачивание"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "Включить меню скачивания на странице «Общие сведения»."
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "Включить блокирование"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr "Включить автоблокировку для репозитория."
 
@@ -2609,6 +2796,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr "Истекает"
 
@@ -2619,7 +2812,9 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+#, fuzzy
+#| msgid "never"
+msgid "Never"
 msgstr "никогда"
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2627,7 +2822,7 @@
 msgstr "Обновить"
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "Отмена"
 
@@ -2650,12 +2845,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr "Создать новую gist-запись"
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr "Создано"
 
@@ -2681,25 +2876,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2729,11 +2926,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "Удалить"
 
@@ -2742,9 +2950,18 @@
 msgstr "Подтвердите удаление этой gist-записи"
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2770,7 +2987,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "Мой Аккаунт"
 
@@ -2779,83 +2996,90 @@
 msgid "Profile"
 msgstr "Профиль"
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
-msgstr "API-ключи"
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "Новый E-mail"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
-msgstr "Мои адреса E-mail"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
+msgstr "API-ключи"
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr "Мои репозитории"
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "репозитории"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "Просмотрено"
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "Создать репозитории"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
-msgstr "Мои привилегии"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+#, fuzzy
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "Скопировать привилегии"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to reset this api key: %s"
+msgid "Confirm to reset this API key: %s"
 msgstr "Подтвердите сброс этого API-ключа: %s"
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
-msgstr ""
+#, fuzzy
+#| msgid "Expires"
+msgid "Expired"
+msgstr "Истекает"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr "Подтвердите удаление этого API-ключа: %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
-msgstr ""
+#, fuzzy
+#| msgid "Removed"
+msgid "Remove"
+msgstr "Удалено"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
-msgstr ""
+#, fuzzy
+#| msgid "No additional emails specified."
+msgid "No additional API keys specified"
+msgstr "Дополнительные адреса e-mail не указаны"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
-msgstr ""
+#, fuzzy
+#| msgid "New field key"
+msgid "New API key"
+msgstr "Ключ"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2868,19 +3092,6 @@
 msgid "Primary"
 msgstr "Основной"
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "удалить"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2901,19 +3112,24 @@
 msgid "Change Your Account Password"
 msgstr "Смена пароля"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr "Текущий пароль"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "Новый пароль"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr "Подтвердите новый пароль"
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "Измените аватар через сайт"
@@ -2934,15 +3150,11 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
+#, fuzzy
+#| msgid "current IP"
+msgid "Current IP"
 msgstr "текущий IP-адрес"
 
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
 msgid "Repositories You Own"
 msgstr "Репозитории, где Вы — владелец"
@@ -2976,7 +3188,7 @@
 msgstr "Комментарии"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr "Pull-запросы"
 
@@ -2994,21 +3206,15 @@
 msgstr "Показать уведомление"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "Уведомления"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr "Управление привилегиями"
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "Привилегии"
+msgid "Default Permissions"
+msgstr "Стандартные привилегии"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -3016,14 +3222,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr "Белый список IP"
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr "Обзор"
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "Анонимный доступ"
@@ -3035,25 +3237,30 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
-"Выбранные привилегии будут установлены по умолчанию для каждого репозитория. "
-"Учтите, что ранее установленные привилегии по умолчанию будут сброшены"
+"Выбранные привилегии будут установлены по умолчанию для каждого "
+"репозитория. Учтите, что ранее установленные привилегии по умолчанию "
+"будут сброшены"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Existing repository?"
+msgid "Apply to all existing repositories"
+msgstr "Существующий репозиторий?"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
-msgstr "Перезаписать существующие настройки"
+msgid "Permissions for the Default user on new repositories."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "Группа репозиториев"
@@ -3065,78 +3272,114 @@
 "will be lost"
 msgstr ""
 "Выбранные привилегии будут установлены по умолчанию для каждой группы "
-"репозиториев. Учтите, что ранее установленные привилегии по умолчанию для "
-"групп репозиториев будут сброшены"
+"репозиториев. Учтите, что ранее установленные привилегии по умолчанию для"
+" групп репозиториев будут сброшены"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy
+#| msgid "Delete this repository group"
+msgid "Apply to all existing repository groups"
+msgstr "Удалить эту группу репозиториев"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr "Группа пользователей"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
+#, fuzzy
+#| msgid "" "All default permissions on each user group will be reset to chosen
+#| " "permission, note that all custom default permission on repository groups
+#| " "will be lost"
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
 msgstr ""
 "Выбранные привилегии будут установлены по умолчанию для каждой группы "
-"пользователей. Учтите, что ранее установленные привилегии по умолчанию для "
-"групп пользователей будут сброшены"
+"пользователей. Учтите, что ранее установленные привилегии по умолчанию "
+"для групп пользователей будут сброшены"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
+msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "Создание репозитория"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid ""
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr "Создание групп пользователей"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr "Создание форка репозитория"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "Регистрация"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr "Активация сторонней учетной записи"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr "Белый список IP для всех пользователей"
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
+#, fuzzy, python-format
+#| msgid "Confirm to delete this ip: %s"
+msgid "Confirm to delete this IP address: %s"
 msgstr "Подтвердите удаление IP %s"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr "Разрешены любые IP-адреса"
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
+msgid "New IP address"
 msgstr "Новый IP-адрес"
 
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-msgid "Default User Permissions Overview"
-msgstr "Обзор прав пользователей по умолчанию"
-
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:105
@@ -3158,12 +3401,12 @@
 msgstr "Родительская группа"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3181,19 +3424,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "Настройки"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr "Дополнительно"
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "Привилегии"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3214,12 +3463,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "Создано"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3231,39 +3480,13 @@
 msgid "Delete this repository group"
 msgstr "Удалить эту группу репозиториев"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "ничего"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "читать"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "записывать"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "администратор"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
-msgstr ""
+#, fuzzy
+#| msgid "User group"
+msgid "User/User Group"
+msgstr "Группа пользователей"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:45
@@ -3271,7 +3494,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "по умолчанию"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3280,14 +3505,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "отозвать"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3295,7 +3517,9 @@
 msgstr "Добавить новый"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+#, fuzzy
+#| msgid "apply to children"
+msgid "Apply to children"
 msgstr "применить к дочерним"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3345,43 +3569,41 @@
 msgid "Number of Top-level Repositories"
 msgstr "Число репозиториев верхнего уровня"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "Клонировать из"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr "Опциональный URL, с которого требуется склонировать репозиторий."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "[создан] репозиторий"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
-msgstr ""
-"Короткое и осмысленное. Для развернутого описания используйте файл README."
-
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+msgstr "Короткое и осмысленное. Для развернутого описания используйте файл README."
+
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr "Опционально выбрать группу, в которую поместить данный репозиторий."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "Тип создаваемого репозитория."
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "Ревизия для выгрузки"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3428,8 +3650,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "Статистика"
 
@@ -3451,47 +3673,47 @@
 msgid "Public Journal Visibility"
 msgstr "Доступ к публичному журналу"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "Удалить из общедоступного журнала"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 msgid "Add to Public Journal"
 msgstr "Добавить в публичный журнал"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr ""
-"Все производимые с этим репозиторием действия будут отображаться в публичном "
-"журнале"
-
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+"Все производимые с этим репозиторием действия будут отображаться в "
+"публичном журнале"
+
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 msgid "Change Locking"
 msgstr "Включить блокирование"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 msgid "Confirm to unlock repository."
 msgstr "Подтвердите снятие блокировки с репозитория."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 msgid "Unlock Repository"
 msgstr "Разблокировать репозиторий"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 msgid "Confirm to lock repository."
 msgstr "Подтвердите блокировку репозитория."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 msgid "Lock Repository"
 msgstr "Заблокировать репозиторий"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "Репозиторий не заблокирован"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3499,17 +3721,17 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "Подтвердите удаление этого репозитория: %s"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 msgid "Delete this Repository"
 msgstr "Удалить этот репозиторий"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
@@ -3517,15 +3739,15 @@
 msgstr[1] "Данный репозиторий имеет %s копии"
 msgstr[2] "Данный репозиторий имеет %s копий"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr "Отсоединить fork'и"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr "Удалить fork'и"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3563,8 +3785,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "Активный"
@@ -3603,28 +3825,38 @@
 msgstr "Дополнительные поля отключены."
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "приватный репозиторий"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr "Ссылка для клонирования"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr "Получить изменения с удалённой стороны"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
+#, fuzzy, python-format
+#| msgid "Created repository %s"
+msgid "Remote repository URL"
+msgstr "Репозиторий %s создан"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "[внесены изменения из удалённого репозитория] в репозиторий"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to pull changes from remote side."
+msgid "Confirm to pull changes from remote repository."
 msgstr "Подтвердите скачивание изменений."
 
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr "Неизменяемый id"
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "приватный репозиторий"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3638,45 +3870,37 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr "Ссылка для клонирования"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "редактировать"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "[создан] репозиторий"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "Репозиторий"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 "Ревизия по умолчанию, из которой будет производиться выгрузка файлов при "
 "скачивании"
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "Изменить владельца репозитория."
 
@@ -3733,55 +3957,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "Отправить"
 
@@ -3854,13 +4034,15 @@
 msgstr "Опции пересканирования"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
-msgstr "Уничтожить все данные"
+#, fuzzy
+#| msgid "Search in repositories"
+msgid "Delete records of missing repositories"
+msgstr "Поиск по репозиториям"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3881,7 +4063,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3908,38 +4090,42 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
+msgid "Platform"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:8
 msgid "Git version"
 msgstr "Версия Git"
 
-#: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4093,11 +4279,11 @@
 msgstr "Иконки"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr "Показывать иконки публичных репозиториев"
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr "Показывать иконки приватных репозиториев"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4105,7 +4291,9 @@
 msgstr "Показывать иконки публичных репозиториев."
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+#, fuzzy
+#| msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr "Метатегирование"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4124,6 +4312,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4143,24 +4332,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "Стандартные привилегии"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "участники"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "Участники"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "Подтвердите удаление следующей группы пользователей: %s"
@@ -4185,10 +4375,6 @@
 msgid "User Groups Administration"
 msgstr "Администрирование групп пользователей"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "Добавить пользователя"
@@ -4214,11 +4400,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr "Стандартные привилегии"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4228,7 +4410,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4238,11 +4420,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Подтвердите удаление пользователя %s"
@@ -4264,18 +4446,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "Подтвердите новый пароль"
 
@@ -4296,47 +4471,55 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Репозиторий Mercurial"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Git репозиторий"
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr "Создать форк"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Общие сведения"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "История изменений"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "Файлы"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr "Переключиться на"
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "Опции"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr "Сравнить форк"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4346,129 +4529,125 @@
 msgid "Compare"
 msgstr "Сравнить"
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "Поиск"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr "Разблокировать"
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr "Заблокировать"
 
-#: kallithea/templates/base/base.html:176
+#: kallithea/templates/base/base.html:180
 msgid "Follow"
 msgstr "Наблюдать"
 
-#: kallithea/templates/base/base.html:177
+#: kallithea/templates/base/base.html:181
 msgid "Unfollow"
 msgstr "Не наблюдать"
 
-#: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "Форк"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr "Создать Pull запрос"
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr "Показать pull-запросы для %s"
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr "Показать последнюю активность"
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "Журнал"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "Общедоступный журнал"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr "Показать публичные записи"
 
-#: kallithea/templates/base/base.html:237
+#: kallithea/templates/base/base.html:241
 msgid "Gists"
 msgstr "Gist"
 
-#: kallithea/templates/base/base.html:241
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr "Все публичные Gist-записи"
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr "Мои публичные Gist-записи"
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr "Мои приватные Gist-записи"
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr "Поиск по репозиториям"
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr "Мои Pull-запросы"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr "Не авторизован"
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr "Авторизоваться"
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "Забыли пароль?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "Выход"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Значения по умолчанию"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4498,8 +4677,9 @@
 "репозиториев"
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "Показать"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4524,7 +4704,7 @@
 msgstr "Добавить ещё один комментарий"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "Отменить наблюдение за репозиторием"
 
@@ -4594,6 +4774,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr "Подтвердите удаление привилегии для {0}: {1} ?"
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr "включено"
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr "отключено"
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr "Выбрать набор изменений"
@@ -4623,6 +4811,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4652,10 +4841,6 @@
 msgstr[1] "Показаны %d из %d ревизий"
 msgstr[2] "Показаны %d из %d ревизий"
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "Показать"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr "Очистить выбор"
@@ -4672,7 +4857,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr "Сравнить форк с родительским репозиторием (%s)"
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4682,10 +4867,12 @@
 
 #: kallithea/templates/changelog/changelog.html:92
 #: kallithea/templates/changelog/changelog_summary_data.html:20
-#, python-format
+#, fuzzy, python-format
+#| msgid "" "Changeset status: %s\n" "Click to open associated pull request
+#| #%s"
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 "Статус набора изенений: %s⏎\n"
 "Кликрните, чтобы перейти к соответствующему pull-request'у #%s"
@@ -4697,7 +4884,7 @@
 msgstr "Статус набора изменений: %s"
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4730,7 +4917,7 @@
 msgid "Branch %s"
 msgstr "Ветка %s"
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "Изменений ещё нет"
 
@@ -4746,7 +4933,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr "Добавлено"
 
@@ -4776,21 +4963,23 @@
 msgid "Refs"
 msgstr "Ссылки"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr "Добавить или загрузить файлы через Kallithea"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Push new repo"
+msgid "Push new repository"
 msgstr "Отправить новый репозиторий"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr "Существующий репозиторий?"
 
@@ -4800,15 +4989,15 @@
 msgstr "%s Изменения"
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr "Статут изменений"
@@ -4831,7 +5020,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "свести"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4842,9 +5033,21 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "Создано"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "Создано"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
@@ -4852,9 +5055,9 @@
 msgstr[1] "%s файлов изменено"
 msgstr[2] "%s файла изменено"
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
@@ -4862,93 +5065,96 @@
 msgstr[1] "%s файла изменёно: %s добавления, %s удаления"
 msgstr[2] "%s файлов изменёно: %s добавлений, %s удалений"
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr "Показать полный diff"
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-msgid "Status change from pull request"
-msgstr "Изменение статуса"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "revisions"
+msgid "No revisions"
+msgstr "версии"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "Комментарий в pull-запросе"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 msgid "No title"
 msgstr "Нет заголовка"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr "Комментарий в pull-запросе"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy
+#| msgid "No changesets"
+msgid "on this changeset"
+msgstr "Нет изменений"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 msgid "Delete comment?"
 msgstr "Удалить комментарий?"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Последние изменения"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr "Комментарий к строке {1}."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 "Парсинг комментариев выполнен с использованием синтаксиса %s с поддержкой"
 " %s."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 "Используйте @имя_пользователя в тексте, чтобы отправить оповещение "
 "указанному пользователю."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
 msgstr "Предварительный просмотр комментария"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:85
+#: kallithea/templates/changeset/changeset_file_comment.html:77
 msgid "Submitting ..."
 msgstr "Применение..."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:80
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "Комментировать"
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr "Предпросмотр"
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr "Предпросмотр"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr "Вам необходимо авторизоваться, чтобы оставлять комментарии."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr "Авторизоваться сейчас"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr "Скрыть"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -4956,7 +5162,7 @@
 msgstr[1] "%d комментария"
 msgstr[2] "%d комментариев"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
@@ -4964,7 +5170,7 @@
 msgstr[1] "%d к строкам"
 msgstr[2] "%d к строкам"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
@@ -4972,25 +5178,27 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-msgid "Use @username inside this text to send notification to another local user."
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+#, fuzzy
+#| msgid "Use @username inside this text to notify another user"
+msgid "Use @username inside this text to notify another user."
 msgstr ""
 "Используйте @имя_пользователя в тексте, чтобы отправить оповещение "
 "указанному пользователю."
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 msgid "Set changeset status"
 msgstr "Изменить статус ревизии"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 msgid "No change"
 msgstr "Без изменений"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 msgid "Close"
 msgstr "Закрыть"
 
@@ -5009,7 +5217,7 @@
 msgstr "Показать полный diff для этого файла"
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr "Показать полный diff для этого файла"
@@ -5018,11 +5226,11 @@
 msgid "Show inline comments"
 msgstr "Показать комментарии в строках"
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr "Удалён"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr "Переименован"
 
@@ -5034,29 +5242,41 @@
 msgid "Ancestor"
 msgstr "Предок"
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr "Показать merge diff"
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr "Общий предок"
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr "отстаёт на"
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, python-format
 msgid "%s changesets"
 msgstr "%s изменений"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr "от"
 
@@ -5080,7 +5300,7 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
@@ -5088,49 +5308,36 @@
 msgstr[1] "Показать %s commit'а"
 msgstr[2] "Показать %s commit'ов"
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr "Нет файлов"
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr "Показать полный diff"
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Репозиторий Mercurial"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Git репозиторий"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "Публичный репозиторий"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "Изменений ещё не было"
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "Подписаться на ленту RSS %s"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "Подписаться на ленту Atom %s"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5257,10 +5464,6 @@
 msgid "Commit Changes"
 msgstr "Применить изменения"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr "Предыдущая ревизия"
@@ -5286,18 +5489,14 @@
 msgstr "Размер"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "Тип файла"
-
-#: kallithea/templates/files/files_browser.html:63
 msgid "Last Revision"
 msgstr "Последняя версия"
 
-#: kallithea/templates/files/files_browser.html:64
+#: kallithea/templates/files/files_browser.html:63
 msgid "Last Modified"
 msgstr "Последнее изменение"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 msgid "Last Committer"
 msgstr "Автор последней ревизии"
 
@@ -5410,8 +5609,8 @@
 msgstr "%s Наблюдатели"
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "Наблюдатели"
 
@@ -5464,8 +5663,8 @@
 msgstr "Форки %s"
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr "Ответвления"
 
@@ -5473,7 +5672,7 @@
 msgid "Forked"
 msgstr "Форкнуто"
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "Форки ещё не созданы"
 
@@ -5486,18 +5685,13 @@
 msgstr "Лента журнала RSS"
 
 #: kallithea/templates/journal/journal.html:56
-msgid "My Repos"
+msgid "My Repositories"
 msgstr "Мои репозитории"
 
-#: kallithea/templates/journal/journal_data.html:61
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr "Записи отсуствуют"
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "Публичный журнал"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "Общая лента журнала ATOM"
@@ -5539,20 +5733,16 @@
 msgid "Destination repository"
 msgstr "Репозиторий назначения"
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr "Рецензенты pull-запросов"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr "Записи отсуствуют"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "отозвать"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5561,50 +5751,49 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr "Последняя оценка: %s"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr "Удалить pull-запрос"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr "Подтвердите удаление этого pull-request'а"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr "Закрыто"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr "Удалить pull-запрос"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr "Подтвердите удаление этого pull-request'а"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this pull request"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "Подтвердите удаление этого pull-request'а"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
+#, fuzzy, python-format
+#| msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr "%s Pull-запрос #%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
-#, python-format
-msgid "Pull request #%s from %s#%s"
+#, fuzzy, python-format
+#| msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr "Pull-запросы №%s от %s#%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5621,11 +5810,11 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr "Еще не рассмотренный"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
@@ -5633,78 +5822,78 @@
 msgstr[1] "%d рецензента"
 msgstr[2] "%d рецензентов"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr "Запрос на внесение изменений был рассмотрен всеми рецензентами"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 msgid "There are no reviewers"
 msgstr "Нет рецензентов"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy
 msgid "on"
 msgstr "ничего"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr "Принять изменения"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr "Создано"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 #, fuzzy
 msgid "Update"
 msgstr "[обновлён] пользователь"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr "владелец"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr "рецензент"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr "Рецензенты pull-запросов"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 msgid "Remove reviewer"
 msgstr "Удалить рецензента"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 msgid "Potential Reviewers"
 msgstr "Потенциальные рецензенты"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr "Сохранить изменения"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 #, fuzzy
 msgid "Save as New Pull Request"
 msgstr "Создать новый pull запрос"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 msgid "Cancel Changes"
 msgstr "Отменить изменения"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 #, fuzzy
 msgid "Pull Request Content"
 msgstr "Статус pull-request'а был изменен"
@@ -5809,8 +5998,8 @@
 msgstr "RSS лента репозитория %s"
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr "Включено"
 
@@ -5818,45 +6007,45 @@
 msgid "Stats gathered: "
 msgstr "Полученная статистика: "
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "файлы"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr "Показать еще"
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "commit'ы"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "файлы добавлены"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "файлы изменены"
+msgid "files added"
+msgstr "файлы добавлены"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "файлы изменены"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "файлы удалены"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "commit"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "файл удалён"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "файл изменён"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "файл удалён"
 
@@ -5878,65 +6067,75 @@
 msgid "Fork of"
 msgstr "Форк от"
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr "Показать по имени"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "Клонировать из"
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
+msgstr "Ссылка для клонирования"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr "Показать по имени"
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr "Показать по ID"
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr "Популярные файлы"
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "Скачать"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "Скачиваний ещё нет"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "Скачивание отключено в этом репозитории"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr "Скачать в zip"
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr "Отметьте для скачивания архива с дочерними репозиториями"
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
+#: kallithea/templates/summary/summary.html:125
+#, fuzzy
+#| msgid "with subrepos"
+msgid "With subrepos"
 msgstr "с дочерними репозиториями"
 
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr "Размер репозитория"
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr "Лента новостей"
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 msgid "Latest Changes"
 msgstr "Последние изменения"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr "Быстрый старт"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "Скачать %s как %s"
@@ -5949,3 +6148,312 @@
 #: kallithea/templates/tags/tags.html:26
 msgid "Compare Tags"
 msgstr "Сравнить теги"
+
+#~ msgid "No comments."
+#~ msgstr "Нет комментариев."
+
+#~ msgid "public journal"
+#~ msgstr "общедоступный журнал"
+
+#~ msgid "journal"
+#~ msgstr "журнал"
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr "Закрытый репозиторий"
+
+#~ msgid "Unlocked repository"
+#~ msgstr "Открытый репозиторий"
+
+#~ msgid "Unlocked"
+#~ msgstr "Разблокировано"
+
+#~ msgid "Locked"
+#~ msgstr "Заблокировано"
+
+#~ msgid "Repository has been %s"
+#~ msgstr "Репозиторий %s"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "Вы не можете редактировать данного пользователя"
+
+#~ msgid "No Files"
+#~ msgstr "Файлов нет"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "Имя \"%(username)s\" отклонено"
+
+#~ msgid "invalid user name"
+#~ msgstr "неверное имя пользователя"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "Ваш аккаунт выключен"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "неверный URL для клонирования"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+#~ "Неверный URL клонирования, предоставьте "
+#~ "корректный URL для клонирования в "
+#~ "формате http(s)/svn+http(s)/ssh"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+#~ "Ревизии %(revs)s уже включены в pull-"
+#~ "request или имеют установленный статус"
+
+#~ msgid "Defaults"
+#~ msgstr "Значения по умолчанию"
+
+#~ msgid "My Emails"
+#~ msgstr "Мои адреса E-mail"
+
+#~ msgid "Watched"
+#~ msgstr "Просмотрено"
+
+#~ msgid "My Permissions"
+#~ msgstr "Мои привилегии"
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr "удалить"
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "Управление привилегиями"
+
+#~ msgid "Overview"
+#~ msgstr "Обзор"
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr "Перезаписать существующие настройки"
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr "Белый список IP для всех пользователей"
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "Обзор прав пользователей по умолчанию"
+
+#~ msgid "none"
+#~ msgstr "ничего"
+
+#~ msgid "read"
+#~ msgstr "читать"
+
+#~ msgid "write"
+#~ msgstr "записывать"
+
+#~ msgid "admin"
+#~ msgstr "администратор"
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "Опциональный URL, с которого требуется склонировать репозиторий."
+
+#~ msgid "Remote URL"
+#~ msgstr "Ссылка для клонирования"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "Получить изменения с удалённой стороны"
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr "Неизменяемый id"
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "редактировать"
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr "Уничтожить все данные"
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "Стандартные привилегии"
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "Изменение статуса"
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+#~ "Используйте @имя_пользователя в тексте, чтобы"
+#~ " отправить оповещение указанному пользователю."
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr "Тип файла"
+
+#~ msgid "My Repos"
+#~ msgstr "Мои репозитории"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr "Последняя оценка: %s"
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr "владелец"
+
+#~ msgid "reviewer"
+#~ msgstr "рецензент"
+
--- a/kallithea/i18n/sk/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/sk/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,9 +5,9 @@
 # #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2015-04-01 12:59+0200\n"
 "Last-Translator: Andrew Shadura <andrew@shadura.me>\n"
 "Language-Team: Slovak "
@@ -20,19 +20,23 @@
 "X-Generator: Weblate 2.3-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "Zatiaľ nie sú žiadne zmeny"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr "(zatvorené)"
 
@@ -47,50 +51,55 @@
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr ""
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr "Taká revízia neexistuje"
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-msgid "No comments."
-msgstr "Nie sú žiadne komentáre."
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr ""
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy, python-format
+#| msgid "Unknown revision %s"
+msgid "No response"
+msgstr "Neznáma revízia %s"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 
-#: kallithea/controllers/error.py:99
-msgid "Unauthorized access to resource"
-msgstr ""
-
-#: kallithea/controllers/error.py:101
-msgid "You don't have permission to view this page"
-msgstr "Nemáte oprávnenie na zobrazenie tejto stránky"
-
 #: kallithea/controllers/error.py:103
-msgid "The resource could not be found"
+msgid "Unauthorized access to resource"
 msgstr ""
 
 #: kallithea/controllers/error.py:105
+msgid "You don't have permission to view this page"
+msgstr "Nemáte oprávnenie na zobrazenie tejto stránky"
+
+#: kallithea/controllers/error.py:107
+msgid "The resource could not be found"
+msgstr ""
+
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -106,17 +115,17 @@
 msgid "%s %s feed"
 msgstr ""
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -194,45 +203,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr "Sťahovanie vypnuté"
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Neznáma revízia %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "Prázdny repozitár"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr ""
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "Zmeny"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Vetvy"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Tagy"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
@@ -248,9 +255,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "Repozitáre"
 
@@ -270,145 +277,163 @@
 msgstr "Záložka"
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr ""
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
-msgstr ""
-
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
+msgstr ""
+
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+#, fuzzy
+#| msgid "bad captcha"
+msgid "Bad captcha"
 msgstr "zlá captcha"
 
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr ""
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr ""
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr "%s (zatvorené)"
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Záložky"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 msgid "No description"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 msgid "Closing."
 msgstr ""
 
@@ -424,21 +449,21 @@
 msgid "An error occurred during search operation."
 msgstr "Došlo k chybe počas vyhľadávania."
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr ""
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -451,38 +476,38 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+msgid "Forever"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr "5 minút"
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr "1 hodina"
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr "1 deň"
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr "1 mesiac"
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -496,7 +521,7 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
+msgid "Unmodified"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:262
@@ -512,117 +537,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr "Došlo k chybe pri aktualizácii gist %s"
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr "Úspešne aktualizované heslo"
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr "Došlo k chybe pri aktualizácii hesla užívateľa"
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "Došlo k chybe pri ukladaní e-mailovej adresy"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
 msgstr ""
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr ""
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -630,11 +671,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -642,221 +683,211 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:297
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
-msgid "Removed repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:307
-#, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
+#: kallithea/controllers/admin/user_groups.py:340
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
-#: kallithea/controllers/admin/user_groups.py:340
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+msgid "Repository group permissions updated"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:321
+#, python-format
+msgid "Cannot delete repository %s which still has forks"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "Nič"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy, python-format
+#| msgid "This repository has been locked by %s on %s"
+msgid "Repository has been locked"
+msgstr "Tento repozitár bol uzamknutý používateľom %s dňa %s"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy, python-format
+#| msgid "This repository has been locked by %s on %s"
+msgid "Repository has been unlocked"
+msgstr "Tento repozitár bol uzamknutý používateľom %s dňa %s"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
 msgstr ""
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
@@ -872,7 +903,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 
 #: kallithea/controllers/admin/settings.py:213
@@ -949,83 +980,80 @@
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:745
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr ""
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr ""
 
@@ -1041,158 +1069,160 @@
 msgid "No changes detected"
 msgstr ""
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
-msgstr ""
-
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:677
+msgid "Compare view"
+msgstr ""
+
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr ""
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr ""
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:722
+#, python-format
+msgid "Fork name %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:742
+#, python-format
+msgid "Pull request %s"
+msgstr ""
+
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr ""
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr ""
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr ""
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr ""
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1200,7 +1230,7 @@
 "repositories"
 msgstr ""
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
@@ -1208,7 +1238,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
@@ -1216,7 +1246,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
@@ -1224,7 +1254,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
@@ -1232,7 +1262,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
@@ -1240,7 +1270,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
@@ -1248,27 +1278,27 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr ""
 
@@ -1283,7 +1313,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr ""
 
@@ -1298,7 +1328,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr ""
 
@@ -1313,7 +1343,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr ""
 
@@ -1328,7 +1358,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr ""
 
@@ -1367,7 +1397,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr ""
 
@@ -1382,7 +1412,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr ""
 
@@ -1397,7 +1427,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr ""
 
@@ -1412,7 +1442,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr ""
 
@@ -1427,7 +1457,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr ""
 
@@ -1463,7 +1493,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr ""
 
@@ -1478,7 +1508,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr ""
 
@@ -1493,7 +1523,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr ""
 
@@ -1508,7 +1538,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr ""
 
@@ -1520,7 +1550,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr ""
 
@@ -1532,7 +1562,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr ""
 
@@ -1544,7 +1574,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr ""
 
@@ -1556,7 +1586,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr ""
 
@@ -1568,7 +1598,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr ""
 
@@ -1579,7 +1609,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr ""
 
@@ -1590,7 +1620,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr ""
 
@@ -1601,7 +1631,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr ""
 
@@ -1612,7 +1642,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr ""
 
@@ -1623,7 +1653,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr ""
 
@@ -1634,7 +1664,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr ""
 
@@ -1645,7 +1675,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr ""
 
@@ -1656,7 +1686,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr ""
 
@@ -1667,7 +1697,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr ""
 
@@ -1678,7 +1708,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr ""
 
@@ -1689,29 +1719,135 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr ""
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+msgid "Default user has read access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1669
+msgid "Default user has write access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+msgid "Only admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1683
+msgid "Non-admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1685
+msgid "Only admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1686
+msgid "Non-admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "Repozitáre"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "Repozitáre"
+
+#: kallithea/model/db.py:1698
+msgid "User registration with manual account activation"
+msgstr ""
+
+#: kallithea/model/db.py:1699
+msgid "User registration with automatic account activation"
+msgstr ""
+
+#: kallithea/model/db.py:2228
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Not reviewed"
+msgstr ""
+
+#: kallithea/model/db.py:2231
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Under review"
+msgstr ""
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr ""
@@ -1730,297 +1866,318 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
-#, python-format
-msgid "%(user)s commented on changeset at %(when)s"
-msgstr ""
-
-#: kallithea/model/notification.py:253
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
 #: kallithea/model/notification.py:254
 #, python-format
-msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:255
 #, python-format
-msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s sent message %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:256
 #, python-format
-msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:257
 #, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:258
+#, python-format
+msgid "%(user)s opened new pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:259
+#, python-format
+msgid "%(user)s commented on pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:266
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:267
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:268
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:269
+#, python-format
+msgid "%(user)s registered in Kallithea at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:270
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:271
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr ""
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr ""
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr ""
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr ""
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr ""
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr ""
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr ""
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
-msgstr ""
-
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:249
+msgid "You can't remove this user since it is crucial for the entire application"
+msgstr ""
+
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr ""
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr ""
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr ""
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr ""
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr ""
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, python-format
+msgid "Username \"%(username)s\" cannot be used"
+msgstr ""
+
+#: kallithea/model/validators.py:99
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
-msgstr ""
-
-#: kallithea/model/validators.py:132
+" dashes and must begin with an alphanumeric character or underscore"
+msgstr ""
+
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr ""
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr ""
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr ""
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
-msgstr ""
-
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr ""
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr ""
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
-msgstr ""
-
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:300
+msgid "Invalid username or password"
+msgstr ""
+
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr ""
+
+#: kallithea/model/validators.py:345
+#, python-format
+msgid "Repository name %(repo)s is not allowed"
+msgstr ""
+
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr ""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:474
-msgid "invalid clone URL"
-msgstr ""
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-
-#: kallithea/model/validators.py:500
+#: kallithea/model/validators.py:465
+#, fuzzy
+#| msgid "Unlock Repository"
+msgid "Invalid repository URL"
+msgstr "Odblokovať repozitár"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr ""
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr ""
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr ""
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
-msgstr ""
-
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
-msgstr ""
-
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:705
+msgid "This email address is already in use"
+msgstr ""
+
+#: kallithea/model/validators.py:725
+#, python-format
+msgid "Email address \"%(email)s\" not found"
+msgstr ""
+
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr ""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr ""
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr ""
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2082,13 +2239,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2100,11 +2257,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr ""
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2125,11 +2282,11 @@
 msgid "Name"
 msgstr ""
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr ""
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2138,18 +2295,19 @@
 msgid "Tip"
 msgstr ""
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr ""
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2161,7 +2319,7 @@
 msgid "Click to sort ascending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2173,11 +2331,11 @@
 msgid "Click to sort descending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr ""
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2189,10 +2347,10 @@
 msgid "Data error."
 msgstr ""
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2202,7 +2360,7 @@
 msgstr ""
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr ""
 
@@ -2211,39 +2369,39 @@
 msgid "Log In to %s"
 msgstr ""
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr ""
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr ""
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr ""
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr ""
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr ""
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr ""
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr ""
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr ""
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr ""
@@ -2291,26 +2449,26 @@
 msgstr ""
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr ""
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr ""
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr ""
 
@@ -2420,109 +2578,95 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr ""
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
+#: kallithea/templates/admin/defaults/defaults.html:11
+#: kallithea/templates/base/base.html:66
 #, fuzzy
 msgid "Repository Defaults"
 msgstr "Repozitáre"
 
-#: kallithea/templates/admin/defaults/defaults.html:11
-#: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr ""
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
@@ -2554,6 +2698,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr ""
 
@@ -2564,7 +2714,7 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
+msgid "Never"
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:145
@@ -2572,7 +2722,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
@@ -2595,12 +2745,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr ""
 
@@ -2626,25 +2776,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2674,11 +2826,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr ""
 
@@ -2687,9 +2850,18 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2715,7 +2887,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr ""
 
@@ -2724,26 +2896,33 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
+#: kallithea/templates/admin/my_account/my_account.html:36
+msgid "Email Addresses"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr ""
+#, fuzzy
+#| msgid "Repositories"
+msgid "Owned Repositories"
+msgstr "Repozitáre"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr ""
+#, fuzzy
+#| msgid "Repositories"
+msgid "Watched Repositories"
+msgstr "Repozitáre"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
-msgid "My Permissions"
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
+msgid "Show Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
@@ -2751,56 +2930,42 @@
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
 #, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
+msgid "Confirm to reset this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+msgid "Expired"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
 #, python-format
-msgid "Confirm to remove this api key: %s"
+msgid "Confirm to remove this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
+msgid "Remove"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+msgid "New API key"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2813,19 +2978,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2846,19 +2998,24 @@
 msgid "Change Your Account Password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr ""
@@ -2879,13 +3036,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2921,7 +3072,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr ""
 
@@ -2939,20 +3090,14 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:5
-msgid "Permissions Administration"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/base/base.html:64
-msgid "Permissions"
+msgid "Default Permissions"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:28
@@ -2961,14 +3106,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr ""
@@ -2980,23 +3121,27 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Apply to all existing repositories"
+msgstr "Repozitáre"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
+msgid "Permissions for the Default user on new repositories."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr ""
@@ -3008,70 +3153,99 @@
 "will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+msgid "Apply to all existing repository groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
-msgid "Repository creation with group write access"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+msgid "Top level repository creation"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
+msgid "Repository creation with group write access"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+msgid ""
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm to delete this IP address: %s"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-msgid "Default User Permissions Overview"
+msgid "New IP address"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
@@ -3095,12 +3269,12 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3118,19 +3292,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr ""
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr ""
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3151,12 +3331,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3168,38 +3348,10 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+msgid "User/User Group"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3208,7 +3360,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+msgid "Default"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3217,12 +3369,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
+msgid "Revoke"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
@@ -3232,7 +3379,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+msgid "Apply to children"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3281,42 +3428,41 @@
 msgid "Number of Top-level Repositories"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Clone remote repository"
+msgstr "Prázdny repozitár"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr ""
 
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
+#: kallithea/templates/forks/fork.html:58
+msgid "Landing revision"
+msgstr ""
+
 #: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
-#: kallithea/templates/forks/fork.html:58
-msgid "Landing revision"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:72
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3363,8 +3509,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr ""
 
@@ -3386,45 +3532,45 @@
 msgid "Public Journal Visibility"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 msgid "Add to Public Journal"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 msgid "Change Locking"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 msgid "Confirm to unlock repository."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 msgid "Unlock Repository"
 msgstr "Odblokovať repozitár"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 msgid "Confirm to lock repository."
 msgstr "Potvrdenie blokovania repozitára."
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 msgid "Lock Repository"
 msgstr "Zablokovať repozitár"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3432,17 +3578,17 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 msgid "Delete this Repository"
 msgstr "Vymazať tento repozitár"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
@@ -3450,15 +3596,15 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3496,8 +3642,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr ""
@@ -3536,28 +3682,38 @@
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
-msgstr ""
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Private Repository"
+msgstr "Prázdny repozitár"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-msgid "Remote URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Remote repository URL"
+msgstr "Prázdny repozitár"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy, python-format
+#| msgid "Changes on %s repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "Zmeny na repozitáre %s"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to lock repository."
+msgid "Confirm to pull changes from remote repository."
+msgstr "Potvrdenie blokovania repozitára."
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr ""
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Permanent Repository ID"
+msgstr "Prázdny repozitár"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3571,43 +3727,35 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
-msgid "Clone URL"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Remote repository"
+msgstr "Prázdny repozitár"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Repository URL"
+msgstr "Repozitáre"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr ""
 
@@ -3664,55 +3812,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr ""
 
@@ -3785,13 +3889,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3812,7 +3916,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3839,38 +3943,42 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
-msgid "Git version"
+msgid "Platform"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:9
-msgid "Upgrade info endpoint"
+msgid "Git version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
+msgid "Upgrade info endpoint"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4023,11 +4131,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4035,7 +4143,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4054,6 +4162,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4073,15 +4182,8 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
-#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
-#: kallithea/templates/admin/user_groups/user_groups.html:48
-msgid "Members"
+msgid "Show Members"
 msgstr ""
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
@@ -4089,8 +4191,14 @@
 msgid "User Group: %s"
 msgstr ""
 
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
+#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
+#: kallithea/templates/admin/user_groups/user_groups.html:48
+msgid "Members"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4115,10 +4223,6 @@
 msgid "User Groups Administration"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr ""
@@ -4144,11 +4248,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-msgid "Default Permissions"
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4158,7 +4258,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4168,11 +4268,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
@@ -4194,18 +4294,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr ""
 
@@ -4226,47 +4319,55 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr ""
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr ""
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
-#: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
-msgid "Changelog"
-msgstr ""
-
 #: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:141
+#: kallithea/templates/changelog/changelog.html:14
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
+msgid "Changelog"
+msgstr ""
+
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr ""
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr ""
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4276,129 +4377,125 @@
 msgid "Compare"
 msgstr ""
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr ""
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
-#: kallithea/templates/forks/fork.html:9
-msgid "Fork"
+msgid "Follow"
 msgstr ""
 
 #: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
+#: kallithea/templates/forks/fork.html:9
+msgid "Fork"
+msgstr ""
+
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr ""
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr ""
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr ""
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr ""
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr ""
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr ""
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr ""
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "Repozitáre"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4426,7 +4523,8 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:22
@@ -4453,7 +4551,7 @@
 msgstr ""
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr ""
 
@@ -4523,6 +4621,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr ""
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr ""
@@ -4552,6 +4658,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4581,10 +4688,6 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr ""
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4602,7 +4705,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4615,7 +4718,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4625,7 +4728,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4658,7 +4761,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr ""
 
@@ -4674,7 +4777,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4704,21 +4807,23 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
-msgstr ""
-
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Empty repository"
+msgid "Push new repository"
+msgstr "Prázdny repozitár"
+
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr ""
 
@@ -4728,15 +4833,15 @@
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr ""
@@ -4759,7 +4864,7 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+msgid "Merge"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4770,9 +4875,17 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+msgid "Replaced by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:149
+msgid "Preceded by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
@@ -4780,9 +4893,9 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
@@ -4790,91 +4903,93 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy, python-format
+#| msgid "Unknown revision %s"
+msgid "No revisions"
+msgstr "Neznáma revízia %s"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Status change from pull request"
+msgid "on pull request"
+msgstr "Zmena stavu"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
+msgid "No title"
 msgstr ""
 
 #: kallithea/templates/changeset/changeset_file_comment.html:24
-#, fuzzy
-msgid "Status change from pull request"
-msgstr "Zmena stavu"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
-msgid "No title"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#, fuzzy, python-format
+#| msgid "%s changesets"
+msgid "on this changeset"
+msgstr "%s zmien"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "Posledné zmeny"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
+msgid "Comment preview"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:77
+msgid "Submitting ..."
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
-msgid "Comment preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:85
-msgid "Submitting ..."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -4882,7 +4997,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
@@ -4890,7 +5005,7 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
@@ -4898,25 +5013,25 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-msgid "Use @username inside this text to send notification to another local user."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+msgid "Use @username inside this text to notify another user."
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "Zmeny"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "Žiadne zmeny"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "(zatvorené)"
@@ -4936,7 +5051,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -4945,11 +5060,11 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 msgid "Deleted"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 msgid "Renamed"
 msgstr ""
 
@@ -4961,29 +5076,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr "%s zmien"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 msgid "behind"
 msgstr ""
 
@@ -5007,7 +5134,7 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
@@ -5015,49 +5142,36 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr ""
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr ""
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5183,10 +5297,6 @@
 msgid "Commit Changes"
 msgstr "Žiadne zmeny"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5212,18 +5322,14 @@
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
+msgid "Last Revision"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
+msgid "Last Modified"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:64
-msgid "Last Modified"
-msgstr ""
-
-#: kallithea/templates/files/files_browser.html:65
 msgid "Last Committer"
 msgstr ""
 
@@ -5336,8 +5442,8 @@
 msgstr ""
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr ""
 
@@ -5388,8 +5494,8 @@
 msgstr ""
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr ""
 
@@ -5397,7 +5503,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr ""
 
@@ -5410,18 +5516,13 @@
 msgstr ""
 
 #: kallithea/templates/journal/journal.html:56
-msgid "My Repos"
-msgstr "Moje repozitáre"
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr ""
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr ""
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr ""
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr ""
@@ -5463,20 +5564,14 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+msgid "Vote"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5485,50 +5580,48 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
 #, python-format
-msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, python-format
-msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5544,11 +5637,11 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
@@ -5556,78 +5649,78 @@
 msgstr[1] ""
 msgstr[2] ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "Zatiaľ nie sú reviewers"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 msgid "on"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 msgid "Update"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 msgid "Cancel Changes"
 msgstr "Zrušiť zmeny"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 msgid "Pull Request Content"
 msgstr ""
 
@@ -5728,8 +5821,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5737,45 +5830,45 @@
 msgid "Stats gathered: "
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
-msgid "commits"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:390
-msgid "files added"
+msgid "commits"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
+msgid "files added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:394
-msgid "commit"
-msgstr ""
-
 #: kallithea/templates/summary/statistics.html:395
-msgid "file added"
+msgid "commit"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:396
-msgid "file changed"
+msgid "file added"
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:397
+msgid "file changed"
+msgstr ""
+
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr ""
 
@@ -5797,65 +5890,73 @@
 msgid "Fork of"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:72
+msgid "Clone URL"
 msgstr ""
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:125
+msgid "With subrepos"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 msgid "Latest Changes"
 msgstr "Posledné zmeny"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 msgid "Quick Start"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
@@ -5868,3 +5969,419 @@
 #: kallithea/templates/tags/tags.html:26
 msgid "Compare Tags"
 msgstr ""
+
+#~ msgid "increase diff context to %(num)s lines"
+#~ msgstr ""
+
+#~ msgid "No comments."
+#~ msgstr "Nie sú žiadne komentáre."
+
+#~ msgid "public journal"
+#~ msgstr ""
+
+#~ msgid "journal"
+#~ msgstr ""
+
+#~ msgid "forever"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Cannot delete %s it still contains attached forks"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked"
+#~ msgstr ""
+
+#~ msgid "Locked"
+#~ msgstr ""
+
+#~ msgid "Repository has been %s"
+#~ msgstr ""
+
+#~ msgid "You can't edit this user"
+#~ msgstr ""
+
+#~ msgid "compare view"
+#~ msgstr ""
+
+#~ msgid "fork name %s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s"
+#~ msgstr ""
+
+#~ msgid "No Files"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#~ msgstr ""
+
+#~ msgid "You can't remove this user since it's crucial for entire application"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Username may only contain alphanumeric "
+#~ "characters underscores, periods or dashes "
+#~ "and must begin with alphanumeric "
+#~ "character or underscore"
+#~ msgstr ""
+
+#~ msgid "invalid password"
+#~ msgstr ""
+
+#~ msgid "invalid user name"
+#~ msgstr ""
+
+#~ msgid "Your account is disabled"
+#~ msgstr ""
+
+#~ msgid "Repository name %(repo)s is disallowed"
+#~ msgstr ""
+
+#~ msgid "invalid clone URL"
+#~ msgstr ""
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+
+#~ msgid "This email address is already taken"
+#~ msgstr ""
+
+#~ msgid "email \"%(email)s\" does not exist."
+#~ msgstr ""
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr ""
+
+#~ msgid "never"
+#~ msgstr ""
+
+#~ msgid "My Emails"
+#~ msgstr ""
+
+#~ msgid "Watched"
+#~ msgstr ""
+
+#~ msgid "My Permissions"
+#~ msgstr ""
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr ""
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr ""
+
+#~ msgid "Overview"
+#~ msgstr ""
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "All default permissions on each user "
+#~ "group will be reset to chosen "
+#~ "permission, note that all custom default"
+#~ " permission on repository groups will "
+#~ "be lost"
+#~ msgstr ""
+
+#~ msgid "Repository creation"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Confirm to delete this ip: %s"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr ""
+
+#~ msgid "none"
+#~ msgstr ""
+
+#~ msgid "read"
+#~ msgstr ""
+
+#~ msgid "write"
+#~ msgstr ""
+
+#~ msgid "admin"
+#~ msgstr ""
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "default"
+#~ msgstr ""
+
+#~ msgid "revoke"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "apply to children"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr ""
+
+#~ msgid "private repository"
+#~ msgstr ""
+
+#~ msgid "Remote URL"
+#~ msgstr ""
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr ""
+
+#~ msgid "Confirm to pull changes from remote side."
+#~ msgstr ""
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr ""
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Meta-Tagging"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr ""
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "Push new repo"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "merge"
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Comment from pull request"
+#~ msgstr ""
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr ""
+
+#~ msgid "My Repos"
+#~ msgstr "Moje repozitáre"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr ""
+
+#~ msgid "reviewer"
+#~ msgstr ""
+
+#~ msgid "with subrepos"
+#~ msgstr ""
+
--- a/kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -7,9 +7,9 @@
 # xpol <xpolife@gmail.com>, 2012
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
 "PO-Revision-Date: 2014-12-12 14:19+0200\n"
 "Last-Translator: Michal Čihař <michal@cihar.com>\n"
 "Language-Team: Simplified Chinese "
@@ -21,19 +21,23 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr "还没有修订集"
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "无"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
 msgstr ""
 
@@ -48,51 +52,55 @@
 
 #: kallithea/controllers/changeset.py:169
 #, python-format
-msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
 msgstr ""
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr ""
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-#, fuzzy
-msgid "No comments."
-msgstr "%d条评论"
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr ""
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "revisions"
+msgid "No response"
+msgstr "修订"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr "由于错误的语法,服务器无法对请求进行响应。"
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr "未授权的资源访问"
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "无权访问该页面"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "资源未找到"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -108,17 +116,17 @@
 msgid "%s %s feed"
 msgstr "%s %s订阅"
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr "修订集太大已被截断......"
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -196,45 +204,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr ""
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "未知版本%s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "空版本库"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "未知包类型"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "修订集"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "分支"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "标签"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "在复刻版本库%s的时候发生错误"
@@ -250,9 +256,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "版本库"
 
@@ -272,149 +278,165 @@
 msgstr ""
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
 msgstr "公共日志"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
 msgstr "日志"
 
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr ""
-
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr ""
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr ""
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "密码重置链接已经发送"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr "密码已经成功重置,新密码已经发送到你的邮箱"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr "修订集"
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "书签"
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 #, fuzzy
 msgid "No description"
 msgstr "描述"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr "成功提交拉取请求"
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 #, fuzzy
 msgid "Error occurred while creating pull request"
 msgstr "提交拉取请求时发生错误"
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 #, fuzzy
 msgid "Pull request update created"
 msgstr "拉取请求检视人员"
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 #, fuzzy
 msgid "Pull request updated"
 msgstr "拉取请求"
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr "成功删除拉取请求"
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 #, fuzzy
 msgid "Closing."
 msgstr "使用中"
@@ -432,22 +454,22 @@
 msgid "An error occurred during search operation."
 msgstr "在搜索操作中发生异常"
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 #, fuzzy
 msgid "No data ready yet"
 msgstr "数据未加载"
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "该版本库统计功能已经禁用"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -460,38 +482,40 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
-msgstr ""
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+#, fuzzy
+#| msgid "reviewer"
+msgid "Forever"
+msgstr "检视者"
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -505,8 +529,10 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
-msgstr ""
+#, fuzzy
+#| msgid "Last Modified"
+msgid "Unmodified"
+msgstr "最后修改于"
 
 #: kallithea/controllers/admin/gists.py:262
 msgid "Successfully updated gist content"
@@ -521,117 +547,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr "由于是系统帐号,无法编辑该用户"
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "你的帐号已经更新完成"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr "已为用户添加电子邮件 %s"
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr "保存电子邮件时发生错误"
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr "成功删除用户电子邮件"
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
-msgstr ""
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "读"
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "读"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "写"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "写"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "管理"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "停用"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -639,11 +681,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -651,221 +693,212 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "启用"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr "这个组内有%s个版本库因而无法删除"
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:297
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
-msgid "Removed repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:307
-#, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
+#: kallithea/controllers/admin/user_groups.py:340
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
-#: kallithea/controllers/admin/user_groups.py:340
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+msgid "Repository group permissions updated"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "版本库%s成功更新"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
+#: kallithea/controllers/admin/repos.py:321
+#, fuzzy, python-format
+#| msgid "Cannot delete %s it still contains attached forks"
+msgid "Cannot delete repository %s which still has forks"
 msgstr "无法删除%s因为它还有其他分复刻本库"
 
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "在删除%s的时候发生错误"
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr "成功更新在公共日志中的可见性"
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr "设置版本库到公共日志时发生错误"
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr "令牌不匹配"
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr "无"
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
 msgstr "成功将版本库%s标记为复刻自%s"
 
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr "在搜索操作中发生错误"
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been locked"
+msgstr "版本库未锁定"
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy
+#| msgid "Repository is not locked"
+msgid "Repository has been unlocked"
+msgstr "版本库未锁定"
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr "解锁时发生错误"
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
-msgstr ""
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr "清除缓存时发生错误"
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
+msgstr "成功拉取自远程路径"
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr "版本库已被%s"
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr "清除缓存时发生错误"
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr "成功拉取自远程路径"
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr "从远程路径拉取时发生错误"
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr "删除版本库统计时发生错误"
 
@@ -881,7 +914,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 
 #: kallithea/controllers/admin/settings.py:213
@@ -958,83 +991,80 @@
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr "保存权限时发生错误"
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "用户更新成功"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr "删除用户时发生错误"
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "无法编辑该用户"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:745
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "必须是注册用户才能进行此操作"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "必须登录才能访问该页面"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr "未找到修订集"
 
@@ -1050,158 +1080,164 @@
 msgid "No changes detected"
 msgstr "未发现差异"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "已经删除分支%s"
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr "创建标签%s"
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "显示合并的修订集%s->%s"
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
+#: kallithea/lib/helpers.py:677
+#, fuzzy
+#| msgid "compare view"
+msgid "Compare view"
 msgstr "比较显示"
 
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "还有"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr "%s个"
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "修订"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "fork name %s"
+msgid "Fork name %s"
 msgstr "复刻名称%s"
 
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "Pull request %s"
 msgstr "拉取请求#%s"
 
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr "[删除]版本库"
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr "[创建]版本库"
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr "[创建]复刻版本库"
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr "[复刻]版本库"
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr "[更新]版本库"
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr "[删除]版本库"
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr "[创建]用户"
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr "[更新]用户"
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr "[评论]了版本库中的修订"
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr "[评论]拉取请求"
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr "[关闭] 拉取请求"
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr "[推送]到"
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr "[通过Kallithea提交]到版本库"
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr "[远程拉取]到版本库"
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr "[拉取]自"
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr "[开始关注]版本库"
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr "[停止关注]版本库"
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr " 还有%s个"
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "没有文件"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr "无文件"
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1209,63 +1245,63 @@
 "repositories"
 msgstr "版本库%s没有映射到数据库,可能是从文件系统创建或者重命名,请重启Kallithea以重新扫描版本库"
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d年"
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d月"
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d天"
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d时"
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d分"
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d秒"
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr "%s"
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr "%s前"
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr "%s零%s"
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s零%s前"
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "刚才"
 
@@ -1280,7 +1316,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr "无版本库访问权限"
 
@@ -1295,7 +1331,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr "版本库读取权限"
 
@@ -1310,7 +1346,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr "版本库写入权限"
 
@@ -1325,7 +1361,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr "版本库管理权限"
 
@@ -1364,7 +1400,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr "Kallithea 管理员"
 
@@ -1379,7 +1415,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr "禁用创建版本库"
 
@@ -1394,7 +1430,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr "允许创建版本库"
 
@@ -1409,7 +1445,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr "禁用复刻版本库"
 
@@ -1424,7 +1460,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr "允许复刻版本库"
 
@@ -1460,7 +1496,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr "未检视"
 
@@ -1475,7 +1511,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr "已批准"
 
@@ -1490,7 +1526,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr "驳回"
 
@@ -1505,7 +1541,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr "检视中"
 
@@ -1517,7 +1553,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr ""
 
@@ -1529,7 +1565,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr ""
 
@@ -1541,7 +1577,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr ""
 
@@ -1553,7 +1589,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr ""
 
@@ -1565,7 +1601,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr ""
 
@@ -1576,7 +1612,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr ""
 
@@ -1587,7 +1623,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr ""
 
@@ -1598,7 +1634,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr ""
 
@@ -1609,7 +1645,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr ""
 
@@ -1620,7 +1656,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr ""
 
@@ -1631,7 +1667,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr ""
 
@@ -1642,7 +1678,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr ""
 
@@ -1653,7 +1689,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr ""
 
@@ -1664,7 +1700,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr ""
 
@@ -1675,7 +1711,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr ""
 
@@ -1686,29 +1722,141 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr "在%s行"
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr "[提及]"
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has read access to new repositories"
+msgstr "未授权的资源访问"
+
+#: kallithea/model/db.py:1669
+#, fuzzy
+#| msgid "Unauthorized access to resource"
+msgid "Default user has write access to new repositories"
+msgstr "未授权的资源访问"
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+#, fuzzy
+#| msgid "You don't have permissions to create repository in this group"
+msgid "Only admins can create repository groups"
+msgstr "没有在该版本库组中创建版本库的权限"
+
+#: kallithea/model/db.py:1683
+#, fuzzy
+#| msgid "You don't have permissions to create repository in this group"
+msgid "Non-admins can create repository groups"
+msgstr "没有在该版本库组中创建版本库的权限"
+
+#: kallithea/model/db.py:1685
+msgid "Only admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1686
+msgid "Non-admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "创建版本库"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "创建版本库"
+
+#: kallithea/model/db.py:1698
+msgid "User registration with manual account activation"
+msgstr ""
+
+#: kallithea/model/db.py:1699
+msgid "User registration with automatic account activation"
+msgstr ""
+
+#: kallithea/model/db.py:2228
+#, fuzzy
+#| msgid "Not Reviewed"
+msgid "Not reviewed"
+msgstr "未检视"
+
+#: kallithea/model/db.py:2231
+#, fuzzy
+#| msgid "Under Review"
+msgid "Under review"
+msgstr "检视中"
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "请登录"
@@ -1727,300 +1875,330 @@
 msgid "Enter %(min)i characters or more"
 msgstr "输入少于%(min)i个字符"
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
-#, python-format
-msgid "%(user)s commented on changeset at %(when)s"
-msgstr ""
-
-#: kallithea/model/notification.py:253
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
 #: kallithea/model/notification.py:254
 #, python-format
-msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:255
 #, python-format
-msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s sent message %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:256
 #, python-format
-msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:257
 #, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:258
+#, fuzzy, python-format
+#| msgid "Successfully opened new pull request"
+msgid "%(user)s opened new pull request %(age)s"
+msgstr "成功提交拉取请求"
+
+#: kallithea/model/notification.py:259
+#, fuzzy, python-format
+#| msgid "[commented] on pull request for"
+msgid "%(user)s commented on pull request %(age)s"
+msgstr "[评论]拉取请求"
+
+#: kallithea/model/notification.py:266
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:267
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:268
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:269
+#, python-format
+msgid "%(user)s registered in Kallithea at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:270
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:271
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, fuzzy, python-format
-msgid "New user %(new_username)s registered"
-msgstr "用户名称 %(new_username)s 无效"
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, fuzzy, python-format
+msgid "New user %(new_username)s registered"
+msgstr "用户名称 %(new_username)s 无效"
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 #, fuzzy
 msgid "Closing"
 msgstr "使用中"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr ""
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr ""
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr "最新tip版本"
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr ""
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr "由于是系统帐号,无法编辑该用户"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr "由于是系统帐号,无法删除该用户"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr "由于用户 \"%s\" 拥有版本库%s因而无法删除,请修改版本库所有者或删除版本库。%s"
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr "由于用户 \"%s\" 拥有版本库%s因而无法删除,请修改版本库所有者或删除版本库。%s"
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, fuzzy, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr "由于用户 \"%s\" 拥有版本库%s因而无法删除,请修改版本库所有者或删除版本库。%s"
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr ""
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr ""
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr ""
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr "值不能为空"
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr "用户名称%(username)s已经存在"
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr "不允许用户名 \"%(username)s\""
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, fuzzy, python-format
+#| msgid "Username %(username)s is not valid"
+msgid "Username \"%(username)s\" cannot be used"
+msgstr "用户名称 %(username)s 无效"
+
+#: kallithea/model/validators.py:99
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
-msgstr ""
-
-#: kallithea/model/validators.py:132
+" dashes and must begin with an alphanumeric character or underscore"
+msgstr ""
+
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr "用户名称 %(username)s 无效"
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr ""
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr "不能将这个组作为parent"
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr "组 \"%(group_name)s\" 已经存在"
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr "已经存在名为 \"%(group_name)s\" 的版本库"
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr "密码含有无效(非ASCII)字符"
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "密码不符"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "无效密码"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "无效用户名"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "该帐号已被禁用"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr "令牌不匹配"
+
+#: kallithea/model/validators.py:345
+#, fuzzy, python-format
+#| msgid "Repository name %(repo)s is disallowed"
+msgid "Repository name %(repo)s is not allowed"
 msgstr "版本库名称不能为%(repo)s"
 
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr "已经存在版本库%(repo)s"
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr "版本库组 \"%(group)s\" 中已经存在版本库 \"%(repo)s\""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:474
+#: kallithea/model/validators.py:465
 #, fuzzy
-msgid "invalid clone URL"
-msgstr "无效的克隆地址"
-
-#: kallithea/model/validators.py:475
-#, fuzzy
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr "无效的克隆地址,提供一个有效的克隆 http(s)或svn+http(s)地址"
-
-#: kallithea/model/validators.py:500
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "私有版本库"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr "复刻版本库必须和父版本库类型相同"
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr "没有在该版本库组中创建版本库的权限"
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr ""
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "不是一个合法的路径"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "该邮件地址已被使用"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
+#: kallithea/model/validators.py:725
+#, fuzzy, python-format
+#| msgid "email \"%(email)s\" does not exist."
+msgid "Email address \"%(email)s\" not found"
 msgstr "邮件地址\"%(email)s\"不存在"
 
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr "LDAP 登陆属性的 CN 必须指定 - 这个名字作为用户名"
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr "修订%(revs)s已经包含在拉取请求中或者或者已经设置状态"
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr ""
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr ""
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2082,13 +2260,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2100,11 +2278,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "描述"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2125,11 +2303,11 @@
 msgid "Name"
 msgstr "名称"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr "最后修改"
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2138,18 +2316,19 @@
 msgid "Tip"
 msgstr "Tip"
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "所有者"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2161,7 +2340,7 @@
 msgid "Click to sort ascending"
 msgstr "点击以升序排列"
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2173,11 +2352,11 @@
 msgid "Click to sort descending"
 msgstr "点击以降序排列"
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr ""
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2189,10 +2368,10 @@
 msgid "Data error."
 msgstr "数据错误"
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2202,7 +2381,7 @@
 msgstr "载入中..."
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr "登录"
 
@@ -2211,39 +2390,39 @@
 msgid "Log In to %s"
 msgstr ""
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "帐号"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "密码"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr "记住密码"
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "忘记了密码?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "还没有帐号?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "登录"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "忘记了密码?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "还没有帐号?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr ""
@@ -2294,26 +2473,26 @@
 msgstr "确认密码"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "名"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "姓"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "电子邮件"
 
@@ -2423,109 +2602,95 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "保存"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
+#: kallithea/templates/admin/defaults/defaults.html:11
+#: kallithea/templates/base/base.html:66
 #, fuzzy
 msgid "Repository Defaults"
 msgstr "版本库默认设置"
 
-#: kallithea/templates/admin/defaults/defaults.html:11
-#: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr "默认设置"
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "类型"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "私有版本库"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr "私有版本库只对成员可见。"
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "启用统计"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr "启用概况页的统计窗口"
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "启用下载"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr "启用概况页的下载菜单"
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr "启用锁定"
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr "启用版本库的拉取锁定"
 
@@ -2557,6 +2722,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr ""
 
@@ -2567,15 +2738,17 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
-msgstr ""
+#, fuzzy
+#| msgid "reviewer"
+msgid "Never"
+msgstr "检视者"
 
 #: kallithea/templates/admin/gists/edit.html:145
 msgid "Update Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
@@ -2598,12 +2771,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr ""
 
@@ -2629,25 +2802,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2677,11 +2852,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "删除"
 
@@ -2690,9 +2876,18 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2718,7 +2913,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "我的账户"
 
@@ -2727,84 +2922,84 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
-msgstr ""
+#: kallithea/templates/admin/my_account/my_account.html:36
+#, fuzzy
+#| msgid "New email address"
+msgid "Email Addresses"
+msgstr "增加邮箱"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr ""
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "版本库"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr "关注的"
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "创建版本库"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
 #, fuzzy
-msgid "My Permissions"
-msgstr "我的权限"
+#| msgid "Copy permissions"
+msgid "Show Permissions"
+msgstr "拷贝权限"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this user: %s"
+msgid "Confirm to reset this API key: %s"
+msgstr "确认删除用户:%s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+msgid "Expired"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to delete this user: %s"
+msgid "Confirm to remove this API key: %s"
+msgstr "确认删除用户:%s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
-msgstr ""
+#, fuzzy
+#| msgid "revoke"
+msgid "Remove"
+msgstr "移除"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+msgid "New API key"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2817,19 +3012,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "删除"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2851,19 +3033,24 @@
 msgid "Change Your Account Password"
 msgstr "忘记了密码?"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "新密码"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "修改你的头像"
@@ -2884,13 +3071,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2928,7 +3109,7 @@
 msgstr "评论"
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr ""
 
@@ -2948,22 +3129,16 @@
 msgstr "显示通知"
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr "通知"
 
 #: kallithea/templates/admin/permissions/permissions.html:5
+#: kallithea/templates/admin/permissions/permissions.html:11
+#: kallithea/templates/base/base.html:64
 #, fuzzy
-msgid "Permissions Administration"
-msgstr "权限管理"
-
-#: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
-#: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "权限"
+msgid "Default Permissions"
+msgstr "默认权限"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -2971,14 +3146,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "匿名访问"
@@ -2990,23 +3161,27 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Existing repository?"
+msgid "Apply to all existing repositories"
+msgstr "已有版本库?"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
+msgid "Permissions for the Default user on new repositories."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "版本库组"
@@ -3018,72 +3193,103 @@
 "will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+#, fuzzy
+#| msgid "Existing repository?"
+msgid "Apply to all existing repository groups"
+msgstr "已有版本库?"
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "建立版本库"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
-msgid "Repository creation with group write access"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
+msgid "Repository creation with group write access"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
+msgid ""
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr "版本库复刻"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "注册"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#, fuzzy, python-format
+#| msgid "Confirm to delete this user: %s"
+msgid "Confirm to delete this IP address: %s"
+msgstr "确认删除用户:%s"
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-#, fuzzy
-msgid "Default User Permissions Overview"
-msgstr "默认权限"
+msgid "New IP address"
+msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
@@ -3106,12 +3312,12 @@
 msgstr "上级组"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3129,19 +3335,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "设置"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr ""
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "权限"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3162,12 +3374,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr "创建于"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3177,38 +3389,10 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "无"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "读"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "写"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "管理"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+msgid "User/User Group"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3217,7 +3401,9 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
+#, fuzzy
+#| msgid "default"
+msgid "Default"
 msgstr "默认"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
@@ -3226,14 +3412,11 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
+#, fuzzy
+#| msgid "revoke"
+msgid "Revoke"
 msgstr "移除"
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
-msgstr ""
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
@@ -3241,7 +3424,9 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+#, fuzzy
+#| msgid "apply to children"
+msgid "Apply to children"
 msgstr "应用到成员"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3292,43 +3477,41 @@
 msgid "Number of Top-level Repositories"
 msgstr "顶层版本库数量"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "克隆自"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
+#: kallithea/templates/admin/repos/repo_add_base.html:17
 #, fuzzy
-msgid "Optional URL from which repository should be cloned."
-msgstr "可选的,指定版本库应该从哪个http[s]地址克隆。"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#| msgid "[created] repository"
+msgid "Clone remote repository"
+msgstr "[创建]版本库"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr "保持简短。用README文件来写更长的描述。"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr "可选的,选择一个组将版本库放到其中"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr "要创建的版本库类型"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
 #: kallithea/templates/forks/fork.html:58
 msgid "Landing revision"
 msgstr "默认修订"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:68
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3375,8 +3558,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "统计"
 
@@ -3401,52 +3584,52 @@
 msgid "Public Journal Visibility"
 msgstr "公共日志"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "从公共日志删除"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 #, fuzzy
 msgid "Add to Public Journal"
 msgstr "公共日志"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 #, fuzzy
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr "任何人都可以在公共日志上看到这个版本库上的所有动作"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 #, fuzzy
 msgid "Change Locking"
 msgstr "启用锁定"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 #, fuzzy
 msgid "Confirm to unlock repository."
 msgstr "确认解锁版本库"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 #, fuzzy
 msgid "Unlock Repository"
 msgstr "公共版本库"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 #, fuzzy
 msgid "Confirm to lock repository."
 msgstr "确认锁定版本库"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 #, fuzzy
 msgid "Lock Repository"
 msgstr "公共版本库"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr "版本库未锁定"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3454,32 +3637,32 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr "确认删除版本库:%s"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr "[删除]版本库"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3521,8 +3704,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "启用"
@@ -3562,31 +3745,38 @@
 msgstr "禁用注册"
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "私有版本库"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
 #, fuzzy
-msgid "Remote URL"
-msgstr "克隆地址"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
+#| msgid "[created] repository"
+msgid "Remote repository URL"
+msgstr "[创建]版本库"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
 #, fuzzy
-msgid "Pull Changes from Remote Location"
-msgstr "从远程路径拉取修订集"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
+#| msgid "[pulled from remote] into repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "[远程拉取]到版本库"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
 #, fuzzy
-msgid "Confirm to pull changes from remote side."
+#| msgid "Confirm to pull changes from remote side."
+msgid "Confirm to pull changes from remote repository."
 msgstr "确认从远程拉取修订集"
 
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr ""
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "私有版本库"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3600,44 +3790,35 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+#| msgid "[created] repository"
+msgid "Remote repository"
+msgstr "[创建]版本库"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
 #, fuzzy
-msgid "Clone URL"
-msgstr "克隆地址"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "编辑"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "版本库"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr "文件浏览、下载、whoosh和README的默认修订版本"
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr "修改这个版本库的所有者"
 
@@ -3698,55 +3879,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr "发送"
 
@@ -3821,13 +3958,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3848,7 +3985,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3875,39 +4012,43 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
+msgid "Platform"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:8
 #, fuzzy
 msgid "Git version"
 msgstr "编辑权限"
 
-#: kallithea/templates/admin/settings/settings_system.html:8
+#: kallithea/templates/admin/settings/settings_system.html:9
 msgid "Git path"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:9
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4061,11 +4202,11 @@
 msgstr "图标"
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr "显示公共版本库图标"
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr "显示私有版本库图标"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4074,7 +4215,9 @@
 msgstr "显示公共版本库图标"
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
+#, fuzzy
+#| msgid "Meta-Tagging"
+msgid "Meta Tagging"
 msgstr "元标记"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
@@ -4093,6 +4236,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4112,24 +4256,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "默认权限"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "成员"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "成员"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4155,10 +4300,6 @@
 msgid "User Groups Administration"
 msgstr "用户管理员"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "添加用户"
@@ -4184,12 +4325,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-#, fuzzy
-msgid "Default Permissions"
-msgstr "默认权限"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4199,7 +4335,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4209,11 +4345,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "确认删除用户:%s"
@@ -4235,18 +4371,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "确认新密码"
 
@@ -4268,49 +4397,57 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Mercurial版本库"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Git版本库"
+
+#: kallithea/templates/base/base.html:126
 #, fuzzy
 msgid "Create Fork"
 msgstr "创建于"
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "概况"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "修订记录"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "浏览"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "选项"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 #, fuzzy
 msgid "Compare Fork"
 msgstr "比较复刻"
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4320,131 +4457,127 @@
 msgid "Compare"
 msgstr "比较显示"
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "搜索"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+msgid "Follow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "复刻"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "日志"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "公共日志"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 #, fuzzy
 msgid "My Pull Requests"
 msgstr "拉取请求"
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr ""
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 #, fuzzy
 msgid "Login to Your Account"
 msgstr "登录"
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "忘记密码?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "退出"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "版本库默认设置"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4472,8 +4605,9 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "显示"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4499,7 +4633,7 @@
 msgstr "%d条评论"
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "停止关注该版本库"
 
@@ -4575,6 +4709,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr ""
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 #, fuzzy
 msgid "Specify changeset"
@@ -4605,6 +4747,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4632,10 +4775,6 @@
 msgid_plural "showing %d out of %d revisions"
 msgstr[0] "显示%d/%d个版本"
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "显示"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr "清除选择"
@@ -4653,7 +4792,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4667,7 +4806,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4677,7 +4816,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4710,7 +4849,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "没有任何变更"
 
@@ -4726,7 +4865,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4756,21 +4895,23 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr "通过Kallithea直接添加或者上传文件"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "Push new repo"
+msgid "Push new repository"
 msgstr "推送新版本库"
 
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr "已有版本库?"
 
@@ -4780,15 +4921,15 @@
 msgstr "%s修订集"
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr "修订集状态"
@@ -4811,7 +4952,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "合并"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4823,148 +4966,162 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+#, fuzzy
+#| msgid "Created by"
+msgid "Replaced by:"
+msgstr "创建于"
+
+#: kallithea/templates/changeset/changeset.html:149
+#, fuzzy
+#| msgid "Created by"
+msgid "Preceded by:"
+msgstr "创建于"
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] "修改%s个文件"
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] "修改%s个文件包括%s行插入和%s行删除"
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
-msgstr ""
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "revisions"
+msgid "No revisions"
+msgstr "修订"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+#, fuzzy
+#| msgid "Comment from pull request"
+msgid "on pull request"
+msgstr "[评论]拉取请求"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
+#, fuzzy
+msgid "No title"
+msgstr "无文件"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:24
 #, fuzzy
-msgid "Status change from pull request"
-msgstr "状态修改为%s"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
-#, fuzzy
-msgid "No title"
-msgstr "无文件"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-#, fuzzy
-msgid "Comment from pull request"
-msgstr "[评论]拉取请求"
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#| msgid "No changesets"
+msgid "on this changeset"
+msgstr "无修订"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr "%d条评论"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "文件已更改"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr "在{1}行上评论"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr "评论使用%s语法并支持%s"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 #, fuzzy
 msgid "Use @username inside this text to notify another user"
 msgstr "在文本中使用 @用户名 以发送通知到该Kallithea用户"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:85
+#: kallithea/templates/changeset/changeset_file_comment.html:77
 #, fuzzy
 msgid "Submitting ..."
 msgstr "提交中……"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:80
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr "评论"
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr "必须登录才能评论"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr "现在登陆"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr "隐藏"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] "%d条评论"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] "(%d内嵌)"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, fuzzy, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
+#: kallithea/templates/changeset/changeset_file_comment.html:150
 #, fuzzy
-msgid "Use @username inside this text to send notification to another local user."
+#| msgid "Use @username inside this text to notify another user"
+msgid "Use @username inside this text to notify another user."
 msgstr "在文本中使用 @用户名 以发送通知到该Kallithea用户"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "修订集状态"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "无变更"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 #, fuzzy
 msgid "Close"
 msgstr "已关闭"
@@ -4984,7 +5141,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -4993,12 +5150,12 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 #, fuzzy
 msgid "Deleted"
 msgstr "删除"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 #, fuzzy
 msgid "Renamed"
 msgstr "读"
@@ -5011,29 +5168,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr "%s修订集"
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 #, fuzzy
 msgid "behind"
 msgstr "重新索引"
@@ -5058,55 +5227,42 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] "显示%s个提交"
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr "无文件"
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Mercurial版本库"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Git版本库"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "公共版本库"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "无修订"
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "订阅%s的RSS"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "订阅%s的Atom"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5233,10 +5389,6 @@
 msgid "Commit Changes"
 msgstr "提交修改"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5262,19 +5414,15 @@
 msgstr "大小"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
-msgstr "MIME类型"
+msgid "Last Revision"
+msgstr "最后修订号"
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
-msgstr "最后修订号"
-
-#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Modified"
 msgstr "最后修改于"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Committer"
 msgstr "最后提交者"
@@ -5386,8 +5534,8 @@
 msgstr "%s个关注者"
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "关注者"
 
@@ -5439,8 +5587,8 @@
 msgstr "%s个复刻"
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr "复刻"
 
@@ -5448,7 +5596,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "无复刻"
 
@@ -5461,19 +5609,13 @@
 msgstr "订阅日志RSS"
 
 #: kallithea/templates/journal/journal.html:56
-#, fuzzy
-msgid "My Repos"
-msgstr "我的版本库"
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr ""
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr "没有条目"
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "公共日志"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr "订阅公共日志ATOM"
@@ -5516,22 +5658,17 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-#, fuzzy
-msgid "Pull Request Reviewers"
-msgstr "拉取请求检视人员"
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 #, fuzzy
 msgid "No entries"
 msgstr "没有条目"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "revoke"
+msgid "Vote"
+msgstr "移除"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5540,52 +5677,51 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, fuzzy, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-#, fuzzy
-msgid "Delete Pull Request"
-msgstr "新建拉取请求"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr "确认删除拉取请求"
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr "已关闭"
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+#, fuzzy
+msgid "Delete Pull Request"
+msgstr "新建拉取请求"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr "确认删除拉取请求"
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this pull request"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr "确认删除拉取请求"
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, python-format
-msgid "%s Pull Request #%s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Pull request #%s"
+msgid "%s Pull Request %s"
+msgstr "拉取请求#%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, fuzzy, python-format
-msgid "Pull request #%s from %s#%s"
-msgstr ""
+#| msgid "Pull Requests from %s'"
+msgid "Pull request %s from %s#%s"
+msgstr "拉取请求#%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
 #, fuzzy
@@ -5601,93 +5737,94 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr "还未检视的检视人员"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] "%d个检视者"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "没有任何分支"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy
 msgid "on"
 msgstr "无"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 #, fuzzy
 msgid "Created by"
 msgstr "创建于"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 #, fuzzy
 msgid "Update"
 msgstr "[更新]用户"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr "所有者"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr "检视者"
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+#, fuzzy
+msgid "Pull Request Reviewers"
+msgstr "拉取请求检视人员"
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr "检视者"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr "%d个检视者"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 #, fuzzy
 msgid "Save as New Pull Request"
 msgstr "新建拉取请求"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "无变更"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 #, fuzzy
 msgid "Pull Request Content"
 msgstr "拉取请求"
@@ -5792,8 +5929,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5801,45 +5938,45 @@
 msgid "Stats gathered: "
 msgstr "已收集的统计:"
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "文件"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "提交"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "文件已添加"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "文件已更改"
+msgid "files added"
+msgstr "文件已添加"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "文件已更改"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "文件已删除"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "提交"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "文件已添加"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "文件已更改"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "文件已删除"
 
@@ -5861,67 +5998,78 @@
 msgid "Fork of"
 msgstr "复刻自"
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr "以名字显示"
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "克隆自"
+
+#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+msgid "Clone URL"
+msgstr "克隆地址"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr "以名字显示"
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr "按ID显示"
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr "文件趋势图"
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "下载"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "无下载"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "这个版本库的下载已经禁用"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr "zip打包下载"
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr "勾选以下载包含子版本库的压缩包"
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
+#: kallithea/templates/summary/summary.html:125
+#, fuzzy
+#| msgid "with subrepos"
+msgid "With subrepos"
 msgstr "包括子版本库"
 
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "文件已更改"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 #, fuzzy
 msgid "Quick Start"
 msgstr "快速入门"
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "下载%s为%s包"
@@ -5936,3 +6084,361 @@
 msgid "Compare Tags"
 msgstr "比较标签"
 
+#~ msgid "increase diff context to %(num)s lines"
+#~ msgstr ""
+
+#~ msgid "No comments."
+#~ msgstr "%d条评论"
+
+#~ msgid "public journal"
+#~ msgstr "公共日志"
+
+#~ msgid "journal"
+#~ msgstr "日志"
+
+#~ msgid "bad captcha"
+#~ msgstr ""
+
+#~ msgid "forever"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked"
+#~ msgstr ""
+
+#~ msgid "Locked"
+#~ msgstr ""
+
+#~ msgid "Repository has been %s"
+#~ msgstr "版本库已被%s"
+
+#~ msgid "You can't edit this user"
+#~ msgstr "无法编辑该用户"
+
+#~ msgid "No Files"
+#~ msgstr "没有文件"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr "不允许用户名 \"%(username)s\""
+
+#~ msgid ""
+#~ "Username may only contain alphanumeric "
+#~ "characters underscores, periods or dashes "
+#~ "and must begin with alphanumeric "
+#~ "character or underscore"
+#~ msgstr ""
+
+#~ msgid "invalid user name"
+#~ msgstr "无效用户名"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "该帐号已被禁用"
+
+#~ msgid "invalid clone URL"
+#~ msgstr "无效的克隆地址"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr "无效的克隆地址,提供一个有效的克隆 http(s)或svn+http(s)地址"
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr "修订%(revs)s已经包含在拉取请求中或者或者已经设置状态"
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr "默认设置"
+
+#~ msgid "never"
+#~ msgstr ""
+
+#~ msgid "My Emails"
+#~ msgstr ""
+
+#~ msgid "Watched"
+#~ msgstr "关注的"
+
+#~ msgid "My Permissions"
+#~ msgstr "我的权限"
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "delete"
+#~ msgstr "删除"
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "权限管理"
+
+#~ msgid "Overview"
+#~ msgstr ""
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "All default permissions on each user "
+#~ "group will be reset to chosen "
+#~ "permission, note that all custom default"
+#~ " permission on repository groups will "
+#~ "be lost"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Confirm to delete this ip: %s"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "默认权限"
+
+#~ msgid "none"
+#~ msgstr "无"
+
+#~ msgid "read"
+#~ msgstr "读"
+
+#~ msgid "write"
+#~ msgstr "写"
+
+#~ msgid "admin"
+#~ msgstr "管理"
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr "可选的,指定版本库应该从哪个http[s]地址克隆。"
+
+#~ msgid "Remote URL"
+#~ msgstr "克隆地址"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr "从远程路径拉取修订集"
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "编辑"
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "默认权限"
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr "状态修改为%s"
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr "在文本中使用 @用户名 以发送通知到该Kallithea用户"
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr "MIME类型"
+
+#~ msgid "My Repos"
+#~ msgstr "我的版本库"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr "所有者"
+
--- a/kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po	Sun Sep 06 23:36:05 2015 +0200
@@ -5,91 +5,102 @@
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2011
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea\n"
+"Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2015-04-01 03:17+0200\n"
-"PO-Revision-Date: 2014-02-13 14:34+0000\n"
-"Last-Translator: marcinkuzminski <marcin@python-blog.com>\n"
+"POT-Creation-Date: 2015-08-25 11:37+0200\n"
+"PO-Revision-Date: 2015-08-21 15:52+0200\n"
+"Last-Translator: EriCSN Chang <ericsning@gmail.com>\n"
 "Language-Team: Chinese (Taiwan) "
 "<https://hosted.weblate.org/projects/kallithea/kallithea/zh_TW/>\n"
-"Plural-Forms: nplurals=1; plural=0\n"
+"Language: zh_TW\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.4-dev\n"
 
 #: kallithea/controllers/changelog.py:86
-#: kallithea/controllers/pullrequests.py:247 kallithea/lib/base.py:449
+#: kallithea/controllers/pullrequests.py:241 kallithea/lib/base.py:512
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/changelog.py:157
-#: kallithea/controllers/admin/permissions.py:62
-#: kallithea/controllers/admin/permissions.py:66
-#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/controllers/changelog.py:166
+#: kallithea/controllers/admin/permissions.py:61
+#: kallithea/controllers/admin/permissions.py:65
+#: kallithea/controllers/admin/permissions.py:69
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:104
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
+#: kallithea/templates/base/perms_summary.html:14
 msgid "None"
 msgstr "無"
 
-#: kallithea/controllers/changelog.py:160 kallithea/controllers/files.py:197
+#: kallithea/controllers/changelog.py:169 kallithea/controllers/files.py:197
 msgid "(closed)"
-msgstr ""
+msgstr "(已關閉)"
 
 #: kallithea/controllers/changeset.py:89
 msgid "Show whitespace"
-msgstr ""
+msgstr "顯示空格"
 
 #: kallithea/controllers/changeset.py:96 kallithea/controllers/changeset.py:103
 #: kallithea/templates/files/diff_2way.html:55
 msgid "Ignore whitespace"
-msgstr ""
+msgstr "忽略空格"
 
 #: kallithea/controllers/changeset.py:169
-#, python-format
-msgid "increase diff context to %(num)s lines"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "increase diff context to %(num)s lines"
+msgid "Increase diff context to %(num)s lines"
+msgstr "增加 diff 上下文至 %(num) 行"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:97
-#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:746
+#: kallithea/controllers/files.py:117 kallithea/controllers/files.py:743
 msgid "Such revision does not exist for this repository"
 msgstr ""
 
-#: kallithea/controllers/changeset.py:352
-#: kallithea/controllers/pullrequests.py:699
-#, fuzzy
-msgid "No comments."
-msgstr ""
-
-#: kallithea/controllers/changeset.py:382
+#: kallithea/controllers/changeset.py:383
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
 
-#: kallithea/controllers/compare.py:158 kallithea/templates/base/root.html:42
+#: kallithea/controllers/compare.py:161 kallithea/templates/base/root.html:42
 msgid "Select changeset"
 msgstr ""
 
-#: kallithea/controllers/compare.py:255
+#: kallithea/controllers/compare.py:258
 msgid "Cannot compare repositories without using common ancestor"
 msgstr ""
 
-#: kallithea/controllers/error.py:96
+#: kallithea/controllers/error.py:71
+#, fuzzy
+#| msgid "revisions"
+msgid "No response"
+msgstr "修訂"
+
+#: kallithea/controllers/error.py:72
+msgid "Unknown error"
+msgstr ""
+
+#: kallithea/controllers/error.py:100
 msgid "The request could not be understood by the server due to malformed syntax."
 msgstr ""
 
-#: kallithea/controllers/error.py:99
+#: kallithea/controllers/error.py:103
 msgid "Unauthorized access to resource"
 msgstr ""
 
-#: kallithea/controllers/error.py:101
+#: kallithea/controllers/error.py:105
 msgid "You don't have permission to view this page"
 msgstr "您沒有權限瀏覽這個頁面"
 
-#: kallithea/controllers/error.py:103
+#: kallithea/controllers/error.py:107
 msgid "The resource could not be found"
 msgstr "找不到這個資源"
 
-#: kallithea/controllers/error.py:105
+#: kallithea/controllers/error.py:109
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
@@ -105,17 +116,17 @@
 msgid "%s %s feed"
 msgstr ""
 
-#: kallithea/controllers/feed.py:89
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
+#: kallithea/controllers/feed.py:87
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: kallithea/controllers/feed.py:93
+#: kallithea/controllers/feed.py:91
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
@@ -193,45 +204,43 @@
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: kallithea/controllers/files.py:528
+#: kallithea/controllers/files.py:527
 msgid "Downloads disabled"
 msgstr ""
 
-#: kallithea/controllers/files.py:539
+#: kallithea/controllers/files.py:538
 #, python-format
 msgid "Unknown revision %s"
 msgstr "未知修訂 %s"
 
-#: kallithea/controllers/files.py:541
+#: kallithea/controllers/files.py:540
 msgid "Empty repository"
 msgstr "空的版本庫"
 
-#: kallithea/controllers/files.py:543
+#: kallithea/controllers/files.py:542
 msgid "Unknown archive type"
 msgstr "未知的存檔類型"
 
-#: kallithea/controllers/files.py:775
+#: kallithea/controllers/files.py:772
 #: kallithea/templates/changeset/changeset_range.html:9
 #: kallithea/templates/email_templates/pull_request.html:15
-#: kallithea/templates/pullrequests/pullrequest.html:116
+#: kallithea/templates/pullrequests/pullrequest.html:97
 msgid "Changesets"
 msgstr "變更"
 
-#: kallithea/controllers/files.py:776 kallithea/controllers/pullrequests.py:182
-#: kallithea/controllers/summary.py:74 kallithea/model/scm.py:816
-#: kallithea/templates/switch_to_list.html:3
+#: kallithea/controllers/files.py:773 kallithea/controllers/pullrequests.py:176
+#: kallithea/model/scm.py:821 kallithea/templates/switch_to_list.html:3
 #: kallithea/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "分支"
 
-#: kallithea/controllers/files.py:777 kallithea/controllers/pullrequests.py:183
-#: kallithea/controllers/summary.py:75 kallithea/model/scm.py:827
-#: kallithea/templates/switch_to_list.html:25
+#: kallithea/controllers/files.py:774 kallithea/controllers/pullrequests.py:177
+#: kallithea/model/scm.py:832 kallithea/templates/switch_to_list.html:25
 #: kallithea/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "標籤"
 
-#: kallithea/controllers/forks.py:187
+#: kallithea/controllers/forks.py:186
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
@@ -247,9 +256,9 @@
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/users/user_edit_advanced.html:6
 #: kallithea/templates/base/base.html:60 kallithea/templates/base/base.html:77
-#: kallithea/templates/base/base.html:127
-#: kallithea/templates/base/base.html:390
-#: kallithea/templates/base/base.html:562
+#: kallithea/templates/base/base.html:131
+#: kallithea/templates/base/base.html:397
+#: kallithea/templates/base/base.html:569
 msgid "Repositories"
 msgstr "版本庫"
 
@@ -269,146 +278,162 @@
 msgstr ""
 
 #: kallithea/controllers/journal.py:111 kallithea/controllers/journal.py:153
-msgid "public journal"
-msgstr ""
+#: kallithea/templates/journal/public_journal.html:4
+#: kallithea/templates/journal/public_journal.html:21
+msgid "Public Journal"
+msgstr "開放日誌"
 
 #: kallithea/controllers/journal.py:115 kallithea/controllers/journal.py:157
-msgid "journal"
+#: kallithea/templates/base/base.html:229
+#: kallithea/templates/journal/journal.html:4
+#: kallithea/templates/journal/journal.html:12
+msgid "Journal"
 msgstr "日誌"
 
-#: kallithea/controllers/login.py:188 kallithea/controllers/login.py:234
-msgid "bad captcha"
-msgstr ""
-
-#: kallithea/controllers/login.py:194
+#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
+msgid "Bad captcha"
+msgstr ""
+
+#: kallithea/controllers/login.py:156
 msgid "You have successfully registered into Kallithea"
 msgstr ""
 
-#: kallithea/controllers/login.py:239
+#: kallithea/controllers/login.py:201
 msgid "Your password reset link was sent"
 msgstr "您的密碼重設連結已寄出"
 
-#: kallithea/controllers/login.py:260
+#: kallithea/controllers/login.py:222
 msgid ""
 "Your password reset was successful, new password has been sent to your "
 "email"
 msgstr "您的密碼重設動作已完成,新的密碼已寄至您的信箱"
 
-#: kallithea/controllers/pullrequests.py:130
+#: kallithea/controllers/pullrequests.py:124
 #, python-format
 msgid "%s (closed)"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:158
+#: kallithea/controllers/pullrequests.py:152
 #: kallithea/templates/changeset/changeset.html:12
 #: kallithea/templates/email_templates/changeset_comment.html:17
 msgid "Changeset"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:179
+#: kallithea/controllers/pullrequests.py:173
 msgid "Special"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:180
+#: kallithea/controllers/pullrequests.py:174
 msgid "Peer branches"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:181 kallithea/model/scm.py:822
+#: kallithea/controllers/pullrequests.py:175 kallithea/model/scm.py:827
 #: kallithea/templates/switch_to_list.html:38
 #: kallithea/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:312
+#: kallithea/controllers/pullrequests.py:306
 #, python-format
 msgid "Error creating pull request: %s"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:356
-#: kallithea/controllers/pullrequests.py:497
+#: kallithea/controllers/pullrequests.py:352
+#: kallithea/controllers/pullrequests.py:499
 #, fuzzy
 msgid "No description"
 msgstr "描述"
 
-#: kallithea/controllers/pullrequests.py:363
+#: kallithea/controllers/pullrequests.py:359
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:366
-#: kallithea/controllers/pullrequests.py:450
+#: kallithea/controllers/pullrequests.py:362
+#: kallithea/controllers/pullrequests.py:449
+#: kallithea/controllers/pullrequests.py:504
+#, python-format
+msgid "Invalid reviewer \"%s\" specified"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:365
+#: kallithea/controllers/pullrequests.py:452
 msgid "Error occurred while creating pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:398
+#: kallithea/controllers/pullrequests.py:397
 msgid "Missing changesets since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:405
+#: kallithea/controllers/pullrequests.py:404
 #, python-format
 msgid "New changesets on %s %s since the previous pull request:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:412
+#: kallithea/controllers/pullrequests.py:411
 msgid "Ancestor didn't change - show diff since previous version:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:419
+#: kallithea/controllers/pullrequests.py:418
 #, python-format
 msgid ""
 "This pull request is based on another %s revision and there is no simple "
 "diff."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:421
+#: kallithea/controllers/pullrequests.py:420
 #, python-format
 msgid "No changes found on %s %s since previous version."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:456
+#: kallithea/controllers/pullrequests.py:458
 #, python-format
 msgid "Closed, replaced by %s ."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:464
+#: kallithea/controllers/pullrequests.py:466
 msgid "Pull request update created"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:503
+#: kallithea/controllers/pullrequests.py:508
 msgid "Pull request updated"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:518
+#: kallithea/controllers/pullrequests.py:523
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:577
+#: kallithea/controllers/pullrequests.py:582
 #, python-format
 msgid "This pull request has already been merged to %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:579
+#: kallithea/controllers/pullrequests.py:584
 msgid "This pull request has been closed and can not be updated."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:597
+#: kallithea/controllers/pullrequests.py:602
 #, python-format
 msgid "This pull request can be updated with changes on %s:"
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:600
+#: kallithea/controllers/pullrequests.py:605
 msgid "No changesets found for updating this pull request."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:608
+#: kallithea/controllers/pullrequests.py:613
 #, python-format
 msgid "Note: Branch %s has another head: %s."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:614
+#: kallithea/controllers/pullrequests.py:619
 msgid "Git pull requests don't support updates yet."
 msgstr ""
 
-#: kallithea/controllers/pullrequests.py:701
+#: kallithea/controllers/pullrequests.py:710
+msgid "No permission to change pull request status"
+msgstr ""
+
+#: kallithea/controllers/pullrequests.py:715
 #, fuzzy
 msgid "Closing."
 msgstr "使用中"
@@ -425,21 +450,21 @@
 msgid "An error occurred during search operation."
 msgstr ""
 
-#: kallithea/controllers/summary.py:199
-#: kallithea/templates/summary/summary.html:387
+#: kallithea/controllers/summary.py:180
+#: kallithea/templates/summary/summary.html:384
 msgid "No data ready yet"
 msgstr ""
 
-#: kallithea/controllers/summary.py:202
-#: kallithea/templates/summary/summary.html:101
+#: kallithea/controllers/summary.py:183
+#: kallithea/templates/summary/summary.html:98
 msgid "Statistics are disabled for this repository"
 msgstr "這個版本庫的統計功能已停用"
 
-#: kallithea/controllers/admin/auth_settings.py:125
+#: kallithea/controllers/admin/auth_settings.py:135
 msgid "Auth settings updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/auth_settings.py:136
+#: kallithea/controllers/admin/auth_settings.py:146
 msgid "error occurred during update of auth settings"
 msgstr ""
 
@@ -452,38 +477,38 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:59
-#: kallithea/controllers/admin/my_account.py:238
-#: kallithea/controllers/admin/users.py:288
-msgid "forever"
+#: kallithea/controllers/admin/my_account.py:243
+#: kallithea/controllers/admin/users.py:283
+msgid "Forever"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:60
-#: kallithea/controllers/admin/my_account.py:239
-#: kallithea/controllers/admin/users.py:289
+#: kallithea/controllers/admin/my_account.py:244
+#: kallithea/controllers/admin/users.py:284
 msgid "5 minutes"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:61
-#: kallithea/controllers/admin/my_account.py:240
-#: kallithea/controllers/admin/users.py:290
+#: kallithea/controllers/admin/my_account.py:245
+#: kallithea/controllers/admin/users.py:285
 msgid "1 hour"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:62
-#: kallithea/controllers/admin/my_account.py:241
-#: kallithea/controllers/admin/users.py:291
+#: kallithea/controllers/admin/my_account.py:246
+#: kallithea/controllers/admin/users.py:286
 msgid "1 day"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:63
-#: kallithea/controllers/admin/my_account.py:242
-#: kallithea/controllers/admin/users.py:292
+#: kallithea/controllers/admin/my_account.py:247
+#: kallithea/controllers/admin/users.py:287
 msgid "1 month"
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:67
-#: kallithea/controllers/admin/my_account.py:244
-#: kallithea/controllers/admin/users.py:294
+#: kallithea/controllers/admin/my_account.py:249
+#: kallithea/controllers/admin/users.py:289
 msgid "Lifetime"
 msgstr ""
 
@@ -497,8 +522,10 @@
 msgstr ""
 
 #: kallithea/controllers/admin/gists.py:233
-msgid "unmodified"
-msgstr ""
+#, fuzzy
+#| msgid "Last Modified"
+msgid "Unmodified"
+msgstr "最後修改"
 
 #: kallithea/controllers/admin/gists.py:262
 msgid "Successfully updated gist content"
@@ -513,117 +540,133 @@
 msgid "Error occurred during update of gist %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:70
+#: kallithea/controllers/admin/my_account.py:70 kallithea/model/user.py:208
+#: kallithea/model/user.py:230
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:128
+#: kallithea/controllers/admin/my_account.py:129
 msgid "Your account was updated successfully"
 msgstr "您的帳號已更新完成"
 
-#: kallithea/controllers/admin/my_account.py:143
-#: kallithea/controllers/admin/users.py:206
+#: kallithea/controllers/admin/my_account.py:144
+#: kallithea/controllers/admin/users.py:204
 #, python-format
 msgid "Error occurred during update of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:162
+#: kallithea/controllers/admin/my_account.py:167
 msgid "Successfully updated password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:173
+#: kallithea/controllers/admin/my_account.py:178
 msgid "Error occurred during update of user password"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:215
-#: kallithea/controllers/admin/users.py:431
+#: kallithea/controllers/admin/my_account.py:220
+#: kallithea/controllers/admin/users.py:413
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:221
-#: kallithea/controllers/admin/users.py:437
+#: kallithea/controllers/admin/my_account.py:226
+#: kallithea/controllers/admin/users.py:419
 msgid "An error occurred during email saving"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:230
-#: kallithea/controllers/admin/users.py:448
+#: kallithea/controllers/admin/my_account.py:235
+#: kallithea/controllers/admin/users.py:431
 msgid "Removed email from user"
 msgstr ""
 
-#: kallithea/controllers/admin/my_account.py:254
-#: kallithea/controllers/admin/users.py:314
-msgid "Api key successfully created"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:266
-#: kallithea/controllers/admin/users.py:330
-msgid "Api key successfully reset"
-msgstr ""
-
-#: kallithea/controllers/admin/my_account.py:270
-#: kallithea/controllers/admin/users.py:334
-msgid "Api key successfully deleted"
-msgstr ""
+#: kallithea/controllers/admin/my_account.py:259
+#: kallithea/controllers/admin/users.py:306
+msgid "API key successfully created"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:271
+#: kallithea/controllers/admin/users.py:319
+msgid "API key successfully reset"
+msgstr ""
+
+#: kallithea/controllers/admin/my_account.py:275
+#: kallithea/controllers/admin/users.py:323
+msgid "API key successfully deleted"
+msgstr ""
+
+#: kallithea/controllers/admin/permissions.py:62
+#: kallithea/controllers/admin/permissions.py:66
+#: kallithea/controllers/admin/permissions.py:70
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
+#: kallithea/templates/base/perms_summary.html:15
+msgid "Read"
+msgstr "讀"
 
 #: kallithea/controllers/admin/permissions.py:63
 #: kallithea/controllers/admin/permissions.py:67
 #: kallithea/controllers/admin/permissions.py:71
-msgid "Read"
-msgstr "讀"
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
+#: kallithea/templates/base/perms_summary.html:16
+msgid "Write"
+msgstr "寫"
 
 #: kallithea/controllers/admin/permissions.py:64
 #: kallithea/controllers/admin/permissions.py:68
 #: kallithea/controllers/admin/permissions.py:72
-msgid "Write"
-msgstr "寫"
-
-#: kallithea/controllers/admin/permissions.py:65
-#: kallithea/controllers/admin/permissions.py:69
-#: kallithea/controllers/admin/permissions.py:73
 #: kallithea/templates/admin/auth/auth_settings.html:9
 #: kallithea/templates/admin/defaults/defaults.html:9
 #: kallithea/templates/admin/permissions/permissions.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:9
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:9
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
+#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
 #: kallithea/templates/admin/repo_groups/repo_groups.html:10
 #: kallithea/templates/admin/repos/repo_add.html:10
 #: kallithea/templates/admin/repos/repo_add.html:14
+#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
 #: kallithea/templates/admin/repos/repos.html:9
 #: kallithea/templates/admin/settings/settings.html:9
 #: kallithea/templates/admin/user_groups/user_group_add.html:8
 #: kallithea/templates/admin/user_groups/user_group_edit.html:9
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
+#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/admin/users/user_add.html:8
 #: kallithea/templates/admin/users/user_edit.html:9
-#: kallithea/templates/admin/users/user_edit_profile.html:114
+#: kallithea/templates/admin/users/user_edit_profile.html:105
 #: kallithea/templates/admin/users/users.html:10
 #: kallithea/templates/admin/users/users.html:55
-#: kallithea/templates/base/base.html:255
-#: kallithea/templates/base/base.html:256
-#: kallithea/templates/base/base.html:262
-#: kallithea/templates/base/base.html:263
+#: kallithea/templates/base/base.html:259
+#: kallithea/templates/base/base.html:260
+#: kallithea/templates/base/base.html:266
+#: kallithea/templates/base/base.html:267
+#: kallithea/templates/base/perms_summary.html:17
 msgid "Admin"
 msgstr "管理"
 
-#: kallithea/controllers/admin/permissions.py:76
-#: kallithea/controllers/admin/permissions.py:87
-#: kallithea/controllers/admin/permissions.py:92
-#: kallithea/controllers/admin/permissions.py:95
-#: kallithea/controllers/admin/permissions.py:98
-#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/controllers/admin/permissions.py:75
+#: kallithea/controllers/admin/permissions.py:86
+#: kallithea/controllers/admin/permissions.py:91
+#: kallithea/controllers/admin/permissions.py:94
+#: kallithea/controllers/admin/permissions.py:97
+#: kallithea/controllers/admin/permissions.py:100
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Disabled"
 msgstr "停用"
 
-#: kallithea/controllers/admin/permissions.py:78
+#: kallithea/controllers/admin/permissions.py:77
 msgid "Allowed with manual account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:80
+#: kallithea/controllers/admin/permissions.py:79
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:83
+#: kallithea/controllers/admin/permissions.py:82
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1439
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1485
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1542
@@ -631,11 +674,11 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1564
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1603
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1655
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1684
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1682 kallithea/model/db.py:1701
 msgid "Manual activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:84
+#: kallithea/controllers/admin/permissions.py:83
 #: kallithea/lib/dbmigrate/schema/db_1_7_0.py:1440
 #: kallithea/lib/dbmigrate/schema/db_1_8_0.py:1486
 #: kallithea/lib/dbmigrate/schema/db_2_0_0.py:1543
@@ -643,221 +686,213 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1565
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1604
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1656
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1685
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1683 kallithea/model/db.py:1702
 msgid "Automatic activation of external account"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:88
-#: kallithea/controllers/admin/permissions.py:91
-#: kallithea/controllers/admin/permissions.py:96
-#: kallithea/controllers/admin/permissions.py:99
-#: kallithea/controllers/admin/permissions.py:102
+#: kallithea/controllers/admin/permissions.py:87
+#: kallithea/controllers/admin/permissions.py:90
+#: kallithea/controllers/admin/permissions.py:95
+#: kallithea/controllers/admin/permissions.py:98
+#: kallithea/controllers/admin/permissions.py:101
+#: kallithea/templates/admin/auth/auth_settings.html:40
 msgid "Enabled"
 msgstr "啟用"
 
-#: kallithea/controllers/admin/permissions.py:125
+#: kallithea/controllers/admin/permissions.py:124
 msgid "Global permissions updated successfully"
 msgstr ""
 
-#: kallithea/controllers/admin/permissions.py:140
+#: kallithea/controllers/admin/permissions.py:139
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:184
+#: kallithea/controllers/admin/repo_groups.py:188
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:193
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:197
-#, python-format
-msgid "Error occurred during creation of repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:255
+#: kallithea/controllers/admin/repo_groups.py:250
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:271
+#: kallithea/controllers/admin/repo_groups.py:266
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:289
+#: kallithea/controllers/admin/repo_groups.py:284
 #, python-format
 msgid "This group contains %s repositories and cannot be deleted"
 msgstr ""
 
-#: kallithea/controllers/admin/repo_groups.py:296
+#: kallithea/controllers/admin/repo_groups.py:291
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:297
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:302
 #, python-format
-msgid "Removed repository group %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:307
-#, python-format
 msgid "Error occurred during deletion of repository group %s"
 msgstr ""
 
+#: kallithea/controllers/admin/repo_groups.py:405
+#: kallithea/controllers/admin/repo_groups.py:440
+#: kallithea/controllers/admin/user_groups.py:340
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
 #: kallithea/controllers/admin/repo_groups.py:420
-#: kallithea/controllers/admin/repo_groups.py:455
-#: kallithea/controllers/admin/user_groups.py:340
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:435
-msgid "Repository Group permissions updated"
-msgstr ""
-
-#: kallithea/controllers/admin/repo_groups.py:472
-#: kallithea/controllers/admin/repos.py:430
+msgid "Repository group permissions updated"
+msgstr ""
+
+#: kallithea/controllers/admin/repo_groups.py:457
+#: kallithea/controllers/admin/repos.py:398
 #: kallithea/controllers/admin/user_groups.py:352
 msgid "An error occurred during revoking of permission"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:163
+#: kallithea/controllers/admin/repos.py:152
 #, python-format
 msgid "Error creating repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:238
+#: kallithea/controllers/admin/repos.py:213
 #, python-format
 msgid "Created repository %s from %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:247
+#: kallithea/controllers/admin/repos.py:222
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:250
+#: kallithea/controllers/admin/repos.py:225
 #, python-format
 msgid "Created repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:290
+#: kallithea/controllers/admin/repos.py:262
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "版本庫 %s 更新完成"
 
-#: kallithea/controllers/admin/repos.py:309
+#: kallithea/controllers/admin/repos.py:283
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:336
+#: kallithea/controllers/admin/repos.py:310
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:339
+#: kallithea/controllers/admin/repos.py:313
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:344
+#: kallithea/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:347
-#, python-format
-msgid "Cannot delete %s it still contains attached forks"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:352
+#: kallithea/controllers/admin/repos.py:321
+#, python-format
+msgid "Cannot delete repository %s which still has forks"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:326
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:406
+#: kallithea/controllers/admin/repos.py:374
 msgid "Repository permissions updated"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:462
+#: kallithea/controllers/admin/repos.py:430
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:476
+#: kallithea/controllers/admin/repos.py:444
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:492
+#: kallithea/controllers/admin/repos.py:460
 msgid "-- Not a fork --"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:526
+#: kallithea/controllers/admin/repos.py:491
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:530
+#: kallithea/controllers/admin/repos.py:495
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:535 kallithea/model/validators.py:340
-msgid "Token mismatch"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:550
+#: kallithea/controllers/admin/repos.py:512
 msgid "Nothing"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:552
-#, python-format
-msgid "Marked repo %s as fork of %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:559
+#: kallithea/controllers/admin/repos.py:514
+#, python-format
+msgid "Marked repository %s as fork of %s"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:521
 msgid "An error occurred during this operation"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:575
-msgid "Locked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:578
-msgid "Unlocked repository"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:581
-#: kallithea/controllers/admin/repos.py:608
+#: kallithea/controllers/admin/repos.py:537
+#: kallithea/controllers/admin/repos.py:564
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been locked"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:540
+#: kallithea/controllers/admin/repos.py:561
+#, fuzzy, python-format
+#| msgid "This repository has %s fork"
+#| msgid_plural "This repository has %s forks"
+msgid "Repository has been unlocked"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:543
+#: kallithea/controllers/admin/repos.py:568
 msgid "An error occurred during unlocking"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:599
-msgid "Unlocked"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:602
-msgid "Locked"
+#: kallithea/controllers/admin/repos.py:582
+msgid "Cache invalidation successful"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:586
+msgid "An error occurred during cache invalidation"
+msgstr ""
+
+#: kallithea/controllers/admin/repos.py:601
+msgid "Pulled from remote location"
 msgstr ""
 
 #: kallithea/controllers/admin/repos.py:604
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:622
-msgid "Cache invalidation successful"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:626
-msgid "An error occurred during cache invalidation"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:641
-msgid "Pulled from remote location"
-msgstr ""
-
-#: kallithea/controllers/admin/repos.py:644
 msgid "An error occurred during pull from remote location"
 msgstr ""
 
-#: kallithea/controllers/admin/repos.py:677
+#: kallithea/controllers/admin/repos.py:637
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
@@ -873,7 +908,7 @@
 
 #: kallithea/controllers/admin/settings.py:180
 #: kallithea/controllers/admin/settings.py:274
-msgid "Error occurred during updating application settings"
+msgid "Error occurred while updating application settings"
 msgstr ""
 
 #: kallithea/controllers/admin/settings.py:213
@@ -950,83 +985,80 @@
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:320
-msgid "User Group permissions updated"
+msgid "User group permissions updated"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:440
-#: kallithea/controllers/admin/users.py:396
+#: kallithea/controllers/admin/users.py:382
 msgid "Updated permissions"
 msgstr ""
 
 #: kallithea/controllers/admin/user_groups.py:444
-#: kallithea/controllers/admin/users.py:400
+#: kallithea/controllers/admin/users.py:386
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:132
+#: kallithea/controllers/admin/users.py:133
 #, python-format
 msgid "Created user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:147
+#: kallithea/controllers/admin/users.py:148
 #, python-format
 msgid "Error occurred during creation of user %s"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:186
+#: kallithea/controllers/admin/users.py:184
 msgid "User updated successfully"
 msgstr "使用者更新完成"
 
-#: kallithea/controllers/admin/users.py:222
+#: kallithea/controllers/admin/users.py:220
 msgid "Successfully deleted user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:227
+#: kallithea/controllers/admin/users.py:225
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: kallithea/controllers/admin/users.py:241
-#: kallithea/controllers/admin/users.py:259
-#: kallithea/controllers/admin/users.py:282
-#: kallithea/controllers/admin/users.py:307
-#: kallithea/controllers/admin/users.py:320
-#: kallithea/controllers/admin/users.py:344
-#: kallithea/controllers/admin/users.py:407
-#: kallithea/controllers/admin/users.py:454
-msgid "You can't edit this user"
-msgstr "您無法編輯這位使用者"
-
-#: kallithea/controllers/admin/users.py:482
-#, python-format
-msgid "Added ip %s to user whitelist"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:488
-msgid "An error occurred during ip saving"
-msgstr ""
-
-#: kallithea/controllers/admin/users.py:502
-msgid "Removed ip address from user whitelist"
-msgstr ""
-
-#: kallithea/lib/auth.py:745
+#: kallithea/controllers/admin/users.py:238
+msgid "The default user cannot be edited"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:461
+#, python-format
+msgid "Added IP address %s to user whitelist"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:467
+msgid "An error occurred while adding IP address"
+msgstr ""
+
+#: kallithea/controllers/admin/users.py:481
+msgid "Removed IP address from user whitelist"
+msgstr ""
+
+#: kallithea/lib/auth.py:744
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: kallithea/lib/auth.py:806
+#: kallithea/lib/auth.py:757
+msgid "Invalid API key"
+msgstr ""
+
+#: kallithea/lib/auth.py:795
 msgid "You need to be a registered user to perform this action"
 msgstr "您必須是註冊使用者才能執行這個動作"
 
-#: kallithea/lib/auth.py:843
+#: kallithea/lib/auth.py:827
 msgid "You need to be signed in to view this page"
 msgstr "您必須登入後才能瀏覽這個頁面"
 
-#: kallithea/lib/base.py:427
+#: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/lib/base.py:453 kallithea/lib/helpers.py:643
+#: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
 msgstr ""
 
@@ -1042,158 +1074,162 @@
 msgid "No changes detected"
 msgstr "尚未有任何變更"
 
-#: kallithea/lib/helpers.py:627
+#: kallithea/lib/helpers.py:609
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:630
+#: kallithea/lib/helpers.py:611
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:693
+#: kallithea/lib/helpers.py:671
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: kallithea/lib/helpers.py:699
-msgid "compare view"
-msgstr ""
-
-#: kallithea/lib/helpers.py:718
+#: kallithea/lib/helpers.py:677
+msgid "Compare view"
+msgstr ""
+
+#: kallithea/lib/helpers.py:696
 msgid "and"
 msgstr "和"
 
-#: kallithea/lib/helpers.py:719
+#: kallithea/lib/helpers.py:697
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:720 kallithea/templates/changelog/changelog.html:44
+#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 msgid "revisions"
 msgstr "修訂"
 
-#: kallithea/lib/helpers.py:744
-#, python-format
-msgid "fork name %s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:761
-#, python-format
-msgid "Pull request #%s"
-msgstr ""
-
-#: kallithea/lib/helpers.py:771
+#: kallithea/lib/helpers.py:722
+#, fuzzy, python-format
+#| msgid "Fork name"
+msgid "Fork name %s"
+msgstr "分支名稱"
+
+#: kallithea/lib/helpers.py:742
+#, fuzzy, python-format
+#| msgid "Pull Request Content"
+msgid "Pull request %s"
+msgstr "文件內容"
+
+#: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:773 kallithea/lib/helpers.py:785
+#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 msgid "[created] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:775
+#: kallithea/lib/helpers.py:756
 msgid "[created] repository as fork"
 msgstr ""
 
-#: kallithea/lib/helpers.py:777 kallithea/lib/helpers.py:787
+#: kallithea/lib/helpers.py:758 kallithea/lib/helpers.py:768
 msgid "[forked] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:779 kallithea/lib/helpers.py:789
+#: kallithea/lib/helpers.py:760 kallithea/lib/helpers.py:770
 msgid "[updated] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:781
+#: kallithea/lib/helpers.py:762
 msgid "[downloaded] archive from repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:783
+#: kallithea/lib/helpers.py:764
 msgid "[delete] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:791
+#: kallithea/lib/helpers.py:772
 msgid "[created] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:793
+#: kallithea/lib/helpers.py:774
 msgid "[updated] user"
 msgstr ""
 
-#: kallithea/lib/helpers.py:795
+#: kallithea/lib/helpers.py:776
 msgid "[created] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:797
+#: kallithea/lib/helpers.py:778
 msgid "[updated] user group"
 msgstr ""
 
-#: kallithea/lib/helpers.py:799
+#: kallithea/lib/helpers.py:780
 msgid "[commented] on revision in repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:801
+#: kallithea/lib/helpers.py:782
 msgid "[commented] on pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:803
+#: kallithea/lib/helpers.py:784
 msgid "[closed] pull request for"
 msgstr ""
 
-#: kallithea/lib/helpers.py:805
+#: kallithea/lib/helpers.py:786
 msgid "[pushed] into"
 msgstr ""
 
-#: kallithea/lib/helpers.py:807
+#: kallithea/lib/helpers.py:788
 msgid "[committed via Kallithea] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:809
+#: kallithea/lib/helpers.py:790
 msgid "[pulled from remote] into repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:811
+#: kallithea/lib/helpers.py:792
 msgid "[pulled] from"
 msgstr ""
 
-#: kallithea/lib/helpers.py:813
+#: kallithea/lib/helpers.py:794
 msgid "[started following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:815
+#: kallithea/lib/helpers.py:796
 msgid "[stopped following] repository"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1144
+#: kallithea/lib/helpers.py:1124
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1148
-msgid "No Files"
-msgstr "沒有檔案"
-
-#: kallithea/lib/helpers.py:1214
+#: kallithea/lib/helpers.py:1128
+#: kallithea/templates/compare/compare_diff.html:65
+#: kallithea/templates/pullrequests/pullrequest_show.html:322
+msgid "No files"
+msgstr ""
+
+#: kallithea/lib/helpers.py:1194
 msgid "new file"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1217
+#: kallithea/lib/helpers.py:1197
 msgid "mod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1220
+#: kallithea/lib/helpers.py:1200
 msgid "del"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1223
+#: kallithea/lib/helpers.py:1203
 msgid "rename"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1228
+#: kallithea/lib/helpers.py:1208
 msgid "chmod"
 msgstr ""
 
-#: kallithea/lib/helpers.py:1460
+#: kallithea/lib/helpers.py:1444
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1201,63 +1237,63 @@
 "repositories"
 msgstr ""
 
-#: kallithea/lib/utils2.py:425
+#: kallithea/lib/utils2.py:415
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] ""
 
-#: kallithea/lib/utils2.py:426
+#: kallithea/lib/utils2.py:416
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] ""
 
-#: kallithea/lib/utils2.py:427
+#: kallithea/lib/utils2.py:417
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] ""
 
-#: kallithea/lib/utils2.py:428
+#: kallithea/lib/utils2.py:418
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] ""
 
-#: kallithea/lib/utils2.py:429
+#: kallithea/lib/utils2.py:419
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] ""
 
-#: kallithea/lib/utils2.py:430
+#: kallithea/lib/utils2.py:420
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] ""
 
-#: kallithea/lib/utils2.py:446
+#: kallithea/lib/utils2.py:436
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:448
+#: kallithea/lib/utils2.py:438
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:450
+#: kallithea/lib/utils2.py:440
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: kallithea/lib/utils2.py:453
+#: kallithea/lib/utils2.py:443
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: kallithea/lib/utils2.py:456
+#: kallithea/lib/utils2.py:446
 msgid "just now"
 msgstr "現在"
 
@@ -1272,7 +1308,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1533
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1572
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1622
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649 kallithea/model/db.py:1651
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1649
 msgid "Repository no access"
 msgstr ""
 
@@ -1287,7 +1323,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1534
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1573
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1623
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650 kallithea/model/db.py:1652
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1650
 msgid "Repository read access"
 msgstr ""
 
@@ -1302,7 +1338,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1535
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1574
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1624
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651 kallithea/model/db.py:1653
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1651
 msgid "Repository write access"
 msgstr ""
 
@@ -1317,7 +1353,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1536
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1575
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1625
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652 kallithea/model/db.py:1654
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1652
 msgid "Repository admin access"
 msgstr ""
 
@@ -1356,7 +1392,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1531
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1570
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1620
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1649
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1647 kallithea/model/db.py:1665
 msgid "Kallithea Administrator"
 msgstr ""
 
@@ -1371,7 +1407,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1554
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1593
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1643
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670 kallithea/model/db.py:1672
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1670
 msgid "Repository creation disabled"
 msgstr ""
 
@@ -1386,7 +1422,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1555
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1594
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1644
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671 kallithea/model/db.py:1673
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1671
 msgid "Repository creation enabled"
 msgstr ""
 
@@ -1401,7 +1437,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1557
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1596
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1648
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675 kallithea/model/db.py:1677
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1675
 msgid "Repository forking disabled"
 msgstr ""
 
@@ -1416,7 +1452,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1558
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1597
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1649
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676 kallithea/model/db.py:1678
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1676
 msgid "Repository forking enabled"
 msgstr ""
 
@@ -1452,7 +1488,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2062
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2101
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2154
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200 kallithea/model/db.py:2202
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2200
 msgid "Not Reviewed"
 msgstr ""
 
@@ -1467,7 +1503,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2063
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2102
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2155
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2203
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2201 kallithea/model/db.py:2229
 msgid "Approved"
 msgstr ""
 
@@ -1482,7 +1518,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2064
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2103
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2156
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2204
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2202 kallithea/model/db.py:2230
 msgid "Rejected"
 msgstr ""
 
@@ -1497,7 +1533,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:2065
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:2104
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:2157
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203 kallithea/model/db.py:2205
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:2203
 msgid "Under Review"
 msgstr ""
 
@@ -1509,7 +1545,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1379
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1418
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1471
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1500
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1498 kallithea/model/db.py:1514
 msgid "top level"
 msgstr ""
 
@@ -1521,7 +1557,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1538
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1577
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1627
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654 kallithea/model/db.py:1656
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1654
 msgid "Repository group no access"
 msgstr ""
 
@@ -1533,7 +1569,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1539
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1578
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1628
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655 kallithea/model/db.py:1657
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1655
 msgid "Repository group read access"
 msgstr ""
 
@@ -1545,7 +1581,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1540
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1579
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1629
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656 kallithea/model/db.py:1658
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1656
 msgid "Repository group write access"
 msgstr ""
 
@@ -1557,7 +1593,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1541
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1580
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1630
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657 kallithea/model/db.py:1659
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1657
 msgid "Repository group admin access"
 msgstr ""
 
@@ -1568,7 +1604,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1543
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1582
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1632
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659 kallithea/model/db.py:1661
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1659
 msgid "User group no access"
 msgstr ""
 
@@ -1579,7 +1615,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1544
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1583
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1633
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660 kallithea/model/db.py:1662
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1660
 msgid "User group read access"
 msgstr ""
 
@@ -1590,7 +1626,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1545
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1584
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1634
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661 kallithea/model/db.py:1663
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1661
 msgid "User group write access"
 msgstr ""
 
@@ -1601,7 +1637,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1546
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1585
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1635
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662 kallithea/model/db.py:1664
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1662
 msgid "User group admin access"
 msgstr ""
 
@@ -1612,7 +1648,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1548
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1587
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1637
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664 kallithea/model/db.py:1666
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1664
 msgid "Repository Group creation disabled"
 msgstr ""
 
@@ -1623,7 +1659,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1549
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1588
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1638
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665 kallithea/model/db.py:1667
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1665
 msgid "Repository Group creation enabled"
 msgstr ""
 
@@ -1634,7 +1670,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1551
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1590
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1640
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667 kallithea/model/db.py:1669
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1667
 msgid "User Group creation disabled"
 msgstr ""
 
@@ -1645,7 +1681,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1552
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1591
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1641
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668 kallithea/model/db.py:1670
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1668
 msgid "User Group creation enabled"
 msgstr ""
 
@@ -1656,7 +1692,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1560
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1599
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1651
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1680
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1678 kallithea/model/db.py:1697
 msgid "Registration disabled"
 msgstr ""
 
@@ -1667,7 +1703,7 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1561
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1600
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1652
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679 kallithea/model/db.py:1681
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1679
 msgid "User Registration with manual account activation"
 msgstr ""
 
@@ -1678,29 +1714,135 @@
 #: kallithea/lib/dbmigrate/schema/db_2_0_2.py:1562
 #: kallithea/lib/dbmigrate/schema/db_2_1_0.py:1601
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1653
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680 kallithea/model/db.py:1682
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1680
 msgid "User Registration with automatic account activation"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1645
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1674
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1672 kallithea/model/db.py:1691
 msgid "Repository creation enabled with write permission to a repository group"
 msgstr ""
 
 #: kallithea/lib/dbmigrate/schema/db_2_2_0.py:1646
-#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1675
+#: kallithea/lib/dbmigrate/schema/db_2_2_3.py:1673 kallithea/model/db.py:1692
 msgid "Repository creation disabled with write permission to a repository group"
 msgstr ""
 
-#: kallithea/model/comment.py:76
+#: kallithea/model/comment.py:72
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: kallithea/model/comment.py:231 kallithea/model/pull_request.py:164
+#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 msgid "[Mention]"
 msgstr ""
 
+#: kallithea/model/db.py:1667
+msgid "Default user has no access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1668
+msgid "Default user has read access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1669
+msgid "Default user has write access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1670
+msgid "Default user has admin access to new repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1672
+msgid "Default user has no access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1673
+msgid "Default user has read access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1674
+msgid "Default user has write access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1675
+msgid "Default user has admin access to new repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1677
+msgid "Default user has no access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1678
+msgid "Default user has read access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1679
+msgid "Default user has write access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1680
+msgid "Default user has admin access to new user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1682
+msgid "Only admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1683
+msgid "Non-admins can create repository groups"
+msgstr ""
+
+#: kallithea/model/db.py:1685
+msgid "Only admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1686
+msgid "Non-admins can create user groups"
+msgstr ""
+
+#: kallithea/model/db.py:1688
+msgid "Only admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1689
+msgid "Non-admins can create top level repositories"
+msgstr ""
+
+#: kallithea/model/db.py:1694
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Only admins can fork repositories"
+msgstr "建立版本庫"
+
+#: kallithea/model/db.py:1695
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Non-admins can can fork repositories"
+msgstr "建立版本庫"
+
+#: kallithea/model/db.py:1698
+msgid "User registration with manual account activation"
+msgstr ""
+
+#: kallithea/model/db.py:1699
+msgid "User registration with automatic account activation"
+msgstr ""
+
+#: kallithea/model/db.py:2228
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Not reviewed"
+msgstr ""
+
+#: kallithea/model/db.py:2231
+#, fuzzy, python-format
+#| msgid "%d reviewer"
+#| msgid_plural "%d reviewers"
+msgid "Under review"
+msgstr ""
+
 #: kallithea/model/forms.py:57
 msgid "Please enter a login"
 msgstr "請登入"
@@ -1719,299 +1861,325 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: kallithea/model/forms.py:156
+#: kallithea/model/forms.py:160
 msgid "Name must not contain only digits"
 msgstr ""
 
-#: kallithea/model/notification.py:252
-#, python-format
-msgid "%(user)s commented on changeset at %(when)s"
-msgstr ""
-
-#: kallithea/model/notification.py:253
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
 #: kallithea/model/notification.py:254
 #, python-format
-msgid "%(user)s mentioned you at %(when)s"
+msgid "%(user)s commented on changeset %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:255
 #, python-format
-msgid "%(user)s registered in Kallithea at %(when)s"
+msgid "%(user)s sent message %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:256
 #, python-format
-msgid "%(user)s opened new pull request at %(when)s"
+msgid "%(user)s mentioned you %(age)s"
 msgstr ""
 
 #: kallithea/model/notification.py:257
 #, python-format
+msgid "%(user)s registered in Kallithea %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:258
+#, python-format
+msgid "%(user)s opened new pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:259
+#, python-format
+msgid "%(user)s commented on pull request %(age)s"
+msgstr ""
+
+#: kallithea/model/notification.py:266
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:267
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:268
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:269
+#, python-format
+msgid "%(user)s registered in Kallithea at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:270
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: kallithea/model/notification.py:271
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: kallithea/model/notification.py:296
-#, python-format
-msgid ""
-"Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:299
-#, python-format
-msgid "New user %(new_username)s registered"
-msgstr ""
-
-#: kallithea/model/notification.py:301
-#, python-format
-msgid ""
-"Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(pr_username)s"
-msgstr ""
-
 #: kallithea/model/notification.py:302
 #, python-format
 msgid ""
-"Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by "
-"%(comment_username)s"
-msgstr ""
-
-#: kallithea/model/notification.py:315
+"[Comment from %(comment_username)s] %(repo_name)s changeset %(short_id)s "
+"on %(branch)s"
+msgstr ""
+
+#: kallithea/model/notification.py:305
+#, python-format
+msgid "New user %(new_username)s registered"
+msgstr ""
+
+#: kallithea/model/notification.py:307
+#, python-format
+msgid ""
+"[Added by %(pr_username)s] %(repo_name)s pull request %(pr_nice_id)s from"
+" %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:308
+#, python-format
+msgid ""
+"[Comment from %(comment_username)s] %(repo_name)s pull request "
+"%(pr_nice_id)s from %(ref)s"
+msgstr ""
+
+#: kallithea/model/notification.py:321
 #, fuzzy
 msgid "Closing"
 msgstr "使用中"
 
-#: kallithea/model/pull_request.py:132
-#, python-format
-msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr ""
-
-#: kallithea/model/scm.py:808
+#: kallithea/model/pull_request.py:137
+#, python-format
+msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
+msgstr ""
+
+#: kallithea/model/scm.py:813
 msgid "latest tip"
 msgstr ""
 
-#: kallithea/model/user.py:194
+#: kallithea/model/user.py:185
 msgid "New user registration"
 msgstr ""
 
-#: kallithea/model/user.py:214 kallithea/model/user.py:236
-msgid "You can't Edit this user since it's crucial for entire application"
-msgstr "您無法編輯這個使用者,因為他是系統帳號"
-
-#: kallithea/model/user.py:255
-msgid "You can't remove this user since it's crucial for entire application"
+#: kallithea/model/user.py:249
+#, fuzzy
+#| msgid "You can't remove this user since it's crucial for entire application"
+msgid "You can't remove this user since it is crucial for the entire application"
 msgstr "您無法移除這個使用者,因為他是系統帳號"
 
-#: kallithea/model/user.py:261
+#: kallithea/model/user.py:254
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repositories and cannot be removed. Switch "
 "owners or remove those repositories: %s"
 msgstr ""
 
-#: kallithea/model/user.py:268
+#: kallithea/model/user.py:259
 #, python-format
 msgid ""
 "User \"%s\" still owns %s repository groups and cannot be removed. Switch"
 " owners or remove those repository groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:275
+#: kallithea/model/user.py:266
 #, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr ""
 
-#: kallithea/model/user.py:305
+#: kallithea/model/user.py:296
 msgid "Password reset link"
 msgstr ""
 
-#: kallithea/model/user.py:328
+#: kallithea/model/user.py:319
 msgid "Your new password"
 msgstr ""
 
-#: kallithea/model/user.py:329
+#: kallithea/model/user.py:320
 #, python-format
 msgid "Your new Kallithea password:%s"
 msgstr ""
 
-#: kallithea/model/validators.py:83 kallithea/model/validators.py:84
+#: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
 msgstr ""
 
-#: kallithea/model/validators.py:101
+#: kallithea/model/validators.py:95
 #, python-format
 msgid "Username \"%(username)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:103
-#, python-format
-msgid "Username \"%(username)s\" is forbidden"
-msgstr ""
-
-#: kallithea/model/validators.py:105
+#: kallithea/model/validators.py:97
+#, python-format
+msgid "Username \"%(username)s\" cannot be used"
+msgstr ""
+
+#: kallithea/model/validators.py:99
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character or underscore"
-msgstr ""
-
-#: kallithea/model/validators.py:132
+" dashes and must begin with an alphanumeric character or underscore"
+msgstr ""
+
+#: kallithea/model/validators.py:126
 msgid "The input is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:139
+#: kallithea/model/validators.py:133
 #, python-format
 msgid "Username %(username)s is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:158
+#: kallithea/model/validators.py:152
 msgid "Invalid user group name"
 msgstr ""
 
-#: kallithea/model/validators.py:159
+#: kallithea/model/validators.py:153
 #, python-format
 msgid "User group \"%(usergroup)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:161
+#: kallithea/model/validators.py:155
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
-#: kallithea/model/validators.py:199
+#: kallithea/model/validators.py:193
 msgid "Cannot assign this group as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:200
+#: kallithea/model/validators.py:194
 #, python-format
 msgid "Group \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:202
+#: kallithea/model/validators.py:196
 #, python-format
 msgid "Repository with name \"%(group_name)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:260
+#: kallithea/model/validators.py:254
 msgid "Invalid characters (non-ascii) in password"
 msgstr ""
 
-#: kallithea/model/validators.py:275
+#: kallithea/model/validators.py:269
 msgid "Invalid old password"
 msgstr ""
 
-#: kallithea/model/validators.py:291
+#: kallithea/model/validators.py:285
 msgid "Passwords do not match"
 msgstr "密碼不相符"
 
-#: kallithea/model/validators.py:308
-msgid "invalid password"
+#: kallithea/model/validators.py:300
+#, fuzzy
+#| msgid "invalid password"
+msgid "Invalid username or password"
 msgstr "無效的密碼"
 
-#: kallithea/model/validators.py:309
-msgid "invalid user name"
-msgstr "無效的使用者名稱"
-
-#: kallithea/model/validators.py:310
-msgid "Your account is disabled"
-msgstr "您的帳號已被停用"
-
-#: kallithea/model/validators.py:354
-#, python-format
-msgid "Repository name %(repo)s is disallowed"
-msgstr ""
-
-#: kallithea/model/validators.py:356
+#: kallithea/model/validators.py:331
+msgid "Token mismatch"
+msgstr ""
+
+#: kallithea/model/validators.py:345
+#, python-format
+msgid "Repository name %(repo)s is not allowed"
+msgstr ""
+
+#: kallithea/model/validators.py:347
 #, python-format
 msgid "Repository named %(repo)s already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:357
+#: kallithea/model/validators.py:348
 #, python-format
 msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 msgstr ""
 
-#: kallithea/model/validators.py:359
+#: kallithea/model/validators.py:350
 #, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
 msgstr ""
 
-#: kallithea/model/validators.py:474
+#: kallithea/model/validators.py:465
 #, fuzzy
-msgid "invalid clone URL"
-msgstr "無效的複製URL"
-
-#: kallithea/model/validators.py:475
-msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
-msgstr ""
-
-#: kallithea/model/validators.py:500
+#| msgid "private repository"
+msgid "Invalid repository URL"
+msgstr "私有版本庫"
+
+#: kallithea/model/validators.py:466
+msgid ""
+"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
+"svn+https URL"
+msgstr ""
+
+#: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
 msgstr ""
 
-#: kallithea/model/validators.py:515
+#: kallithea/model/validators.py:504
 msgid "You don't have permissions to create repository in this group"
 msgstr ""
 
-#: kallithea/model/validators.py:517
+#: kallithea/model/validators.py:506
 msgid "no permission to create repository in root location"
 msgstr ""
 
-#: kallithea/model/validators.py:566
+#: kallithea/model/validators.py:556
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: kallithea/model/validators.py:607
+#: kallithea/model/validators.py:597
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: kallithea/model/validators.py:700
+#: kallithea/model/validators.py:690
 msgid "This is not a valid path"
 msgstr "不是一個有效的路徑"
 
-#: kallithea/model/validators.py:715
-msgid "This e-mail address is already taken"
+#: kallithea/model/validators.py:705
+#, fuzzy
+#| msgid "This email address is already taken"
+msgid "This email address is already in use"
 msgstr "這個郵件位址已經使用了"
 
-#: kallithea/model/validators.py:735
-#, python-format
-msgid "e-mail \"%(email)s\" does not exist."
-msgstr ""
-
-#: kallithea/model/validators.py:772
+#: kallithea/model/validators.py:725
+#, python-format
+msgid "Email address \"%(email)s\" not found"
+msgstr ""
+
+#: kallithea/model/validators.py:762
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr ""
 
-#: kallithea/model/validators.py:785
-#, python-format
-msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr ""
-
-#: kallithea/model/validators.py:817
-msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: kallithea/model/validators.py:818
+#: kallithea/model/validators.py:774
+msgid "Please enter a valid IPv4 or IPv6 address"
+msgstr ""
+
+#: kallithea/model/validators.py:775
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: kallithea/model/validators.py:851
+#: kallithea/model/validators.py:808
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
-#: kallithea/model/validators.py:865
+#: kallithea/model/validators.py:822
 msgid "Filename cannot be inside a directory"
 msgstr ""
 
-#: kallithea/model/validators.py:881
+#: kallithea/model/validators.py:838
 #, python-format
 msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 msgstr ""
@@ -2073,13 +2241,13 @@
 msgstr ""
 
 #: kallithea/templates/index_base.html:46
-#: kallithea/templates/index_base.html:131
+#: kallithea/templates/index_base.html:127
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:64
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:42
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:17
 #: kallithea/templates/admin/repo_groups/repo_groups.html:47
-#: kallithea/templates/admin/repos/repo_add_base.html:32
-#: kallithea/templates/admin/repos/repo_edit_settings.html:72
+#: kallithea/templates/admin/repos/repo_add_base.html:28
+#: kallithea/templates/admin/repos/repo_edit_settings.html:65
 #: kallithea/templates/admin/repos/repos.html:48
 #: kallithea/templates/admin/user_groups/user_group_add.html:40
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:15
@@ -2091,11 +2259,11 @@
 #: kallithea/templates/pullrequests/pullrequest.html:40
 #: kallithea/templates/pullrequests/pullrequest_show.html:38
 #: kallithea/templates/pullrequests/pullrequest_show.html:63
-#: kallithea/templates/summary/summary.html:84
+#: kallithea/templates/summary/summary.html:85
 msgid "Description"
 msgstr "描述"
 
-#: kallithea/templates/index_base.html:129
+#: kallithea/templates/index_base.html:125
 #: kallithea/templates/admin/my_account/my_account_repos.html:46
 #: kallithea/templates/admin/my_account/my_account_watched.html:46
 #: kallithea/templates/admin/repo_groups/repo_groups.html:46
@@ -2116,11 +2284,11 @@
 msgid "Name"
 msgstr "名稱"
 
-#: kallithea/templates/index_base.html:132
+#: kallithea/templates/index_base.html:128
 msgid "Last Change"
 msgstr ""
 
-#: kallithea/templates/index_base.html:134
+#: kallithea/templates/index_base.html:130
 #: kallithea/templates/admin/my_account/my_account_repos.html:48
 #: kallithea/templates/admin/my_account/my_account_watched.html:48
 #: kallithea/templates/admin/repos/repos.html:49
@@ -2129,18 +2297,19 @@
 msgid "Tip"
 msgstr ""
 
-#: kallithea/templates/index_base.html:136
+#: kallithea/templates/index_base.html:132
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:10
 #: kallithea/templates/admin/repo_groups/repo_groups.html:49
-#: kallithea/templates/admin/repos/repo_edit_settings.html:60
+#: kallithea/templates/admin/repos/repo_edit_settings.html:53
 #: kallithea/templates/admin/repos/repos.html:50
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:8
 #: kallithea/templates/admin/user_groups/user_groups.html:50
-#: kallithea/templates/summary/summary.html:137
+#: kallithea/templates/pullrequests/pullrequest_show.html:229
+#: kallithea/templates/summary/summary.html:134
 msgid "Owner"
 msgstr "擁有者"
 
-#: kallithea/templates/index_base.html:144
+#: kallithea/templates/index_base.html:140
 #: kallithea/templates/admin/my_account/my_account_repos.html:57
 #: kallithea/templates/admin/my_account/my_account_watched.html:57
 #: kallithea/templates/base/root.html:44
@@ -2152,7 +2321,7 @@
 msgid "Click to sort ascending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:145
+#: kallithea/templates/index_base.html:141
 #: kallithea/templates/admin/my_account/my_account_repos.html:58
 #: kallithea/templates/admin/my_account/my_account_watched.html:58
 #: kallithea/templates/base/root.html:45
@@ -2164,11 +2333,11 @@
 msgid "Click to sort descending"
 msgstr ""
 
-#: kallithea/templates/index_base.html:146
+#: kallithea/templates/index_base.html:142
 msgid "No repositories found."
 msgstr ""
 
-#: kallithea/templates/index_base.html:147
+#: kallithea/templates/index_base.html:143
 #: kallithea/templates/admin/my_account/my_account_repos.html:60
 #: kallithea/templates/admin/my_account/my_account_watched.html:60
 #: kallithea/templates/base/root.html:47
@@ -2180,10 +2349,10 @@
 msgid "Data error."
 msgstr ""
 
-#: kallithea/templates/index_base.html:148
+#: kallithea/templates/index_base.html:144
 #: kallithea/templates/admin/my_account/my_account_repos.html:61
 #: kallithea/templates/admin/my_account/my_account_watched.html:61
-#: kallithea/templates/base/base.html:143 kallithea/templates/base/root.html:48
+#: kallithea/templates/base/base.html:147 kallithea/templates/base/root.html:48
 #: kallithea/templates/bookmarks/bookmarks.html:83
 #: kallithea/templates/branches/branches.html:83
 #: kallithea/templates/journal/journal.html:202
@@ -2193,7 +2362,7 @@
 msgstr ""
 
 #: kallithea/templates/login.html:5 kallithea/templates/login.html:15
-#: kallithea/templates/base/base.html:329
+#: kallithea/templates/base/base.html:333
 msgid "Log In"
 msgstr ""
 
@@ -2202,39 +2371,39 @@
 msgid "Log In to %s"
 msgstr ""
 
-#: kallithea/templates/login.html:27 kallithea/templates/register.html:24
+#: kallithea/templates/login.html:26 kallithea/templates/register.html:24
 #: kallithea/templates/admin/admin_log.html:5
-#: kallithea/templates/admin/my_account/my_account_profile.html:32
+#: kallithea/templates/admin/my_account/my_account_profile.html:25
 #: kallithea/templates/admin/users/user_add.html:32
-#: kallithea/templates/admin/users/user_edit_profile.html:33
+#: kallithea/templates/admin/users/user_edit_profile.html:24
 #: kallithea/templates/admin/users/users.html:50
-#: kallithea/templates/base/base.html:305
+#: kallithea/templates/base/base.html:309
 msgid "Username"
 msgstr "帳號"
 
-#: kallithea/templates/login.html:36 kallithea/templates/register.html:33
-#: kallithea/templates/admin/my_account/my_account.html:36
+#: kallithea/templates/login.html:33 kallithea/templates/register.html:33
+#: kallithea/templates/admin/my_account/my_account.html:37
 #: kallithea/templates/admin/users/user_add.html:41
-#: kallithea/templates/base/base.html:314
+#: kallithea/templates/base/base.html:318
 msgid "Password"
 msgstr "密碼"
 
-#: kallithea/templates/login.html:46
+#: kallithea/templates/login.html:44
 msgid "Remember me"
 msgstr ""
 
-#: kallithea/templates/login.html:50
+#: kallithea/templates/login.html:53
+msgid "Forgot your password ?"
+msgstr "忘記您的密碼?"
+
+#: kallithea/templates/login.html:56 kallithea/templates/base/base.html:329
+msgid "Don't have an account ?"
+msgstr "沒有帳號?"
+
+#: kallithea/templates/login.html:59
 msgid "Sign In"
 msgstr "登入"
 
-#: kallithea/templates/login.html:56
-msgid "Forgot your password ?"
-msgstr "忘記您的密碼?"
-
-#: kallithea/templates/login.html:59 kallithea/templates/base/base.html:325
-msgid "Don't have an account ?"
-msgstr "沒有帳號?"
-
 #: kallithea/templates/password_reset.html:5
 msgid "Password Reset"
 msgstr ""
@@ -2284,26 +2453,26 @@
 msgstr "確認密碼"
 
 #: kallithea/templates/register.html:51
-#: kallithea/templates/admin/my_account/my_account_profile.html:43
+#: kallithea/templates/admin/my_account/my_account_profile.html:34
 #: kallithea/templates/admin/users/user_add.html:59
-#: kallithea/templates/admin/users/user_edit_profile.html:87
+#: kallithea/templates/admin/users/user_edit_profile.html:78
 #: kallithea/templates/admin/users/users.html:51
 msgid "First Name"
 msgstr "名"
 
 #: kallithea/templates/register.html:60
-#: kallithea/templates/admin/my_account/my_account_profile.html:52
+#: kallithea/templates/admin/my_account/my_account_profile.html:43
 #: kallithea/templates/admin/users/user_add.html:68
-#: kallithea/templates/admin/users/user_edit_profile.html:96
+#: kallithea/templates/admin/users/user_edit_profile.html:87
 #: kallithea/templates/admin/users/users.html:52
 msgid "Last Name"
 msgstr "姓"
 
 #: kallithea/templates/register.html:69
-#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/my_account/my_account_profile.html:52
 #: kallithea/templates/admin/settings/settings.html:31
 #: kallithea/templates/admin/users/user_add.html:77
-#: kallithea/templates/admin/users/user_edit_profile.html:42
+#: kallithea/templates/admin/users/user_edit_profile.html:33
 msgid "Email"
 msgstr "電子郵件"
 
@@ -2413,109 +2582,95 @@
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
 msgid ""
-"Comma separated list of plugins. Order of plugins is also order in which "
-"Kallithea will try to authenticate user"
+"Comma-separated list of plugins; Kallithea will try user authentication "
+"in plugin order"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
 msgstr ""
 
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:40
-msgid "enabled"
-msgstr ""
-
-#: kallithea/templates/admin/auth/auth_settings.html:40
-#: kallithea/templates/base/root.html:41
-msgid "disabled"
-msgstr ""
-
 #: kallithea/templates/admin/auth/auth_settings.html:51
 msgid "Plugin"
 msgstr ""
 
 #: kallithea/templates/admin/auth/auth_settings.html:101
-#: kallithea/templates/admin/defaults/defaults.html:84
-#: kallithea/templates/admin/my_account/my_account_password.html:33
-#: kallithea/templates/admin/my_account/my_account_profile.html:70
-#: kallithea/templates/admin/permissions/permissions_globals.html:108
+#: kallithea/templates/admin/defaults/defaults.html:82
+#: kallithea/templates/admin/my_account/my_account_password.html:36
+#: kallithea/templates/admin/my_account/my_account_profile.html:60
+#: kallithea/templates/admin/permissions/permissions_globals.html:112
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:69
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:114
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:42
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:101
-#: kallithea/templates/admin/repos/repo_edit_settings.html:134
+#: kallithea/templates/admin/repos/repo_edit_settings.html:127
 #: kallithea/templates/admin/settings/settings_hooks.html:53
 #: kallithea/templates/admin/user_groups/user_group_add.html:57
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:104
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:60
 #: kallithea/templates/admin/users/user_add.html:96
-#: kallithea/templates/admin/users/user_edit_profile.html:122
+#: kallithea/templates/admin/users/user_edit_profile.html:113
 #: kallithea/templates/base/default_perms_box.html:64
 msgid "Save"
 msgstr "儲存"
 
 #: kallithea/templates/admin/defaults/defaults.html:5
-#: kallithea/templates/admin/defaults/defaults.html:25
+#: kallithea/templates/admin/defaults/defaults.html:11
+#: kallithea/templates/base/base.html:66
 #, fuzzy
 msgid "Repository Defaults"
 msgstr "個版本庫"
 
-#: kallithea/templates/admin/defaults/defaults.html:11
-#: kallithea/templates/base/base.html:66
-msgid "Defaults"
-msgstr ""
-
-#: kallithea/templates/admin/defaults/defaults.html:35
-#: kallithea/templates/admin/repos/repo_add_base.html:59
+#: kallithea/templates/admin/defaults/defaults.html:33
+#: kallithea/templates/admin/repos/repo_add_base.html:55
 #: kallithea/templates/admin/repos/repo_edit_fields.html:7
 msgid "Type"
 msgstr "類型"
 
-#: kallithea/templates/admin/defaults/defaults.html:44
-#: kallithea/templates/admin/repos/repo_add_base.html:77
-#: kallithea/templates/admin/repos/repo_edit_settings.html:82
-#: kallithea/templates/data_table/_dt_elements.html:74
+#: kallithea/templates/admin/defaults/defaults.html:42
+#: kallithea/templates/admin/repos/repo_add_base.html:73
+#: kallithea/templates/admin/repos/repo_edit_settings.html:75
+#: kallithea/templates/data_table/_dt_elements.html:72
 msgid "Private repository"
 msgstr "私有的版本庫"
 
-#: kallithea/templates/admin/defaults/defaults.html:48
-#: kallithea/templates/admin/repos/repo_add_base.html:81
-#: kallithea/templates/admin/repos/repo_edit_settings.html:86
+#: kallithea/templates/admin/defaults/defaults.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:79
 #: kallithea/templates/forks/fork.html:72
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:55
-#: kallithea/templates/admin/repos/repo_edit_settings.html:91
+#: kallithea/templates/admin/defaults/defaults.html:53
+#: kallithea/templates/admin/repos/repo_edit_settings.html:84
 msgid "Enable statistics"
 msgstr "啟用統計"
 
-#: kallithea/templates/admin/defaults/defaults.html:59
-#: kallithea/templates/admin/repos/repo_edit_settings.html:95
+#: kallithea/templates/admin/defaults/defaults.html:57
+#: kallithea/templates/admin/repos/repo_edit_settings.html:88
 msgid "Enable statistics window on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:65
-#: kallithea/templates/admin/repos/repo_edit_settings.html:100
+#: kallithea/templates/admin/defaults/defaults.html:63
+#: kallithea/templates/admin/repos/repo_edit_settings.html:93
 msgid "Enable downloads"
 msgstr "啟用下載"
 
-#: kallithea/templates/admin/defaults/defaults.html:69
-#: kallithea/templates/admin/repos/repo_edit_settings.html:104
+#: kallithea/templates/admin/defaults/defaults.html:67
+#: kallithea/templates/admin/repos/repo_edit_settings.html:97
 msgid "Enable download menu on summary page."
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:75
+#: kallithea/templates/admin/defaults/defaults.html:73
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:34
-#: kallithea/templates/admin/repos/repo_edit_settings.html:109
+#: kallithea/templates/admin/repos/repo_edit_settings.html:102
 msgid "Enable locking"
 msgstr ""
 
-#: kallithea/templates/admin/defaults/defaults.html:79
-#: kallithea/templates/admin/repos/repo_edit_settings.html:113
+#: kallithea/templates/admin/defaults/defaults.html:77
+#: kallithea/templates/admin/repos/repo_edit_settings.html:106
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
@@ -2547,6 +2702,12 @@
 #: kallithea/templates/admin/gists/index.html:59
 #: kallithea/templates/admin/gists/show.html:47
 #: kallithea/templates/admin/gists/show.html:49
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
+#: kallithea/templates/admin/users/user_edit_api_keys.html:8
+#: kallithea/templates/admin/users/user_edit_api_keys.html:27
+#: kallithea/templates/admin/users/user_edit_api_keys.html:32
 msgid "Expires"
 msgstr ""
 
@@ -2557,15 +2718,17 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-msgid "never"
-msgstr ""
+#, fuzzy
+#| msgid "Owner"
+msgid "Never"
+msgstr "擁有者"
 
 #: kallithea/templates/admin/gists/edit.html:145
 msgid "Update Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/edit.html:146
-#: kallithea/templates/changeset/changeset_file_comment.html:89
+#: kallithea/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
@@ -2588,12 +2751,12 @@
 
 #: kallithea/templates/admin/gists/index.html:37
 #: kallithea/templates/admin/gists/show.html:25
-#: kallithea/templates/base/base.html:240
+#: kallithea/templates/base/base.html:244
 msgid "Create New Gist"
 msgstr ""
 
 #: kallithea/templates/admin/gists/index.html:54
-#: kallithea/templates/data_table/_dt_elements.html:143
+#: kallithea/templates/data_table/_dt_elements.html:141
 msgid "Created"
 msgstr ""
 
@@ -2619,25 +2782,27 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/new.html:58
+#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:70
 #: kallithea/templates/admin/my_account/my_account_emails.html:46
-#: kallithea/templates/admin/my_account/my_account_password.html:34
-#: kallithea/templates/admin/my_account/my_account_profile.html:71
-#: kallithea/templates/admin/permissions/permissions_globals.html:109
-#: kallithea/templates/admin/permissions/permissions_ips.html:41
+#: kallithea/templates/admin/my_account/my_account_password.html:37
+#: kallithea/templates/admin/my_account/my_account_profile.html:61
+#: kallithea/templates/admin/permissions/permissions_globals.html:113
+#: kallithea/templates/admin/permissions/permissions_ips.html:39
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:115
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:43
 #: kallithea/templates/admin/repos/repo_edit_fields.html:59
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:102
-#: kallithea/templates/admin/repos/repo_edit_settings.html:135
+#: kallithea/templates/admin/repos/repo_edit_settings.html:128
 #: kallithea/templates/admin/settings/settings_global.html:57
 #: kallithea/templates/admin/settings/settings_vcs.html:81
 #: kallithea/templates/admin/settings/settings_visual.html:117
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:105
+#: kallithea/templates/admin/users/user_edit_api_keys.html:15
 #: kallithea/templates/admin/users/user_edit_api_keys.html:70
 #: kallithea/templates/admin/users/user_edit_emails.html:46
 #: kallithea/templates/admin/users/user_edit_ips.html:50
-#: kallithea/templates/admin/users/user_edit_profile.html:123
+#: kallithea/templates/admin/users/user_edit_profile.html:114
 #: kallithea/templates/base/default_perms_box.html:65
 #: kallithea/templates/files/files_add.html:65
 #: kallithea/templates/files/files_delete.html:44
@@ -2667,11 +2832,22 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:56
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:76
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/admin/my_account/my_account_emails.html:19
+#: kallithea/templates/admin/permissions/permissions_ips.html:12
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:75
+#: kallithea/templates/admin/repos/repo_edit_fields.html:18
+#: kallithea/templates/admin/settings/settings_hooks.html:36
+#: kallithea/templates/admin/users/user_edit_emails.html:19
+#: kallithea/templates/admin/users/user_edit_ips.html:22
+#: kallithea/templates/changeset/changeset_file_comment.html:30
+#: kallithea/templates/data_table/_dt_elements.html:129
+#: kallithea/templates/data_table/_dt_elements.html:157
+#: kallithea/templates/data_table/_dt_elements.html:173
+#: kallithea/templates/data_table/_dt_elements.html:189
 #: kallithea/templates/files/files_source.html:39
 #: kallithea/templates/files/files_source.html:42
 #: kallithea/templates/files/files_source.html:45
+#: kallithea/templates/pullrequests/pullrequest_data.html:20
 msgid "Delete"
 msgstr "移除"
 
@@ -2680,9 +2856,18 @@
 msgstr ""
 
 #: kallithea/templates/admin/gists/show.html:63
-#: kallithea/templates/changeset/changeset_file_comment.html:91
-#: kallithea/templates/changeset/changeset_file_comment.html:207
+#: kallithea/templates/base/perms_summary.html:43
+#: kallithea/templates/base/perms_summary.html:79
+#: kallithea/templates/base/perms_summary.html:81
+#: kallithea/templates/changeset/changeset_file_comment.html:83
+#: kallithea/templates/changeset/changeset_file_comment.html:192
+#: kallithea/templates/data_table/_dt_elements.html:122
+#: kallithea/templates/data_table/_dt_elements.html:123
+#: kallithea/templates/data_table/_dt_elements.html:150
+#: kallithea/templates/data_table/_dt_elements.html:151
+#: kallithea/templates/data_table/_dt_elements.html:165
 #: kallithea/templates/data_table/_dt_elements.html:167
+#: kallithea/templates/data_table/_dt_elements.html:181
 #: kallithea/templates/data_table/_dt_elements.html:183
 #: kallithea/templates/files/diff_2way.html:56
 #: kallithea/templates/files/files_source.html:41
@@ -2708,7 +2893,7 @@
 
 #: kallithea/templates/admin/my_account/my_account.html:5
 #: kallithea/templates/admin/my_account/my_account.html:9
-#: kallithea/templates/base/base.html:346
+#: kallithea/templates/base/base.html:350
 msgid "My Account"
 msgstr "我的帳號"
 
@@ -2717,27 +2902,35 @@
 msgid "Profile"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account.html:37
-#: kallithea/templates/admin/users/user_edit.html:30
-msgid "API Keys"
+#: kallithea/templates/admin/my_account/my_account.html:36
+msgid "Email Addresses"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:38
-msgid "My Emails"
+#: kallithea/templates/admin/users/user_edit.html:31
+msgid "API Keys"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-msgid "My Repositories"
-msgstr ""
+#, fuzzy
+#| msgid "repositories"
+msgid "Owned Repositories"
+msgstr "個版本庫"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-msgid "Watched"
-msgstr ""
+#, fuzzy
+#| msgid "Create repositories"
+msgid "Watched Repositories"
+msgstr "建立版本庫"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
+#: kallithea/templates/admin/permissions/permissions.html:30
+#: kallithea/templates/admin/user_groups/user_group_edit.html:32
+#: kallithea/templates/admin/users/user_edit.html:34
 #, fuzzy
-msgid "My Permissions"
+#| msgid "Permissions"
+msgid "Show Permissions"
 msgstr "權限"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
@@ -2745,56 +2938,45 @@
 msgid "Built-in"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:8
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:27
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:32
-#: kallithea/templates/admin/users/user_edit_api_keys.html:8
-#: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#: kallithea/templates/admin/users/user_edit_api_keys.html:32
-msgid "expires"
-msgstr ""
-
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
 #, python-format
-msgid "Confirm to reset this api key: %s"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_api_keys.html:15
-#: kallithea/templates/admin/users/user_edit_api_keys.html:15
-msgid "reset"
+msgid "Confirm to reset this API key: %s"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-msgid "expired"
+msgid "Expired"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, python-format
-msgid "Confirm to remove this api key: %s"
-msgstr ""
+#, fuzzy, python-format
+#| msgid "Confirm to remove current statistics."
+msgid "Confirm to remove this API key: %s"
+msgstr "確認移除目前的統計"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-msgid "remove"
-msgstr ""
+#, fuzzy
+#| msgid "file removed"
+msgid "Remove"
+msgstr "移除檔案"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-msgid "No additional api keys specified"
+msgid "No additional API keys specified"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-msgid "New api key"
+msgid "New API key"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 #: kallithea/templates/admin/my_account/my_account_emails.html:45
-#: kallithea/templates/admin/permissions/permissions_ips.html:40
-#: kallithea/templates/admin/repos/repo_add_base.html:85
+#: kallithea/templates/admin/permissions/permissions_ips.html:38
+#: kallithea/templates/admin/repos/repo_add_base.html:81
 #: kallithea/templates/admin/repos/repo_edit_fields.html:58
 #: kallithea/templates/admin/users/user_edit_api_keys.html:69
 #: kallithea/templates/admin/users/user_edit_emails.html:45
@@ -2807,19 +2989,6 @@
 msgid "Primary"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_emails.html:19
-#: kallithea/templates/admin/permissions/permissions_ips.html:14
-#: kallithea/templates/admin/repos/repo_edit_fields.html:18
-#: kallithea/templates/admin/settings/settings_hooks.html:36
-#: kallithea/templates/admin/users/user_edit_emails.html:19
-#: kallithea/templates/admin/users/user_edit_ips.html:22
-#: kallithea/templates/data_table/_dt_elements.html:131
-#: kallithea/templates/data_table/_dt_elements.html:159
-#: kallithea/templates/data_table/_dt_elements.html:175
-#: kallithea/templates/data_table/_dt_elements.html:191
-msgid "delete"
-msgstr "刪除"
-
 #: kallithea/templates/admin/my_account/my_account_emails.html:20
 #: kallithea/templates/admin/users/user_edit_emails.html:20
 #, python-format
@@ -2841,19 +3010,24 @@
 msgid "Change Your Account Password"
 msgstr "忘記您的密碼?"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:7
+#: kallithea/templates/admin/my_account/my_account_password.html:10
 msgid "Current password"
 msgstr ""
 
-#: kallithea/templates/admin/my_account/my_account_password.html:16
-#: kallithea/templates/admin/users/user_edit_profile.html:69
+#: kallithea/templates/admin/my_account/my_account_password.html:19
+#: kallithea/templates/admin/users/user_edit_profile.html:60
 msgid "New password"
 msgstr "新密碼"
 
-#: kallithea/templates/admin/my_account/my_account_password.html:25
+#: kallithea/templates/admin/my_account/my_account_password.html:28
 msgid "Confirm new password"
 msgstr ""
 
+#: kallithea/templates/admin/my_account/my_account_password.html:45
+#, python-format
+msgid "This account is managed with %s and the password cannot be changed here"
+msgstr ""
+
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
 msgstr "修改您的頭像於"
@@ -2874,13 +3048,7 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-msgid "current IP"
-msgstr ""
-
-#: kallithea/templates/admin/my_account/my_account_profile.html:28
-msgid ""
-"Your user is in an external Source of Record; some details cannot be "
-"managed here"
+msgid "Current IP"
 msgstr ""
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
@@ -2918,7 +3086,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/notifications.html:26
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 msgid "Pull Requests"
 msgstr ""
 
@@ -2936,22 +3104,16 @@
 msgstr ""
 
 #: kallithea/templates/admin/notifications/show_notification.html:9
-#: kallithea/templates/base/base.html:345
+#: kallithea/templates/base/base.html:349
 msgid "Notifications"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:5
+#: kallithea/templates/admin/permissions/permissions.html:11
+#: kallithea/templates/base/base.html:64
 #, fuzzy
-msgid "Permissions Administration"
-msgstr "權限管理員"
-
-#: kallithea/templates/admin/permissions/permissions.html:11
-#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
-#: kallithea/templates/admin/repos/repo_edit.html:43
-#: kallithea/templates/admin/user_groups/user_group_edit.html:32
-#: kallithea/templates/base/base.html:64
-msgid "Permissions"
-msgstr "權限"
+msgid "Default Permissions"
+msgstr "預設權限"
 
 #: kallithea/templates/admin/permissions/permissions.html:28
 #: kallithea/templates/admin/settings/settings.html:29
@@ -2959,14 +3121,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions.html:29
-#: kallithea/templates/admin/users/user_edit.html:34
+#: kallithea/templates/admin/users/user_edit.html:32
 msgid "IP Whitelist"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions.html:30
-msgid "Overview"
-msgstr ""
-
 #: kallithea/templates/admin/permissions/permissions_globals.html:7
 msgid "Anonymous access"
 msgstr "訪客權限"
@@ -2978,23 +3136,27 @@
 "%s user permissions."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
 "All default permissions on each repository will be reset to chosen "
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:26
+#, fuzzy
+#| msgid "Location of repositories"
+msgid "Apply to all existing repositories"
+msgstr "建立版本庫"
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
-#: kallithea/templates/admin/permissions/permissions_globals.html:40
-#: kallithea/templates/admin/permissions/permissions_globals.html:54
-msgid "Overwrite existing settings"
+msgid "Permissions for the Default user on new repositories."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
-#: kallithea/templates/admin/repos/repo_add_base.html:41
-#: kallithea/templates/admin/repos/repo_edit_settings.html:42
-#: kallithea/templates/data_table/_dt_elements.html:204
+#: kallithea/templates/admin/repos/repo_add_base.html:37
+#: kallithea/templates/admin/repos/repo_edit_settings.html:35
+#: kallithea/templates/data_table/_dt_elements.html:202
 #: kallithea/templates/forks/fork.html:48
 msgid "Repository group"
 msgstr "版本庫群組"
@@ -3006,72 +3168,102 @@
 "will be lost"
 msgstr ""
 
+#: kallithea/templates/admin/permissions/permissions_globals.html:40
+msgid "Apply to all existing repository groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:41
+msgid "Permissions for the Default user on new repository groups."
+msgstr ""
+
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
-#: kallithea/templates/data_table/_dt_elements.html:211
+#: kallithea/templates/data_table/_dt_elements.html:209
 msgid "User group"
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:53
 msgid ""
 "All default permissions on each user group will be reset to chosen "
-"permission, note that all custom default permission on repository groups "
-"will be lost"
+"permission, note that all custom default permission on user groups will "
+"be lost"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:54
+msgid "Apply to all existing user groups"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:55
+msgid "Permissions for the Default user on new user groups."
 msgstr ""
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-msgid "Repository creation"
+#, fuzzy
+#| msgid "Repository creation"
+msgid "Top level repository creation"
 msgstr "版本庫建立"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:68
+#: kallithea/templates/admin/permissions/permissions_globals.html:64
+msgid "Enable this to allow non-admins to create repositories at the top level."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:65
+msgid ""
+"Note: This will also give all users API access to create repositories "
+"everywhere. That might change in future versions."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:72
+#: kallithea/templates/admin/permissions/permissions_globals.html:74
 msgid ""
-"Write permission to a repository group allows creating repositories "
-"inside that group."
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_globals.html:77
+"With this, write permission to a repository group allows creating "
+"repositories inside that group. Without this, group write permissions "
+"mean nothing."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:85
+#: kallithea/templates/admin/permissions/permissions_globals.html:83
+msgid "Enable this to allow non-admins to create user groups."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:93
+#: kallithea/templates/admin/permissions/permissions_globals.html:92
+msgid "Enable this to allow non-admins to fork repositories."
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
 msgstr "註冊"
 
-#: kallithea/templates/admin/permissions/permissions_globals.html:101
+#: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:1
-msgid "Default IP Whitelist for All Users"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:15
+#: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, python-format
-msgid "Confirm to delete this ip: %s"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_ips.html:21
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm to delete this IP address: %s"
+msgstr ""
+
+#: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
 msgid "All IP addresses are allowed."
 msgstr ""
 
-#: kallithea/templates/admin/permissions/permissions_ips.html:32
+#: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
-msgid "New ip address"
-msgstr ""
-
-#: kallithea/templates/admin/permissions/permissions_perms.html:1
-#, fuzzy
-msgid "Default User Permissions Overview"
-msgstr "預設權限"
+msgid "New IP address"
+msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:11
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:11
@@ -3094,12 +3286,12 @@
 msgstr "父群組"
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:60
-#: kallithea/templates/admin/repos/repo_add_base.html:50
+#: kallithea/templates/admin/repos/repo_add_base.html:46
 msgid "Copy parent group permissions"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
-#: kallithea/templates/admin/repos/repo_add_base.html:54
+#: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
 msgstr ""
 
@@ -3117,19 +3309,25 @@
 #: kallithea/templates/admin/repos/repo_edit.html:40
 #: kallithea/templates/admin/settings/settings.html:11
 #: kallithea/templates/admin/user_groups/user_group_edit.html:29
-#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:154
-#: kallithea/templates/data_table/_dt_elements.html:43
-#: kallithea/templates/data_table/_dt_elements.html:47
+#: kallithea/templates/base/base.html:67 kallithea/templates/base/base.html:158
+#: kallithea/templates/data_table/_dt_elements.html:45
+#: kallithea/templates/data_table/_dt_elements.html:49
 msgid "Settings"
 msgstr "設定"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:41
 #: kallithea/templates/admin/repos/repo_edit.html:46
 #: kallithea/templates/admin/user_groups/user_group_edit.html:30
-#: kallithea/templates/admin/users/user_edit.html:31
+#: kallithea/templates/admin/users/user_edit.html:33
 msgid "Advanced"
 msgstr ""
 
+#: kallithea/templates/admin/repo_groups/repo_group_edit.html:42
+#: kallithea/templates/admin/repos/repo_edit.html:43
+#: kallithea/templates/admin/user_groups/user_group_edit.html:31
+msgid "Permissions"
+msgstr "權限"
+
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:1
 #, python-format
 msgid "Repository Group: %s"
@@ -3150,12 +3348,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:9
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_advanced.html:8
-#: kallithea/templates/pullrequests/pullrequest_show.html:147
+#: kallithea/templates/pullrequests/pullrequest_show.html:146
 msgid "Created on"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:192
+#: kallithea/templates/data_table/_dt_elements.html:190
 #, python-format
 msgid "Confirm to delete this group: %s with %s repository"
 msgid_plural "Confirm to delete this group: %s with %s repositories"
@@ -3165,38 +3363,10 @@
 msgid "Delete this repository group"
 msgstr ""
 
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:7
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:8
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:7
-#: kallithea/templates/base/perms_summary.html:14
-msgid "none"
-msgstr "無"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:8
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:9
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:8
-#: kallithea/templates/base/perms_summary.html:15
-msgid "read"
-msgstr "讀"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:9
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:10
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:9
-#: kallithea/templates/base/perms_summary.html:16
-msgid "write"
-msgstr "寫"
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:10
-#: kallithea/templates/admin/repos/repo_edit_permissions.html:11
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:10
-#: kallithea/templates/base/perms_summary.html:17
-msgid "admin"
-msgstr "管理員"
-
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-msgid "user/user group"
+msgid "User/User Group"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
@@ -3205,8 +3375,10 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-msgid "default"
-msgstr ""
+#, fuzzy
+#| msgid "delete"
+msgid "Default"
+msgstr "刪除"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:71
@@ -3214,12 +3386,7 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-msgid "revoke"
-msgstr ""
-
-#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:47
-#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:47
-msgid "delegated admin"
+msgid "Revoke"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
@@ -3229,7 +3396,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-msgid "apply to children"
+msgid "Apply to children"
 msgstr ""
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
@@ -3280,42 +3447,41 @@
 msgid "Number of Top-level Repositories"
 msgstr "建立版本庫"
 
-#: kallithea/templates/admin/repos/repo_add_base.html:14
-msgid "Import existing repository ?"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:23
-#: kallithea/templates/summary/summary.html:29
-msgid "Clone from"
-msgstr "複製由"
-
-#: kallithea/templates/admin/repos/repo_add_base.html:27
-msgid "Optional URL from which repository should be cloned."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:36
-#: kallithea/templates/admin/repos/repo_edit_settings.html:76
+#: kallithea/templates/admin/repos/repo_add_base.html:17
+#, fuzzy
+#| msgid "private repository"
+msgid "Clone remote repository"
+msgstr "私有版本庫"
+
+#: kallithea/templates/admin/repos/repo_add_base.html:22
+msgid ""
+"Optional: URL of a remote repository. If set, the repository will be "
+"created as a clone from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_add_base.html:32
+#: kallithea/templates/admin/repos/repo_edit_settings.html:69
 #: kallithea/templates/forks/fork.html:42
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:45
-#: kallithea/templates/admin/repos/repo_edit_settings.html:46
+#: kallithea/templates/admin/repos/repo_add_base.html:41
+#: kallithea/templates/admin/repos/repo_edit_settings.html:39
 #: kallithea/templates/forks/fork.html:52
 msgid "Optionally select a group to put this repository into."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_add_base.html:63
+#: kallithea/templates/admin/repos/repo_add_base.html:59
 msgid "Type of repository to create."
 msgstr ""
 
+#: kallithea/templates/admin/repos/repo_add_base.html:64
+#: kallithea/templates/admin/repos/repo_edit_settings.html:44
+#: kallithea/templates/forks/fork.html:58
+msgid "Landing revision"
+msgstr ""
+
 #: kallithea/templates/admin/repos/repo_add_base.html:68
-#: kallithea/templates/admin/repos/repo_edit_settings.html:51
-#: kallithea/templates/forks/fork.html:58
-msgid "Landing revision"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_add_base.html:72
 msgid ""
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
@@ -3362,8 +3528,8 @@
 
 #: kallithea/templates/admin/repos/repo_edit.html:58
 #: kallithea/templates/summary/statistics.html:8
-#: kallithea/templates/summary/summary.html:174
-#: kallithea/templates/summary/summary.html:175
+#: kallithea/templates/summary/summary.html:171
+#: kallithea/templates/summary/summary.html:172
 msgid "Statistics"
 msgstr "統計"
 
@@ -3387,51 +3553,51 @@
 msgid "Public Journal Visibility"
 msgstr "公開日誌"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:30
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "從公開日誌移除"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:35
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:34
 #, fuzzy
 msgid "Add to Public Journal"
 msgstr "公開日誌"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:41
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:40
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:47
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:46
 #, fuzzy
 msgid "Change Locking"
 msgstr "修改紀錄"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:53
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:52
 #, fuzzy
 msgid "Confirm to unlock repository."
 msgstr "確認廢止版本庫快取"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:55
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:54
 #, fuzzy
 msgid "Unlock Repository"
 msgstr "公開的版本庫"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:61
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:60
 #, fuzzy
 msgid "Confirm to lock repository."
 msgstr "確認廢止版本庫快取"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:63
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:62
 #, fuzzy
 msgid "Lock Repository"
 msgstr "公開的版本庫"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:65
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:69
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 msgid ""
 "Force locking on the repository. Works only when anonymous access is "
 "disabled. Triggering a pull locks the repository.  The user who is "
@@ -3439,32 +3605,32 @@
 "unlock it by doing a push."
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:80
-#: kallithea/templates/data_table/_dt_elements.html:132
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:79
+#: kallithea/templates/data_table/_dt_elements.html:130
 #, python-format
 msgid "Confirm to delete this repository: %s"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:82
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:81
 #, fuzzy
 msgid "Delete this Repository"
 msgstr "公開的版本庫"
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:84
 #, fuzzy, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
 msgstr[0] ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:87
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_advanced.html:91
+#: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
 "The deleted repository will be moved away and hidden until the "
 "administrator expires it. The administrator can both permanently delete "
@@ -3504,8 +3670,8 @@
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 #: kallithea/templates/admin/user_groups/user_groups.html:49
-#: kallithea/templates/admin/users/user_add.html:88
-#: kallithea/templates/admin/users/user_edit_profile.html:105
+#: kallithea/templates/admin/users/user_add.html:86
+#: kallithea/templates/admin/users/user_edit_profile.html:96
 #: kallithea/templates/admin/users/users.html:54
 msgid "Active"
 msgstr "啟用"
@@ -3544,29 +3710,38 @@
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-msgid "private repository"
+#, fuzzy
+#| msgid "private repository"
+msgid "Private Repository"
 msgstr "私有版本庫"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
 #, fuzzy
-msgid "Remote URL"
-msgstr "複製連結"
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Pull Changes from Remote Location"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:8
-msgid "Confirm to pull changes from remote side."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_remote.html:14
-msgid "This repository does not have a remote URL set."
+#| msgid "private repository"
+msgid "Remote repository URL"
+msgstr "私有版本庫"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:9
+#, fuzzy, python-format
+#| msgid "Changes on %s repository"
+msgid "Pull Changes from Remote Repository"
+msgstr "修改於版本庫 %s"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:11
+#, fuzzy
+#| msgid "Confirm to unlock repository."
+msgid "Confirm to pull changes from remote repository."
+msgstr "確認廢止版本庫快取"
+
+#: kallithea/templates/admin/repos/repo_edit_remote.html:17
+msgid "This repository does not have a remote repository URL."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-msgid "Non-changeable id"
-msgstr ""
+#, fuzzy
+#| msgid "private repository"
+msgid "Permanent Repository ID"
+msgstr "私有版本庫"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
@@ -3580,44 +3755,35 @@
 msgid ""
 "In case this repository is renamed or moved into another group the "
 "repository URL changes.\n"
-"                               Using the above URL guarantees that this "
-"repository will always be accessible under such URL.\n"
-"                               Useful for CI systems, or any other cases "
-"that you need to hardcode the URL into 3rd party service."
+"                               Using the above permanent URL guarantees "
+"that this repository always will be accessible on that URL.\n"
+"                               This is useful for CI systems, or any "
+"other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+#| msgid "private repository"
+msgid "Remote repository"
+msgstr "私有版本庫"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:25
 #, fuzzy
-msgid "Clone URL"
-msgstr "複製連結"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:27
-#: kallithea/templates/base/perms_summary.html:43
-#: kallithea/templates/base/perms_summary.html:79
-#: kallithea/templates/base/perms_summary.html:81
-#: kallithea/templates/data_table/_dt_elements.html:124
-#: kallithea/templates/data_table/_dt_elements.html:125
-#: kallithea/templates/data_table/_dt_elements.html:152
-#: kallithea/templates/data_table/_dt_elements.html:153
-#: kallithea/templates/data_table/_dt_elements.html:169
-#: kallithea/templates/data_table/_dt_elements.html:185
-msgid "edit"
-msgstr "編輯"
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:30
-msgid "new value"
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:37
-msgid "URL used for doing remote pulls."
-msgstr ""
-
-#: kallithea/templates/admin/repos/repo_edit_settings.html:55
+#| msgid "Repository"
+msgid "Repository URL"
+msgstr "版本庫"
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:29
+msgid ""
+"Optional: URL of a remote repository. If set, the repository can be "
+"pulled from this URL."
+msgstr ""
+
+#: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
-#: kallithea/templates/admin/repos/repo_edit_settings.html:65
+#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 msgid "Change owner of this repository."
 msgstr ""
 
@@ -3678,55 +3844,11 @@
 msgid "System Info"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_email.html:4
-msgid "Email prefix"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:5
-msgid "Kallithea email from"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:6
-msgid "Error email from"
-msgstr ""
-
 #: kallithea/templates/admin/settings/settings_email.html:7
-msgid "Error email recipients"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:9
-msgid "SMTP server"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:10
-msgid "SMTP username"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:11
-msgid "SMTP password"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:12
-msgid "SMTP port"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:14
-msgid "SMTP use TLS"
+msgid "Send test email to"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_email.html:15
-msgid "SMTP use SSL"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:16
-msgid "SMTP auth"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:31
-msgid "Send test email to"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_email.html:39
 msgid "Send"
 msgstr ""
 
@@ -3801,13 +3923,13 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
-msgid "Destroy old data"
+msgid "Delete records of missing repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
-"Check this option to remove references to repositories that no longer "
-"exist in on the filesystem."
+"Check this option to remove all comments, pull requests and other records"
+" related to repositories that no longer exist in the filesystem."
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
@@ -3828,7 +3950,7 @@
 "Current hooks will be updated to the latest version."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_mapping.html:32
+#: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid "Rescan Repositories"
 msgstr ""
 
@@ -3855,38 +3977,42 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-msgid "check for updates"
+msgid "Check for updates"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:5
-msgid "Python version"
+msgid "Kallithea configuration file"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:6
-msgid "Platform"
+msgid "Python version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:7
-msgid "Git version"
+msgid "Platform"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:8
-msgid "Git path"
-msgstr ""
-
-#: kallithea/templates/admin/settings/settings_system.html:9
-msgid "Upgrade info endpoint"
+msgid "Git version"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_system.html:9
+msgid "Git path"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
+msgid "Upgrade info endpoint"
+msgstr ""
+
+#: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Note: please make sure this server can access this URL"
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:14
+#: kallithea/templates/admin/settings/settings_system.html:15
 msgid "Checking for updates..."
 msgstr ""
 
-#: kallithea/templates/admin/settings/settings_system.html:22
+#: kallithea/templates/admin/settings/settings_system.html:23
 msgid "Python Packages"
 msgstr ""
 
@@ -4040,11 +4166,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:80
-msgid "Show public repo icon on repositories"
+msgid "Show public repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:84
-msgid "Show private repo icon on repositories"
+msgid "Show private repository icon on repositories"
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
@@ -4052,8 +4178,10 @@
 msgstr ""
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-msgid "Meta-Tagging"
-msgstr ""
+#, fuzzy
+#| msgid "Settings"
+msgid "Meta Tagging"
+msgstr "設定"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
 msgid "Stylify recognised meta tags:"
@@ -4071,6 +4199,7 @@
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
+#: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
 msgstr ""
@@ -4090,24 +4219,25 @@
 msgid "%s user group settings"
 msgstr ""
 
-#: kallithea/templates/admin/user_groups/user_group_edit.html:31
-msgid "Default permissions"
-msgstr "預設權限"
-
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
+#, fuzzy
+#| msgid "members"
+msgid "Show Members"
+msgstr "成員"
+
+#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
+#, python-format
+msgid "User Group: %s"
+msgstr ""
+
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
 #: kallithea/templates/admin/user_groups/user_groups.html:48
 msgid "Members"
 msgstr "成員"
 
-#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
-#, python-format
-msgid "User Group: %s"
-msgstr ""
-
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
-#: kallithea/templates/data_table/_dt_elements.html:176
+#: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
@@ -4133,10 +4263,6 @@
 msgid "User Groups Administration"
 msgstr "使用者管理員"
 
-#: kallithea/templates/admin/user_groups/user_groups.html:10
-msgid "user groups"
-msgstr ""
-
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
 msgstr "新增使用者"
@@ -4162,12 +4288,7 @@
 msgid "%s user settings"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit.html:32
-#, fuzzy
-msgid "Default Permissions"
-msgstr "預設權限"
-
-#: kallithea/templates/admin/users/user_edit.html:33
+#: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
 msgstr ""
 
@@ -4177,7 +4298,7 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
-#: kallithea/templates/admin/users/user_edit_profile.html:51
+#: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
 msgstr ""
 
@@ -4187,11 +4308,11 @@
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
-msgid "Member of User groups"
+msgid "Member of User Groups"
 msgstr ""
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
-#: kallithea/templates/data_table/_dt_elements.html:160
+#: kallithea/templates/data_table/_dt_elements.html:158
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
@@ -4213,18 +4334,11 @@
 msgid "Missing email, please update this user email address."
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:27
-#, python-format
-msgid ""
-"This user is in an external Source of Record (%s); some details cannot be"
-" managed here."
-msgstr ""
-
-#: kallithea/templates/admin/users/user_edit_profile.html:60
+#: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
 msgstr ""
 
-#: kallithea/templates/admin/users/user_edit_profile.html:78
+#: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr ""
 
@@ -4246,47 +4360,55 @@
 msgid "Support"
 msgstr ""
 
-#: kallithea/templates/base/base.html:122
+#: kallithea/templates/base/base.html:90
+msgid "Mercurial repository"
+msgstr "Mercurial 版本庫"
+
+#: kallithea/templates/base/base.html:93
+msgid "Git repository"
+msgstr "Git 版本庫"
+
+#: kallithea/templates/base/base.html:126
 msgid "Create Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:133
-#: kallithea/templates/data_table/_dt_elements.html:11
-#: kallithea/templates/data_table/_dt_elements.html:15
+#: kallithea/templates/base/base.html:137
+#: kallithea/templates/data_table/_dt_elements.html:13
+#: kallithea/templates/data_table/_dt_elements.html:17
 #: kallithea/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "概況"
 
-#: kallithea/templates/base/base.html:135
-#: kallithea/templates/base/base.html:137
+#: kallithea/templates/base/base.html:139
+#: kallithea/templates/base/base.html:141
 #: kallithea/templates/changelog/changelog.html:14
-#: kallithea/templates/data_table/_dt_elements.html:19
-#: kallithea/templates/data_table/_dt_elements.html:23
+#: kallithea/templates/data_table/_dt_elements.html:21
+#: kallithea/templates/data_table/_dt_elements.html:25
 msgid "Changelog"
 msgstr "修改紀錄"
 
-#: kallithea/templates/base/base.html:139
-#: kallithea/templates/data_table/_dt_elements.html:27
-#: kallithea/templates/data_table/_dt_elements.html:31
+#: kallithea/templates/base/base.html:143
+#: kallithea/templates/data_table/_dt_elements.html:29
+#: kallithea/templates/data_table/_dt_elements.html:33
 #: kallithea/templates/files/files.html:11
 msgid "Files"
 msgstr "檔案"
 
-#: kallithea/templates/base/base.html:141
+#: kallithea/templates/base/base.html:145
 msgid "Switch To"
 msgstr ""
 
-#: kallithea/templates/base/base.html:148
-#: kallithea/templates/base/base.html:150
+#: kallithea/templates/base/base.html:152
+#: kallithea/templates/base/base.html:154
 msgid "Options"
 msgstr "選項"
 
-#: kallithea/templates/base/base.html:158
+#: kallithea/templates/base/base.html:162
 #: kallithea/templates/forks/forks_data.html:21
 msgid "Compare Fork"
 msgstr ""
 
-#: kallithea/templates/base/base.html:160
+#: kallithea/templates/base/base.html:164
 #: kallithea/templates/bookmarks/bookmarks.html:56
 #: kallithea/templates/bookmarks/bookmarks_data.html:13
 #: kallithea/templates/branches/branches.html:56
@@ -4296,129 +4418,125 @@
 msgid "Compare"
 msgstr ""
 
-#: kallithea/templates/base/base.html:162
-#: kallithea/templates/base/base.html:250
+#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:254
 #: kallithea/templates/search/search.html:14
 #: kallithea/templates/search/search.html:54
 msgid "Search"
 msgstr "搜尋"
 
-#: kallithea/templates/base/base.html:166
+#: kallithea/templates/base/base.html:170
 msgid "Unlock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:168
+#: kallithea/templates/base/base.html:172
 msgid "Lock"
 msgstr ""
 
-#: kallithea/templates/base/base.html:176
-msgid "Follow"
-msgstr ""
-
-#: kallithea/templates/base/base.html:177
-msgid "Unfollow"
-msgstr ""
-
 #: kallithea/templates/base/base.html:180
-#: kallithea/templates/data_table/_dt_elements.html:35
-#: kallithea/templates/data_table/_dt_elements.html:39
+msgid "Follow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:181
+msgid "Unfollow"
+msgstr ""
+
+#: kallithea/templates/base/base.html:184
+#: kallithea/templates/data_table/_dt_elements.html:37
+#: kallithea/templates/data_table/_dt_elements.html:41
 #: kallithea/templates/forks/fork.html:9
 msgid "Fork"
 msgstr "分支"
 
-#: kallithea/templates/base/base.html:181
+#: kallithea/templates/base/base.html:185
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
 msgstr ""
 
-#: kallithea/templates/base/base.html:186
+#: kallithea/templates/base/base.html:190
 #, python-format
 msgid "Show Pull Requests for %s"
 msgstr ""
 
-#: kallithea/templates/base/base.html:224
+#: kallithea/templates/base/base.html:228
 msgid "Show recent activity"
 msgstr ""
 
-#: kallithea/templates/base/base.html:225
-#: kallithea/templates/journal/journal.html:4
-#: kallithea/templates/journal/journal.html:12
-msgid "Journal"
-msgstr "日誌"
-
-#: kallithea/templates/base/base.html:230
-#: kallithea/templates/base/base.html:231
+#: kallithea/templates/base/base.html:234
+#: kallithea/templates/base/base.html:235
 msgid "Public journal"
 msgstr "公開日誌"
 
-#: kallithea/templates/base/base.html:236
+#: kallithea/templates/base/base.html:240
 msgid "Show public gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:237
-msgid "Gists"
-msgstr ""
-
 #: kallithea/templates/base/base.html:241
+msgid "Gists"
+msgstr ""
+
+#: kallithea/templates/base/base.html:245
 msgid "All Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:243
+#: kallithea/templates/base/base.html:247
 msgid "My Public Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:244
+#: kallithea/templates/base/base.html:248
 msgid "My Private Gists"
 msgstr ""
 
-#: kallithea/templates/base/base.html:249
+#: kallithea/templates/base/base.html:253
 msgid "Search in repositories"
 msgstr ""
 
-#: kallithea/templates/base/base.html:272
-#: kallithea/templates/base/base.html:273
+#: kallithea/templates/base/base.html:276
+#: kallithea/templates/base/base.html:277
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:4
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:8
 msgid "My Pull Requests"
 msgstr ""
 
-#: kallithea/templates/base/base.html:292
+#: kallithea/templates/base/base.html:296
 msgid "Not Logged In"
 msgstr ""
 
-#: kallithea/templates/base/base.html:299
+#: kallithea/templates/base/base.html:303
 msgid "Login to Your Account"
 msgstr ""
 
-#: kallithea/templates/base/base.html:322
+#: kallithea/templates/base/base.html:326
 msgid "Forgot password ?"
 msgstr "忘記密碼?"
 
-#: kallithea/templates/base/base.html:347
+#: kallithea/templates/base/base.html:353
 msgid "Log Out"
 msgstr "登出"
 
-#: kallithea/templates/base/base.html:395
+#: kallithea/templates/base/base.html:402
 msgid "No matches found"
 msgstr ""
 
-#: kallithea/templates/base/base.html:524
+#: kallithea/templates/base/base.html:531
 msgid "Keyboard shortcuts"
 msgstr ""
 
-#: kallithea/templates/base/base.html:533
+#: kallithea/templates/base/base.html:540
 msgid "Site-wide shortcuts"
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:14
-msgid "Inherit from defaults"
-msgstr ""
+#, fuzzy
+#| msgid "Repository Defaults"
+msgid "Inherit defaults"
+msgstr "個版本庫"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
 msgid ""
-"Select to inherit permissions from %s permissions settings, and default "
-"IP address whitelist."
+"Select to inherit global settings, IP whitelist and permissions from the "
+"%s."
 msgstr ""
 
 #: kallithea/templates/base/default_perms_box.html:28
@@ -4446,8 +4564,9 @@
 msgstr ""
 
 #: kallithea/templates/base/perms_summary.html:13
-msgid "show"
-msgstr ""
+#: kallithea/templates/changelog/changelog.html:42
+msgid "Show"
+msgstr "顯示"
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
@@ -4473,7 +4592,7 @@
 msgstr ""
 
 #: kallithea/templates/base/root.html:23
-#: kallithea/templates/data_table/_dt_elements.html:216
+#: kallithea/templates/data_table/_dt_elements.html:214
 msgid "Stop following this repository"
 msgstr "停止追蹤這個版本庫"
 
@@ -4545,6 +4664,14 @@
 msgid "Confirm to revoke permission for {0}: {1} ?"
 msgstr ""
 
+#: kallithea/templates/base/root.html:40
+msgid "enabled"
+msgstr ""
+
+#: kallithea/templates/base/root.html:41
+msgid "disabled"
+msgstr ""
+
 #: kallithea/templates/base/root.html:43
 msgid "Specify changeset"
 msgstr ""
@@ -4574,6 +4701,7 @@
 #: kallithea/templates/branches/branches.html:54
 #: kallithea/templates/branches/branches_data.html:12
 #: kallithea/templates/changelog/changelog_summary_data.html:7
+#: kallithea/templates/files/files_browser.html:32
 #: kallithea/templates/pullrequests/pullrequest.html:62
 #: kallithea/templates/pullrequests/pullrequest.html:78
 #: kallithea/templates/tags/tags.html:54
@@ -4601,10 +4729,6 @@
 msgid_plural "showing %d out of %d revisions"
 msgstr[0] ""
 
-#: kallithea/templates/changelog/changelog.html:42
-msgid "Show"
-msgstr "顯示"
-
 #: kallithea/templates/changelog/changelog.html:52
 msgid "Clear selection"
 msgstr ""
@@ -4622,7 +4746,7 @@
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
-msgid "Compare fork with parent repo (%s)"
+msgid "Compare fork with parent repository (%s)"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:66
@@ -4635,7 +4759,7 @@
 #, python-format
 msgid ""
 "Changeset status: %s\n"
-"Click to open associated pull request #%s"
+"Click to open associated pull request %s"
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:96
@@ -4645,7 +4769,7 @@
 msgstr ""
 
 #: kallithea/templates/changelog/changelog.html:115
-#: kallithea/templates/compare/compare_cs.html:48
+#: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
 msgstr ""
 
@@ -4678,7 +4802,7 @@
 msgid "Branch %s"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog.html:290
+#: kallithea/templates/changelog/changelog.html:291
 msgid "There are no changes yet"
 msgstr "尚未有任何變更"
 
@@ -4694,7 +4818,7 @@
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
-#: kallithea/templates/changeset/diff_block.html:80
+#: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
 msgstr ""
 
@@ -4724,21 +4848,23 @@
 msgid "Refs"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:91
+#: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:94
+#: kallithea/templates/changelog/changelog_summary_data.html:84
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
 msgstr ""
 
-#: kallithea/templates/changelog/changelog_summary_data.html:100
-msgid "Push new repo"
-msgstr ""
-
-#: kallithea/templates/changelog/changelog_summary_data.html:108
+#: kallithea/templates/changelog/changelog_summary_data.html:90
+#, fuzzy
+#| msgid "private repository"
+msgid "Push new repository"
+msgstr "私有版本庫"
+
+#: kallithea/templates/changelog/changelog_summary_data.html:98
 msgid "Existing repository?"
 msgstr ""
 
@@ -4748,15 +4874,15 @@
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:36
-msgid "parent rev."
+msgid "Parent rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:42
-msgid "child rev."
+msgid "Child rev."
 msgstr ""
 
 #: kallithea/templates/changeset/changeset.html:50
-#: kallithea/templates/changeset/changeset_file_comment.html:43
+#: kallithea/templates/changeset/changeset_file_comment.html:37
 #: kallithea/templates/changeset/changeset_range.html:48
 msgid "Changeset status"
 msgstr ""
@@ -4779,7 +4905,9 @@
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-msgid "merge"
+#, fuzzy
+#| msgid "merge"
+msgid "Merge"
 msgstr "合併"
 
 #: kallithea/templates/changeset/changeset.html:123
@@ -4790,143 +4918,152 @@
 msgid "Transplanted from:"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:137
+#: kallithea/templates/changeset/changeset.html:135
+msgid "Replaced by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:149
+msgid "Preceded by:"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
-#: kallithea/templates/pullrequests/pullrequest_show.html:307
+#: kallithea/templates/pullrequests/pullrequest_show.html:314
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
 msgstr[0] ""
 
-#: kallithea/templates/changeset/changeset.html:139
+#: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
-#: kallithea/templates/pullrequests/pullrequest_show.html:309
+#: kallithea/templates/pullrequests/pullrequest_show.html:316
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] ""
 
-#: kallithea/templates/changeset/changeset.html:153
-#: kallithea/templates/changeset/changeset.html:166
-#: kallithea/templates/pullrequests/pullrequest_show.html:328
-#: kallithea/templates/pullrequests/pullrequest_show.html:351
+#: kallithea/templates/changeset/changeset.html:182
+#: kallithea/templates/changeset/changeset.html:195
+#: kallithea/templates/pullrequests/pullrequest_show.html:335
+#: kallithea/templates/pullrequests/pullrequest_show.html:359
 msgid "Show full diff anyway"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset.html:224
-#: kallithea/templates/changeset/changeset.html:261
-msgid "no revisions"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:24
-msgid "Status change from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:25
-#: kallithea/templates/changeset/changeset_file_comment.html:28
+#: kallithea/templates/changeset/changeset.html:247
+#: kallithea/templates/changeset/changeset.html:284
+#, fuzzy
+#| msgid "revisions"
+msgid "No revisions"
+msgstr "修訂"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:21
+msgid "on pull request"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:22
 #, fuzzy
 msgid "No title"
 msgstr "沒有檔案"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:27
-msgid "Comment from pull request"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:32
-msgid "Status change on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:34
-msgid "Comment on changeset"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:50
+#: kallithea/templates/changeset/changeset_file_comment.html:24
+#, fuzzy
+#| msgid "No changes"
+msgid "on this changeset"
+msgstr "沒有修改"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:30
 #, fuzzy
 msgid "Delete comment?"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:67
+#: kallithea/templates/changeset/changeset_file_comment.html:37
+#, fuzzy
+#| msgid "Latest Changes"
+msgid "Status change"
+msgstr "多個檔案修改"
+
+#: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:68
-#: kallithea/templates/changeset/changeset_file_comment.html:163
+#: kallithea/templates/changeset/changeset_file_comment.html:60
+#: kallithea/templates/changeset/changeset_file_comment.html:148
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:70
+#: kallithea/templates/changeset/changeset_file_comment.html:62
 msgid "Use @username inside this text to notify another user"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:72
+#: kallithea/templates/changeset/changeset_file_comment.html:184
+msgid "Comment preview"
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:77
+msgid "Submitting ..."
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:80
-#: kallithea/templates/changeset/changeset_file_comment.html:199
-msgid "Comment preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:85
-msgid "Submitting ..."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:88
-#: kallithea/templates/changeset/changeset_file_comment.html:205
+#: kallithea/templates/changeset/changeset_file_comment.html:190
 msgid "Comment"
 msgstr ""
 
+#: kallithea/templates/changeset/changeset_file_comment.html:82
+#: kallithea/templates/changeset/changeset_file_comment.html:191
+msgid "Preview"
+msgstr ""
+
 #: kallithea/templates/changeset/changeset_file_comment.html:90
-#: kallithea/templates/changeset/changeset_file_comment.html:206
-msgid "Preview"
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:98
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:98
+#: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "Login now"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:102
+#: kallithea/templates/changeset/changeset_file_comment.html:94
 msgid "Hide"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:114
+#: kallithea/templates/changeset/changeset_file_comment.html:106
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:115
+#: kallithea/templates/changeset/changeset_file_comment.html:107
 #, fuzzy, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
 msgstr[0] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:116
+#: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
 msgstr[0] ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:165
-msgid "Use @username inside this text to send notification to another local user."
-msgstr ""
-
-#: kallithea/templates/changeset/changeset_file_comment.html:172
+#: kallithea/templates/changeset/changeset_file_comment.html:150
+msgid "Use @username inside this text to notify another user."
+msgstr ""
+
+#: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
 msgstr ""
 
-#: kallithea/templates/changeset/changeset_file_comment.html:174
+#: kallithea/templates/changeset/changeset_file_comment.html:159
 #, fuzzy
 msgid "Set changeset status"
 msgstr "尚未有任何變更"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:178
+#: kallithea/templates/changeset/changeset_file_comment.html:163
 #, fuzzy
 msgid "No change"
 msgstr "沒有修改"
 
-#: kallithea/templates/changeset/changeset_file_comment.html:191
+#: kallithea/templates/changeset/changeset_file_comment.html:176
 msgid "Close"
 msgstr ""
 
@@ -4945,7 +5082,7 @@
 msgstr ""
 
 #: kallithea/templates/changeset/diff_block.html:24
-#: kallithea/templates/changeset/diff_block.html:99
+#: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
 msgstr ""
@@ -4954,12 +5091,12 @@
 msgid "Show inline comments"
 msgstr ""
 
-#: kallithea/templates/changeset/diff_block.html:87
+#: kallithea/templates/changeset/diff_block.html:86
 #, fuzzy
 msgid "Deleted"
 msgstr "刪除"
 
-#: kallithea/templates/changeset/diff_block.html:90
+#: kallithea/templates/changeset/diff_block.html:89
 #, fuzzy
 msgid "Renamed"
 msgstr "讀"
@@ -4972,29 +5109,41 @@
 msgid "Ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:61
+#: kallithea/templates/compare/compare_cs.html:44
+msgid "First (oldest) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:46
+msgid "Last (most recent) changeset in this list"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:48
+msgid "Position in this list of changesets"
+msgstr ""
+
+#: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:71
-#: kallithea/templates/pullrequests/pullrequest_show.html:299
+#: kallithea/templates/compare/compare_cs.html:86
+#: kallithea/templates/pullrequests/pullrequest_show.html:306
 msgid "Common ancestor"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:75
+#: kallithea/templates/compare/compare_cs.html:90
 msgid "No common ancestor found - repositories are unrelated"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:83
+#: kallithea/templates/compare/compare_cs.html:98
 msgid "is"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:84
+#: kallithea/templates/compare/compare_cs.html:99
 #, fuzzy, python-format
 msgid "%s changesets"
 msgstr ""
 
-#: kallithea/templates/compare/compare_cs.html:85
+#: kallithea/templates/compare/compare_cs.html:100
 #, fuzzy
 msgid "behind"
 msgstr "重新索引"
@@ -5019,55 +5168,42 @@
 msgstr ""
 
 #: kallithea/templates/compare/compare_diff.html:47
-#: kallithea/templates/pullrequests/pullrequest_show.html:294
+#: kallithea/templates/pullrequests/pullrequest_show.html:301
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
 msgstr[0] ""
 
-#: kallithea/templates/compare/compare_diff.html:65
-#: kallithea/templates/pullrequests/pullrequest_show.html:315
-msgid "No files"
-msgstr ""
-
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:67
-msgid "Mercurial repository"
-msgstr "Mercurial 版本庫"
-
-#: kallithea/templates/data_table/_dt_elements.html:69
-msgid "Git repository"
-msgstr "Git 版本庫"
-
-#: kallithea/templates/data_table/_dt_elements.html:76
+#: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
 msgstr "公開的版本庫"
 
-#: kallithea/templates/data_table/_dt_elements.html:86
+#: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
 msgstr ""
 
-#: kallithea/templates/data_table/_dt_elements.html:100
+#: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
 msgstr "尚未有任何變更"
 
+#: kallithea/templates/data_table/_dt_elements.html:105
 #: kallithea/templates/data_table/_dt_elements.html:107
-#: kallithea/templates/data_table/_dt_elements.html:109
 #, python-format
 msgid "Subscribe to %s rss feed"
 msgstr "訂閱 %s rss"
 
+#: kallithea/templates/data_table/_dt_elements.html:113
 #: kallithea/templates/data_table/_dt_elements.html:115
-#: kallithea/templates/data_table/_dt_elements.html:117
 #, python-format
 msgid "Subscribe to %s atom feed"
 msgstr "訂閱 %s atom"
 
-#: kallithea/templates/data_table/_dt_elements.html:141
+#: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
 msgstr ""
 
@@ -5193,10 +5329,6 @@
 msgid "Commit Changes"
 msgstr "遞交修改"
 
-#: kallithea/templates/files/files_browser.html:32
-msgid "revision"
-msgstr ""
-
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
 msgstr ""
@@ -5222,19 +5354,15 @@
 msgstr "大小"
 
 #: kallithea/templates/files/files_browser.html:62
-msgid "Mimetype"
+msgid "Last Revision"
 msgstr ""
 
 #: kallithea/templates/files/files_browser.html:63
-msgid "Last Revision"
-msgstr ""
-
-#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Modified"
 msgstr "最後修改"
 
-#: kallithea/templates/files/files_browser.html:65
+#: kallithea/templates/files/files_browser.html:64
 #, fuzzy
 msgid "Last Committer"
 msgstr "最後的遞交者"
@@ -5346,8 +5474,8 @@
 msgstr ""
 
 #: kallithea/templates/followers/followers.html:9
-#: kallithea/templates/summary/summary.html:145
-#: kallithea/templates/summary/summary.html:146
+#: kallithea/templates/summary/summary.html:142
+#: kallithea/templates/summary/summary.html:143
 msgid "Followers"
 msgstr "追蹤者"
 
@@ -5398,8 +5526,8 @@
 msgstr ""
 
 #: kallithea/templates/forks/forks.html:9
-#: kallithea/templates/summary/summary.html:151
-#: kallithea/templates/summary/summary.html:152
+#: kallithea/templates/summary/summary.html:148
+#: kallithea/templates/summary/summary.html:149
 msgid "Forks"
 msgstr ""
 
@@ -5407,7 +5535,7 @@
 msgid "Forked"
 msgstr ""
 
-#: kallithea/templates/forks/forks_data.html:43
+#: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
 msgstr "尚未有任何 fork"
 
@@ -5420,19 +5548,13 @@
 msgstr ""
 
 #: kallithea/templates/journal/journal.html:56
-#, fuzzy
-msgid "My Repos"
-msgstr "空的版本庫"
-
-#: kallithea/templates/journal/journal_data.html:61
+msgid "My Repositories"
+msgstr ""
+
+#: kallithea/templates/journal/journal_data.html:43
 msgid "No entries yet"
 msgstr ""
 
-#: kallithea/templates/journal/public_journal.html:4
-#: kallithea/templates/journal/public_journal.html:21
-msgid "Public Journal"
-msgstr "開放日誌"
-
 #: kallithea/templates/journal/public_journal.html:13
 msgid "ATOM public journal feed"
 msgstr ""
@@ -5474,20 +5596,16 @@
 msgid "Destination repository"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest.html:97
-#: kallithea/templates/pullrequests/pullrequest_show.html:210
-msgid "Pull Request Reviewers"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest.html:107
-#: kallithea/templates/pullrequests/pullrequest_show.html:239
-msgid "Type name of reviewer to add"
-msgstr ""
-
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
 msgid "No entries"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:14
+#, fuzzy
+#| msgid "Remote"
+msgid "Vote"
+msgstr "遠端"
+
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
 msgstr ""
@@ -5496,50 +5614,48 @@
 msgid "To"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:27
-#, python-format
-msgid "Latest vote: %s"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:29
-msgid "Nobody voted"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:34
+#: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:36
+#: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:45
-msgid "Delete Pull Request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:46
-msgid "Confirm to delete this pull request"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_data.html:54
+#: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_data.html:56
+#: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
 #: kallithea/templates/pullrequests/pullrequest_show.html:83
 msgid "Closed"
 msgstr ""
 
+#: kallithea/templates/pullrequests/pullrequest_data.html:67
+msgid "Delete Pull Request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:68
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_data.html:70
+#, fuzzy, python-format
+#| msgid "Confirm to delete this group: %s with %s repository"
+#| msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgid "Confirm again to delete this pull request with %s comments"
+msgstr ""
+
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
 #, python-format
-msgid "%s Pull Request #%s"
+msgid "%s Pull Request %s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
 #, python-format
-msgid "Pull request #%s from %s#%s"
+msgid "Pull request %s from %s#%s"
 msgstr ""
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
@@ -5556,91 +5672,91 @@
 msgid "Pull request status calculated from votes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:94
+#: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:98
+#: kallithea/templates/pullrequests/pullrequest_show.html:97
 #, python-format
 msgid "%d reviewer"
 msgid_plural "%d reviewers"
 msgstr[0] ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:100
+#: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:102
+#: kallithea/templates/pullrequests/pullrequest_show.html:101
 #, fuzzy
 msgid "There are no reviewers"
 msgstr "沒有任何分支"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:108
+#: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:114
+#: kallithea/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy
 msgid "on"
 msgstr "無"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:121
+#: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:132
+#: kallithea/templates/pullrequests/pullrequest_show.html:131
 msgid "Pull changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:155
+#: kallithea/templates/pullrequests/pullrequest_show.html:154
 msgid "Created by"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:170
+#: kallithea/templates/pullrequests/pullrequest_show.html:169
 #, fuzzy
 msgid "Update"
 msgstr "時間"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:188
+#: kallithea/templates/pullrequests/pullrequest_show.html:187
 msgid "Current revision - no change"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "owner"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:224
-msgid "reviewer"
-msgstr ""
-
-#: kallithea/templates/pullrequests/pullrequest_show.html:227
+#: kallithea/templates/pullrequests/pullrequest_show.html:209
+msgid "Pull Request Reviewers"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:234
 #, fuzzy
 msgid "Remove reviewer"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:247
+#: kallithea/templates/pullrequests/pullrequest_show.html:246
+msgid "Type name of reviewer to add"
+msgstr ""
+
+#: kallithea/templates/pullrequests/pullrequest_show.html:254
 #, fuzzy
 msgid "Potential Reviewers"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:250
+#: kallithea/templates/pullrequests/pullrequest_show.html:257
 msgid "Click to add the repository owner as reviewer:"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:273
+#: kallithea/templates/pullrequests/pullrequest_show.html:280
 msgid "Save Changes"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:274
+#: kallithea/templates/pullrequests/pullrequest_show.html:281
 msgid "Save as New Pull Request"
 msgstr ""
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:275
+#: kallithea/templates/pullrequests/pullrequest_show.html:282
 #, fuzzy
 msgid "Cancel Changes"
 msgstr "沒有修改"
 
-#: kallithea/templates/pullrequests/pullrequest_show.html:285
+#: kallithea/templates/pullrequests/pullrequest_show.html:292
 #, fuzzy
 msgid "Pull Request Content"
 msgstr "文件內容"
@@ -5743,8 +5859,8 @@
 msgstr ""
 
 #: kallithea/templates/summary/statistics.html:36
-#: kallithea/templates/summary/summary.html:103
-#: kallithea/templates/summary/summary.html:119
+#: kallithea/templates/summary/summary.html:100
+#: kallithea/templates/summary/summary.html:116
 msgid "Enable"
 msgstr ""
 
@@ -5752,45 +5868,45 @@
 msgid "Stats gathered: "
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:88
-#: kallithea/templates/summary/summary.html:352
+#: kallithea/templates/summary/statistics.html:89
+#: kallithea/templates/summary/summary.html:349
 msgid "files"
 msgstr "檔案"
 
-#: kallithea/templates/summary/statistics.html:112
-#: kallithea/templates/summary/summary.html:376
+#: kallithea/templates/summary/statistics.html:113
+#: kallithea/templates/summary/summary.html:373
 msgid "Show more"
 msgstr ""
 
-#: kallithea/templates/summary/statistics.html:389
+#: kallithea/templates/summary/statistics.html:390
 msgid "commits"
 msgstr "遞交"
 
-#: kallithea/templates/summary/statistics.html:390
-msgid "files added"
-msgstr "多個檔案新增"
-
 #: kallithea/templates/summary/statistics.html:391
-msgid "files changed"
-msgstr "多個檔案修改"
+msgid "files added"
+msgstr "多個檔案新增"
 
 #: kallithea/templates/summary/statistics.html:392
+msgid "files changed"
+msgstr "多個檔案修改"
+
+#: kallithea/templates/summary/statistics.html:393
 msgid "files removed"
 msgstr "移除多個檔案"
 
-#: kallithea/templates/summary/statistics.html:394
+#: kallithea/templates/summary/statistics.html:395
 msgid "commit"
 msgstr "遞交"
 
-#: kallithea/templates/summary/statistics.html:395
+#: kallithea/templates/summary/statistics.html:396
 msgid "file added"
 msgstr "檔案新增"
 
-#: kallithea/templates/summary/statistics.html:396
+#: kallithea/templates/summary/statistics.html:397
 msgid "file changed"
 msgstr "檔案修改"
 
-#: kallithea/templates/summary/statistics.html:397
+#: kallithea/templates/summary/statistics.html:398
 msgid "file removed"
 msgstr "移除檔案"
 
@@ -5812,67 +5928,76 @@
 msgid "Fork of"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:77
-msgid "Show by Name"
-msgstr ""
+#: kallithea/templates/summary/summary.html:29
+msgid "Clone from"
+msgstr "複製由"
+
+#: kallithea/templates/summary/summary.html:72
+#, fuzzy
+msgid "Clone URL"
+msgstr "複製連結"
 
 #: kallithea/templates/summary/summary.html:78
+msgid "Show by Name"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:79
 msgid "Show by ID"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:95
+#: kallithea/templates/summary/summary.html:92
 msgid "Trending files"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:111
+#: kallithea/templates/summary/summary.html:108
 msgid "Download"
 msgstr "下載"
 
-#: kallithea/templates/summary/summary.html:115
+#: kallithea/templates/summary/summary.html:112
 msgid "There are no downloads yet"
 msgstr "沒有任何下載"
 
-#: kallithea/templates/summary/summary.html:117
+#: kallithea/templates/summary/summary.html:114
 msgid "Downloads are disabled for this repository"
 msgstr "這個版本庫的下載已停用"
 
-#: kallithea/templates/summary/summary.html:123
+#: kallithea/templates/summary/summary.html:120
 msgid "Download as zip"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
+#: kallithea/templates/summary/summary.html:125
 msgid "Check this to download archive with subrepos"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:128
-msgid "with subrepos"
-msgstr ""
-
-#: kallithea/templates/summary/summary.html:159
+#: kallithea/templates/summary/summary.html:125
+msgid "With subrepos"
+msgstr ""
+
+#: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:166
-#: kallithea/templates/summary/summary.html:168
+#: kallithea/templates/summary/summary.html:163
+#: kallithea/templates/summary/summary.html:165
 msgid "Feed"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:189
+#: kallithea/templates/summary/summary.html:186
 #, fuzzy
 msgid "Latest Changes"
 msgstr "多個檔案修改"
 
-#: kallithea/templates/summary/summary.html:191
+#: kallithea/templates/summary/summary.html:188
 #, fuzzy
 msgid "Quick Start"
 msgstr "快速過濾..."
 
-#: kallithea/templates/summary/summary.html:205
+#: kallithea/templates/summary/summary.html:202
 #, python-format
 msgid "Readme file from revision %s:%s"
 msgstr ""
 
-#: kallithea/templates/summary/summary.html:296
+#: kallithea/templates/summary/summary.html:293
 #, python-format
 msgid "Download %s as %s"
 msgstr "下載 %s 為 %s"
@@ -5886,3 +6011,400 @@
 msgid "Compare Tags"
 msgstr ""
 
+#~ msgid "No comments."
+#~ msgstr ""
+
+#~ msgid "public journal"
+#~ msgstr ""
+
+#~ msgid "journal"
+#~ msgstr "日誌"
+
+#~ msgid "bad captcha"
+#~ msgstr ""
+
+#~ msgid "forever"
+#~ msgstr ""
+
+#~ msgid "unmodified"
+#~ msgstr ""
+
+#~ msgid "Cannot delete %s it still contains attached forks"
+#~ msgstr ""
+
+#~ msgid "Locked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked repository"
+#~ msgstr ""
+
+#~ msgid "Unlocked"
+#~ msgstr ""
+
+#~ msgid "Locked"
+#~ msgstr ""
+
+#~ msgid "Repository has been %s"
+#~ msgstr ""
+
+#~ msgid "You can't edit this user"
+#~ msgstr "您無法編輯這位使用者"
+
+#~ msgid "compare view"
+#~ msgstr ""
+
+#~ msgid "fork name %s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s"
+#~ msgstr ""
+
+#~ msgid "No Files"
+#~ msgstr "沒有檔案"
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s changeset "
+#~ "%(short_id)s on %(branch)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Review request on %(repo_name)s pull "
+#~ "request #%(pr_id)s from %(ref)s by "
+#~ "%(pr_username)s"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comment on %(repo_name)s pull request "
+#~ "#%(pr_id)s from %(ref)s by "
+#~ "%(comment_username)s"
+#~ msgstr ""
+
+#~ msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+#~ msgstr ""
+
+#~ msgid "Username \"%(username)s\" is forbidden"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Username may only contain alphanumeric "
+#~ "characters underscores, periods or dashes "
+#~ "and must begin with alphanumeric "
+#~ "character or underscore"
+#~ msgstr ""
+
+#~ msgid "invalid user name"
+#~ msgstr "無效的使用者名稱"
+
+#~ msgid "Your account is disabled"
+#~ msgstr "您的帳號已被停用"
+
+#~ msgid "Repository name %(repo)s is disallowed"
+#~ msgstr ""
+
+#~ msgid "invalid clone URL"
+#~ msgstr "無效的複製URL"
+
+#~ msgid "Invalid clone URL, provide a valid clone http(s)/svn+http(s)/ssh URL"
+#~ msgstr ""
+
+#~ msgid "email \"%(email)s\" does not exist."
+#~ msgstr ""
+
+#~ msgid "Revisions %(revs)s are already part of pull request or have set status"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Comma separated list of plugins. Order"
+#~ " of plugins is also order in "
+#~ "which Kallithea will try to authenticate"
+#~ " user"
+#~ msgstr ""
+
+#~ msgid "Defaults"
+#~ msgstr ""
+
+#~ msgid "never"
+#~ msgstr ""
+
+#~ msgid "My Emails"
+#~ msgstr ""
+
+#~ msgid "Watched"
+#~ msgstr ""
+
+#~ msgid "My Permissions"
+#~ msgstr "權限"
+
+#~ msgid "expires"
+#~ msgstr ""
+
+#~ msgid "Confirm to reset this api key: %s"
+#~ msgstr ""
+
+#~ msgid "reset"
+#~ msgstr ""
+
+#~ msgid "expired"
+#~ msgstr ""
+
+#~ msgid "Confirm to remove this api key: %s"
+#~ msgstr ""
+
+#~ msgid "remove"
+#~ msgstr ""
+
+#~ msgid "No additional api keys specified"
+#~ msgstr ""
+
+#~ msgid "New api key"
+#~ msgstr ""
+
+#~ msgid "current IP"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Your user is in an external source"
+#~ " of record; some details cannot be"
+#~ " managed here"
+#~ msgstr ""
+
+#~ msgid "Permissions Administration"
+#~ msgstr "權限管理員"
+
+#~ msgid "Overview"
+#~ msgstr ""
+
+#~ msgid "Overwrite existing settings"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "All default permissions on each user "
+#~ "group will be reset to chosen "
+#~ "permission, note that all custom default"
+#~ " permission on repository groups will "
+#~ "be lost"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Write permission to a repository group"
+#~ " allows creating repositories inside that"
+#~ " group."
+#~ msgstr ""
+
+#~ msgid "Default IP Whitelist for All Users"
+#~ msgstr ""
+
+#~ msgid "Confirm to delete this ip: %s"
+#~ msgstr ""
+
+#~ msgid "Default User Permissions Overview"
+#~ msgstr "預設權限"
+
+#~ msgid "none"
+#~ msgstr "無"
+
+#~ msgid "read"
+#~ msgstr "讀"
+
+#~ msgid "write"
+#~ msgstr "寫"
+
+#~ msgid "admin"
+#~ msgstr "管理員"
+
+#~ msgid "user/user group"
+#~ msgstr ""
+
+#~ msgid "default"
+#~ msgstr ""
+
+#~ msgid "revoke"
+#~ msgstr ""
+
+#~ msgid "delegated admin"
+#~ msgstr ""
+
+#~ msgid "apply to children"
+#~ msgstr ""
+
+#~ msgid "Import existing repository ?"
+#~ msgstr ""
+
+#~ msgid "Optional URL from which repository should be cloned."
+#~ msgstr ""
+
+#~ msgid "Remote URL"
+#~ msgstr "複製連結"
+
+#~ msgid "Pull Changes from Remote Location"
+#~ msgstr ""
+
+#~ msgid "Confirm to pull changes from remote side."
+#~ msgstr ""
+
+#~ msgid "This repository does not have a remote URL set."
+#~ msgstr ""
+
+#~ msgid "Non-changeable id"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "In case this repository is renamed "
+#~ "or moved into another group the "
+#~ "repository URL changes.\n"
+#~ "                               Using the above "
+#~ "URL guarantees that this repository will"
+#~ " always be accessible under such URL."
+#~ "\n"
+#~ "                               Useful for CI "
+#~ "systems, or any other cases that "
+#~ "you need to hardcode the URL into"
+#~ " 3rd party service."
+#~ msgstr ""
+
+#~ msgid "edit"
+#~ msgstr "編輯"
+
+#~ msgid "new value"
+#~ msgstr ""
+
+#~ msgid "URL used for doing remote pulls."
+#~ msgstr ""
+
+#~ msgid "Email prefix"
+#~ msgstr ""
+
+#~ msgid "Kallithea email from"
+#~ msgstr ""
+
+#~ msgid "Error email from"
+#~ msgstr ""
+
+#~ msgid "Error email recipients"
+#~ msgstr ""
+
+#~ msgid "SMTP server"
+#~ msgstr ""
+
+#~ msgid "SMTP username"
+#~ msgstr ""
+
+#~ msgid "SMTP password"
+#~ msgstr ""
+
+#~ msgid "SMTP port"
+#~ msgstr ""
+
+#~ msgid "SMTP use TLS"
+#~ msgstr ""
+
+#~ msgid "SMTP use SSL"
+#~ msgstr ""
+
+#~ msgid "SMTP auth"
+#~ msgstr ""
+
+#~ msgid "Destroy old data"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Check this option to remove references"
+#~ " to repositories that no longer exist"
+#~ " in on the filesystem."
+#~ msgstr ""
+
+#~ msgid "check for updates"
+#~ msgstr ""
+
+#~ msgid "Meta-Tagging"
+#~ msgstr ""
+
+#~ msgid "Default permissions"
+#~ msgstr "預設權限"
+
+#~ msgid "user groups"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "This user is in an external source"
+#~ " of record (%s); some details cannot"
+#~ " be managed here."
+#~ msgstr ""
+
+#~ msgid "Inherit from defaults"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Select to inherit permissions from %s"
+#~ " permissions settings, and default IP "
+#~ "address whitelist."
+#~ msgstr ""
+
+#~ msgid "show"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Changeset status: %s\n"
+#~ "Click to open associated pull request #%s"
+#~ msgstr ""
+
+#~ msgid "Push new repo"
+#~ msgstr ""
+
+#~ msgid "parent rev."
+#~ msgstr ""
+
+#~ msgid "child rev."
+#~ msgstr ""
+
+#~ msgid "no revisions"
+#~ msgstr ""
+
+#~ msgid "Status change from pull request"
+#~ msgstr ""
+
+#~ msgid "Comment from pull request"
+#~ msgstr ""
+
+#~ msgid "Status change on changeset"
+#~ msgstr ""
+
+#~ msgid "Comment on changeset"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Use @username inside this text to "
+#~ "send notification to another local user."
+#~ msgstr ""
+
+#~ msgid "revision"
+#~ msgstr ""
+
+#~ msgid "Mimetype"
+#~ msgstr ""
+
+#~ msgid "My Repos"
+#~ msgstr "空的版本庫"
+
+#~ msgid "Latest vote: %s"
+#~ msgstr ""
+
+#~ msgid "Nobody voted"
+#~ msgstr ""
+
+#~ msgid "%s Pull Request #%s"
+#~ msgstr ""
+
+#~ msgid "Pull request #%s from %s#%s"
+#~ msgstr ""
+
+#~ msgid "owner"
+#~ msgstr ""
+
+#~ msgid "reviewer"
+#~ msgstr ""
+
+#~ msgid "with subrepos"
+#~ msgstr ""
+
--- a/kallithea/lib/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -45,7 +45,7 @@
         wk_dir = repo.workdir
         cur_rev = wk_dir.get_changeset()
         return (cur_rev.revision, cur_rev.short_id)
-    except Exception, err:
+    except Exception as err:
         if not quiet:
             print ("WARNING: Cannot retrieve kallithea's revision. "
                    "disregard this if you don't know what that means. "
--- a/kallithea/lib/auth.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/auth.py	Sun Sep 06 23:36:05 2015 +0200
@@ -24,7 +24,6 @@
 :copyright: (c) 2013 RhodeCode GmbH, and others.
 :license: GPLv3, see LICENSE.md for more details.
 """
-from __future__ import with_statement
 import time
 import os
 import logging
@@ -33,7 +32,6 @@
 import itertools
 import collections
 
-from tempfile import _RandomNameSequence
 from decorator import decorator
 
 from pylons import url, request
@@ -101,13 +99,12 @@
     def hash_string(cls, str_):
         """
         Cryptographic function used for password hashing based on pybcrypt
-        or pycrypto in windows
+        or Python's own OpenSSL wrapper on windows
 
         :param password: password to hash
         """
         if is_windows:
-            from hashlib import sha256
-            return sha256(str_).hexdigest()
+            return hashlib.sha256(str_).hexdigest()
         elif is_unix:
             import bcrypt
             return bcrypt.hashpw(str_, bcrypt.gensalt(10))
@@ -126,8 +123,7 @@
         """
 
         if is_windows:
-            from hashlib import sha256
-            return sha256(password).hexdigest() == hashed
+            return hashlib.sha256(password).hexdigest() == hashed
         elif is_unix:
             import bcrypt
             return bcrypt.hashpw(password, hashed) == hashed
@@ -144,21 +140,6 @@
     return KallitheaCrypto.hash_check(password, hashed)
 
 
-class CookieStoreWrapper(object):
-
-    def __init__(self, cookie_store):
-        self.cookie_store = cookie_store
-
-    def __repr__(self):
-        return 'CookieStore<%s>' % (self.cookie_store)
-
-    def get(self, key, other=None):
-        if isinstance(self.cookie_store, dict):
-            return self.cookie_store.get(key, other)
-        elif isinstance(self.cookie_store, AuthUser):
-            return self.cookie_store.__dict__.get(key, other)
-
-
 
 def _cached_perms_data(user_id, user_is_admin, user_inherit_default_permissions,
                        explicit, algo):
@@ -193,8 +174,8 @@
 
     if user_is_admin:
         #==================================================================
-        # admin user have all default rights for repositories
-        # and groups set to admin
+        # admin users have all rights;
+        # based on default permissions, just set everything to admin
         #==================================================================
         permissions[GLOBAL].add('hg.admin')
         permissions[GLOBAL].add('hg.create.write_on_repogroup.true')
@@ -221,7 +202,6 @@
     #==================================================================
     # SET DEFAULTS GLOBAL, REPOS, REPOSITORY GROUPS
     #==================================================================
-    uid = user_id
 
     # default global permissions taken from the default user
     default_global_perms = UserToPerm.query()\
@@ -234,10 +214,10 @@
     # defaults for repositories, taken from default user
     for perm in default_repo_perms:
         r_k = perm.UserRepoToPerm.repository.repo_name
-        if perm.Repository.private and not (perm.Repository.user_id == uid):
+        if perm.Repository.private and not (perm.Repository.user_id == user_id):
             # disable defaults for private repos,
             p = 'repository.none'
-        elif perm.Repository.user_id == uid:
+        elif perm.Repository.user_id == user_id:
             # set admin if owner
             p = 'repository.admin'
         else:
@@ -275,7 +255,7 @@
         .options(joinedload(UserGroupToPerm.permission))\
         .join((UserGroupMember, UserGroupToPerm.users_group_id ==
                UserGroupMember.users_group_id))\
-        .filter(UserGroupMember.user_id == uid)\
+        .filter(UserGroupMember.user_id == user_id)\
         .join((UserGroup, UserGroupMember.users_group_id ==
                UserGroup.users_group_id))\
         .filter(UserGroup.users_group_active == True)\
@@ -301,7 +281,7 @@
     # user specific global permissions
     user_perms = Session().query(UserToPerm)\
             .options(joinedload(UserToPerm.permission))\
-            .filter(UserToPerm.user_id == uid).all()
+            .filter(UserToPerm.user_id == user_id).all()
 
     if not user_inherit_default_permissions:
         # NEED TO IGNORE all configurable permissions and
@@ -334,7 +314,7 @@
         .filter(UserGroup.users_group_active == True)\
         .join((UserGroupMember, UserGroupRepoToPerm.users_group_id ==
                UserGroupMember.users_group_id))\
-        .filter(UserGroupMember.user_id == uid)\
+        .filter(UserGroupMember.user_id == user_id)\
         .all()
 
     multiple_counter = collections.defaultdict(int)
@@ -344,7 +324,7 @@
         p = perm.Permission.permission_name
         cur_perm = permissions[RK][r_k]
 
-        if perm.Repository.user_id == uid:
+        if perm.Repository.user_id == user_id:
             # set admin if owner
             p = 'repository.admin'
         else:
@@ -354,12 +334,12 @@
 
     # user explicit permissions for repositories, overrides any specified
     # by the group permission
-    user_repo_perms = Permission.get_default_perms(uid)
+    user_repo_perms = Permission.get_default_perms(user_id)
     for perm in user_repo_perms:
         r_k = perm.UserRepoToPerm.repository.repo_name
         cur_perm = permissions[RK][r_k]
         # set admin if owner
-        if perm.Repository.user_id == uid:
+        if perm.Repository.user_id == user_id:
             p = 'repository.admin'
         else:
             p = perm.Permission.permission_name
@@ -386,7 +366,7 @@
      .filter(UserGroup.users_group_active == True)\
      .join((UserGroupMember, UserGroupRepoGroupToPerm.users_group_id
             == UserGroupMember.users_group_id))\
-     .filter(UserGroupMember.user_id == uid)\
+     .filter(UserGroupMember.user_id == user_id)\
      .all()
 
     multiple_counter = collections.defaultdict(int)
@@ -400,7 +380,7 @@
         permissions[GK][g_k] = p
 
     # user explicit permissions for repository groups
-    user_repo_groups_perms = Permission.get_default_group_perms(uid)
+    user_repo_groups_perms = Permission.get_default_group_perms(user_id)
     for perm in user_repo_groups_perms:
         rg_k = perm.UserRepoGroupToPerm.group.group_name
         p = perm.Permission.permission_name
@@ -421,7 +401,7 @@
             == Permission.permission_id))\
      .join((UserGroupMember, UserGroupUserGroupToPerm.user_group_id
             == UserGroupMember.users_group_id))\
-     .filter(UserGroupMember.user_id == uid)\
+     .filter(UserGroupMember.user_id == user_id)\
      .join((UserGroup, UserGroupMember.users_group_id ==
             UserGroup.users_group_id), aliased=True, from_joinpoint=True)\
      .filter(UserGroup.users_group_active == True)\
@@ -438,7 +418,7 @@
         permissions[UK][g_k] = p
 
     #user explicit permission for user groups
-    user_user_groups_perms = Permission.get_default_user_group_perms(uid)
+    user_user_groups_perms = Permission.get_default_user_group_perms(user_id)
     for perm in user_user_groups_perms:
         u_k = perm.UserUserGroupToPerm.user_group.users_group_name
         p = perm.Permission.permission_name
@@ -458,10 +438,10 @@
         from kallithea import CONFIG
         whitelist = aslist(CONFIG.get('api_access_controllers_whitelist'),
                            sep=',')
-        log.debug('whitelist of API access is: %s' % (whitelist))
+        log.debug('whitelist of API access is: %s', whitelist)
     api_access_valid = controller_name in whitelist
     if api_access_valid:
-        log.debug('controller:%s is in API whitelist' % (controller_name))
+        log.debug('controller:%s is in API whitelist', controller_name)
     else:
         msg = 'controller: %s is *NOT* in API whitelist' % (controller_name)
         if api_key:
@@ -474,84 +454,100 @@
 
 class AuthUser(object):
     """
-    A simple object that handles all attributes of user in Kallithea
+    Represents a Kallithea user, including various authentication and
+    authorization information. Typically used to store the current user,
+    but is also used as a generic user information data structure in
+    parts of the code, e.g. user management.
 
-    It does lookup based on API key,given user, or user present in session
-    Then it fills all required information for such user. It also checks if
-    anonymous access is enabled and if so, it returns default user as logged in
+    Constructed from a database `User` object, a user ID or cookie dict,
+    it looks up the user (if needed) and copies all attributes to itself,
+    adding various non-persistent data. If lookup fails but anonymous
+    access to Kallithea is enabled, the default user is loaded instead.
+
+    `AuthUser` does not by itself authenticate users and the constructor
+    sets the `is_authenticated` field to False, except when falling back
+    to the default anonymous user (if enabled). It's up to other parts
+    of the code to check e.g. if a supplied password is correct, and if
+    so, set `is_authenticated` to True.
+
+    However, `AuthUser` does refuse to load a user that is not `active`.
     """
 
-    def __init__(self, user_id=None, api_key=None, username=None, ip_addr=None):
+    def __init__(self, user_id=None, dbuser=None,
+            is_external_auth=False):
+
+        self.is_authenticated = False
+        self.is_external_auth = is_external_auth
 
-        self.user_id = user_id
-        self._api_key = api_key
+        user_model = UserModel()
+        self.anonymous_user = User.get_default_user(cache=True)
 
+        # These attributes will be overriden by fill_data, below, unless the
+        # requested user cannot be found and the default anonymous user is
+        # not enabled.
+        self.user_id = None
+        self.username = None
         self.api_key = None
-        self.username = username
-        self.ip_addr = ip_addr
         self.name = ''
         self.lastname = ''
         self.email = ''
-        self.is_authenticated = False
         self.admin = False
         self.inherit_default_permissions = False
 
-        self.propagate_data()
-        self._instance = None
-
-    @LazyProperty
-    def permissions(self):
-        return self.get_perms(user=self, cache=False)
-
-    @property
-    def api_keys(self):
-        return self.get_api_keys()
-
-    def propagate_data(self):
-        user_model = UserModel()
-        self.anonymous_user = User.get_default_user(cache=True)
-        is_user_loaded = False
-
-        # lookup by userid
-        if self.user_id is not None and self.user_id != self.anonymous_user.user_id:
-            log.debug('Auth User lookup by USER ID %s' % self.user_id)
-            is_user_loaded = user_model.fill_data(self, user_id=self.user_id)
+        # Look up database user, if necessary.
+        if user_id is not None:
+            log.debug('Auth User lookup by USER ID %s', user_id)
+            dbuser = user_model.get(user_id)
+        else:
+            # Note: dbuser is allowed to be None.
+            log.debug('Auth User lookup by database user %s', dbuser)
 
-        # try go get user by api key
-        elif self._api_key and self._api_key != self.anonymous_user.api_key:
-            log.debug('Auth User lookup by API KEY %s' % self._api_key)
-            is_user_loaded = user_model.fill_data(self, api_key=self._api_key)
+        is_user_loaded = self._fill_data(dbuser)
 
-        # lookup by username
-        elif self.username:
-            log.debug('Auth User lookup by USER NAME %s' % self.username)
-            is_user_loaded = user_model.fill_data(self, username=self.username)
-        else:
-            log.debug('No data in %s that could been used to log in' % self)
-
+        # If user cannot be found, try falling back to anonymous.
         if not is_user_loaded:
-            # if we cannot authenticate user try anonymous
-            if self.anonymous_user.active:
-                user_model.fill_data(self, user_id=self.anonymous_user.user_id)
-                # then we set this user is logged in
-                self.is_authenticated = True
-            else:
-                self.user_id = None
-                self.username = None
-                self.is_authenticated = False
+            is_user_loaded =  self._fill_data(self.anonymous_user)
+
+        # The anonymous user is always "logged in".
+        if self.user_id == self.anonymous_user.user_id:
+            self.is_authenticated = True
 
         if not self.username:
             self.username = 'None'
 
-        log.debug('Auth User is now %s' % self)
+        log.debug('Auth User is now %s', self)
+
+    def _fill_data(self, dbuser):
+        """
+        Copies database fields from a `db.User` to this `AuthUser`. Does
+        not copy `api_keys` and `permissions` attributes.
 
-    def get_perms(self, user, explicit=True, algo='higherwin', cache=False):
+        Checks that `dbuser` is `active` (and not None) before copying;
+        returns True on success.
+        """
+        if dbuser is not None and dbuser.active:
+            log.debug('filling %s data', dbuser)
+            for k, v in dbuser.get_dict().iteritems():
+                assert k not in ['api_keys', 'permissions']
+                setattr(self, k, v)
+            return True
+        return False
+
+    @LazyProperty
+    def permissions(self):
+        return self.__get_perms(user=self, cache=False)
+
+    @property
+    def api_keys(self):
+        return self._get_api_keys()
+
+    def __get_perms(self, user, explicit=True, algo='higherwin', cache=False):
         """
         Fills user permission attribute with permissions taken from database
         works for permissions given for repositories, and for permissions that
         are granted to groups
 
-        :param user: instance of User object from database
+        :param user: `AuthUser` instance
         :param explicit: In case there are permissions both for user and a group
             that user is part of, explicit flag will define if user will
             explicitly override permissions from group, if it's False it will
@@ -571,7 +567,7 @@
         return compute(user_id, user_is_admin,
                        user_inherit_default_permissions, explicit, algo)
 
-    def get_api_keys(self):
+    def _get_api_keys(self):
         api_keys = [self.api_key]
         for api_key in UserApiKeys.query()\
                 .filter(UserApiKeys.user_id == self.user_id)\
@@ -609,25 +605,16 @@
         return [x[0] for x in self.permissions['user_groups'].iteritems()
                 if x[1] == 'usergroup.admin']
 
-    @property
-    def ip_allowed(self):
-        """
-        Checks if ip_addr used in constructor is allowed from defined list of
-        allowed ip_addresses for user
-
-        :returns: boolean, True if ip is in allowed ip range
+    @staticmethod
+    def check_ip_allowed(user, ip_addr):
         """
-        # check IP
-        inherit = self.inherit_default_permissions
-        return AuthUser.check_ip_allowed(self.user_id, self.ip_addr,
-                                         inherit_from_default=inherit)
-
-    @classmethod
-    def check_ip_allowed(cls, user_id, ip_addr, inherit_from_default):
-        allowed_ips = AuthUser.get_allowed_ips(user_id, cache=True,
-                        inherit_from_default=inherit_from_default)
+        Check if the given IP address (a `str`) is allowed for the given
+        user (an `AuthUser` or `db.User`).
+        """
+        allowed_ips = AuthUser.get_allowed_ips(user.user_id, cache=True,
+            inherit_from_default=user.inherit_default_permissions)
         if check_ip_access(source_ip=ip_addr, allowed_ips=allowed_ips):
-            log.debug('IP:%s is in range of %s' % (ip_addr, allowed_ips))
+            log.debug('IP:%s is in range of %s', ip_addr, allowed_ips)
             return True
         else:
             log.info('Access for IP:%s forbidden, '
@@ -635,30 +622,35 @@
             return False
 
     def __repr__(self):
-        return "<AuthUser('id:%s[%s] ip:%s auth:%s')>"\
-            % (self.user_id, self.username, self.ip_addr, self.is_authenticated)
+        return "<AuthUser('id:%s[%s] auth:%s')>"\
+            % (self.user_id, self.username, self.is_authenticated)
 
     def set_authenticated(self, authenticated=True):
         if self.user_id != self.anonymous_user.user_id:
             self.is_authenticated = authenticated
 
-    def get_cookie_store(self):
-        return {'username': self.username,
-                'user_id': self.user_id,
-                'is_authenticated': self.is_authenticated}
+    def to_cookie(self):
+        """ Serializes this login session to a cookie `dict`. """
+        return {
+            'user_id': self.user_id,
+            'is_authenticated': self.is_authenticated,
+            'is_external_auth': self.is_external_auth,
+        }
 
-    @classmethod
-    def from_cookie_store(cls, cookie_store):
+    @staticmethod
+    def from_cookie(cookie):
         """
-        Creates AuthUser from a cookie store
-
-        :param cls:
-        :param cookie_store:
+        Deserializes an `AuthUser` from a cookie `dict`.
         """
-        user_id = cookie_store.get('user_id')
-        username = cookie_store.get('username')
-        api_key = cookie_store.get('api_key')
-        return AuthUser(user_id, api_key, username)
+
+        au = AuthUser(
+            user_id=cookie.get('user_id'),
+            is_external_auth=cookie.get('is_external_auth', False),
+        )
+        if not au.is_authenticated and au.user_id is not None:
+            # user is not authenticated and not empty
+            au.set_authenticated(cookie.get('is_authenticated'))
+        return au
 
     @classmethod
     def get_allowed_ips(cls, user_id, cache=False, inherit_from_default=False):
@@ -717,6 +709,15 @@
 #==============================================================================
 # CHECK DECORATORS
 #==============================================================================
+
+def redirect_to_login(message=None):
+    from kallithea.lib import helpers as h
+    p = url.current()
+    if message:
+        h.flash(h.literal(message), category='warning')
+    log.debug('Redirecting to login page, origin: %s', p)
+    return redirect(url('login_home', came_from=p, **request.GET))
+
 class LoginRequired(object):
     """
     Must be logged in to execute this function else
@@ -733,61 +734,63 @@
         return decorator(self.__wrapper, func)
 
     def __wrapper(self, func, *fargs, **fkwargs):
-        cls = fargs[0]
-        user = cls.authuser
-        loc = "%s:%s" % (cls.__class__.__name__, func.__name__)
+        controller = fargs[0]
+        user = controller.authuser
+        loc = "%s:%s" % (controller.__class__.__name__, func.__name__)
+        log.debug('Checking access for user %s @ %s', user, loc)
 
-        # check if our IP is allowed
-        ip_access_valid = True
-        if not user.ip_allowed:
-            from kallithea.lib import helpers as h
-            h.flash(h.literal(_('IP %s not allowed' % (user.ip_addr))),
-                    category='warning')
-            ip_access_valid = False
+        if not AuthUser.check_ip_allowed(user, controller.ip_addr):
+            return redirect_to_login(_('IP %s not allowed') % controller.ip_addr)
 
-        # check if we used an APIKEY and it's a valid one
-        # defined whitelist of controllers which API access will be enabled
-        _api_key = request.GET.get('api_key', '')
-        api_access_valid = allowed_api_access(loc, api_key=_api_key)
+        # check if we used an API key and it's a valid one
+        api_key = request.GET.get('api_key')
+        if api_key is not None:
+            # explicit controller is enabled or API is in our whitelist
+            if self.api_access or allowed_api_access(loc, api_key=api_key):
+                if api_key in user.api_keys:
+                    log.info('user %s authenticated with API key ****%s @ %s',
+                             user, api_key[-4:], loc)
+                    return func(*fargs, **fkwargs)
+                else:
+                    log.warning('API key ****%s is NOT valid', api_key[-4:])
+                    return redirect_to_login(_('Invalid API key'))
+            else:
+                # controller does not allow API access
+                log.warning('API access to %s is not allowed', loc)
+                return abort(403)
 
-        # explicit controller is enabled or API is in our whitelist
-        if self.api_access or api_access_valid:
-            log.debug('Checking API KEY access for %s' % cls)
-            if _api_key and _api_key in user.api_keys:
-                api_access_valid = True
-                log.debug('API KEY ****%s is VALID' % _api_key[-4:])
-            else:
-                api_access_valid = False
-                if not _api_key:
-                    log.debug("API KEY *NOT* present in request")
-                else:
-                    log.warning("API KEY ****%s *NOT* valid" % _api_key[-4:])
+        # Only allow the following HTTP request methods. (We sometimes use POST
+        # requests with a '_method' set to 'PUT' or 'DELETE'; but that is only
+        # used for the route lookup, and does not affect request.method.)
+        if request.method not in ['GET', 'HEAD', 'POST', 'PUT']:
+            return abort(405)
 
-        # CSRF protection - POSTs with session auth must contain correct token
-        if request.POST and user.is_authenticated and not api_access_valid:
+        # CSRF protection: Whenever a request has ambient authority (whether
+        # through a session cookie or its origin IP address), it must include
+        # the correct token, unless the HTTP method is GET or HEAD (and thus
+        # guaranteed to be side effect free. In practice, the only situation
+        # where we allow side effects without ambient authority is when the
+        # authority comes from an API key; and that is handled above.
+        if request.method not in ['GET', 'HEAD']:
             token = request.POST.get(secure_form.token_key)
             if not token or token != secure_form.authentication_token():
                 log.error('CSRF check failed')
                 return abort(403)
 
-        log.debug('Checking if %s is authenticated @ %s' % (user.username, loc))
-        reason = 'RegularAuth' if user.is_authenticated else 'APIAuth'
+        # WebOb already ignores request payload parameters for anything other
+        # than POST/PUT, but double-check since other Kallithea code relies on
+        # this assumption.
+        if request.method not in ['POST', 'PUT'] and request.POST:
+            log.error('%r request with payload parameters; WebOb should have stopped this', request.method)
+            return abort(400)
 
-        if ip_access_valid and (user.is_authenticated or api_access_valid):
-            log.info('user %s authenticating with:%s IS authenticated on func %s '
-                     % (user, reason, loc)
-            )
+        # regular user authentication
+        if user.is_authenticated:
+            log.info('user %s authenticated with regular auth @ %s', user, loc)
             return func(*fargs, **fkwargs)
         else:
-            log.warning('user %s authenticating with:%s NOT authenticated on func: %s: '
-                     'IP_ACCESS:%s API_ACCESS:%s'
-                     % (user, reason, loc, ip_access_valid, api_access_valid)
-            )
-            p = url.current()
-
-            log.debug('redirecting to login page with %s' % p)
-            return redirect(url('login_home', came_from=p))
-
+            log.warning('user %s NOT authenticated with regular auth @ %s', user, loc)
+            return redirect_to_login()
 
 class NotAnonymous(object):
     """
@@ -801,18 +804,13 @@
         cls = fargs[0]
         self.user = cls.authuser
 
-        log.debug('Checking if user is not anonymous @%s' % cls)
+        log.debug('Checking if user is not anonymous @%s', cls)
 
         anonymous = self.user.username == User.DEFAULT_USER
 
         if anonymous:
-            p = url.current()
-
-            import kallithea.lib.helpers as h
-            h.flash(_('You need to be a registered user to '
-                      'perform this action'),
-                    category='warning')
-            return redirect(url('login_home', came_from=p))
+            return redirect_to_login(_('You need to be a registered user to '
+                    'perform this action'))
         else:
             return func(*fargs, **fkwargs)
 
@@ -832,25 +830,18 @@
         self.user = cls.authuser
         self.user_perms = self.user.permissions
         log.debug('checking %s permissions %s for %s %s',
-           self.__class__.__name__, self.required_perms, cls, self.user)
+          self.__class__.__name__, self.required_perms, cls, self.user)
 
         if self.check_permissions():
-            log.debug('Permission granted for %s %s' % (cls, self.user))
+            log.debug('Permission granted for %s %s', cls, self.user)
             return func(*fargs, **fkwargs)
 
         else:
-            log.debug('Permission denied for %s %s' % (cls, self.user))
+            log.debug('Permission denied for %s %s', cls, self.user)
             anonymous = self.user.username == User.DEFAULT_USER
 
             if anonymous:
-                p = url.current()
-
-                import kallithea.lib.helpers as h
-                h.flash(_('You need to be signed in to '
-                          'view this page'),
-                        category='warning')
-                return redirect(url('login_home', came_from=p))
-
+                return redirect_to_login(_('You need to be signed in to view this page'))
             else:
                 # redirect with forbidden ret code
                 return abort(403)
@@ -1029,15 +1020,15 @@
             return False
         self.user_perms = user.permissions
         if self.check_permissions():
-            log.debug('Permission to %s granted for user: %s @ %s'
-                      % (check_scope, user,
-                         check_location or 'unspecified location'))
+            log.debug('Permission to %s granted for user: %s @ %s',
+                      check_scope, user,
+                         check_location or 'unspecified location')
             return True
 
         else:
-            log.debug('Permission to %s denied for user: %s @ %s'
-                      % (check_scope, user,
-                         check_location or 'unspecified location'))
+            log.debug('Permission to %s denied for user: %s @ %s',
+                      check_scope, user,
+                         check_location or 'unspecified location')
             return False
 
     def check_permissions(self):
@@ -1189,11 +1180,11 @@
                   'permissions %s for user:%s repository:%s', self.user_perms,
                                                 self.username, self.repo_name)
         if self.required_perms.intersection(self.user_perms):
-            log.debug('Permission to repo: %s granted for user: %s @ %s'
-                      % (self.repo_name, self.username, 'PermissionMiddleware'))
+            log.debug('Permission to repo: %s granted for user: %s @ %s',
+                      self.repo_name, self.username, 'PermissionMiddleware')
             return True
-        log.debug('Permission to repo: %s denied for user: %s @ %s'
-                  % (self.repo_name, self.username, 'PermissionMiddleware'))
+        log.debug('Permission to repo: %s denied for user: %s @ %s',
+                  self.repo_name, self.username, 'PermissionMiddleware')
         return False
 
 
@@ -1214,8 +1205,8 @@
         if group_name:
             check_scope += ', repo group:%s' % (group_name)
 
-        log.debug('checking cls:%s %s %s @ %s'
-                  % (cls_name, self.required_perms, check_scope, check_location))
+        log.debug('checking cls:%s %s %s @ %s',
+                  cls_name, self.required_perms, check_scope, check_location)
         if not user:
             log.debug('Empty User passed into arguments')
             return False
@@ -1226,13 +1217,13 @@
         if not check_location:
             check_location = 'unspecified'
         if self.check_permissions(user.permissions, repo_name, group_name):
-            log.debug('Permission to %s granted for user: %s @ %s'
-                      % (check_scope, user, check_location))
+            log.debug('Permission to %s granted for user: %s @ %s',
+                      check_scope, user, check_location)
             return True
 
         else:
-            log.debug('Permission to %s denied for user: %s @ %s'
-                      % (check_scope, user, check_location))
+            log.debug('Permission to %s denied for user: %s @ %s',
+                      check_scope, user, check_location)
             return False
 
     def check_permissions(self, perm_defs, repo_name=None, group_name=None):
@@ -1314,11 +1305,11 @@
     :param allowed_ips: list of allowed ips together with mask
     """
     from kallithea.lib import ipaddr
-    log.debug('checking if ip:%s is subnet of %s' % (source_ip, allowed_ips))
+    log.debug('checking if ip:%s is subnet of %s', source_ip, allowed_ips)
     if isinstance(allowed_ips, (tuple, list, set)):
         for ip in allowed_ips:
             if ipaddr.IPAddress(source_ip) in ipaddr.IPNetwork(ip):
-                log.debug('IP %s is network %s' %
-                          (ipaddr.IPAddress(source_ip), ipaddr.IPNetwork(ip)))
+                log.debug('IP %s is network %s',
+                          ipaddr.IPAddress(source_ip), ipaddr.IPNetwork(ip))
                 return True
     return False
--- a/kallithea/lib/auth_modules/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/auth_modules/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -54,11 +54,10 @@
         "email": "email address",
         "groups": '["list", "of", "groups"]',
         "extern_name": "name in external source of record",
-        "extern_type": "type of external source of record",
-        "admin": 'True|False defines if user should be Kallithea super admin',
-        "active": 'True|False defines active state of user internally for Kallithea',
-        "active_from_extern": "True|False\None, active state from the external auth, "
-                              "None means use definition from Kallithea extern_type active value"
+        "admin": 'True|False defines if user should be Kallithea admin',
+        "active": 'True|False defines active state of user in Kallithea',
+        "active_from_extern": "True|False|None, active state from the external auth, "
+                              "None means use value from the auth plugin"
     }
 
     @property
@@ -75,7 +74,7 @@
             def __call__(self, *args, **kwargs):
                 from kallithea.model import validators as v
                 obj = getattr(v, self.validator_name)
-                #log.debug('Initializing lazy formencode object: %s' % obj)
+                #log.debug('Initializing lazy formencode object: %s', obj)
                 return LazyFormencode(obj, *args, **kwargs)
 
 
@@ -121,8 +120,8 @@
             return False
 
         if user and user.extern_type and user.extern_type != plugin_name:
-            log.debug('User %s should authenticate using %s this is %s, skipping'
-                      % (user, user.extern_type, plugin_name))
+            log.debug('User %s should authenticate using %s this is %s, skipping',
+                      user, user.extern_type, plugin_name)
 
             return False
         return True
@@ -137,15 +136,15 @@
         :param kwargs: extra arguments needed for user fetching.
         """
         user = None
-        log.debug('Trying to fetch user `%s` from Kallithea database'
-                  % (username))
+        log.debug('Trying to fetch user `%s` from Kallithea database',
+                  username)
         if username:
             user = User.get_by_username(username)
             if not user:
                 log.debug('Fallback to fetch user in case insensitive mode')
                 user = User.get_by_username(username, case_insensitive=True)
         else:
-            log.debug('provided username:`%s` is empty skipping...' % username)
+            log.debug('provided username:`%s` is empty skipping...', username)
         return user
 
     def settings(self):
@@ -184,7 +183,7 @@
     def plugin_settings(self):
         """
         This method is called by the authentication framework, not the .settings()
-        method. This method adds a few default settings (e.g., "active"), so that
+        method. This method adds a few default settings (e.g., "enabled"), so that
         plugin authors don't have to maintain a bunch of boilerplate.
 
         OVERRIDING THIS METHOD WILL CAUSE YOUR PLUGIN TO FAIL.
@@ -211,14 +210,14 @@
 
     def auth(self, userobj, username, passwd, settings, **kwargs):
         """
-        Given a user object (which may be null), username, a plaintext password,
+        Given a user object (which may be None), username, a plaintext password,
         and a settings object (containing all the keys needed as listed in settings()),
         authenticate this user's login attempt.
 
-        Return None on failure. On success, return a dictionary of the form:
+        Return None on failure. On success, return a dictionary with keys from
+        KallitheaAuthPluginBase.auth_func_attrs.
 
-            see: KallitheaAuthPluginBase.auth_func_attrs
-        This is later validated for correctness
+        This is later validated for correctness.
         """
         raise NotImplementedError("not implemented in base class")
 
@@ -231,18 +230,18 @@
         :param passwd: plaintext password
         :param settings: plugin settings
         """
-        auth = self.auth(userobj, username, passwd, settings, **kwargs)
-        if auth:
-            return self._validate_auth_return(auth)
-        return auth
+        user_data = self.auth(userobj, username, passwd, settings, **kwargs)
+        if user_data is not None:
+            return self._validate_auth_return(user_data)
+        return None
 
-    def _validate_auth_return(self, ret):
-        if not isinstance(ret, dict):
+    def _validate_auth_return(self, user_data):
+        if not isinstance(user_data, dict):
             raise Exception('returned value from auth must be a dict')
         for k in self.auth_func_attrs:
-            if k not in ret:
+            if k not in user_data:
                 raise Exception('Missing %s attribute from returned data' % k)
-        return ret
+        return user_data
 
 
 class KallitheaExternalAuthPlugin(KallitheaAuthPluginBase):
@@ -257,19 +256,19 @@
         raise NotImplementedError("Not implemented in base class")
 
     def _authenticate(self, userobj, username, passwd, settings, **kwargs):
-        auth = super(KallitheaExternalAuthPlugin, self)._authenticate(
+        user_data = super(KallitheaExternalAuthPlugin, self)._authenticate(
             userobj, username, passwd, settings, **kwargs)
-        if auth:
+        if user_data is not None:
             # maybe plugin will clean the username ?
             # we should use the return value
-            username = auth['username']
+            username = user_data['username']
             # if user is not active from our extern type we should fail to auth
             # this can prevent from creating users in Kallithea when using
             # external authentication, but if it's inactive user we shouldn't
             # create that user anyway
-            if auth['active_from_extern'] is False:
-                log.warning("User %s authenticated against %s, but is inactive"
-                            % (username, self.__module__))
+            if user_data['active_from_extern'] is False:
+                log.warning("User %s authenticated against %s, but is inactive",
+                            username, self.__module__)
                 return None
 
             if self.use_fake_password():
@@ -277,26 +276,26 @@
                 # them blank either
                 passwd = PasswordGenerator().gen_password(length=8)
 
-            log.debug('Updating or creating user info from %s plugin'
-                      % self.name)
+            log.debug('Updating or creating user info from %s plugin',
+                      self.name)
             user = UserModel().create_or_update(
                 username=username,
                 password=passwd,
-                email=auth["email"],
-                firstname=auth["firstname"],
-                lastname=auth["lastname"],
-                active=auth["active"],
-                admin=auth["admin"],
-                extern_name=auth["extern_name"],
+                email=user_data["email"],
+                firstname=user_data["firstname"],
+                lastname=user_data["lastname"],
+                active=user_data["active"],
+                admin=user_data["admin"],
+                extern_name=user_data["extern_name"],
                 extern_type=self.name
             )
             Session().flush()
             # enforce user is just in given groups, all of them has to be ones
             # created from plugins. We store this info in _group_data JSON field
-            groups = auth['groups'] or []
+            groups = user_data['groups'] or []
             UserGroupModel().enforce_groups(user, groups, self.name)
             Session().commit()
-        return auth
+        return user_data
 
 
 def importplugin(plugin):
@@ -310,7 +309,7 @@
         TypeError -- if the KallitheaAuthPlugin is not a subclass of ours KallitheaAuthPluginBase
         ImportError -- if we couldn't import the plugin at all
     """
-    log.debug("Importing %s" % plugin)
+    log.debug("Importing %s", plugin)
     if not plugin.startswith(u'kallithea.lib.auth_modules.auth_'):
         parts = plugin.split(u'.lib.auth_modules.auth_', 1)
         if len(parts) == 2:
@@ -327,8 +326,8 @@
         # the plugin name, the crash is pretty bad and hard to recover
         raise
 
-    log.debug("Loaded auth plugin from %s (module:%s, file:%s)"
-              % (plugin, module.__name__, module.__file__))
+    log.debug("Loaded auth plugin from %s (module:%s, file:%s)",
+              plugin, module.__name__, module.__file__)
 
     pluginclass = getattr(module, PLUGIN_CLASS_NAME)
     if not issubclass(pluginclass, KallitheaAuthPluginBase):
@@ -359,18 +358,18 @@
     :param username: username can be empty for container auth
     :param password: password can be empty for container auth
     :param environ: environ headers passed for container auth
-    :returns: None if auth failed, plugin_user dict if auth is correct
+    :returns: None if auth failed, user_data dict if auth is correct
     """
 
     auth_plugins = Setting.get_auth_plugins()
-    log.debug('Authentication against %s plugins' % (auth_plugins,))
+    log.debug('Authentication against %s plugins', auth_plugins)
     for module in auth_plugins:
         try:
             plugin = loadplugin(module)
-        except (ImportError, AttributeError, TypeError), e:
+        except (ImportError, AttributeError, TypeError) as e:
             raise ImportError('Failed to load authentication module %s : %s'
                               % (module, str(e)))
-        log.debug('Trying authentication using ** %s **' % (module,))
+        log.debug('Trying authentication using ** %s **', module)
         # load plugin settings from Kallithea database
         plugin_name = plugin.name
         plugin_settings = {}
@@ -378,42 +377,55 @@
             conf_key = "auth_%s_%s" % (plugin_name, v["name"])
             setting = Setting.get_by_name(conf_key)
             plugin_settings[v["name"]] = setting.app_settings_value if setting else None
-        log.debug('Plugin settings \n%s' % formatted_json(plugin_settings))
+        log.debug('Plugin settings \n%s', formatted_json(plugin_settings))
 
         if not str2bool(plugin_settings["enabled"]):
-            log.info("Authentication plugin %s is disabled, skipping for %s"
-                     % (module, username))
+            log.info("Authentication plugin %s is disabled, skipping for %s",
+                     module, username)
             continue
 
         # use plugin's method of user extraction.
         user = plugin.get_user(username, environ=environ,
                                settings=plugin_settings)
-        log.debug('Plugin %s extracted user is `%s`' % (module, user))
+        log.debug('Plugin %s extracted user is `%s`', module, user)
         if not plugin.accepts(user):
-            log.debug('Plugin %s does not accept user `%s` for authentication'
-                      % (module, user))
+            log.debug('Plugin %s does not accept user `%s` for authentication',
+                      module, user)
             continue
         else:
-            log.debug('Plugin %s accepted user `%s` for authentication'
-                      % (module, user))
+            log.debug('Plugin %s accepted user `%s` for authentication',
+                      module, user)
 
-        log.info('Authenticating user using %s plugin' % plugin.__module__)
+        log.info('Authenticating user using %s plugin', plugin.__module__)
         # _authenticate is a wrapper for .auth() method of plugin.
         # it checks if .auth() sends proper data. For KallitheaExternalAuthPlugin
         # it also maps users to Database and maps the attributes returned
         # from .auth() to Kallithea database. If this function returns data
         # then auth is correct.
-        plugin_user = plugin._authenticate(user, username, password,
+        user_data = plugin._authenticate(user, username, password,
                                            plugin_settings,
                                            environ=environ or {})
-        log.debug('PLUGIN USER DATA: %s' % plugin_user)
+        log.debug('PLUGIN USER DATA: %s', user_data)
+
+        if user_data is not None:
+            log.debug('Plugin returned proper authentication data')
+            return user_data
 
-        if plugin_user:
-            log.debug('Plugin returned proper authentication data')
-            return plugin_user
+        # we failed to Auth because .auth() method didn't return the user
+        if username:
+            log.warning("User `%s` failed to authenticate against %s",
+                        username, plugin.__module__)
+    return None
 
-        # we failed to Auth because .auth() method didn't return proper the user
-        if username:
-            log.warning("User `%s` failed to authenticate against %s"
-                        % (username, plugin.__module__))
-    return None
+def get_managed_fields(user):
+    """return list of fields that are managed by the user's auth source, usually some of
+    'username', 'firstname', 'lastname', 'email', 'active', 'password'
+    """
+    auth_plugins = Setting.get_auth_plugins()
+    for module in auth_plugins:
+        log.debug('testing %s (%s) with auth plugin %s', user, user.extern_type, module)
+        plugin = loadplugin(module)
+        if plugin.name == user.extern_type:
+            return plugin.get_managed_fields()
+    log.error('no auth plugin %s found for %s', user.extern_type, user)
+    return [] # TODO: Fail badly instead of allowing everything to be edited?
--- a/kallithea/lib/auth_modules/auth_container.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/auth_modules/auth_container.py	Sun Sep 06 23:36:05 2015 +0200
@@ -95,24 +95,24 @@
         username = None
         environ = environ or {}
         if not environ:
-            log.debug('got empty environ: %s' % environ)
+            log.debug('got empty environ: %s', environ)
 
         settings = settings or {}
         if settings.get('header'):
             header = settings.get('header')
             username = environ.get(header)
-            log.debug('extracted %s:%s' % (header, username))
+            log.debug('extracted %s:%s', header, username)
 
         # fallback mode
         if not username and settings.get('fallback_header'):
             header = settings.get('fallback_header')
             username = environ.get(header)
-            log.debug('extracted %s:%s' % (header, username))
+            log.debug('extracted %s:%s', header, username)
 
         if username and str2bool(settings.get('clean_username')):
-            log.debug('Received username %s from container' % username)
+            log.debug('Received username %s from container', username)
             username = self._clean_username(username)
-            log.debug('New cleanup user is: %s' % username)
+            log.debug('New cleanup user is: %s', username)
         return username
 
     def get_user(self, username=None, **kwargs):
@@ -175,9 +175,8 @@
         email = getattr(userobj, 'email', '')
         firstname = getattr(userobj, 'firstname', '')
         lastname = getattr(userobj, 'lastname', '')
-        extern_type = getattr(userobj, 'extern_type', '')
 
-        user_attrs = {
+        user_data = {
             'username': username,
             'firstname': safe_unicode(firstname or username),
             'lastname': safe_unicode(lastname or ''),
@@ -187,8 +186,10 @@
             'active': active,
             'active_from_extern': True,
             'extern_name': username,
-            'extern_type': extern_type,
         }
 
-        log.info('user `%s` authenticated correctly' % user_attrs['username'])
-        return user_attrs
+        log.info('user `%s` authenticated correctly', user_data['username'])
+        return user_data
+
+    def get_managed_fields(self):
+        return ['username', 'password']
--- a/kallithea/lib/auth_modules/auth_crowd.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/auth_modules/auth_crowd.py	Sun Sep 06 23:36:05 2015 +0200
@@ -85,9 +85,9 @@
             _headers["Authorization"] = "Basic %s" % authstring
         if headers:
             _headers.update(headers)
-        log.debug("Sent crowd: \n%s"
-                  % (formatted_json({"url": url, "body": body,
-                                           "headers": _headers})))
+        log.debug("Sent crowd: \n%s",
+                  formatted_json({"url": url, "body": body,
+                                           "headers": _headers}))
         request = urllib2.Request(url, body, _headers)
         if method:
             request.get_method = lambda: method
@@ -106,7 +106,7 @@
                 rval["status"] = True
             else:
                 rval = "".join(rdoc.readlines())
-        except Exception, e:
+        except Exception as e:
             if not noformat:
                 rval = {"status": False,
                         "body": body,
@@ -202,16 +202,16 @@
             log.debug('Empty username or password skipping...')
             return None
 
-        log.debug("Crowd settings: \n%s" % (formatted_json(settings)))
+        log.debug("Crowd settings: \n%s", formatted_json(settings))
         server = CrowdServer(**settings)
         server.set_credentials(settings["app_name"], settings["app_password"])
         crowd_user = server.user_auth(username, password)
-        log.debug("Crowd returned: \n%s" % (formatted_json(crowd_user)))
+        log.debug("Crowd returned: \n%s", formatted_json(crowd_user))
         if not crowd_user["status"]:
             return None
 
         res = server.user_groups(crowd_user["name"])
-        log.debug("Crowd groups: \n%s" % (formatted_json(res)))
+        log.debug("Crowd groups: \n%s", formatted_json(res))
         crowd_user["groups"] = [x["name"] for x in res["groups"]]
 
         # old attrs fetched from Kallithea database
@@ -220,9 +220,8 @@
         email = getattr(userobj, 'email', '')
         firstname = getattr(userobj, 'firstname', '')
         lastname = getattr(userobj, 'lastname', '')
-        extern_type = getattr(userobj, 'extern_type', '')
 
-        user_attrs = {
+        user_data = {
             'username': username,
             'firstname': crowd_user["first-name"] or firstname,
             'lastname': crowd_user["last-name"] or lastname,
@@ -230,15 +229,17 @@
             'email': crowd_user["email"] or email,
             'admin': admin,
             'active': active,
-            'active_from_extern': crowd_user.get('active'),
+            'active_from_extern': crowd_user.get('active'), # ???
             'extern_name': crowd_user["name"],
-            'extern_type': extern_type,
         }
 
         # set an admin if we're in admin_groups of crowd
         for group in settings["admin_groups"].split(","):
-            if group in user_attrs["groups"]:
-                user_attrs["admin"] = True
-        log.debug("Final crowd user object: \n%s" % (formatted_json(user_attrs)))
-        log.info('user %s authenticated correctly' % user_attrs['username'])
-        return user_attrs
+            if group in user_data["groups"]:
+                user_data["admin"] = True
+        log.debug("Final crowd user object: \n%s", formatted_json(user_data))
+        log.info('user %s authenticated correctly', user_data['username'])
+        return user_data
+
+    def get_managed_fields(self):
+        return ['username', 'firstname', 'lastname', 'email', 'password']
--- a/kallithea/lib/auth_modules/auth_internal.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/auth_modules/auth_internal.py	Sun Sep 06 23:36:05 2015 +0200
@@ -13,7 +13,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 kallithea.lib.auth_modules.auth_internal
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Kallithea authentication plugin for built in internal auth
 
@@ -61,14 +61,14 @@
 
     def auth(self, userobj, username, password, settings, **kwargs):
         if not userobj:
-            log.debug('userobj was:%s skipping' % (userobj, ))
+            log.debug('userobj was:%s skipping', userobj)
             return None
         if userobj.extern_type != self.name:
-            log.warning("userobj:%s extern_type mismatch got:`%s` expected:`%s`"
-                     % (userobj, userobj.extern_type, self.name))
+            log.warning("userobj:%s extern_type mismatch got:`%s` expected:`%s`",
+                     userobj, userobj.extern_type, self.name)
             return None
 
-        user_attrs = {
+        user_data = {
             "username": userobj.username,
             "firstname": userobj.firstname,
             "lastname": userobj.lastname,
@@ -78,23 +78,26 @@
             "active": userobj.active,
             "active_from_extern": userobj.active,
             "extern_name": userobj.user_id,
-            'extern_type': userobj.extern_type,
         }
 
-        log.debug(formatted_json(user_attrs))
+        log.debug(formatted_json(user_data))
         if userobj.active:
             from kallithea.lib import auth
             password_match = auth.KallitheaCrypto.hash_check(password, userobj.password)
             if userobj.username == User.DEFAULT_USER and userobj.active:
-                log.info('user %s authenticated correctly as anonymous user' %
+                log.info('user %s authenticated correctly as anonymous user',
                          username)
-                return user_attrs
+                return user_data
 
             elif userobj.username == username and password_match:
-                log.info('user %s authenticated correctly' % user_attrs['username'])
-                return user_attrs
-            log.error("user %s had a bad password" % username)
+                log.info('user %s authenticated correctly', user_data['username'])
+                return user_data
+            log.error("user %s had a bad password", username)
             return None
         else:
-            log.warning('user %s tried auth but is disabled' % username)
+            log.warning('user %s tried auth but is disabled', username)
             return None
+
+    def get_managed_fields(self):
+        # Note: 'username' should only be editable (at least for user) if self registration is enabled
+        return []
--- a/kallithea/lib/auth_modules/auth_ldap.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/auth_modules/auth_ldap.py	Sun Sep 06 23:36:05 2015 +0200
@@ -127,8 +127,8 @@
                 server.start_tls_s()
 
             if self.LDAP_BIND_DN and self.LDAP_BIND_PASS:
-                log.debug('Trying simple_bind with password and given DN: %s'
-                          % self.LDAP_BIND_DN)
+                log.debug('Trying simple_bind with password and given DN: %s',
+                          self.LDAP_BIND_DN)
                 server.simple_bind_s(self.LDAP_BIND_DN, self.LDAP_BIND_PASS)
 
             filter_ = '(&%s(%s=%s))' % (self.LDAP_FILTER, self.attr_login,
@@ -146,15 +146,15 @@
                     continue
 
                 try:
-                    log.debug('Trying simple bind with %s' % dn)
+                    log.debug('Trying simple bind with %s', dn)
                     server.simple_bind_s(dn, safe_str(password))
                     attrs = server.search_ext_s(dn, ldap.SCOPE_BASE,
                                                 '(objectClass=*)')[0][1]
                     break
 
                 except ldap.INVALID_CREDENTIALS:
-                    log.debug("LDAP rejected password for user '%s' (%s): %s"
-                              % (uid, username, dn))
+                    log.debug("LDAP rejected password for user '%s' (%s): %s",
+                              uid, username, dn)
 
             else:
                 log.debug("No matching LDAP objects for authentication "
@@ -162,7 +162,7 @@
                 raise LdapPasswordError()
 
         except ldap.NO_SUCH_OBJECT:
-            log.debug("LDAP says no such user '%s' (%s)" % (uid, username))
+            log.debug("LDAP says no such user '%s' (%s)", uid, username)
             raise LdapUsernameError()
         except ldap.SERVER_DOWN:
             raise LdapConnectionError("LDAP can't access authentication server")
@@ -328,7 +328,7 @@
         try:
             aldap = AuthLdap(**kwargs)
             (user_dn, ldap_attrs) = aldap.authenticate_ldap(username, password)
-            log.debug('Got ldap DN response %s' % user_dn)
+            log.debug('Got ldap DN response %s', user_dn)
 
             get_ldap_attr = lambda k: ldap_attrs.get(settings.get(k), [''])[0]
 
@@ -338,22 +338,20 @@
             email = getattr(userobj, 'email', '')
             firstname = getattr(userobj, 'firstname', '')
             lastname = getattr(userobj, 'lastname', '')
-            extern_type = getattr(userobj, 'extern_type', '')
 
-            user_attrs = {
+            user_data = {
                 'username': username,
                 'firstname': safe_unicode(get_ldap_attr('attr_firstname') or firstname),
                 'lastname': safe_unicode(get_ldap_attr('attr_lastname') or lastname),
                 'groups': [],
-                'email': get_ldap_attr('attr_email' or email),
+                'email': get_ldap_attr('attr_email') or email,
                 'admin': admin,
                 'active': active,
                 "active_from_extern": None,
                 'extern_name': user_dn,
-                'extern_type': extern_type,
             }
-            log.info('user %s authenticated correctly' % user_attrs['username'])
-            return user_attrs
+            log.info('user %s authenticated correctly', user_data['username'])
+            return user_data
 
         except (LdapUsernameError, LdapPasswordError, LdapImportError):
             log.error(traceback.format_exc())
@@ -361,3 +359,6 @@
         except (Exception,):
             log.error(traceback.format_exc())
             return None
+
+    def get_managed_fields(self):
+        return ['username', 'firstname', 'lastname', 'email', 'password']
--- a/kallithea/lib/auth_modules/auth_pam.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/auth_modules/auth_pam.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.lib.auth_pam
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.auth_modules.auth_pam
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Kallithea authentication library for PAM
 
@@ -98,10 +98,10 @@
                 _pam_lock.release()
 
             if not auth_result:
-                log.error("PAM was unable to authenticate user: %s" % (username,))
+                log.error("PAM was unable to authenticate user: %s", username)
                 return None
         else:
-            log.debug("Using cached auth for user: %s" % (username,))
+            log.debug("Using cached auth for user: %s", username)
 
         # old attrs fetched from Kallithea database
         admin = getattr(userobj, 'admin', False)
@@ -109,9 +109,8 @@
         email = getattr(userobj, 'email', '') or "%s@%s" % (username, socket.gethostname())
         firstname = getattr(userobj, 'firstname', '')
         lastname = getattr(userobj, 'lastname', '')
-        extern_type = getattr(userobj, 'extern_type', '')
 
-        user_attrs = {
+        user_data = {
             'username': username,
             'firstname': firstname,
             'lastname': lastname,
@@ -121,7 +120,6 @@
             'active': active,
             "active_from_extern": None,
             'extern_name': username,
-            'extern_type': extern_type,
         }
 
         try:
@@ -129,12 +127,15 @@
             regex = settings["gecos"]
             match = re.search(regex, user_data.pw_gecos)
             if match:
-                user_attrs["firstname"] = match.group('first_name')
-                user_attrs["lastname"] = match.group('last_name')
+                user_data["firstname"] = match.group('first_name')
+                user_data["lastname"] = match.group('last_name')
         except Exception:
             log.warning("Cannot extract additional info for PAM user %s", username)
             pass
 
-        log.debug("pamuser: \n%s" % formatted_json(user_attrs))
-        log.info('user %s authenticated correctly' % user_attrs['username'])
-        return user_attrs
+        log.debug("pamuser: \n%s", formatted_json(user_data))
+        log.info('user %s authenticated correctly', user_data['username'])
+        return user_data
+
+    def get_managed_fields(self):
+        return ['username', 'password']
--- a/kallithea/lib/base.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/base.py	Sun Sep 06 23:36:05 2015 +0200
@@ -28,6 +28,7 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
+import datetime
 import logging
 import time
 import traceback
@@ -48,7 +49,7 @@
 from kallithea.lib.utils2 import str2bool, safe_unicode, AttributeDict,\
     safe_str, safe_int
 from kallithea.lib import auth_modules
-from kallithea.lib.auth import AuthUser, HasPermissionAnyMiddleware, CookieStoreWrapper
+from kallithea.lib.auth import AuthUser, HasPermissionAnyMiddleware
 from kallithea.lib.utils import get_repo_slug
 from kallithea.lib.exceptions import UserCreationError
 from kallithea.lib.vcs.exceptions import RepositoryError, EmptyRepositoryError, ChangesetDoesNotExistError
@@ -73,7 +74,7 @@
     if ',' in ip:
         _ips = ip.split(',')
         _first_ip = _ips[0].strip()
-        log.debug('Got multiple IPs %s, using %s' % (','.join(_ips), _first_ip))
+        log.debug('Got multiple IPs %s, using %s', ','.join(_ips), _first_ip)
         return _first_ip
     return ip
 
@@ -103,6 +104,42 @@
     return path
 
 
+def log_in_user(user, remember, is_external_auth):
+    """
+    Log a `User` in and update session and cookies. If `remember` is True,
+    the session cookie is set to expire in a year; otherwise, it expires at
+    the end of the browser session.
+
+    Returns populated `AuthUser` object.
+    """
+    user.update_lastlogin()
+    meta.Session().commit()
+
+    auth_user = AuthUser(dbuser=user,
+                         is_external_auth=is_external_auth)
+    auth_user.set_authenticated()
+
+    # Start new session to prevent session fixation attacks.
+    session.invalidate()
+    session['authuser'] = cookie = auth_user.to_cookie()
+
+    # If they want to be remembered, update the cookie.
+    # NOTE: Assumes that beaker defaults to browser session cookie.
+    if remember:
+        t = datetime.datetime.now() + datetime.timedelta(days=365)
+        session._set_cookie_expires(t)
+
+    session.save()
+
+    log.info('user %s is now authenticated and stored in '
+             'session, session attrs %s', user.username, cookie)
+
+    # dumps session attrs back to cookie
+    session._update_cookie_out()
+
+    return auth_user
+
+
 class BasicAuth(paste.auth.basic.AuthBasicAuthenticator):
 
     def __init__(self, realm, authfunc, auth_http_code=None):
@@ -129,7 +166,7 @@
         _parts = auth.split(':', 1)
         if len(_parts) == 2:
             username, password = _parts
-            if self.authfunc(username, password, environ):
+            if self.authfunc(username, password, environ) is not None:
                 return username
         return self.build_authentication()
 
@@ -143,7 +180,7 @@
         self.config = config
         # base path of repo locations
         self.basepath = self.config['base_path']
-        #authenticate this VCS request using authfunc
+        # authenticate this VCS request using the authentication modules
         self.authenticate = BasicAuth('', auth_modules.authenticate,
                                       config.get('auth_ret_code'))
         self.ip_addr = '0.0.0.0'
@@ -182,15 +219,13 @@
         name
 
         :param action: push or pull action
-        :param user: user instance
+        :param user: `User` instance
         :param repo_name: repository name
         """
         # check IP
-        inherit = user.inherit_default_permissions
-        ip_allowed = AuthUser.check_ip_allowed(user.user_id, ip_addr,
-                                               inherit_from_default=inherit)
+        ip_allowed = AuthUser.check_ip_allowed(user, ip_addr)
         if ip_allowed:
-            log.info('Access for IP:%s allowed' % (ip_addr,))
+            log.info('Access for IP:%s allowed', ip_addr)
         else:
             return False
 
@@ -222,8 +257,8 @@
         if str2bool(Ui.get_by_key('push_ssl').ui_value):
             org_proto = environ.get('wsgi._org_proto', environ['wsgi.url_scheme'])
             if org_proto != 'https':
-                log.debug('proto is %s and SSL is required BAD REQUEST !'
-                          % org_proto)
+                log.debug('proto is %s and SSL is required BAD REQUEST !',
+                          org_proto)
                 return False
         return True
 
@@ -252,7 +287,7 @@
                 #check if it's already locked !, if it is compare users
                 user_id, _date = repo.locked
                 if user.user_id == user_id:
-                    log.debug('Got push from user %s, now unlocking' % (user))
+                    log.debug('Got push from user %s, now unlocking', user)
                     # unlock if we have push from user who locked
                     make_lock = False
                 else:
@@ -262,13 +297,13 @@
                 if repo.locked[0] and repo.locked[1]:
                     locked = True
                 else:
-                    log.debug('Setting lock on repo %s by %s' % (repo, user))
+                    log.debug('Setting lock on repo %s by %s', repo, user)
                     make_lock = True
 
         else:
-            log.debug('Repository %s do not have locking enabled' % (repo))
-        log.debug('FINAL locking values make_lock:%s,locked:%s,locked_by:%s'
-                  % (make_lock, locked, locked_by))
+            log.debug('Repository %s do not have locking enabled', repo)
+        log.debug('FINAL locking values make_lock:%s,locked:%s,locked_by:%s',
+                  make_lock, locked, locked_by)
         return make_lock, locked, locked_by
 
     def __call__(self, environ, start_response):
@@ -277,7 +312,7 @@
             return self._handle_request(environ, start_response)
         finally:
             log = logging.getLogger('kallithea.' + self.__class__.__name__)
-            log.debug('Request time: %.3fs' % (time.time() - start))
+            log.debug('Request time: %.3fs', time.time() - start)
             meta.Session.remove()
 
 
@@ -341,44 +376,72 @@
         self.sa = meta.Session
         self.scm_model = ScmModel(self.sa)
 
+    @staticmethod
+    def _determine_auth_user(api_key, session_authuser):
+        """
+        Create an `AuthUser` object given the API key (if any) and the
+        value of the authuser session cookie.
+        """
+
+        # Authenticate by API key
+        if api_key:
+            # when using API_KEY we are sure user exists.
+            return AuthUser(dbuser=User.get_by_api_key(api_key),
+                            is_external_auth=True)
+
+        # Authenticate by session cookie
+        # In ancient login sessions, 'authuser' may not be a dict.
+        # In that case, the user will have to log in again.
+        if isinstance(session_authuser, dict):
+            try:
+                return AuthUser.from_cookie(session_authuser)
+            except UserCreationError as e:
+                # container auth or other auth functions that create users on
+                # the fly can throw UserCreationError to signal issues with
+                # user creation. Explanation should be provided in the
+                # exception object.
+                from kallithea.lib import helpers as h
+                h.flash(e, 'error', logf=log.error)
+
+        # Authenticate by auth_container plugin (if enabled)
+        if any(
+            auth_modules.importplugin(name).is_container_auth
+            for name in Setting.get_auth_plugins()
+        ):
+            try:
+                user_info = auth_modules.authenticate('', '', request.environ)
+            except UserCreationError as e:
+                from kallithea.lib import helpers as h
+                h.flash(e, 'error', logf=log.error)
+            else:
+                if user_info is not None:
+                    username = user_info['username']
+                    user = User.get_by_username(username, case_insensitive=True)
+                    return log_in_user(user, remember=False,
+                                       is_external_auth=True)
+
+        # User is anonymous
+        return AuthUser()
+
     def __call__(self, environ, start_response):
         """Invoke the Controller"""
+
         # WSGIController.__call__ dispatches to the Controller method
         # the request is routed to. This routing information is
         # available in environ['pylons.routes_dict']
         try:
             self.ip_addr = _get_ip_addr(environ)
             # make sure that we update permissions each time we call controller
-            api_key = request.GET.get('api_key')
 
-            if api_key:
-                # when using API_KEY we are sure user exists.
-                auth_user = AuthUser(api_key=api_key, ip_addr=self.ip_addr)
-                authenticated = False
-            else:
-                cookie_store = CookieStoreWrapper(session.get('authuser'))
-                try:
-                    auth_user = AuthUser(user_id=cookie_store.get('user_id', None),
-                                         ip_addr=self.ip_addr)
-                except UserCreationError, e:
-                    from kallithea.lib import helpers as h
-                    h.flash(e, 'error')
-                    # container auth or other auth functions that create users on
-                    # the fly can throw this exception signaling that there's issue
-                    # with user creation, explanation should be provided in
-                    # Exception itself
-                    auth_user = AuthUser(ip_addr=self.ip_addr)
+            #set globals for auth user
+            self.authuser = c.authuser = request.user = self._determine_auth_user(
+                request.GET.get('api_key'),
+                session.get('authuser'),
+            )
 
-                authenticated = cookie_store.get('is_authenticated')
-
-            if not auth_user.is_authenticated and auth_user.user_id is not None:
-                # user is not authenticated and not empty
-                auth_user.set_authenticated(authenticated)
-            request.user = auth_user
-            #set globals for auth user
-            self.authuser = c.authuser = auth_user
-            log.info('IP: %s User: %s accessed %s' % (
-               self.ip_addr, auth_user, safe_unicode(_get_access_path(environ)))
+            log.info('IP: %s User: %s accessed %s',
+                self.ip_addr, self.authuser,
+                safe_unicode(_get_access_path(environ)),
             )
             return WSGIController.__call__(self, environ, start_response)
         finally:
@@ -404,8 +467,8 @@
             if not _dbr:
                 return
 
-            log.debug('Found repository in database %s with state `%s`'
-                      % (safe_unicode(_dbr), safe_unicode(_dbr.repo_state)))
+            log.debug('Found repository in database %s with state `%s`',
+                      safe_unicode(_dbr), safe_unicode(_dbr.repo_state))
             route = getattr(request.environ.get('routes.route'), 'name', '')
 
             # allow to delete repos that are somehow damages in filesystem
@@ -457,3 +520,20 @@
             log.error(traceback.format_exc())
             h.flash(safe_str(e), category='error')
             raise webob.exc.HTTPBadRequest()
+
+
+class WSGIResultCloseCallback(object):
+    """Wrap a WSGI result and let close call close after calling the
+    close method on the result.
+    """
+    def __init__(self, result, close):
+        self._result = result
+        self._close = close
+
+    def __iter__(self):
+        return iter(self._result)
+
+    def close(self):
+        if hasattr(self._result, 'close'):
+            self._result.close()
+        self._close()
--- a/kallithea/lib/celerylib/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/celerylib/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.lib.celerylib.__init__
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.celerylib
+~~~~~~~~~~~~~~~~~~~~~~~
 
 celery libs for Kallithea
 
@@ -62,21 +62,21 @@
     if CELERY_ON:
         try:
             t = task.apply_async(args=args, kwargs=kwargs)
-            log.info('running task %s:%s' % (t.task_id, task))
+            log.info('running task %s:%s', t.task_id, task)
             return t
 
-        except socket.error, e:
+        except socket.error as e:
             if isinstance(e, IOError) and e.errno == 111:
                 log.debug('Unable to connect to celeryd. Sync execution')
                 CELERY_ON = False
             else:
                 log.error(traceback.format_exc())
-        except KeyError, e:
+        except KeyError as e:
                 log.debug('Unable to connect to celeryd. Sync execution')
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
 
-    log.debug('executing task %s in sync mode' % task)
+    log.debug('executing task %s in sync mode', task)
     return ResultWrapper(task(*args, **kwargs))
 
 
@@ -96,7 +96,7 @@
         lockkey = __get_lockkey(func, *fargs, **fkwargs)
         lockkey_path = config['app_conf']['cache_dir']
 
-        log.info('running task with lockkey %s' % lockkey)
+        log.info('running task with lockkey %s', lockkey)
         try:
             l = DaemonLock(file_=jn(lockkey_path, lockkey))
             ret = func(*fargs, **fkwargs)
--- a/kallithea/lib/celerylib/tasks.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/celerylib/tasks.py	Sun Sep 06 23:36:05 2015 +0200
@@ -31,6 +31,7 @@
 import os
 import traceback
 import logging
+import rfc822
 from os.path import join as jn
 
 from time import mktime
@@ -45,6 +46,7 @@
 from kallithea.lib.helpers import person
 from kallithea.lib.rcmail.smtp_mailer import SmtpMailer
 from kallithea.lib.utils import add_cache, action_logger
+from kallithea.lib.vcs.utils import author_email
 from kallithea.lib.compat import json, OrderedDict
 from kallithea.lib.hooks import log_create_repository
 
@@ -87,7 +89,7 @@
                             ts_max_y)
     lockkey_path = config['app_conf']['cache_dir']
 
-    log.info('running task with lockkey %s' % lockkey)
+    log.info('running task with lockkey %s', lockkey)
 
     try:
         lock = l = DaemonLock(file_=jn(lockkey_path, lockkey))
@@ -134,15 +136,15 @@
                                         cur_stats.commit_activity_combined))
             co_day_auth_aggr = json.loads(cur_stats.commit_activity)
 
-        log.debug('starting parsing %s' % parse_limit)
+        log.debug('starting parsing %s', parse_limit)
         lmktime = mktime
 
         last_rev = last_rev + 1 if last_rev >= 0 else 0
-        log.debug('Getting revisions from %s to %s' % (
-             last_rev, last_rev + parse_limit)
+        log.debug('Getting revisions from %s to %s',
+             last_rev, last_rev + parse_limit
         )
         for cs in repo[last_rev:last_rev + parse_limit]:
-            log.debug('parsing %s' % cs)
+            log.debug('parsing %s', cs)
             last_cs = cs  # remember last parsed changeset
             k = lmktime([cs.date.timetuple()[0], cs.date.timetuple()[1],
                           cs.date.timetuple()[2], 0, 0, 0, 0, 0, 0])
@@ -210,9 +212,9 @@
         stats.commit_activity = json.dumps(co_day_auth_aggr)
         stats.commit_activity_combined = json.dumps(overview_data)
 
-        log.debug('last revision %s' % last_rev)
+        log.debug('last revision %s', last_rev)
         leftovers = len(repo.revisions[last_rev:])
-        log.debug('revisions to parse %s' % leftovers)
+        log.debug('revisions to parse %s', leftovers)
 
         if last_rev == 0 or leftovers < parse_limit:
             log.debug('getting code trending stats')
@@ -247,7 +249,7 @@
 
 @task(ignore_result=True)
 @dbsession
-def send_email(recipients, subject, body='', html_body='', headers=None):
+def send_email(recipients, subject, body='', html_body='', headers=None, author=None):
     """
     Sends an email with defined parameters from the .ini files.
 
@@ -256,25 +258,49 @@
     :param subject: subject of the mail
     :param body: body of the mail
     :param html_body: html version of body
+    :param headers: dictionary of prepopulated e-mail headers
+    :param author: User object of the author of this mail, if known and relevant
     """
     log = get_logger(send_email)
     assert isinstance(recipients, list), recipients
+    if headers is None:
+        headers = {}
+    else:
+        # do not modify the original headers object passed by the caller
+        headers = headers.copy()
 
     email_config = config
     email_prefix = email_config.get('email_prefix', '')
     if email_prefix:
         subject = "%s %s" % (email_prefix, subject)
-    if recipients is None:
+
+    if not recipients:
         # if recipients are not defined we send to email_config + all admins
-        admins = [u.email for u in User.query()
-                  .filter(User.admin == True).all()]
-        recipients = [email_config.get('email_to')] + admins
-        log.warning("recipients not specified for '%s' - sending to admins %s", subject, ' '.join(recipients))
-    elif not recipients:
-        log.error("No recipients specified")
-        return False
+        recipients = [u.email for u in User.query()
+                      .filter(User.admin == True).all()]
+        if email_config.get('email_to') is not None:
+            recipients += [email_config.get('email_to')]
+
+        # If there are still no recipients, there are no admins and no address
+        # configured in email_to, so return.
+        if not recipients:
+            log.error("No recipients specified and no fallback available.")
+            return False
+
+        log.warning("No recipients specified for '%s' - sending to admins %s", subject, ' '.join(recipients))
 
-    mail_from = email_config.get('app_email_from', 'Kallithea')
+    # SMTP sender
+    envelope_from = email_config.get('app_email_from', 'Kallithea')
+    # 'From' header
+    if author is not None:
+        # set From header based on author but with a generic e-mail address
+        # In case app_email_from is in "Some Name <e-mail>" format, we first
+        # extract the e-mail address.
+        envelope_addr = author_email(envelope_from)
+        headers['From'] = '"%s" <%s>' % (
+            rfc822.quote('%s (no-reply)' % author.full_name_or_username),
+            envelope_addr)
+
     user = email_config.get('smtp_username')
     passwd = email_config.get('smtp_password')
     mail_server = email_config.get('smtp_server')
@@ -284,14 +310,23 @@
     debug = str2bool(email_config.get('debug'))
     smtp_auth = email_config.get('smtp_auth')
 
-    if not mail_server:
-        log.error("SMTP mail server not configured - cannot send mail '%s' to %s", subject, ' '.join(recipients))
-        log.warning("body:\n%s", body)
-        log.warning("html:\n%s", html_body)
+    logmsg = ("Mail details:\n"
+              "recipients: %s\n"
+              "headers: %s\n"
+              "subject: %s\n"
+              "body:\n%s\n"
+              "html:\n%s\n"
+              % (' '.join(recipients), headers, subject, body, html_body))
+
+    if mail_server:
+        log.debug("Sending e-mail. " + logmsg)
+    else:
+        log.error("SMTP mail server not configured - cannot send e-mail.")
+        log.warning(logmsg)
         return False
 
     try:
-        m = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth,
+        m = SmtpMailer(envelope_from, user, passwd, mail_server, smtp_auth,
                        mail_port, ssl, tls, debug=debug)
         m.send(recipients, subject, body, html_body, headers=headers)
     except:
@@ -371,7 +406,7 @@
         # set new created state
         repo.set_state(Repository.STATE_CREATED)
         DBS.commit()
-    except Exception, e:
+    except Exception as e:
         log.warning('Exception %s occurred when forking repository, '
                     'doing cleanup...' % e)
         # rollback things manually !
@@ -456,7 +491,7 @@
         # set new created state
         repo.set_state(Repository.STATE_CREATED)
         DBS.commit()
-    except Exception, e:
+    except Exception as e:
         log.warning('Exception %s occurred when forking repository, '
                     'doing cleanup...' % e)
         #rollback things manually !
--- a/kallithea/lib/db_manage.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/db_manage.py	Sun Sep 06 23:36:05 2015 +0200
@@ -39,7 +39,7 @@
 from kallithea.model import init_model
 from kallithea.model.db import User, Permission, Ui, \
     Setting, UserToPerm, DbMigrateVersion, RepoGroup, \
-    UserRepoGroupToPerm, CacheInvalidation, UserGroup, Repository
+    UserRepoGroupToPerm, CacheInvalidation, Repository
 
 from sqlalchemy.engine import create_engine
 from kallithea.model.repo_group import RepoGroupModel
@@ -103,7 +103,7 @@
 
         checkfirst = not override
         Base.metadata.create_all(checkfirst=checkfirst)
-        log.info('Created tables for %s' % self.dbname)
+        log.info('Created tables for %s', self.dbname)
 
     def set_db_version(self):
         ver = DbMigrateVersion()
@@ -111,7 +111,7 @@
         ver.repository_id = DB_MIGRATIONS
         ver.repository_path = 'versions'
         self.sa.add(ver)
-        log.info('db version set to: %s' % __dbversion__)
+        log.info('db version set to: %s', __dbversion__)
 
     def upgrade(self):
         """
@@ -363,7 +363,7 @@
         for k, v, t in [('auth_plugins', 'kallithea.lib.auth_modules.auth_internal', 'list'),
                      ('auth_internal_enabled', 'True', 'bool')]:
             if skip_existing and Setting.get_by_name(k) != None:
-                log.debug('Skipping option %s' % k)
+                log.debug('Skipping option %s', k)
                 continue
             setting = Setting(k, v, t)
             self.sa.add(setting)
@@ -379,7 +379,7 @@
             ('default_repo_type', 'hg', 'unicode')]:
 
             if skip_existing and Setting.get_by_name(k) is not None:
-                log.debug('Skipping option %s' % k)
+                log.debug('Skipping option %s', k)
                 continue
             setting = Setting(k, v, t)
             self.sa.add(setting)
@@ -396,7 +396,7 @@
                 .scalar()
 
             if default is None:
-                log.debug('missing default permission for group %s adding' % g)
+                log.debug('missing default permission for group %s adding', g)
                 perm_obj = RepoGroupModel()._create_default_perms(g)
                 self.sa.add(perm_obj)
 
@@ -444,20 +444,20 @@
         # check proper dir
         if not os.path.isdir(path):
             path_ok = False
-            log.error('Given path %s is not a valid directory' % (path,))
+            log.error('Given path %s is not a valid directory', path)
 
         elif not os.path.isabs(path):
             path_ok = False
-            log.error('Given path %s is not an absolute path' % (path,))
+            log.error('Given path %s is not an absolute path', path)
 
         # check if path is at least readable.
         if not os.access(path, os.R_OK):
             path_ok = False
-            log.error('Given path %s is not readable' % (path,))
+            log.error('Given path %s is not readable', path)
 
         # check write access, warn user about non writeable paths
         elif not os.access(path, os.W_OK) and path_ok:
-            log.warning('No write permission to given path %s' % (path,))
+            log.warning('No write permission to given path %s', path)
             if not ask_ok('Given path %s is not writeable, do you want to '
                           'continue with read only mode ? [y/n]' % (path,)):
                 log.error('Canceled by user')
@@ -472,7 +472,7 @@
         real_path = os.path.normpath(os.path.realpath(path))
 
         if real_path != os.path.normpath(path):
-            log.warning('Using normalized path %s instead of %s' % (real_path, path))
+            log.warning('Using normalized path %s instead of %s', real_path, path)
 
         return real_path
 
@@ -520,7 +520,7 @@
         log.info('created ui config')
 
     def create_user(self, username, password, email='', admin=False):
-        log.info('creating user %s' % username)
+        log.info('creating user %s', username)
         UserModel().create_or_update(username, password, email,
                                      firstname='Kallithea', lastname='Admin',
                                      active=True, admin=admin,
--- a/kallithea/lib/dbmigrate/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.lib.dbmigrate.__init__
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate
+~~~~~~~~~~~~~~~~~~~~~~~
 
 Database migration modules
 
--- a/kallithea/lib/dbmigrate/migrate.cfg	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate.cfg	Sun Sep 06 23:36:05 2015 +0200
@@ -5,16 +5,16 @@
 
 # The name of the database table used to track the schema version.
 # This name shouldn't already be used by your project.
-# If this is changed once a database is under version control, you'll need to 
-# change the table name in each database too. 
+# If this is changed once a database is under version control, you'll need to
+# change the table name in each database too.
 version_table=db_migrate_version
 
-# When committing a change script, Migrate will attempt to generate the 
+# When committing a change script, Migrate will attempt to generate the
 # sql for all supported databases; normally, if one of them fails - probably
-# because you don't have that database installed - it is ignored and the 
-# commit continues, perhaps ending successfully. 
-# Databases in this list MUST compile successfully during a commit, or the 
-# entire commit will fail. List the databases your application will actually 
+# because you don't have that database installed - it is ignored and the
+# commit continues, perhaps ending successfully.
+# Databases in this list MUST compile successfully during a commit, or the
+# entire commit will fail. List the databases your application will actually
 # be using to ensure your updates to that database work properly.
 # This must be a list; example: ['postgres','sqlite']
 required_dbs=['sqlite']
--- a/kallithea/lib/dbmigrate/migrate/versioning/config.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/config.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
 from sqlalchemy.util import OrderedDict
--- a/kallithea/lib/dbmigrate/migrate/versioning/migrate_repository.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/migrate_repository.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,13 +25,13 @@
 
 def delete_file(filepath):
     """Deletes a file and prints a message."""
-    log.info('Deleting file: %s' % filepath)
+    log.info('Deleting file: %s', filepath)
     os.remove(filepath)
 
 
 def move_file(src, tgt):
     """Moves a file and prints a message."""
-    log.info('Moving file %s to %s' % (src, tgt))
+    log.info('Moving file %s to %s', src, tgt)
     if os.path.exists(tgt):
         raise Exception(
             'Cannot move file %s because target %s already exists' % \
@@ -41,13 +41,13 @@
 
 def delete_directory(dirpath):
     """Delete a directory and print a message."""
-    log.info('Deleting directory: %s' % dirpath)
+    log.info('Deleting directory: %s', dirpath)
     os.rmdir(dirpath)
 
 
 def migrate_repository(repos):
     """Does the actual migration to the new repository format."""
-    log.info('Migrating repository at: %s to new format' % repos)
+    log.info('Migrating repository at: %s to new format', repos)
     versions = '%s/versions' % repos
     dirs = os.listdir(versions)
     # Only use int's in list.
@@ -55,7 +55,7 @@
     numdirs.sort()  # Sort list.
     for dirname in numdirs:
         origdir = '%s/%s' % (versions, dirname)
-        log.info('Working on directory: %s' % origdir)
+        log.info('Working on directory: %s', origdir)
         files = os.listdir(origdir)
         files.sort()
         for filename in files:
--- a/kallithea/lib/dbmigrate/migrate/versioning/pathed.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/pathed.py	Sun Sep 06 23:36:05 2015 +0200
@@ -35,7 +35,7 @@
         """Try to initialize this object's parent, if it has one"""
         parent_path = self.__class__._parent_path(path)
         self.parent = self.__class__.parent(parent_path)
-        log.debug("Getting parent %r:%r" % (self.__class__.parent, parent_path))
+        log.debug("Getting parent %r:%r", self.__class__.parent, parent_path)
         self.parent._init_child(path, self)
 
     def _init_child(self, child, path):
--- a/kallithea/lib/dbmigrate/migrate/versioning/repository.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/repository.py	Sun Sep 06 23:36:05 2015 +0200
@@ -74,14 +74,14 @@
     _versions = 'versions'
 
     def __init__(self, path):
-        log.debug('Loading repository %s...' % path)
+        log.debug('Loading repository %s...', path)
         self.verify(path)
         super(Repository, self).__init__(path)
         self.config = cfgparse.Config(os.path.join(self.path, self._config))
         self.versions = version.Collection(os.path.join(self.path,
                                                       self._versions))
-        log.debug('Repository %s loaded successfully' % path)
-        log.debug('Config: %r' % self.config.to_dict())
+        log.debug('Repository %s loaded successfully', path)
+        log.debug('Config: %r', self.config.to_dict())
 
     @classmethod
     def verify(cls, path):
@@ -95,7 +95,7 @@
             cls.require_found(path)
             cls.require_found(os.path.join(path, cls._config))
             cls.require_found(os.path.join(path, cls._versions))
-        except exceptions.PathNotFoundError, e:
+        except exceptions.PathNotFoundError as e:
             raise exceptions.InvalidRepositoryError(path)
 
     @classmethod
--- a/kallithea/lib/dbmigrate/migrate/versioning/script/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/script/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
 from kallithea.lib.dbmigrate.migrate.versioning.script.base import BaseScript
--- a/kallithea/lib/dbmigrate/migrate/versioning/script/base.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/script/base.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 import logging
 
@@ -24,10 +24,10 @@
     """ # TODO: sphinxfy this and implement it correctly
 
     def __init__(self, path):
-        log.debug('Loading script %s...' % path)
+        log.debug('Loading script %s...', path)
         self.verify(path)
         super(BaseScript, self).__init__(path)
-        log.debug('Script %s loaded successfully' % path)
+        log.debug('Script %s loaded successfully', path)
 
     @classmethod
     def verify(cls, path):
--- a/kallithea/lib/dbmigrate/migrate/versioning/script/py.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/script/py.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
 import shutil
@@ -96,7 +96,7 @@
         module = import_path(path)
         try:
             assert callable(module.upgrade)
-        except Exception, e:
+        except Exception as e:
             raise InvalidScriptError(path + ': %s' % str(e))
         return module
 
--- a/kallithea/lib/dbmigrate/migrate/versioning/script/sql.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/script/sql.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 import logging
 import shutil
--- a/kallithea/lib/dbmigrate/migrate/versioning/shell.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/shell.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
 """The migrate command-line tool."""
@@ -207,7 +207,7 @@
         ret = command_func(**kwargs)
         if ret is not None:
             log.info(ret)
-    except (exceptions.UsageError, exceptions.KnownError), e:
+    except (exceptions.UsageError, exceptions.KnownError) as e:
         parser.error(e.args[0])
 
 if __name__ == "__main__":
--- a/kallithea/lib/dbmigrate/migrate/versioning/template.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/template.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
 import os
--- a/kallithea/lib/dbmigrate/migrate/versioning/templates/manage.py_tmpl	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/templates/manage.py_tmpl	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 from migrate.versioning.shell import main
 
 if __name__ == '__main__':
--- a/kallithea/lib/dbmigrate/migrate/versioning/templates/manage/default.py_tmpl	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/templates/manage/default.py_tmpl	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 from migrate.versioning.shell import main
 
 {{py:
--- a/kallithea/lib/dbmigrate/migrate/versioning/templates/manage/pylons.py_tmpl	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/templates/manage/pylons.py_tmpl	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 import sys
 
--- a/kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/migrate.cfg	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/migrate.cfg	Sun Sep 06 23:36:05 2015 +0200
@@ -5,16 +5,16 @@
 
 # The name of the database table used to track the schema version.
 # This name shouldn't already be used by your project.
-# If this is changed once a database is under version control, you'll need to 
-# change the table name in each database too. 
+# If this is changed once a database is under version control, you'll need to
+# change the table name in each database too.
 version_table={{ locals().pop('version_table') }}
 
-# When committing a change script, Migrate will attempt to generate the 
+# When committing a change script, Migrate will attempt to generate the
 # sql for all supported databases; normally, if one of them fails - probably
-# because you don't have that database installed - it is ignored and the 
-# commit continues, perhaps ending successfully. 
-# Databases in this list MUST compile successfully during a commit, or the 
-# entire commit will fail. List the databases your application will actually 
+# because you don't have that database installed - it is ignored and the
+# commit continues, perhaps ending successfully.
+# Databases in this list MUST compile successfully during a commit, or the
+# entire commit will fail. List the databases your application will actually
 # be using to ensure your updates to that database work properly.
 # This must be a list; example: ['postgres','sqlite']
 required_dbs={{ locals().pop('required_dbs') }}
@@ -22,4 +22,4 @@
 # When creating new change scripts, Migrate will stamp the new script with
 # a version number. By default this is latest_version + 1. You can set this
 # to 'true' to tell Migrate to use the UTC timestamp instead.
-use_timestamp_numbering='false'
\ No newline at end of file
+use_timestamp_numbering='false'
--- a/kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/migrate.cfg	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/migrate.cfg	Sun Sep 06 23:36:05 2015 +0200
@@ -5,16 +5,16 @@
 
 # The name of the database table used to track the schema version.
 # This name shouldn't already be used by your project.
-# If this is changed once a database is under version control, you'll need to 
-# change the table name in each database too. 
+# If this is changed once a database is under version control, you'll need to
+# change the table name in each database too.
 version_table={{ locals().pop('version_table') }}
 
-# When committing a change script, Migrate will attempt to generate the 
+# When committing a change script, Migrate will attempt to generate the
 # sql for all supported databases; normally, if one of them fails - probably
-# because you don't have that database installed - it is ignored and the 
-# commit continues, perhaps ending successfully. 
-# Databases in this list MUST compile successfully during a commit, or the 
-# entire commit will fail. List the databases your application will actually 
+# because you don't have that database installed - it is ignored and the
+# commit continues, perhaps ending successfully.
+# Databases in this list MUST compile successfully during a commit, or the
+# entire commit will fail. List the databases your application will actually
 # be using to ensure your updates to that database work properly.
 # This must be a list; example: ['postgres','sqlite']
 required_dbs={{ locals().pop('required_dbs') }}
--- a/kallithea/lib/dbmigrate/migrate/versioning/util/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/util/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 """.. currentmodule:: migrate.versioning.util"""
 
@@ -87,7 +87,7 @@
 
     try:
         return f(*a, **kw)
-    except exceptions.PathFoundError, e:
+    except exceptions.PathFoundError as e:
         raise exceptions.KnownError("The path %s already exists" % e.args[0])
 
 def construct_engine(engine, **opts):
--- a/kallithea/lib/dbmigrate/migrate/versioning/util/keyedinstance.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/util/keyedinstance.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
 class KeyedInstance(object):
--- a/kallithea/lib/dbmigrate/migrate/versioning/version.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/migrate/versioning/version.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 
 import os
--- a/kallithea/lib/dbmigrate/schema/db_1_2_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_2_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db_1_2_0
-~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_2_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea <=1.2.X
 
@@ -323,7 +323,7 @@
         self.last_login = datetime.datetime.now()
         Session.add(self)
         Session.commit()
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def create(cls, form_data):
@@ -698,7 +698,7 @@
 
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository' % alias)
+            log.debug('Creating instance of %s repository', alias)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -785,7 +785,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1060,7 +1060,7 @@
         :param key:
         """
 
-        log.debug('marking %s for invalidation' % key)
+        log.debug('marking %s for invalidation', key)
         inv_obj = Session.query(cls)\
             .filter(cls.cache_key == key).scalar()
         if inv_obj:
--- a/kallithea/lib/dbmigrate/schema/db_1_3_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_3_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db_1_3_0
-~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_3_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea <=1.3.X
 
@@ -391,7 +391,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session.add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     def __json__(self):
         return dict(
@@ -716,7 +716,7 @@
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository' % alias)
+            log.debug('Creating instance of %s repository', alias)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -813,7 +813,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1151,8 +1151,8 @@
 
         key, _prefix, _org_key = cls._get_key(key)
         inv_objs = Session.query(cls).filter(cls.cache_args == _org_key).all()
-        log.debug('marking %s key[s] %s for invalidation' % (len(inv_objs),
-                                                             _org_key))
+        log.debug('marking %s key[s] %s for invalidation', len(inv_objs),
+                                                             _org_key)
         try:
             for inv_obj in inv_objs:
                 if inv_obj:
--- a/kallithea/lib/dbmigrate/schema/db_1_4_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_4_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db_1_4_0
-~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_4_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea <=1.4.X
 
@@ -437,7 +437,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     def get_api_data(self):
         """
@@ -863,7 +863,7 @@
         if last_change is None:
             last_change = datetime.datetime.now()
         if self.updated_on is None or self.updated_on != last_change:
-            log.debug('updated repo %s with new date %s' % (self, last_change))
+            log.debug('updated repo %s with new date %s', self, last_change)
             self.updated_on = last_change
             Session().add(self)
             Session().commit()
@@ -977,7 +977,7 @@
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository' % alias)
+            log.debug('Creating instance of %s repository', alias)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1081,7 +1081,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1505,8 +1505,8 @@
         elif repo_name:
             inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
 
-        log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s'
-                  % (len(inv_objs), key, repo_name))
+        log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s',
+                  len(inv_objs), key, repo_name)
         try:
             for inv_obj in inv_objs:
                 inv_obj.cache_active = False
--- a/kallithea/lib/dbmigrate/schema/db_1_5_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_5_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db_1_5_0
-~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_5_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea <=1.5.2
 
@@ -455,7 +455,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     def get_api_data(self):
         """
@@ -882,7 +882,7 @@
         if last_change is None:
             last_change = datetime.datetime.now()
         if self.updated_on is None or self.updated_on != last_change:
-            log.debug('updated repo %s with new date %s' % (self, last_change))
+            log.debug('updated repo %s with new date %s', self, last_change)
             self.updated_on = last_change
             Session().add(self)
             Session().commit()
@@ -996,7 +996,7 @@
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository' % alias)
+            log.debug('Creating instance of %s repository', alias)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1100,7 +1100,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1532,8 +1532,8 @@
         elif repo_name:
             inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
 
-        log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s'
-                  % (len(inv_objs), key, repo_name))
+        log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s',
+                  len(inv_objs), key, repo_name)
         try:
             for inv_obj in inv_objs:
                 inv_obj.cache_active = False
--- a/kallithea/lib/dbmigrate/schema/db_1_5_2.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_5_2.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db_1_5_2
-~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_5_2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea <=1.5.X
 
@@ -462,7 +462,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     def get_api_data(self):
         """
@@ -995,15 +995,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1117,7 +1117,7 @@
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository' % alias)
+            log.debug('Creating instance of %s repository', alias)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1221,7 +1221,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1645,8 +1645,8 @@
         elif repo_name:
             inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
 
-        log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s'
-                  % (len(inv_objs), key, repo_name))
+        log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s',
+                  len(inv_objs), key, repo_name)
         try:
             for inv_obj in inv_objs:
                 inv_obj.cache_active = False
--- a/kallithea/lib/dbmigrate/schema/db_1_6_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_6_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db_1_6_0
-~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_6_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea <=1.5.X
 
@@ -48,7 +48,7 @@
 from kallithea.lib.vcs.backends.base import EmptyChangeset
 
 from kallithea.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
-    safe_unicode, remove_suffix, remove_prefix, time_to_datetime, _set_extras
+    safe_unicode, remove_suffix, remove_prefix, time_to_datetime
 from kallithea.lib.compat import json
 from kallithea.lib.caching_query import FromCache
 
@@ -491,7 +491,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     def get_api_data(self):
         """
@@ -1065,15 +1065,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1192,8 +1192,8 @@
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1296,7 +1296,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1723,8 +1723,8 @@
         try:
             for inv_obj in inv_objs:
                 inv_obj.cache_active = False
-                log.debug('marking %s key for invalidation based on key=%s,repo_name=%s'
-                  % (inv_obj, key, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on key=%s,repo_name=%s',
+                  inv_obj, key, safe_str(repo_name))
                 invalidated_keys.append(inv_obj.cache_key)
                 Session().add(inv_obj)
             Session().commit()
--- a/kallithea/lib/dbmigrate/schema/db_1_7_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_7_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_7_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -48,7 +48,7 @@
 from kallithea.lib.vcs.backends.base import EmptyChangeset
 
 from kallithea.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
-    safe_unicode, remove_suffix, remove_prefix, time_to_datetime, _set_extras
+    safe_unicode, remove_prefix, time_to_datetime
 from kallithea.lib.compat import json
 from kallithea.lib.caching_query import FromCache
 
@@ -493,7 +493,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1096,15 +1096,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1199,18 +1199,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1314,7 +1314,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1828,8 +1828,8 @@
 
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 inv_obj.cache_active = False
                 Session().add(inv_obj)
             Session().commit()
--- a/kallithea/lib/dbmigrate/schema/db_1_8_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_1_8_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_1_8_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -48,7 +48,7 @@
 from kallithea.lib.vcs.backends.base import EmptyChangeset
 
 from kallithea.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
-    safe_unicode, remove_suffix, remove_prefix, time_to_datetime, _set_extras
+    safe_unicode, remove_prefix, time_to_datetime
 from kallithea.lib.compat import json
 from kallithea.lib.caching_query import FromCache
 
@@ -516,7 +516,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1126,15 +1126,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1229,18 +1229,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1344,7 +1344,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1874,8 +1874,8 @@
 
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 inv_obj.cache_active = False
                 Session().add(inv_obj)
             Session().commit()
--- a/kallithea/lib/dbmigrate/schema/db_2_0_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_2_0_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_2_0_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -568,7 +568,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1183,15 +1183,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1286,18 +1286,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1401,7 +1401,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1931,8 +1931,8 @@
 
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 if delete:
                     Session().delete(inv_obj)
                 else:
--- a/kallithea/lib/dbmigrate/schema/db_2_0_1.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_2_0_1.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_2_0_1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -568,7 +568,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1182,15 +1182,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1285,18 +1285,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1402,7 +1402,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1932,8 +1932,8 @@
 
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 if delete:
                     Session().delete(inv_obj)
                 else:
--- a/kallithea/lib/dbmigrate/schema/db_2_0_2.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_2_0_2.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_2_0_2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -568,7 +568,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1202,15 +1202,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1305,18 +1305,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1423,7 +1423,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1953,8 +1953,8 @@
 
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 if delete:
                     Session().delete(inv_obj)
                 else:
--- a/kallithea/lib/dbmigrate/schema/db_2_1_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_2_1_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_2_1_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -583,7 +583,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1241,15 +1241,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1344,18 +1344,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1462,7 +1462,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -1992,8 +1992,8 @@
 
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 if delete:
                     Session().delete(inv_obj)
                 else:
--- a/kallithea/lib/dbmigrate/schema/db_2_2_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_2_2_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_2_2_0
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -437,7 +437,7 @@
     user_comments = relationship('ChangesetComment', cascade='all')
     #extra emails for this user
     user_emails = relationship('UserEmailMap', cascade='all')
-    #extra api keys
+    #extra API keys
     user_api_keys = relationship('UserApiKeys', cascade='all')
 
 
@@ -610,7 +610,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1239,7 +1239,7 @@
                 pass
 
         return get_clone_url(uri_tmpl=uri_tmpl,
-                             qualifed_home_url=qualified_home_url,
+                             qualified_home_url=qualified_home_url,
                              repo_name=self.repo_name,
                              repo_id=self.repo_id, **override)
 
@@ -1287,15 +1287,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1390,18 +1390,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1512,7 +1512,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -2042,11 +2042,11 @@
         Mark all caches of a repo as invalid in the database.
         """
         inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
-        log.debug('for repo %s got %s invalidation objects' % (repo_name, inv_objs))
+        log.debug('for repo %s got %s invalidation objects', repo_name, inv_objs)
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 if delete:
                     Session().delete(inv_obj)
                 else:
--- a/kallithea/lib/dbmigrate/schema/db_2_2_3.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/schema/db_2_2_3.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.db
-~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.schema.db_2_2_3
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Database Models for Kallithea
 
@@ -437,7 +437,7 @@
     user_comments = relationship('ChangesetComment', cascade='all')
     #extra emails for this user
     user_emails = relationship('UserEmailMap', cascade='all')
-    #extra api keys
+    #extra API keys
     user_api_keys = relationship('UserApiKeys', cascade='all')
 
 
@@ -610,7 +610,7 @@
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -1263,7 +1263,7 @@
                 pass
 
         return get_clone_url(uri_tmpl=uri_tmpl,
-                             qualifed_home_url=qualified_home_url,
+                             qualified_home_url=qualified_home_url,
                              repo_name=self.repo_name,
                              repo_id=self.repo_id, **override)
 
@@ -1314,15 +1314,15 @@
         if (cs_cache != self.changeset_cache or not self.changeset_cache):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('Skipping repo:%s already with latest changes'
-                      % self.repo_name)
+            log.debug('Skipping repo:%s already with latest changes',
+                      self.repo_name)
 
     @property
     def tip(self):
@@ -1417,18 +1417,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting obj for %s from cache' % (rn))
+            log.debug('Getting obj for %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
         try:
             alias = get_scm(repo_full_path)[0]
-            log.debug('Creating instance of %s repository from %s'
-                      % (alias, repo_full_path))
+            log.debug('Creating instance of %s repository from %s',
+                      alias, repo_full_path)
             backend = get_backend(alias)
         except VCSError:
             log.error(traceback.format_exc())
@@ -1539,7 +1539,7 @@
                 break
             if cnt == parents_recursion_limit:
                 # this will prevent accidental infinite loops
-                log.error('group nested more than %s' %
+                log.error('group nested more than %s',
                           parents_recursion_limit)
                 break
 
@@ -2087,12 +2087,12 @@
         Mark all caches of a repo as invalid in the database.
         """
         inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
-        log.debug('for repo %s got %s invalidation objects'
-                  % (safe_str(repo_name), inv_objs))
+        log.debug('for repo %s got %s invalidation objects',
+                  safe_str(repo_name), inv_objs)
         try:
             for inv_obj in inv_objs:
-                log.debug('marking %s key for invalidation based on repo_name=%s'
-                          % (inv_obj, safe_str(repo_name)))
+                log.debug('marking %s key for invalidation based on repo_name=%s',
+                          inv_obj, safe_str(repo_name))
                 if delete:
                     Session().delete(inv_obj)
                 else:
--- a/kallithea/lib/dbmigrate/versions/001_initial_release.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/versions/001_initial_release.py	Sun Sep 06 23:36:05 2015 +0200
@@ -76,7 +76,7 @@
             self.last_login = datetime.datetime.now()
             session.add(self)
             session.commit()
-            log.debug('updated user %s lastlogin' % self.username)
+            log.debug('updated user %s lastlogin', self.username)
         except (DatabaseError,):
             session.rollback()
 
--- a/kallithea/lib/dbmigrate/versions/004_version_1_3_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/versions/004_version_1_3_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -22,19 +22,19 @@
     #==========================================================================
     # Add table `changeset_comments`
     #==========================================================================
-    from kallithea.lib.dbmigrate.schema.db_1_3_0 import  ChangesetComment
+    from kallithea.lib.dbmigrate.schema.db_1_3_0 import ChangesetComment
     ChangesetComment().__table__.create()
 
     #==========================================================================
     # Add table `notifications`
     #==========================================================================
-    from kallithea.lib.dbmigrate.schema.db_1_3_0 import  Notification
+    from kallithea.lib.dbmigrate.schema.db_1_3_0 import Notification
     Notification().__table__.create()
 
     #==========================================================================
     # Add table `user_to_notification`
     #==========================================================================
-    from kallithea.lib.dbmigrate.schema.db_1_3_0 import  UserNotification
+    from kallithea.lib.dbmigrate.schema.db_1_3_0 import UserNotification
     UserNotification().__table__.create()
 
     #==========================================================================
--- a/kallithea/lib/dbmigrate/versions/005_version_1_3_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/versions/005_version_1_3_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -33,7 +33,7 @@
     if old_cons:
         try:
             old_cons.drop()
-        except Exception, e:
+        except Exception as e:
             # we don't care if this fails really... better to pass migration than
             # leave this in intermidiate state
             print 'Failed to remove Unique for user_id, repository_id reason %s' % e
@@ -61,7 +61,7 @@
     if old_cons:
         try:
             old_cons.drop()
-        except Exception, e:
+        except Exception as e:
             # we don't care if this fails really... better to pass migration than
             # leave this in intermidiate state
             print 'Failed to remove Unique for user_id, repository_id reason %s' % e
--- a/kallithea/lib/dbmigrate/versions/008_version_1_5_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/versions/008_version_1_5_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -90,7 +90,7 @@
     perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
     defined_perms_groups = map(_get_group,
                               (x.permission.permission_name for x in perms))
-    log.debug('GOT ALREADY DEFINED:%s' % perms)
+    log.debug('GOT ALREADY DEFINED:%s', perms)
     DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
 
     # for every default permission that needs to be created, we check if
@@ -98,8 +98,8 @@
     for perm_name in DEFAULT_PERMS:
         gr = _get_group(perm_name)
         if gr not in defined_perms_groups:
-            log.debug('GR:%s not found, creating permission %s'
-                      % (gr, perm_name))
+            log.debug('GR:%s not found, creating permission %s',
+                      gr, perm_name)
             new_perm = _make_perm(perm_name)
             _SESSION().add(new_perm)
     _SESSION().commit()
@@ -115,7 +115,7 @@
         ('default_repo_type', 'hg')]:
 
         if skip_existing and models.Setting.get_by_name(k) is not None:
-            log.debug('Skipping option %s' % k)
+            log.debug('Skipping option %s', k)
             continue
         setting = models.Setting(k, v)
         _SESSION().add(setting)
--- a/kallithea/lib/dbmigrate/versions/012_version_1_7_0.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/versions/012_version_1_7_0.py	Sun Sep 06 23:36:05 2015 +0200
@@ -93,7 +93,7 @@
     perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
     defined_perms_groups = map(_get_group,
                               (x.permission.permission_name for x in perms))
-    log.debug('GOT ALREADY DEFINED:%s' % perms)
+    log.debug('GOT ALREADY DEFINED:%s', perms)
     DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
 
     # for every default permission that needs to be created, we check if
@@ -101,8 +101,8 @@
     for perm_name in DEFAULT_PERMS:
         gr = _get_group(perm_name)
         if gr not in defined_perms_groups:
-            log.debug('GR:%s not found, creating permission %s'
-                      % (gr, perm_name))
+            log.debug('GR:%s not found, creating permission %s',
+                      gr, perm_name)
             new_perm = _make_perm(perm_name)
             _SESSION().add(new_perm)
     _SESSION().commit()
--- a/kallithea/lib/dbmigrate/versions/022_version_2_0_2.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/versions/022_version_2_0_2.py	Sun Sep 06 23:36:05 2015 +0200
@@ -50,7 +50,7 @@
                         _rev_type = 'branch'
                     elif _rev in known_bookmarks:
                         _rev_type = 'book'
-            except Exception, e:
+            except Exception as e:
                 print e
                 print 'continue...'
                 #we don't want any error to break the process
--- a/kallithea/lib/dbmigrate/versions/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/dbmigrate/versions/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.lib.dbmigrate.versions.__init__
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.dbmigrate.versions
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Package containing new versions of database models
 
--- a/kallithea/lib/diffs.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/diffs.py	Sun Sep 06 23:36:05 2015 +0200
@@ -193,8 +193,8 @@
         (?:^\+\+\+[ ](b/(?P<b_file>.+?)|/dev/null)\t?(?:\n|$))?
     """, re.VERBOSE | re.MULTILINE)
 
-    #used for inline highlighter word split
-    _token_re = re.compile(r'()(&gt;|&lt;|&amp;|<u>\t</u>| <i></i>|\W+?)')
+    # Used for inline highlighter word split, must match the substitutions in _escaper
+    _token_re = re.compile(r'()(&amp;|&lt;|&gt;|<u>\t</u>|<u class="cr"></u>| <i></i>|\W+?)')
 
     _escape_re = re.compile(r'(&)|(<)|(>)|(\t)|(\r)|(?<=.)( \n| $)')
 
@@ -618,7 +618,7 @@
 
         """
         # Transform all whitespace to underscore
-        idstring = re.sub(r'\s', "_", '%s' % idstring)
+        idstring = re.sub(r'\s', "_", idstring)
         # Remove everything that is not a hyphen or a member of \w
         idstring = re.sub(r'(?!-)\W', "", idstring).lower()
         return idstring
--- a/kallithea/lib/exceptions.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/exceptions.py	Sun Sep 06 23:36:05 2015 +0200
@@ -45,6 +45,7 @@
 
 
 class DefaultUserException(Exception):
+    """An invalid action was attempted on the default user"""
     pass
 
 
@@ -98,6 +99,10 @@
     pass
 
 
+class UserInvalidException(Exception):
+    pass
+
+
 class RepositoryCreationError(Exception):
     pass
 
--- a/kallithea/lib/graphmod.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/graphmod.py	Sun Sep 06 23:36:05 2015 +0200
@@ -103,6 +103,7 @@
 
     row = []
     colors = {}
+    obs = {}
     newcolor = 1
 
     for (rev, dagparents) in dag:
@@ -111,6 +112,7 @@
         if rev not in row:
             row.append(rev)  # new head
             colors[rev] = newcolor
+            obs[rev] = int(repo[rev].obsolete)
             newcolor += 1
 
         col = row.index(rev)
@@ -126,12 +128,14 @@
                 nextrow.append(r)
             else:
                 colors.pop(r)
+                obs.pop(r)
 
         # Set colors for the parents
         color = colors.pop(rev)
         if addparents:
             b = branch(rev)
             for p in reversed(addparents):
+                obs[p] = int(repo[p].obsolete)
                 if b and branch(abs(p)) == b:
                     colors[p] = color
                     b = None
@@ -143,12 +147,13 @@
         edges = []
         for ecol, ep in enumerate(row):
             if ep in nextrow:
-                edges.append((ecol, nextrow.index(ep), colors[ep]))
+                edges.append((ecol, nextrow.index(ep), colors[ep], obs[ep]))
             elif ep == rev:
                 for p in dagparents:
-                    edges.append((ecol, nextrow.index(p), colors[p]))
+                    edges.append((ecol, nextrow.index(p), colors[p], obs[p]))
 
         # Yield and move on
         closing = int(repo[rev].closesbranch)
-        yield ((col, color), edges, closing)
+        obsolete = int(repo[rev].obsolete)
+        yield ((col, color), edges, closing, obsolete)
         row = nextrow
--- a/kallithea/lib/helpers.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/helpers.py	Sun Sep 06 23:36:05 2015 +0200
@@ -17,7 +17,6 @@
 Consists of functions to typically be used within templates, but also
 available to Controllers. This module is available to both as 'h'.
 """
-import random
 import hashlib
 import StringIO
 import math
@@ -30,7 +29,6 @@
 from pygments import highlight as code_highlight
 from pylons import url
 from pylons.i18n.translation import _, ungettext
-from hashlib import md5
 
 from webhelpers.html import literal, HTML, escape
 from webhelpers.html.tools import *
@@ -89,24 +87,23 @@
         parts = url('home', qualified=True).split('://', 1)
         return parts[1].split('/', 1)[0]
 
-def html_escape(text, html_escape_table=None):
-    """Produce entities within text."""
-    if not html_escape_table:
-        html_escape_table = {
-            "&": "&amp;",
-            '"': "&quot;",
-            "'": "&apos;",
-            ">": "&gt;",
-            "<": "&lt;",
-        }
-    return "".join(html_escape_table.get(c, c) for c in text)
+def html_escape(s):
+    """Return string with all html escaped.
+    This is also safe for javascript in html but not necessarily correct.
+    """
+    return (s
+        .replace('&', '&amp;')
+        .replace(">", "&gt;")
+        .replace("<", "&lt;")
+        .replace('"', "&quot;")
+        .replace("'", "&apos;")
+        )
 
-
-def shorter(text, size=20):
+def shorter(s, size=20):
     postfix = '...'
-    if len(text) > size:
-        return text[:size - len(postfix)] + postfix
-    return text
+    if len(s) > size:
+        return s[:size - len(postfix)] + postfix
+    return s
 
 
 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
@@ -131,7 +128,7 @@
     :param path:
     """
 
-    return 'C-%s-%s' % (short_id(raw_id), md5(safe_str(path)).hexdigest()[:12])
+    return 'C-%s-%s' % (short_id(raw_id), hashlib.md5(safe_str(path)).hexdigest()[:12])
 
 
 class _GetError(object):
@@ -150,21 +147,6 @@
 get_error = _GetError()
 
 
-class _ToolTip(object):
-
-    def __call__(self, tooltip_title, trim_at=50):
-        """
-        Special function just to wrap our text into nice formatted
-        autowrapped text
-
-        :param tooltip_title:
-        """
-        tooltip_title = escape(tooltip_title)
-        tooltip_title = tooltip_title.replace('<', '&lt;').replace('>', '&gt;')
-        return tooltip_title
-tooltip = _ToolTip()
-
-
 class _FilesBreadCrumbs(object):
 
     def __call__(self, repo_name, rev, paths):
@@ -355,12 +337,10 @@
             author = escape(changeset.author)
             date = changeset.date
             message = escape(changeset.message)
-
             tooltip_html = ("<div style='font-size:0.8em'><b>Author:</b>"
                             " %s<br/><b>Date:</b> %s</b><br/><b>Message:"
-                            "</b> %s<br/></div>")
+                            "</b> %s<br/></div>") % (author, date, message)
 
-            tooltip_html = tooltip_html % (author, date, message)
             lnk_format = show_id(changeset)
             uri = link_to(
                     lnk_format,
@@ -406,6 +386,25 @@
 
 class Flash(_Flash):
 
+    def __call__(self, message, category=None, ignore_duplicate=False, logf=None):
+        """
+        Show a message to the user _and_ log it through the specified function
+
+        category: notice (default), warning, error, success
+        logf: a custom log function - such as log.debug
+
+        logf defaults to log.info, unless category equals 'success', in which
+        case logf defaults to log.debug.
+        """
+        if logf is None:
+            logf = log.info
+            if category == 'success':
+                logf = log.debug
+
+        logf('Flash %s: %s', category, message)
+
+        super(Flash, self).__call__(message, category, ignore_duplicate)
+
     def pop_messages(self):
         """Return all accumulated messages and delete them from the session.
 
@@ -423,7 +422,7 @@
 #==============================================================================
 from kallithea.lib.vcs.utils import author_name, author_email
 from kallithea.lib.utils2 import credentials_filter, age as _age
-from kallithea.model.db import User, ChangesetStatus
+from kallithea.model.db import User, ChangesetStatus, PullRequest
 
 age = lambda  x, y=False: _age(x, y)
 capitalize = lambda x: x.capitalize()
@@ -447,7 +446,7 @@
     if show_rev:
         return 'r%s:%s' % (cs.revision, raw_id)
     else:
-        return '%s' % (raw_id)
+        return raw_id
 
 
 def fmt_date(date):
@@ -545,13 +544,13 @@
     if not value:
         return ''
 
-    value = re.sub(r'\[see\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
+    value = re.sub(r'\[see\ \=&gt;\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
                    '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
-    value = re.sub(r'\[license\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
+    value = re.sub(r'\[license\ \=&gt;\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
                    '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
-    value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\>\ *([a-zA-Z0-9\-\/]*)\]',
+    value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=&gt;\ *([a-zA-Z0-9\-\/]*)\]',
                    '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
-    value = re.sub(r'\[(lang|language)\ \=\>\ *([a-zA-Z\-\/\#\+]*)\]',
+    value = re.sub(r'\[(lang|language)\ \=&gt;\ *([a-zA-Z\-\/\#\+]*)\]',
                    '<div class="metatag" tag="lang">\\2</div>', value)
     value = re.sub(r'\[([a-z]+)\]',
                   '<div class="metatag" tag="\\1">\\1</div>', value)
@@ -601,32 +600,29 @@
         repo_name = user_log.repository.repo_name
 
         def lnk(rev, repo_name):
+            lazy_cs = False
+            title_ = None
+            url_ = '#'
             if isinstance(rev, BaseChangeset) or isinstance(rev, AttributeDict):
-                lazy_cs = True
-                if getattr(rev, 'op', None) and getattr(rev, 'ref_name', None):
-                    lazy_cs = False
-                    lbl = '?'
+                if rev.op and rev.ref_name:
                     if rev.op == 'delete_branch':
-                        lbl = '%s' % _('Deleted branch: %s') % rev.ref_name
-                        title = ''
+                        lbl = _('Deleted branch: %s') % rev.ref_name
                     elif rev.op == 'tag':
-                        lbl = '%s' % _('Created tag: %s') % rev.ref_name
-                        title = ''
-                    _url = '#'
-
+                        lbl = _('Created tag: %s') % rev.ref_name
+                    else:
+                        lbl = 'Unknown operation %s' % rev.op
                 else:
-                    lbl = '%s' % (rev.short_id[:8])
-                    _url = url('changeset_home', repo_name=repo_name,
+                    lazy_cs = True
+                    lbl = rev.short_id[:8]
+                    url_ = url('changeset_home', repo_name=repo_name,
                                revision=rev.raw_id)
-                    title = tooltip(rev.message)
             else:
-                ## changeset cannot be found/striped/removed etc.
-                lbl = ('%s' % rev)[:12]
-                _url = '#'
-                title = _('Changeset not found')
+                # changeset cannot be found - it might have been stripped or removed
+                lbl = rev[:12]
+                title_ = _('Changeset not found')
             if parse_cs:
-                return link_to(lbl, _url, title=title, class_='tooltip')
-            return link_to(lbl, _url, raw_id=rev.raw_id, repo_name=repo_name,
+                return link_to(lbl, url_, title=title_, class_='tooltip')
+            return link_to(lbl, url_, raw_id=rev.raw_id, repo_name=repo_name,
                            class_='lazy-cs' if lazy_cs else '')
 
         def _get_op(rev_txt):
@@ -650,9 +646,8 @@
                         _rev = repo.get_changeset(rev)
                         revs.append(_rev)
                     except ChangesetDoesNotExistError:
-                        log.error('cannot find revision %s in this repo' % rev)
+                        log.error('cannot find revision %s in this repo', rev)
                         revs.append(rev)
-                        continue
                 else:
                     _rev = AttributeDict({
                         'short_id': rev[:12],
@@ -679,7 +674,7 @@
                 url('changeset_home', repo_name=repo_name,
                     revision=_rev
                 ),
-                _('compare view')
+                _('Compare view')
             )
         )
 
@@ -723,8 +718,8 @@
 
     def get_fork_name():
         repo_name = action_params
-        _url = url('summary_home', repo_name=repo_name)
-        return _('fork name %s') % link_to(action_params, _url)
+        url_ = url('summary_home', repo_name=repo_name)
+        return _('Fork name %s') % link_to(action_params, url_)
 
     def get_user_name():
         user_name = action_params
@@ -736,12 +731,15 @@
 
     def get_pull_request():
         pull_request_id = action_params
+        nice_id = PullRequest.make_nice_id(pull_request_id)
+
         deleted = user_log.repository is None
         if deleted:
             repo_name = user_log.repository_name
         else:
             repo_name = user_log.repository.repo_name
-        return link_to(_('Pull request #%s') % pull_request_id,
+
+        return link_to(_('Pull request %s') % nice_id,
                     url('pullrequest_show', repo_name=repo_name,
                     pull_request_id=pull_request_id))
 
@@ -852,7 +850,7 @@
 
     #  here it makes sense to use style="width: ..." (instead of, say, a
     # stylesheet) because we using this to generate a high-res (retina) size
-    tmpl = """<img alt="gravatar" class="{cls}" style="width: {size}px; height: {size}px" src="{src}"/>"""
+    tmpl = '<img alt="" class="{cls}" style="width: {size}px; height: {size}px" src="{src}"/>'
 
     # if src is empty then there was no gravatar, so we use a font icon
     if not src:
@@ -940,32 +938,31 @@
         # and the currently displayed page range
         if leftmost_page - self.first_page > 1:
             # Wrap in a SPAN tag if nolink_attr is set
-            text = '..'
+            text_ = '..'
             if self.dotdot_attr:
-                text = HTML.span(c=text, **self.dotdot_attr)
-            nav_items.append(text)
+                text_ = HTML.span(c=text_, **self.dotdot_attr)
+            nav_items.append(text_)
 
         for thispage in xrange(leftmost_page, rightmost_page + 1):
             # Highlight the current page number and do not use a link
+            text_ = str(thispage)
             if thispage == self.page:
-                text = '%s' % (thispage,)
                 # Wrap in a SPAN tag if nolink_attr is set
                 if self.curpage_attr:
-                    text = HTML.span(c=text, **self.curpage_attr)
-                nav_items.append(text)
+                    text_ = HTML.span(c=text_, **self.curpage_attr)
+                nav_items.append(text_)
             # Otherwise create just a link to that page
             else:
-                text = '%s' % (thispage,)
-                nav_items.append(self._pagerlink(thispage, text))
+                nav_items.append(self._pagerlink(thispage, text_))
 
         # Insert dots if there are pages between the displayed
         # page numbers and the end of the page range
         if self.last_page - rightmost_page > 1:
-            text = '..'
+            text_ = '..'
             # Wrap in a SPAN tag if nolink_attr is set
             if self.dotdot_attr:
-                text = HTML.span(c=text, **self.dotdot_attr)
-            nav_items.append(text)
+                text_ = HTML.span(c=text_, **self.dotdot_attr)
+            nav_items.append(text_)
 
         # Create a link to the very last page (unless we are on the last
         # page or there would be no need to insert '..' spacers)
@@ -1128,7 +1125,7 @@
         return literal(pref + '<br/> '.join([safe_unicode(x.path)
                                              for x in nodes[:30]]) + suf)
     else:
-        return ': ' + _('No Files')
+        return ': ' + _('No files')
 
 
 def repo_link(groups_and_repos):
@@ -1213,7 +1210,7 @@
 
         #import ipdb;ipdb.set_trace()
         b_d = '<div class="bin bin%s %s" style="width:100%%">%s</div>' % (bin_op, cgen('a', a_v='', d_v=0), lbl)
-        b_a = '<div class="bin bin1" style="width:0%%"></div>'
+        b_a = '<div class="bin bin1" style="width:0%"></div>'
         return literal('<div style="width:%spx">%s%s</div>' % (width, b_a, b_d))
 
     t = stats['added'] + stats['deleted']
@@ -1243,21 +1240,26 @@
     return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
 
 
-def urlify_text(text_, safe=True):
+def _urlify_text(s):
     """
     Extract urls from text and make html links out of them
-
-    :param text_:
     """
-
     def url_func(match_obj):
-        url_full = match_obj.groups()[0]
+        url_full = match_obj.group(1)
         return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
-    _newtext = url_re.sub(url_func, text_)
-    if safe:
-        return literal(_newtext)
-    return _newtext
+    return url_re.sub(url_func, s)
 
+def urlify_text(s, truncate=None, stylize=False, truncatef=truncate):
+    """
+    Extract urls from text and make literal html links out of them
+    """
+    if truncate is not None:
+        s = truncatef(s, truncate)
+    s = html_escape(s)
+    if stylize:
+        s = desc_stylize(s)
+    s = _urlify_text(s)
+    return literal(s)
 
 def urlify_changesets(text_, repository):
     """
@@ -1298,14 +1300,13 @@
     :param repository:
     :param link_: changeset link
     """
-    def escaper(string):
-        return string.replace('<', '&lt;').replace('>', '&gt;')
+    newtext = html_escape(text_)
 
     # urlify changesets - extract revisions and make link out of them
-    newtext = urlify_changesets(escaper(text_), repository)
+    newtext = urlify_changesets(newtext, repository)
 
     # extract http/https links and make them real urls
-    newtext = urlify_text(newtext, safe=False)
+    newtext = _urlify_text(newtext)
 
     newtext = urlify_issues(newtext, repository, link_)
 
@@ -1323,19 +1324,19 @@
     ]
 
     if valid_indices:
-        log.debug('found issue server suffixes `%s` during valuation of: %s'
-                  % (','.join(valid_indices), newtext))
+        log.debug('found issue server suffixes `%s` during valuation of: %s',
+                  ','.join(valid_indices), newtext)
 
     for pattern_index in valid_indices:
         ISSUE_PATTERN = conf.get('issue_pat%s' % pattern_index)
         ISSUE_SERVER_LNK = conf.get('issue_server_link%s' % pattern_index)
         ISSUE_PREFIX = conf.get('issue_prefix%s' % pattern_index)
 
-        log.debug('pattern suffix `%s` PAT:%s SERVER_LINK:%s PREFIX:%s'
-                  % (pattern_index, ISSUE_PATTERN, ISSUE_SERVER_LNK,
-                     ISSUE_PREFIX))
+        log.debug('pattern suffix `%s` PAT:%s SERVER_LINK:%s PREFIX:%s',
+                  pattern_index, ISSUE_PATTERN, ISSUE_SERVER_LNK,
+                     ISSUE_PREFIX)
 
-        URL_PAT = re.compile(r'%s' % ISSUE_PATTERN)
+        URL_PAT = re.compile(ISSUE_PATTERN)
 
         def url_func(match_obj):
             pref = ''
@@ -1362,7 +1363,7 @@
                  'serv': ISSUE_SERVER_LNK,
                 }
         newtext = URL_PAT.sub(url_func, newtext)
-        log.debug('processed prefix:`%s` => %s' % (pattern_index, newtext))
+        log.debug('processed prefix:`%s` => %s', pattern_index, newtext)
 
     # if we actually did something above
     if link_:
--- a/kallithea/lib/hooks.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/hooks.py	Sun Sep 06 23:36:05 2015 +0200
@@ -157,10 +157,8 @@
 
 def log_push_action(ui, repo, **kwargs):
     """
-    Maps user last push action to new changeset id, from mercurial
-
-    :param ui:
-    :param repo: repo object containing the `ui` object
+    Register that changes have been pushed.
+    Mercurial invokes this directly as a hook, git uses handle_git_receive.
     """
 
     ex = _extract_extras()
@@ -369,13 +367,13 @@
     return 0
 
 
-handle_git_pre_receive = (lambda repo_path, revs, env:
-    handle_git_receive(repo_path, revs, env, hook_type='pre'))
-handle_git_post_receive = (lambda repo_path, revs, env:
-    handle_git_receive(repo_path, revs, env, hook_type='post'))
+def handle_git_pre_receive(repo_path, revs, env):
+    return handle_git_receive(repo_path, revs, env, hook_type='pre')
 
+def handle_git_post_receive(repo_path, revs, env):
+    return handle_git_receive(repo_path, revs, env, hook_type='post')
 
-def handle_git_receive(repo_path, revs, env, hook_type='post'):
+def handle_git_receive(repo_path, revs, env, hook_type):
     """
     A really hacky method that is run by git post-receive hook and logs
     an push action together with pushed revisions. It's executed by subprocess
@@ -447,21 +445,21 @@
                         repo._repo.refs.set_symbolic_ref('HEAD',
                                             'refs/heads/%s' % push_ref['name'])
 
-                    cmd = "for-each-ref --format='%(refname)' 'refs/heads/*'"
+                    cmd = ['for-each-ref', '--format=%(refname)','refs/heads/*']
                     heads = repo.run_git_command(cmd)[0]
+                    cmd = ['log', push_ref['new_rev'],
+                           '--reverse', '--pretty=format:%H', '--not']
                     heads = heads.replace(push_ref['ref'], '')
-                    heads = ' '.join(map(lambda c: c.strip('\n').strip(),
-                                         heads.splitlines()))
-                    cmd = (('log %(new_rev)s' % push_ref) +
-                           ' --reverse --pretty=format:"%H" --not ' + heads)
+                    for l in heads.splitlines():
+                        cmd.append(l.strip())
                     git_revs += repo.run_git_command(cmd)[0].splitlines()
 
                 elif push_ref['new_rev'] == EmptyChangeset().raw_id:
                     #delete branch case
                     git_revs += ['delete_branch=>%s' % push_ref['name']]
                 else:
-                    cmd = (('log %(old_rev)s..%(new_rev)s' % push_ref) +
-                           ' --reverse --pretty=format:"%H"')
+                    cmd = ['log', '%(old_rev)s..%(new_rev)s' % push_ref,
+                           '--reverse', '--pretty=format:%H']
                     git_revs += repo.run_git_command(cmd)[0].splitlines()
 
             elif _type == 'tags':
--- a/kallithea/lib/indexers/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/indexers/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.lib.indexers.__init__
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.indexers
+~~~~~~~~~~~~~~~~~~~~~~
 
 Whoosh indexing module for Kallithea
 
@@ -138,7 +138,7 @@
 
     def get_full_content(self, docid):
         res = self.searcher.stored_fields(docid[0])
-        log.debug('result: %s' % res)
+        log.debug('result: %s', res)
         if self.search_type == 'content':
             full_repo_path = jn(self.repo_location, res['repository'])
             f_path = res['path'].split(full_repo_path)[-1]
@@ -156,7 +156,7 @@
         elif self.search_type == 'message':
             res.update({'message_hl': self.highlight(res['message'])})
 
-        log.debug('result: %s' % res)
+        log.debug('result: %s', res)
 
         return res
 
--- a/kallithea/lib/indexers/daemon.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/indexers/daemon.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 
 import os
 import sys
@@ -182,11 +181,11 @@
                             'replacing with empty content' % path)
                 u_content = u''
             else:
-                log.debug('    >> %s [WITH CONTENT]' % path)
+                log.debug('    >> %s [WITH CONTENT]', path)
                 indexed_w_content += 1
 
         else:
-            log.debug('    >> %s' % path)
+            log.debug('    >> %s', path)
             # just index file name without it's content
             u_content = u''
             indexed += 1
@@ -221,14 +220,14 @@
         if start_rev is None:
             start_rev = repo[0].raw_id
 
-        log.debug('indexing changesets in %s starting at rev: %s' %
-                  (repo_name, start_rev))
+        log.debug('indexing changesets in %s starting at rev: %s',
+                  repo_name, start_rev)
 
         indexed = 0
         cs_iter = repo.get_changesets(start=start_rev)
         total = len(cs_iter)
         for cs in cs_iter:
-            log.debug('    >> %s/%s' % (cs, total))
+            log.debug('    >> %s/%s', cs, total)
             writer.add_document(
                 raw_id=unicode(cs.raw_id),
                 owner=unicode(repo.contact),
@@ -244,7 +243,7 @@
             )
             indexed += 1
 
-        log.debug('indexed %d changesets for repo %s' % (indexed, repo_name))
+        log.debug('indexed %d changesets for repo %s', indexed, repo_name)
         return indexed
 
     def index_files(self, file_idx_writer, repo_name, repo):
@@ -256,16 +255,16 @@
         :param repo: instance of vcs repo
         """
         i_cnt = iwc_cnt = 0
-        log.debug('building index for %s @revision:%s' % (repo.path,
-                                                self._get_index_revision(repo)))
+        log.debug('building index for %s @revision:%s', repo.path,
+                                                self._get_index_revision(repo))
         index_rev = self._get_index_revision(repo)
         for idx_path in self.get_paths(repo):
             i, iwc = self.add_doc(file_idx_writer, idx_path, repo, repo_name, index_rev)
             i_cnt += i
             iwc_cnt += iwc
 
-        log.debug('added %s files %s with content for repo %s' %
-                  (i_cnt + iwc_cnt, iwc_cnt, repo.path))
+        log.debug('added %s files %s with content for repo %s',
+                  i_cnt + iwc_cnt, iwc_cnt, repo.path)
         return i_cnt, iwc_cnt
 
     def update_changeset_index(self):
@@ -311,8 +310,8 @@
                         indexed_total += self.index_changesets(writer,
                                                 repo_name, repo, start_id)
                         writer_is_dirty = True
-                log.debug('indexed %s changesets for repo %s' % (
-                          indexed_total, repo_name)
+                log.debug('indexed %s changesets for repo %s',
+                          indexed_total, repo_name
                 )
             finally:
                 if writer_is_dirty:
@@ -357,8 +356,8 @@
                             # The file has changed, delete it and add it to
                             # the list of files to reindex
                             log.debug(
-                                'adding to reindex list %s mtime: %s vs %s' % (
-                                    indexed_path, mtime, indexed_time)
+                                'adding to reindex list %s mtime: %s vs %s',
+                                    indexed_path, mtime, indexed_time
                             )
                             writer.delete_by_term('fileid', indexed_path)
                             writer_is_dirty = True
@@ -366,7 +365,7 @@
                             to_index.add(indexed_path)
                     except (ChangesetError, NodeDoesNotExistError):
                         # This file was deleted since it was indexed
-                        log.debug('removing from index %s' % indexed_path)
+                        log.debug('removing from index %s', indexed_path)
                         writer.delete_by_term('path', indexed_path)
                         writer_is_dirty = True
 
@@ -389,16 +388,16 @@
                         # that wasn't indexed before. So index it!
                         i, iwc = self.add_doc(writer, path, repo, repo_name)
                         writer_is_dirty = True
-                        log.debug('re indexing %s' % path)
+                        log.debug('re indexing %s', path)
                         ri_cnt += i
                         ri_cnt_total += 1
                         riwc_cnt += iwc
                         riwc_cnt_total += iwc
-                log.debug('added %s files %s with content for repo %s' % (
-                             ri_cnt + riwc_cnt, riwc_cnt, repo.path)
+                log.debug('added %s files %s with content for repo %s',
+                             ri_cnt + riwc_cnt, riwc_cnt, repo.path
                 )
-            log.debug('indexed %s files in total and %s with content' % (
-                        ri_cnt_total, riwc_cnt_total)
+            log.debug('indexed %s files in total and %s with content',
+                        ri_cnt_total, riwc_cnt_total
             )
         finally:
             if writer_is_dirty:
--- a/kallithea/lib/ipaddr.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/ipaddr.py	Sun Sep 06 23:36:05 2015 +0200
@@ -514,7 +514,7 @@
         return '%s(%r)' % (self.__class__.__name__, str(self))
 
     def __str__(self):
-        return  '%s' % self._string_from_ip_int(self._ip)
+        return self._string_from_ip_int(self._ip)
 
     def __hash__(self):
         return hash(hex(long(self._ip)))
--- a/kallithea/lib/markup_renderer.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/markup_renderer.py	Sun Sep 06 23:36:05 2015 +0200
@@ -36,7 +36,7 @@
 
 
 url_re = re.compile(r'''(\bhttps?://(?:[\da-zA-Z0-9@:.-]+)'''
-                    r'''(?:[/a-zA-Z0-9_=@#~&+%.,:?!*()-]*[/a-zA-Z0-9_=@#~])?)''')
+                    r'''(?:[/a-zA-Z0-9_=@#~&+%.,:;?!*()-]*[/a-zA-Z0-9_=@#~])?)''')
 
 class MarkupRenderer(object):
     RESTRUCTUREDTEXT_DISALLOWED_DIRECTIVES = ['include', 'meta', 'raw']
--- a/kallithea/lib/middleware/pygrack.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/middleware/pygrack.py	Sun Sep 06 23:36:05 2015 +0200
@@ -69,7 +69,7 @@
 
         git_command = request.GET.get('service')
         if git_command not in self.commands:
-            log.debug('command %s not allowed' % git_command)
+            log.debug('command %s not allowed', git_command)
             return exc.HTTPMethodNotAllowed()
 
         # note to self:
@@ -82,15 +82,14 @@
         server_advert = '# service=%s' % git_command
         packet_len = str(hex(len(server_advert) + 4)[2:].rjust(4, '0')).lower()
         _git_path = kallithea.CONFIG.get('git_path', 'git')
+        cmd = [_git_path, git_command[4:],
+               '--stateless-rpc', '--advertise-refs', self.content_path]
+        log.debug('handling cmd %s', cmd)
         try:
-            out = subprocessio.SubprocessIOChunker(
-                r'%s %s --stateless-rpc --advertise-refs "%s"' % (
-                    _git_path, git_command[4:], self.content_path),
-                starting_values=[
-                    packet_len + server_advert + '0000'
-                ]
+            out = subprocessio.SubprocessIOChunker(cmd,
+                starting_values=[packet_len + server_advert + '0000']
             )
-        except EnvironmentError, e:
+        except EnvironmentError as e:
             log.error(traceback.format_exc())
             raise exc.HTTPExpectationFailed()
         resp = Response()
@@ -109,7 +108,7 @@
         _git_path = kallithea.CONFIG.get('git_path', 'git')
         git_command = self._get_fixedpath(request.path_info)
         if git_command not in self.commands:
-            log.debug('command %s not allowed' % git_command)
+            log.debug('command %s not allowed', git_command)
             return exc.HTTPMethodNotAllowed()
 
         if 'CONTENT_LENGTH' in environ:
@@ -118,23 +117,19 @@
         else:
             inputstream = environ['wsgi.input']
 
+        gitenv = dict(os.environ)
+        # forget all configs
+        gitenv['GIT_CONFIG_NOGLOBAL'] = '1'
+        cmd = [_git_path, git_command[4:], '--stateless-rpc', self.content_path]
+        log.debug('handling cmd %s', cmd)
         try:
-            gitenv = os.environ
-            # forget all configs
-            gitenv['GIT_CONFIG_NOGLOBAL'] = '1'
-            opts = dict(
+            out = subprocessio.SubprocessIOChunker(
+                cmd,
+                inputstream=inputstream,
                 env=gitenv,
                 cwd=self.content_path,
             )
-            cmd = r'%s %s --stateless-rpc "%s"' % (_git_path, git_command[4:],
-                                                   self.content_path),
-            log.debug('handling cmd %s' % cmd)
-            out = subprocessio.SubprocessIOChunker(
-                cmd,
-                inputstream=inputstream,
-                **opts
-            )
-        except EnvironmentError, e:
+        except EnvironmentError as e:
             log.error(traceback.format_exc())
             raise exc.HTTPExpectationFailed()
 
@@ -162,10 +157,10 @@
             app = self.backend
         try:
             resp = app(request, environ)
-        except exc.HTTPException, e:
+        except exc.HTTPException as e:
             resp = e
             log.error(traceback.format_exc())
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
             resp = exc.HTTPInternalServerError()
         return resp(environ, start_response)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/lib/middleware/sessionmiddleware.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+kallithea.lib.middleware.sessionmiddleware
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+session management middleware
+
+This file overrides Beaker's built-in SessionMiddleware
+class to automagically use secure cookies over HTTPS.
+
+Original Beaker SessionMiddleware class written by Ben Bangert
+"""
+
+from beaker.session import SessionObject
+from beaker.middleware import SessionMiddleware
+
+class SecureSessionMiddleware(SessionMiddleware):
+    def __call__(self, environ, start_response):
+        """
+        This function's implementation is taken directly from Beaker,
+        with HTTPS detection added. When accessed over HTTPS, force
+        setting cookie's secure flag.
+
+        The only difference from that original code is that we switch
+        the secure option on and off depending on the URL scheme (first
+        two lines). To avoid concurrency issues, we use a local options
+        variable.
+        """
+        options = dict(self.options)
+        options["secure"] = environ['wsgi.url_scheme'] == 'https'
+
+        session = SessionObject(environ, **options)
+        if environ.get('paste.registry'):
+            if environ['paste.registry'].reglist:
+                environ['paste.registry'].register(self.session, session)
+        environ[self.environ_key] = session
+        environ['beaker.get_session'] = self._get_session
+
+        if 'paste.testing_variables' in environ and 'webtest_varname' in options:
+            environ['paste.testing_variables'][options['webtest_varname']] = session
+
+        def session_start_response(status, headers, exc_info=None):
+            if session.accessed():
+                session.persist()
+                if session.__dict__['_headers']['set_cookie']:
+                    cookie = session.__dict__['_headers']['cookie_out']
+                    if cookie:
+                        headers.append(('Set-cookie', cookie))
+            return start_response(status, headers, exc_info)
+        return self.wrap_app(environ, session_start_response)
--- a/kallithea/lib/middleware/simplegit.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/middleware/simplegit.py	Sun Sep 06 23:36:05 2015 +0200
@@ -40,7 +40,7 @@
 
 from kallithea.lib.utils2 import safe_str, fix_PATH, get_server_url,\
     _set_extras
-from kallithea.lib.base import BaseVCSController
+from kallithea.lib.base import BaseVCSController, WSGIResultCloseCallback
 from kallithea.lib.utils import make_ui, is_valid_repo
 from kallithea.lib.exceptions import HTTPLockedRC
 from kallithea.lib.hooks import pre_pull
@@ -55,8 +55,8 @@
 def is_git(environ):
     path_info = environ['PATH_INFO']
     isgit_path = GIT_PROTO_PAT.match(path_info)
-    log.debug('pathinfo: %s detected as Git %s' % (
-        path_info, isgit_path is not None)
+    log.debug('pathinfo: %s detected as Git %s',
+        path_info, isgit_path is not None
     )
     return isgit_path
 
@@ -80,7 +80,7 @@
         #======================================================================
         try:
             repo_name = self.__get_repository(environ)
-            log.debug('Extracted repo name is %s' % repo_name)
+            log.debug('Extracted repo name is %s', repo_name)
         except Exception:
             return HTTPInternalServerError()(environ, start_response)
 
@@ -124,9 +124,9 @@
                 # try to auth based on environ, container auth methods
                 log.debug('Running PRE-AUTH for container based authentication')
                 pre_auth = auth_modules.authenticate('', '', environ)
-                if pre_auth and pre_auth.get('username'):
+                if pre_auth is not None and pre_auth.get('username'):
                     username = pre_auth['username']
-                log.debug('PRE-AUTH got %s as username' % username)
+                log.debug('PRE-AUTH got %s as username', username)
 
                 # If not authenticated by the container, running basic auth
                 if not username:
@@ -178,7 +178,7 @@
         #===================================================================
         str_repo_name = safe_str(repo_name)
         repo_path = os.path.join(safe_str(self.basepath),str_repo_name)
-        log.debug('Repository path is %s' % repo_path)
+        log.debug('Repository path is %s', repo_path)
 
         # CHECK LOCKING only if it's not ANONYMOUS USER
         if username != User.DEFAULT_USER:
@@ -194,27 +194,27 @@
                            'locked_by': locked_by})
 
         fix_PATH()
-        log.debug('HOOKS extras is %s' % extras)
+        log.debug('HOOKS extras is %s', extras)
         baseui = make_ui('db')
         self.__inject_extras(repo_path, baseui, extras)
 
         try:
             self._handle_githooks(repo_name, action, baseui, environ)
-            log.info('%s action on Git repo "%s" by "%s" from %s' %
-                     (action, str_repo_name, safe_str(username), ip_addr))
+            log.info('%s action on Git repo "%s" by "%s" from %s',
+                     action, str_repo_name, safe_str(username), ip_addr)
             app = self.__make_app(repo_name, repo_path, extras)
-            return app(environ, start_response)
-        except HTTPLockedRC, e:
+            result = app(environ, start_response)
+            if action == 'push':
+                result = WSGIResultCloseCallback(result,
+                    lambda: self._invalidate_cache(repo_name))
+            return result
+        except HTTPLockedRC as e:
             _code = CONFIG.get('lock_ret_code')
-            log.debug('Repository LOCKED ret code %s!' % (_code))
+            log.debug('Repository LOCKED ret code %s!', _code)
             return e(environ, start_response)
         except Exception:
             log.error(traceback.format_exc())
             return HTTPInternalServerError()(environ, start_response)
-        finally:
-            # invalidate cache on push
-            if action == 'push':
-                self._invalidate_cache(repo_name)
 
     def __make_app(self, repo_name, repo_path, extras):
         """
--- a/kallithea/lib/middleware/simplehg.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/middleware/simplehg.py	Sun Sep 06 23:36:05 2015 +0200
@@ -39,7 +39,7 @@
 
 from kallithea.lib.utils2 import safe_str, fix_PATH, get_server_url,\
     _set_extras
-from kallithea.lib.base import BaseVCSController
+from kallithea.lib.base import BaseVCSController, WSGIResultCloseCallback
 from kallithea.lib.utils import make_ui, is_valid_repo, ui_sections
 from kallithea.lib.vcs.utils.hgcompat import RepoError, hgweb_mod
 from kallithea.lib.exceptions import HTTPLockedRC
@@ -60,8 +60,8 @@
     else:
         ishg_path = False
 
-    log.debug('pathinfo: %s detected as Mercurial %s' % (
-        path_info, ishg_path)
+    log.debug('pathinfo: %s detected as Mercurial %s',
+        path_info, ishg_path
     )
     return ishg_path
 
@@ -84,7 +84,7 @@
         #======================================================================
         try:
             repo_name = environ['REPO_NAME'] = self.__get_repository(environ)
-            log.debug('Extracted repo name is %s' % repo_name)
+            log.debug('Extracted repo name is %s', repo_name)
         except Exception:
             return HTTPInternalServerError()(environ, start_response)
 
@@ -128,9 +128,9 @@
                 # try to auth based on environ, container auth methods
                 log.debug('Running PRE-AUTH for container based authentication')
                 pre_auth = auth_modules.authenticate('', '', environ)
-                if pre_auth and pre_auth.get('username'):
+                if pre_auth is not None and pre_auth.get('username'):
                     username = pre_auth['username']
-                log.debug('PRE-AUTH got %s as username' % username)
+                log.debug('PRE-AUTH got %s as username', username)
 
                 # If not authenticated by the container, running basic auth
                 if not username:
@@ -181,7 +181,7 @@
         #======================================================================
         str_repo_name = safe_str(repo_name)
         repo_path = os.path.join(safe_str(self.basepath), str_repo_name)
-        log.debug('Repository path is %s' % repo_path)
+        log.debug('Repository path is %s', repo_path)
 
         # CHECK LOCKING only if it's not ANONYMOUS USER
         if username != User.DEFAULT_USER:
@@ -197,29 +197,29 @@
                            'locked_by': locked_by})
 
         fix_PATH()
-        log.debug('HOOKS extras is %s' % extras)
+        log.debug('HOOKS extras is %s', extras)
         baseui = make_ui('db')
         self.__inject_extras(repo_path, baseui, extras)
 
         try:
-            log.info('%s action on Mercurial repo "%s" by "%s" from %s' %
-                     (action, str_repo_name, safe_str(username), ip_addr))
+            log.info('%s action on Mercurial repo "%s" by "%s" from %s',
+                     action, str_repo_name, safe_str(username), ip_addr)
             app = self.__make_app(repo_path, baseui, extras)
-            return app(environ, start_response)
-        except RepoError, e:
+            result = app(environ, start_response)
+            if action == 'push':
+                result = WSGIResultCloseCallback(result,
+                    lambda: self._invalidate_cache(repo_name))
+            return result
+        except RepoError as e:
             if str(e).find('not found') != -1:
                 return HTTPNotFound()(environ, start_response)
-        except HTTPLockedRC, e:
+        except HTTPLockedRC as e:
             _code = CONFIG.get('lock_ret_code')
-            log.debug('Repository LOCKED ret code %s!' % (_code))
+            log.debug('Repository LOCKED ret code %s!', _code)
             return e(environ, start_response)
         except Exception:
             log.error(traceback.format_exc())
             return HTTPInternalServerError()(environ, start_response)
-        finally:
-            # invalidate cache on push
-            if action == 'push':
-                self._invalidate_cache(repo_name)
 
     def __make_app(self, repo_name, baseui, extras):
         """
--- a/kallithea/lib/paster_commands/cache_keys.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/paster_commands/cache_keys.py	Sun Sep 06 23:36:05 2015 +0200
@@ -26,7 +26,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 
 import os
 import sys
--- a/kallithea/lib/paster_commands/cleanup.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/paster_commands/cleanup.py	Sun Sep 06 23:36:05 2015 +0200
@@ -26,7 +26,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 
 import os
 import sys
@@ -86,7 +85,7 @@
 
         repos_location = Ui.get_repos_location()
         to_remove = []
-        for dn, dirs, f in os.walk(safe_str(repos_location)):
+        for dn_, dirs, f in os.walk(safe_str(repos_location)):
             alldirs = list(dirs)
             del dirs[:]
             if ('.hg' in alldirs or
@@ -94,7 +93,7 @@
                 continue
             for loc in alldirs:
                 if REMOVED_REPO_PAT.match(loc):
-                    to_remove.append([os.path.join(dn, loc),
+                    to_remove.append([os.path.join(dn_, loc),
                                       self._extract_date(loc)])
                 else:
                     dirs.append(loc)
--- a/kallithea/lib/paster_commands/ishell.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/paster_commands/ishell.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 
 import os
 import sys
--- a/kallithea/lib/paster_commands/make_index.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/paster_commands/make_index.py	Sun Sep 06 23:36:05 2015 +0200
@@ -26,7 +26,6 @@
 
 """
 
-from __future__ import with_statement
 
 import os
 import sys
--- a/kallithea/lib/paster_commands/make_rcextensions.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/paster_commands/make_rcextensions.py	Sun Sep 06 23:36:05 2015 +0200
@@ -26,11 +26,9 @@
 
 """
 
-from __future__ import with_statement
 
 import os
 import sys
-import logging
 import pkg_resources
 
 from kallithea.lib.utils import BasePasterCommand, ask_ok
@@ -40,46 +38,44 @@
 rc_path = dn(dn(dn(os.path.realpath(__file__))))
 sys.path.append(rc_path)
 
-log = logging.getLogger(__name__)
-
 
 class Command(BasePasterCommand):
 
     max_args = 1
     min_args = 1
 
-    usage = "CONFIG_FILE"
     group_name = "Kallithea"
     takes_config_file = -1
     parser = BasePasterCommand.standard_parser(verbose=True)
-    summary = "Creates additional extensions for kallithea"
+    summary = "Write template file for extending Kallithea in Python."
+    usage = "CONFIG_FILE"
+    description = '''\
+        A rcextensions directory with a __init__.py file will be created next to
+        the ini file. Local customizations in that file will survive upgrades.
+        The file contains instructions on how it can be customized.
+        '''
 
     def command(self):
-        logging.config.fileConfig(self.path_to_ini_file)
         from pylons import config
 
-        def _make_file(ext_file, tmpl):
-            bdir = os.path.split(ext_file)[0]
-            if not os.path.isdir(bdir):
-                os.makedirs(bdir)
-            with open(ext_file, 'wb') as f:
-                f.write(tmpl)
-                log.info('Writen new extensions file to %s' % ext_file)
-
         here = config['here']
-        tmpl = pkg_resources.resource_string(
+        content = pkg_resources.resource_string(
             'kallithea', os.path.join('config', 'rcextensions', '__init__.py')
         )
         ext_file = os.path.join(here, 'rcextensions', '__init__.py')
         if os.path.exists(ext_file):
             msg = ('Extension file already exists, do you want '
                    'to overwrite it ? [y/n]')
-            if ask_ok(msg):
-                _make_file(ext_file, tmpl)
-            else:
-                log.info('nothing done...')
-        else:
-            _make_file(ext_file, tmpl)
+            if not ask_ok(msg):
+                print 'Nothing done...'
+                return
+
+        dirname = os.path.dirname(ext_file)
+        if not os.path.isdir(dirname):
+            os.makedirs(dirname)
+        with open(ext_file, 'wb') as f:
+            f.write(content)
+            print 'Wrote new extensions file to %s' % ext_file
 
     def update_parser(self):
         pass
--- a/kallithea/lib/paster_commands/repo_scan.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/paster_commands/repo_scan.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.lib.paster_commands.make_rcextensions
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.lib.paster_commands.repo_scan
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 repo-scan paster command for Kallithea
 
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 
 import os
 import sys
@@ -62,7 +61,7 @@
                                         remove_obsolete=rm_obsolete)
         added = ', '.join(added) or '-'
         removed = ', '.join(removed) or '-'
-        log.info('Scan completed added: %s removed: %s' % (added, removed))
+        log.info('Scan completed added: %s removed: %s', added, removed)
 
     def update_parser(self):
         self.parser.add_option(
--- a/kallithea/lib/paster_commands/update_repoinfo.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/paster_commands/update_repoinfo.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 
 import os
 import sys
--- a/kallithea/lib/pidlock.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/pidlock.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,7 +12,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from __future__ import with_statement
 import os
 import errno
 
@@ -62,7 +61,7 @@
         locking function, if lock is present it
         will raise LockHeld exception
         """
-        lockname = '%s' % (os.getpid())
+        lockname = str(os.getpid())
         if self.debug:
             print 'running lock'
         self.trylock()
@@ -88,7 +87,7 @@
             if running_pid:
                 try:
                     kill(running_pid, 0)
-                except OSError, exc:
+                except OSError as exc:
                     if exc.errno in (errno.ESRCH, errno.EPERM):
                         print ("Lock File is there but"
                                " the program is not running")
@@ -101,7 +100,7 @@
                     print "It is running as process %s" % running_pid
                     raise LockHeld()
 
-        except IOError, e:
+        except IOError as e:
             if e.errno != 2:
                 raise
 
@@ -121,7 +120,7 @@
                 print 'removing pidfile %s' % self.pidfile
             os.remove(self.pidfile)
             self.held = False
-        except OSError, e:
+        except OSError as e:
             if self.debug:
                 print 'removing pidfile failed %s' % e
             pass
--- a/kallithea/lib/profiler.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/profiler.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 
 import objgraph
 import cProfile
--- a/kallithea/lib/rcmail/response.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/rcmail/response.py	Sun Sep 06 23:36:05 2015 +0200
@@ -338,7 +338,7 @@
 
     try:
         out = MIMEPart(ctype, **params)
-    except TypeError, exc:  # pragma: no cover
+    except TypeError as exc:  # pragma: no cover
         raise EncodingError("Content-Type malformed, not allowed: %r; "
                             "%r (Python ERROR: %s" %
                             (ctype, params, exc.message))
--- a/kallithea/lib/recaptcha.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/recaptcha.py	Sun Sep 06 23:36:05 2015 +0200
@@ -55,7 +55,7 @@
     recaptcha_challenge_field -- The value of recaptcha_challenge_field from the form
     recaptcha_response_field -- The value of recaptcha_response_field from the form
     private_key -- your reCAPTCHA private key
-    remoteip -- the user's ip address
+    remoteip -- the user's IP address
     """
 
     if not (recaptcha_response_field and recaptcha_challenge_field and
--- a/kallithea/lib/utils.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/utils.py	Sun Sep 06 23:36:05 2015 +0200
@@ -50,11 +50,9 @@
 from kallithea.lib.vcs.utils.helpers import get_scm
 from kallithea.lib.vcs.exceptions import VCSError
 
-from kallithea.lib.caching_query import FromCache
-
 from kallithea.model import meta
 from kallithea.model.db import Repository, User, Ui, \
-    UserLog, RepoGroup, Setting, CacheInvalidation, UserGroup
+    UserLog, RepoGroup, Setting, UserGroup
 from kallithea.model.meta import Session
 from kallithea.model.repo_group import RepoGroupModel
 from kallithea.lib.utils2 import safe_str, safe_unicode, get_current_authuser
@@ -161,7 +159,7 @@
         easy translations
     :param repo: string name of repository or object containing repo_id,
         that action was made on
-    :param ipaddr: optional ip address from what the action was made
+    :param ipaddr: optional IP address from what the action was made
     :param sa: optional sqlalchemy session
 
     """
@@ -202,8 +200,8 @@
     user_log.user_ip = ipaddr
     sa.add(user_log)
 
-    log.info('Logging action:%s on %s by user:%s ip:%s' %
-             (action, safe_unicode(repo), user_obj, ipaddr))
+    log.info('Logging action:%s on %s by user:%s ip:%s',
+             action, safe_unicode(repo), user_obj, ipaddr)
     if commit:
         sa.commit()
 
@@ -218,14 +216,14 @@
 
     # remove ending slash for better results
     path = path.rstrip(os.sep)
-    log.debug('now scanning in %s location recursive:%s...' % (path, recursive))
+    log.debug('now scanning in %s location recursive:%s...', path, recursive)
 
     def _get_repos(p):
         if not os.access(p, os.R_OK) or not os.access(p, os.X_OK):
-            log.warning('ignoring repo path without access: %s' % (p,))
+            log.warning('ignoring repo path without access: %s', p)
             return
         if not os.access(p, os.W_OK):
-            log.warning('repo path without write access: %s' % (p,))
+            log.warning('repo path without write access: %s', p)
         for dirpath in os.listdir(p):
             if os.path.isfile(os.path.join(p, dirpath)):
                 continue
@@ -350,14 +348,14 @@
 
     if read_from == 'file':
         if not os.path.isfile(path):
-            log.debug('hgrc file is not present at %s, skipping...' % path)
+            log.debug('hgrc file is not present at %s, skipping...', path)
             return False
-        log.debug('reading hgrc from %s' % path)
+        log.debug('reading hgrc from %s', path)
         cfg = config.config()
         cfg.read(path)
         for section in ui_sections:
             for k, v in cfg.items(section):
-                log.debug('settings ui from file: [%s] %s=%s' % (section, k, v))
+                log.debug('settings ui from file: [%s] %s=%s', section, k, v)
                 baseui.setconfig(safe_str(section), safe_str(k), safe_str(v))
 
     elif read_from == 'db':
@@ -407,7 +405,6 @@
 
     :param config: kallithea.CONFIG
     """
-    import kallithea
     from kallithea.lib.vcs import conf
     from kallithea.lib.utils2 import aslist
     conf.settings.BACKENDS = {
@@ -448,8 +445,8 @@
             break
 
         if group is None:
-            log.debug('creating group level: %s group_name: %s'
-                      % (lvl, group_name))
+            log.debug('creating group level: %s group_name: %s',
+                      lvl, group_name)
             group = RepoGroup(group_name, parent)
             group.group_description = desc
             group.user = owner
@@ -463,7 +460,7 @@
 
 
 def repo2db_mapper(initial_repo_list, remove_obsolete=False,
-                   install_git_hook=False, user=None):
+                   install_git_hooks=False, user=None, overwrite_git_hooks=False):
     """
     maps all repos given in initial_repo_list, non existing repositories
     are created, if remove_obsolete is True it also check for db entries
@@ -471,8 +468,10 @@
 
     :param initial_repo_list: list of repositories found by scanning methods
     :param remove_obsolete: check for obsolete entries in database
-    :param install_git_hook: if this is True, also check and install githook
+    :param install_git_hooks: if this is True, also check and install git hook
         for a repo if missing
+    :param overwrite_git_hooks: if this is True, overwrite any existing git hooks
+        that may be encountered (even if user-deployed)
     """
     from kallithea.model.repo import RepoModel
     from kallithea.model.scm import ScmModel
@@ -495,7 +494,7 @@
         db_repo = repo_model.get_by_repo_name(unicode_name)
         # found repo that is on filesystem not in Kallithea database
         if not db_repo:
-            log.info('repository %s not found, creating now' % name)
+            log.info('repository %s not found, creating now', name)
             added.append(name)
             desc = (repo.description
                     if repo.description != 'unknown'
@@ -518,21 +517,21 @@
             # installed, and updated server info
             if new_repo.repo_type == 'git':
                 git_repo = new_repo.scm_instance
-                ScmModel().install_git_hook(git_repo)
+                ScmModel().install_git_hooks(git_repo)
                 # update repository server-info
                 log.debug('Running update server info')
                 git_repo._update_server_info()
             new_repo.update_changeset_cache()
-        elif install_git_hook:
+        elif install_git_hooks:
             if db_repo.repo_type == 'git':
-                ScmModel().install_git_hook(db_repo.scm_instance)
+                ScmModel().install_git_hooks(db_repo.scm_instance, force_create=overwrite_git_hooks)
 
     removed = []
     # remove from database those repositories that are not in the filesystem
     for repo in sa.query(Repository).all():
         if repo.repo_name not in initial_repo_list.keys():
             if remove_obsolete:
-                log.debug("Removing non-existing repository found in db `%s`" %
+                log.debug("Removing non-existing repository found in db `%s`",
                           repo.repo_name)
                 try:
                     RepoModel(sa).delete(repo, forks='detach', fs_remove=False)
@@ -581,7 +580,7 @@
     if os.path.isfile(path):
         rcext = create_module('rc', path)
         EXT = kallithea.EXTENSIONS = rcext
-        log.debug('Found rcextensions now loading %s...' % rcext)
+        log.debug('Found rcextensions now loading %s...', rcext)
 
         # Additional mappings that are not present in the pygments lexers
         conf.LANGUAGES_EXTENSIONS_MAP.update(getattr(EXT, 'EXTRA_MAPPINGS', {}))
@@ -657,11 +656,11 @@
 
     # PART ONE create db
     dbconf = config['sqlalchemy.db1.url']
-    log.debug('making test db %s' % dbconf)
+    log.debug('making test db %s', dbconf)
 
     # create test dir if it doesn't exist
     if not os.path.isdir(repos_test_path):
-        log.debug('Creating testdir %s' % repos_test_path)
+        log.debug('Creating testdir %s', repos_test_path)
         os.makedirs(repos_test_path)
 
     dbmanage = DbManage(log_sql=True, dbconf=dbconf, root=config['here'],
@@ -682,11 +681,11 @@
 
     #clean index and data
     if idx_path and os.path.exists(idx_path):
-        log.debug('remove %s' % idx_path)
+        log.debug('remove %s', idx_path)
         shutil.rmtree(idx_path)
 
     if data_path and os.path.exists(data_path):
-        log.debug('remove %s' % data_path)
+        log.debug('remove %s', data_path)
         shutil.rmtree(data_path)
 
     #CREATE DEFAULT TEST REPOS
@@ -799,7 +798,7 @@
     if 'git' not in BACKENDS:
         return None
 
-    stdout, stderr = GitRepository._run_git_command('--version', _bare=True,
+    stdout, stderr = GitRepository._run_git_command(['--version'], _bare=True,
                                                     _safe=True)
 
     m = re.search("\d+.\d+.\d+", stdout)
@@ -810,10 +809,10 @@
 
     req_ver = StrictVersion('1.7.4')
 
-    log.debug('Git executable: "%s" version %s detected: %s'
-              % (settings.GIT_EXECUTABLE_PATH, ver, stdout))
+    log.debug('Git executable: "%s" version %s detected: %s',
+              settings.GIT_EXECUTABLE_PATH, ver, stdout)
     if stderr:
-        log.warning('Error detecting git version: %r' % stderr)
+        log.warning('Error detecting git version: %r', stderr)
     elif ver < req_ver:
         log.warning('Kallithea detected git version %s, which is too old '
                     'for the system to function properly. '
--- a/kallithea/lib/utils2.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/utils2.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.lib.utils
-~~~~~~~~~~~~~~~~~~~
+kallithea.lib.utils2
+~~~~~~~~~~~~~~~~~~~~
 
 Some simple helper functions
 
@@ -433,17 +433,17 @@
 
         if sub_value == 0 or show_short_version:
             if future:
-                return _(u'in %s') % fmt_funcs[part](value)
+                return _('in %s') % fmt_funcs[part](value)
             else:
-                return _(u'%s ago') % fmt_funcs[part](value)
+                return _('%s ago') % fmt_funcs[part](value)
         if future:
-            return _(u'in %s and %s') % (fmt_funcs[part](value),
+            return _('in %s and %s') % (fmt_funcs[part](value),
                 fmt_funcs[sub_part](sub_value))
         else:
-            return _(u'%s and %s ago') % (fmt_funcs[part](value),
+            return _('%s and %s ago') % (fmt_funcs[part](value),
                 fmt_funcs[sub_part](sub_value))
 
-    return _(u'just now')
+    return _('just now')
 
 
 def uri_filter(uri):
@@ -459,7 +459,7 @@
 
     proto = ''
 
-    for pat in ('https://', 'http://'):
+    for pat in ('https://', 'http://', 'git://'):
         if uri.startswith(pat):
             uri = uri[len(pat):]
             proto = pat
@@ -493,8 +493,8 @@
     return ''.join(uri)
 
 
-def get_clone_url(uri_tmpl, qualifed_home_url, repo_name, repo_id, **override):
-    parsed_url = urlobject.URLObject(qualifed_home_url)
+def get_clone_url(uri_tmpl, qualified_home_url, repo_name, repo_id, **override):
+    parsed_url = urlobject.URLObject(qualified_home_url)
     decoded_path = safe_unicode(urllib.unquote(parsed_url.path.rstrip('/')))
     args = {
         'scheme': parsed_url.scheme,
@@ -615,25 +615,25 @@
 
 def _extract_extras(env=None):
     """
-    Extracts the rc extras data from os.environ, and wraps it into named
+    Extracts the Kallithea extras data from os.environ, and wraps it into named
     AttributeDict object
     """
     if not env:
         env = os.environ
 
     try:
-        rc_extras = json.loads(env['KALLITHEA_EXTRAS'])
+        extras = json.loads(env['KALLITHEA_EXTRAS'])
     except KeyError:
-        rc_extras = {}
+        extras = {}
 
     try:
         for k in ['username', 'repository', 'locked_by', 'scm', 'make_lock',
                   'action', 'ip']:
-            rc_extras[k]
-    except KeyError, e:
-        raise Exception('Missing key %s in os.environ %s' % (e, rc_extras))
+            extras[k]
+    except KeyError as e:
+        raise Exception('Missing key %s in os.environ %s' % (e, extras))
 
-    return AttributeDict(rc_extras)
+    return AttributeDict(extras)
 
 
 def _set_extras(extras):
--- a/kallithea/lib/vcs/backends/base.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/backends/base.py	Sun Sep 06 23:36:05 2015 +0200
@@ -127,7 +127,7 @@
                     for f in files:
                         size += tip.get_file_size(f.path)
 
-        except RepositoryError, e:
+        except RepositoryError as e:
             pass
         return size
 
@@ -667,6 +667,10 @@
     def closesbranch(self):
         return False
 
+    @LazyProperty
+    def obsolete(self):
+        return False
+
 class BaseWorkdir(object):
     """
     Working directory representation of single repository.
--- a/kallithea/lib/vcs/backends/git/changeset.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/backends/git/changeset.py	Sun Sep 06 23:36:05 2015 +0200
@@ -10,7 +10,7 @@
     ChangesetDoesNotExistError, ImproperArchiveTypeError
 )
 from kallithea.lib.vcs.nodes import (
-    FileNode, DirNode, NodeKind, RootNode, RemovedFileNode, SubModuleNode,
+    FileNode, DirNode, NodeKind, RootNode, SubModuleNode,
     ChangedFileNodesGenerator, AddedFileNodesGenerator, RemovedFileNodesGenerator
 )
 from kallithea.lib.vcs.utils import (
@@ -189,7 +189,7 @@
         """
         rev_filter = settings.GIT_REV_FILTER
         so, se = self.repository.run_git_command(
-            "rev-list %s --children" % (rev_filter)
+            ['rev-list', rev_filter, '--children']
         )
 
         children = []
@@ -288,12 +288,12 @@
         f_path = safe_str(path)
 
         if limit:
-            cmd = 'log -n %s --pretty="format: %%H" -s %s -- "%s"' % (
-                      safe_int(limit, 0), cs_id, f_path)
+            cmd = ['log', '-n', str(safe_int(limit, 0)),
+                   '--pretty=format:%H', '-s', cs_id, '--', f_path]
 
         else:
-            cmd = 'log --pretty="format: %%H" -s %s -- "%s"' % (
-                      cs_id, f_path)
+            cmd = ['log',
+                   '--pretty=format:%H', '-s', cs_id, '--', f_path]
         so, se = self.repository.run_git_command(cmd)
         ids = re.findall(r'[0-9a-fA-F]{40}', so)
         return [self.repository.get_changeset(sha) for sha in ids]
@@ -321,7 +321,7 @@
         generally not good. Should be replaced with algorithm iterating
         commits.
         """
-        cmd = 'blame -l --root -r %s -- "%s"' % (self.id, path)
+        cmd = ['blame', '-l', '--root', '-r', self.id, '--', path]
         # -l     ==> outputs long shas (and we need all 40 characters)
         # --root ==> doesn't put '^' character for boundaries
         # -r sha ==> blames for the given revision
@@ -471,8 +471,8 @@
     def _diff_name_status(self):
         output = []
         for parent in self.parents:
-            cmd = 'diff --name-status %s %s --encoding=utf8' % (parent.raw_id,
-                                                                self.raw_id)
+            cmd = ['diff', '--name-status', parent.raw_id, self.raw_id,
+                   '--encoding=utf8']
             so, se = self.repository.run_git_command(cmd)
             output.append(so.strip())
         return '\n'.join(output)
--- a/kallithea/lib/vcs/backends/git/repository.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/backends/git/repository.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,23 +12,11 @@
 import os
 import re
 import time
+import errno
 import urllib
 import urllib2
 import logging
 import posixpath
-import string
-import sys
-if sys.platform == "win32":
-    from subprocess import list2cmdline
-    def quote(s):
-        return list2cmdline([s])
-else:
-    try:
-        # Python <=2.7
-        from pipes import quote
-    except ImportError:
-        # Python 3.3+
-        from shlex import quote
 
 from dulwich.objects import Tag
 from dulwich.repo import Repo, NotGitRepository
@@ -134,10 +122,7 @@
             del opts['_safe']
             safe_call = True
 
-        _str_cmd = False
-        if isinstance(cmd, basestring):
-            cmd = [cmd]
-            _str_cmd = True
+        assert isinstance(cmd, list), cmd
 
         gitenv = os.environ
         # need to clean fix GIT_DIR !
@@ -147,17 +132,15 @@
 
         _git_path = settings.GIT_EXECUTABLE_PATH
         cmd = [_git_path] + _copts + cmd
-        if _str_cmd:
-            cmd = ' '.join(cmd)
 
         try:
             _opts = dict(
                 env=gitenv,
-                shell=True,
+                shell=False,
             )
             _opts.update(opts)
             p = subprocessio.SubprocessIOChunker(cmd, **_opts)
-        except (EnvironmentError, OSError), err:
+        except (EnvironmentError, OSError) as err:
             tb_err = ("Couldn't run git command (%s).\n"
                       "Original error was:%s\n" % (cmd, err))
             log.error(tb_err)
@@ -190,6 +173,9 @@
         if os.path.isdir(url) or url.startswith('file:'):
             return True
 
+        if url.startswith('git://'):
+            return True
+
         if '+' in url[:url.find('://')]:
             url = url[url.find('+') + 1:]
 
@@ -222,7 +208,7 @@
             resp = o.open(req)
             if resp.code != 200:
                 raise Exception('Return Code is not 200')
-        except Exception, e:
+        except Exception as e:
             # means it cannot be cloned
             raise urllib2.URLError("[%s] org_exc: %s" % (cleaned_uri, e))
 
@@ -254,7 +240,7 @@
                     return Repo.init(self.path)
             else:
                 return self._repo
-        except (NotGitRepository, OSError), err:
+        except (NotGitRepository, OSError) as err:
             raise RepositoryError(err)
 
     def _get_all_revisions(self):
@@ -267,7 +253,7 @@
             return []
 
         rev_filter = settings.GIT_REV_FILTER
-        cmd = 'rev-list %s --reverse --date-order' % (rev_filter)
+        cmd = ['rev-list', rev_filter, '--reverse', '--date-order']
         try:
             so, se = self.run_git_command(cmd)
         except RepositoryError:
@@ -459,7 +445,7 @@
             os.remove(tagpath)
             self._parsed_refs = self._get_parsed_refs()
             self.tags = self._get_tags()
-        except OSError, e:
+        except OSError as e:
             raise RepositoryError(e.strerror)
 
     @LazyProperty
@@ -550,22 +536,16 @@
 
         # %H at format means (full) commit hash, initial hashes are retrieved
         # in ascending date order
-        cmd_template = 'log --date-order --reverse --pretty=format:"%H"'
-        cmd_params = {}
+        cmd = ['log', '--date-order', '--reverse', '--pretty=format:%H']
         if start_date:
-            cmd_template += ' --since "$since"'
-            cmd_params['since'] = start_date.strftime('%m/%d/%y %H:%M:%S')
+            cmd += ['--since', start_date.strftime('%m/%d/%y %H:%M:%S')]
         if end_date:
-            cmd_template += ' --until "$until"'
-            cmd_params['until'] = end_date.strftime('%m/%d/%y %H:%M:%S')
+            cmd += ['--until', end_date.strftime('%m/%d/%y %H:%M:%S')]
         if branch_name:
-            cmd_template += ' $branch_name'
-            cmd_params['branch_name'] = branch_name
+            cmd.append(branch_name)
         else:
-            rev_filter = settings.GIT_REV_FILTER
-            cmd_template += ' %s' % (rev_filter)
+            cmd.append(settings.GIT_REV_FILTER)
 
-        cmd = string.Template(cmd_template).safe_substitute(**cmd_params)
         revs = self.run_git_command(cmd)[0].splitlines()
         start_pos = 0
         end_pos = len(revs)
@@ -621,14 +601,14 @@
 
         if rev1 == self.EMPTY_CHANGESET:
             rev2 = self.get_changeset(rev2).raw_id
-            cmd = ' '.join(['show'] + flags + [rev2])
+            cmd = ['show'] + flags + [rev2]
         else:
             rev1 = self.get_changeset(rev1).raw_id
             rev2 = self.get_changeset(rev2).raw_id
-            cmd = ' '.join(['diff'] + flags + [rev1, rev2])
+            cmd = ['diff'] + flags + [rev1, rev2]
 
         if path:
-            cmd += ' -- "%s"' % path
+            cmd += ['--', path]
 
         stdout, stderr = self.run_git_command(cmd)
         # TODO: don't ignore stderr
@@ -662,8 +642,7 @@
             cmd.append('--bare')
         elif not update_after_clone:
             cmd.append('--no-checkout')
-        cmd += ['--', quote(url), quote(self.path)]
-        cmd = ' '.join(cmd)
+        cmd += ['--', url, self.path]
         # If error occurs run_git_command raises RepositoryError already
         self.run_git_command(cmd)
 
@@ -672,8 +651,7 @@
         Tries to pull changes from external location.
         """
         url = self._get_url(url)
-        cmd = ['pull', "--ff-only", quote(url)]
-        cmd = ' '.join(cmd)
+        cmd = ['pull', '--ff-only', url]
         # If error occurs run_git_command raises RepositoryError already
         self.run_git_command(cmd)
 
@@ -682,13 +660,11 @@
         Tries to pull changes from external location.
         """
         url = self._get_url(url)
-        so, se = self.run_git_command('ls-remote -h %s' % quote(url))
-        refs = []
+        so, se = self.run_git_command(['ls-remote', '-h', url])
+        cmd = ['fetch', url, '--']
         for line in (x for x in so.splitlines()):
             sha, ref = line.split('\t')
-            refs.append(ref)
-        refs = ' '.join(('+%s:%s' % (r, r) for r in refs))
-        cmd = '''fetch %s -- %s''' % (quote(url), refs)
+            cmd.append('+%s:%s' % (ref, ref))
         self.run_git_command(cmd)
 
     def _update_server_info(self):
@@ -696,7 +672,13 @@
         runs gits update-server-info command in this repo instance
         """
         from dulwich.server import update_server_info
-        update_server_info(self._repo)
+        try:
+            update_server_info(self._repo)
+        except OSError as e:
+            if e.errno != errno.ENOENT:
+                raise
+            # Workaround for dulwich crashing on for example its own dulwich/tests/data/repos/simple_merge.git/info/refs.lock
+            log.error('Ignoring error running update-server-info: %s', e)
 
     @LazyProperty
     def workdir(self):
--- a/kallithea/lib/vcs/backends/hg/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/backends/hg/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 """
     vcs.backends.hg
-    ~~~~~~~~~~~~~~~~
+    ~~~~~~~~~~~~~~~
 
     Mercurial backend implementation.
 
--- a/kallithea/lib/vcs/backends/hg/changeset.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/backends/hg/changeset.py	Sun Sep 06 23:36:05 2015 +0200
@@ -16,6 +16,7 @@
 from kallithea.lib.vcs.utils.paths import get_dirs_for_path
 from kallithea.lib.vcs.utils.hgcompat import archival, hex
 
+from mercurial import obsolete
 
 class MercurialChangeset(BaseChangeset):
     """
@@ -43,6 +44,30 @@
         return  self._ctx.closesbranch()
 
     @LazyProperty
+    def obsolete(self):
+        return  self._ctx.obsolete()
+
+    @LazyProperty
+    def successors(self):
+        successors = obsolete.successorssets(self._ctx._repo, self._ctx.node())
+        if successors:
+            # flatten the list here handles both divergent (len > 1)
+            # and the usual case (len = 1)
+            successors = [hex(n)[:12] for sub in successors for n in sub if n != self._ctx.node()]
+
+        return successors
+
+    @LazyProperty
+    def precursors(self):
+        precursors = set()
+        nm = self._ctx._repo.changelog.nodemap
+        for p in self._ctx._repo.obsstore.precursors.get(self._ctx.node(), ()):
+            pr = nm.get(p[0])
+            if pr is not None:
+                precursors.add(hex(p[0])[:12])
+        return precursors
+
+    @LazyProperty
     def bookmarks(self):
         return map(safe_unicode, self._ctx.bookmarks())
 
@@ -284,13 +309,6 @@
         archival.archive(self.repository._repo, stream, self.raw_id,
                          kind, prefix=prefix, subrepos=subrepos)
 
-        if stream.closed and hasattr(stream, 'name'):
-            stream = open(stream.name, 'rb')
-        elif hasattr(stream, 'mode') and 'r' not in stream.mode:
-            stream = open(stream.name, 'rb')
-        else:
-            stream.seek(0)
-
     def get_nodes(self, path):
         """
         Returns combined ``DirNode`` and ``FileNode`` objects list representing
--- a/kallithea/lib/vcs/backends/hg/repository.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/backends/hg/repository.py	Sun Sep 06 23:36:05 2015 +0200
@@ -29,7 +29,7 @@
 from kallithea.lib.vcs.utils.ordered_dict import OrderedDict
 from kallithea.lib.vcs.utils.paths import abspath
 from kallithea.lib.vcs.utils.hgcompat import (
-    ui, nullid, match, patch, diffopts, clone, get_contact, pull,
+    ui, nullid, match, patch, diffopts, clone, get_contact,
     localrepository, RepoLookupError, Abort, RepoError, hex, scmutil, hg_url,
     httpbasicauthhandler, httpdigestauthhandler, peer, httppeer, sshpeer
 )
@@ -177,7 +177,7 @@
         try:
             self._repo.tag(name, changeset._ctx.node(), message, local, user,
                 date)
-        except Abort, e:
+        except Abort as e:
             raise RepositoryError(e.message)
 
         # Reinitialize tags
@@ -208,7 +208,7 @@
         try:
             self._repo.tag(name, nullid, message, local, user, date)
             self.tags = self._get_tags()
-        except Abort, e:
+        except Abort as e:
             raise RepositoryError(e.message)
 
     @LazyProperty
@@ -229,7 +229,7 @@
 
     def _get_all_revisions(self):
 
-        return map(lambda x: hex(x[7]), self._repo.changelog.index)[:-1]
+        return [self._repo[x].hex() for x in self._repo.filtered('visible').changelog.revs()]
 
     def get_diff(self, rev1, rev2, path='', ignore_whitespace=False,
                   context=3):
@@ -264,6 +264,7 @@
 
         return ''.join(patch.diff(self._repo, rev1, rev2, match=file_filter,
                           opts=diffopts(git=True,
+                                        showfunc=True,
                                         ignorews=ignore_whitespace,
                                         context=context)))
 
@@ -320,7 +321,7 @@
             resp = o.open(req)
             if resp.code != 200:
                 raise Exception('Return Code is not 200')
-        except Exception, e:
+        except Exception as e:
             # means it cannot be cloned
             raise urllib2.URLError("[%s] org_exc: %s" % (cleaned_uri, e))
 
@@ -328,7 +329,7 @@
             # now check if it's a proper hg repo
             try:
                 httppeer(repoui or ui.ui(), url).lookup('tip')
-            except Exception, e:
+            except Exception as e:
                 raise urllib2.URLError(
                     "url [%s] does not look like an hg repo org_exc: %s"
                     % (cleaned_uri, e))
@@ -358,7 +359,7 @@
                 # Don't try to create if we've already cloned repo
                 create = False
             return localrepository(self.baseui, self.path, create=create)
-        except (Abort, RepoError), err:
+        except (Abort, RepoError) as err:
             if create:
                 msg = "Cannot create repository at %s. Original error was %s"\
                     % (self.path, err)
@@ -564,7 +565,7 @@
             exchange.pull(self._repo, other, heads=None, force=None)
         except ImportError:
             self._repo.pull(other, heads=None, force=None)
-        except Abort, err:
+        except Abort as err:
             # Propagate error but with vcs's type
             raise RepositoryError(str(err))
 
--- a/kallithea/lib/vcs/subprocessio.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/subprocessio.py	Sun Sep 06 23:36:05 2015 +0200
@@ -342,11 +342,9 @@
             input_streamer.start()
             inputstream = input_streamer.output
 
-        _shell = kwargs.get('shell', True)
-        if isinstance(cmd, (list, tuple)):
-            cmd = ' '.join(cmd)
+        # Note: fragile cmd mangling has been removed for use in Kallithea
+        assert isinstance(cmd, list), cmd
 
-        kwargs['shell'] = _shell
         _p = subprocess.Popen(cmd, bufsize=-1,
                               stdin=inputstream,
                               stdout=subprocess.PIPE,
@@ -397,7 +395,7 @@
 
     def next(self):
         if self.process and self.process.poll():
-            err = '%s' % ''.join(self.error)
+            err = ''.join(self.error)
             raise EnvironmentError("Subprocess exited due to an error:\n" + err)
         return self.output.next()
 
--- a/kallithea/lib/vcs/utils/diffs.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/utils/diffs.py	Sun Sep 06 23:36:05 2015 +0200
@@ -356,7 +356,7 @@
 
         """
         # Transform all whitespace to underscore
-        idstring = re.sub(r'\s', "_", '%s' % idstring)
+        idstring = re.sub(r'\s', "_", idstring)
         # Remove everything that is not a hyphen or a member of \w
         idstring = re.sub(r'(?!-)\W', "", idstring).lower()
         return idstring
--- a/kallithea/lib/vcs/utils/hgcompat.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/utils/hgcompat.py	Sun Sep 06 23:36:05 2015 +0200
@@ -44,3 +44,5 @@
 
 # workaround for 3.3 94ac64bcf6fe and not calling largefiles reposetup correctly
 localrepository._lfstatuswriters = [lambda *msg, **opts: None]
+# 3.5 7699d3212994 added the invariant that repo.lfstatus must exist before hitting overridearchive
+localrepository.lfstatus = False
--- a/kallithea/lib/vcs/utils/imports.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/utils/imports.py	Sun Sep 06 23:36:05 2015 +0200
@@ -18,7 +18,7 @@
     class_name = splitted[-1]
     try:
         class_mod = __import__(mod_path, {}, {}, [class_name])
-    except ImportError, err:
+    except ImportError as err:
         msg = "There was problem while trying to import backend class. "\
             "Original error was:\n%s" % err
         raise VCSError(msg)
--- a/kallithea/lib/vcs/utils/lazy.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/utils/lazy.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,3 +1,6 @@
+import threading
+
+
 class _Missing(object):
 
     def __repr__(self):
@@ -41,8 +44,6 @@
             obj.__dict__[self.__name__] = value
         return value
 
-import threading
-
 
 class ThreadLocalLazyProperty(LazyProperty):
     """
--- a/kallithea/lib/vcs/utils/lockfiles.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/lib/vcs/utils/lockfiles.py	Sun Sep 06 23:36:05 2015 +0200
@@ -42,7 +42,7 @@
         try:
             fd = os.open(lock_file, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0)
             os.close(fd)
-        except OSError,e:
+        except OSError as e:
             raise IOError(str(e))
 
         self._owns_lock = True
--- a/kallithea/model/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.__init__
-~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.model
+~~~~~~~~~~~~~~~
 
 The application's model objects
 
@@ -60,7 +60,7 @@
     :param engine: engine to bind to
     """
     engine_str = obfuscate_url_pw(str(engine.url))
-    log.info("initializing db for %s" % engine_str)
+    log.info("initializing db for %s", engine_str)
     meta.Base.metadata.bind = engine
 
 
@@ -94,7 +94,7 @@
         elif isinstance(instance, (int, long)) or safe_str(instance).isdigit():
             return cls.get(instance)
         else:
-            if instance:
+            if instance is not None:
                 if callback is None:
                     raise Exception(
                         'given object must be int, long or Instance of %s '
--- a/kallithea/model/api_key.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/api_key.py	Sun Sep 06 23:36:05 2015 +0200
@@ -15,7 +15,7 @@
 kallithea.model.api_key
 ~~~~~~~~~~~~~~~~~~~~~~~
 
-api key model for Kallithea
+API key model for Kallithea
 
 This file was forked by the Kallithea project in July 2014.
 Original author and date, and relevant copyright and licensing information is below:
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 import time
 import logging
 from sqlalchemy import or_
@@ -65,7 +64,7 @@
         """
         api_key = UserApiKeys.query().filter(UserApiKeys.api_key == api_key)
 
-        if user:
+        if user is not None:
             user = self._get_user(user)
             api_key = api_key.filter(UserApiKeys.user_id == user.user_id)
 
--- a/kallithea/model/changeset_status.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/changeset_status.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,16 @@
 # -*- coding: utf-8 -*-
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 kallithea.model.changeset_status
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -12,22 +24,8 @@
 :copyright: (c) 2013 RhodeCode GmbH, and others.
 :license: GPLv3, see LICENSE.md for more details.
 """
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
 
 import logging
-from collections import  defaultdict
 from sqlalchemy.orm import joinedload
 
 from kallithea.model import BaseModel
@@ -66,9 +64,27 @@
         q = q.order_by(ChangesetStatus.version.asc())
         return q
 
+    def _calculate_status(self, statuses):
+        """
+        Given a list of statuses, calculate the resulting status, according to
+        the policy: approve if consensus, reject when at least one reject.
+        """
+
+        if not statuses:
+            return ChangesetStatus.STATUS_UNDER_REVIEW
+
+        if all(st and st.status == ChangesetStatus.STATUS_APPROVED for st in statuses):
+            return ChangesetStatus.STATUS_APPROVED
+
+        if any(st and st.status == ChangesetStatus.STATUS_REJECTED for st in statuses):
+            return ChangesetStatus.STATUS_REJECTED
+
+        return ChangesetStatus.STATUS_UNDER_REVIEW
+
     def calculate_pull_request_result(self, pull_request):
         """
-        Policy: approve if consensus. Only approve and reject counts as valid votes.
+        Return a tuple (reviewers, pending reviewers, pull request status)
+        Only approve and reject counts as valid votes.
         """
 
         # collect latest votes from all voters
@@ -77,24 +93,21 @@
                                              pull_request=pull_request,
                                              with_revisions=True)):
             cs_statuses[st.author.username] = st
+
         # collect votes from official reviewers
         pull_request_reviewers = []
         pull_request_pending_reviewers = []
-        approved_votes = 0
+        relevant_statuses = []
         for r in pull_request.reviewers:
             st = cs_statuses.get(r.user.username)
-            if st and st.status == ChangesetStatus.STATUS_APPROVED:
-                approved_votes += 1
+            relevant_statuses.append(st)
             if not st or st.status in (ChangesetStatus.STATUS_NOT_REVIEWED,
                                        ChangesetStatus.STATUS_UNDER_REVIEW):
                 st = None
                 pull_request_pending_reviewers.append(r.user)
             pull_request_reviewers.append((r.user, st))
 
-        # calculate result
-        result = ChangesetStatus.STATUS_UNDER_REVIEW
-        if approved_votes and approved_votes == len(pull_request.reviewers):
-            result = ChangesetStatus.STATUS_APPROVED
+        result = self._calculate_status(relevant_statuses)
 
         return (pull_request_reviewers,
                 pull_request_pending_reviewers,
--- a/kallithea/model/comment.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/comment.py	Sun Sep 06 23:36:05 2015 +0200
@@ -63,10 +63,6 @@
                                line_no=None, revision=None, pull_request=None,
                                status_change=None, closing_pr=False):
         """
-        Get notification data
-
-        :param comment_text:
-        :param line:
         :returns: tuple (subj,body,recipients,notification_type,email_kwargs)
         """
         # make notification
@@ -79,7 +75,7 @@
         if revision:
             notification_type = Notification.TYPE_CHANGESET_COMMENT
             cs = repo.scm_instance.get_changeset(revision)
-            desc = "%s" % (cs.short_id)
+            desc = cs.short_id
 
             threading = ['%s-rev-%s@%s' % (repo.repo_name, revision, h.canonical_hostname())]
             if line_no: # TODO: url to file _and_ line number
@@ -96,7 +92,7 @@
             )
             # get the current participants of this changeset
             recipients = ChangesetComment.get_users(revision=revision)
-            # add changeset author if it's in kallithea system
+            # add changeset author if it's known locally
             cs_author = User.get_from_cs_author(cs.author)
             if not cs_author:
                 #use repo owner if we cannot extract the author correctly
@@ -104,7 +100,7 @@
             recipients += [cs_author]
             email_kwargs = {
                 'status_change': status_change,
-                'cs_comment_user': h.person(user, 'username_and_name'),
+                'cs_comment_user': h.person(user, 'full_name_and_username'),
                 'cs_target_repo': h.canonical_url('summary_home', repo_name=repo.repo_name),
                 'cs_comment_url': comment_url,
                 'raw_id': revision,
@@ -130,9 +126,9 @@
             comment_url = pull_request.url(canonical=True,
                 anchor='comment-%s' % comment.comment_id)
             subj = safe_unicode(
-                h.link_to('Re pull request #%(pr_id)s: %(desc)s %(line)s' % \
+                h.link_to('Re pull request %(pr_nice_id)s: %(desc)s %(line)s' % \
                           {'desc': desc,
-                           'pr_id': comment.pull_request.pull_request_id,
+                           'pr_nice_id': comment.pull_request.nice_id(),
                            'line': line},
                           comment_url)
             )
@@ -140,7 +136,7 @@
             recipients = ChangesetComment.get_users(pull_request_id=
                                                 pull_request.pull_request_id)
             # add pull request author
-            recipients += [pull_request.author]
+            recipients += [pull_request.owner]
 
             # add the reviewers to notification
             recipients += [x.user for x in pull_request.reviewers]
@@ -148,11 +144,11 @@
             #set some variables for email notification
             email_kwargs = {
                 'pr_title': pull_request.title,
-                'pr_id': pull_request.pull_request_id,
+                'pr_nice_id': pull_request.nice_id(),
                 'status_change': status_change,
                 'closing_pr': closing_pr,
                 'pr_comment_url': comment_url,
-                'pr_comment_user': h.person(user, 'username_and_name'),
+                'pr_comment_user': h.person(user, 'full_name_and_username'),
                 'pr_target_repo': h.canonical_url('summary_home',
                                    repo_name=pull_request.other_repo.repo_name),
                 'repo_name': pull_request.other_repo.repo_name,
@@ -167,24 +163,14 @@
                f_path=None, line_no=None, status_change=None, closing_pr=False,
                send_email=True):
         """
-        Creates new comment for changeset or pull request.
-        If status_change is not None this comment is associated with a
-        status change of changeset or changesets associated with pull request
+        Creates a new comment for either a changeset or a pull request.
+        status_change and closing_pr is only for the optional email.
 
-        :param text:
-        :param repo:
-        :param user:
-        :param revision:
-        :param pull_request: (for emails, not for comments)
-        :param f_path:
-        :param line_no:
-        :param status_change: (for emails, not for comments)
-        :param closing_pr: (for emails, not for comments)
-        :param send_email: also send email
+        Returns the created comment.
         """
-        if not text:
+        if not status_change and not text:
             log.warning('Missing text for comment, skipping...')
-            return
+            return None
 
         repo = self._get_repo(repo)
         user = self._get_user(user)
@@ -195,9 +181,9 @@
         comment.f_path = f_path
         comment.line_no = line_no
 
-        if revision:
+        if revision is not None:
             comment.revision = revision
-        elif pull_request:
+        elif pull_request is not None:
             pull_request = self.__get_pull_request(pull_request)
             comment.pull_request = pull_request
         else:
@@ -239,11 +225,6 @@
         return comment
 
     def delete(self, comment):
-        """
-        Deletes given comment
-
-        :param comment_id:
-        """
         comment = self.__get_changeset_comment(comment)
         Session().delete(comment)
 
@@ -251,46 +232,47 @@
 
     def get_comments(self, repo_id, revision=None, pull_request=None):
         """
-        Gets main comments based on revision or pull_request_id
+        Gets general comments for either revision or pull_request.
+
+        Returns a list, ordered by creation date.
+        """
+        return self._get_comments(repo_id, revision=revision, pull_request=pull_request,
+                                  inline=False)
 
-        :param repo_id:
-        :param revision:
-        :param pull_request:
+    def get_inline_comments(self, repo_id, revision=None, pull_request=None):
         """
+        Gets inline comments for either revision or pull_request.
+
+        Returns a list of tuples with file path and list of comments per line number.
+        """
+        comments = self._get_comments(repo_id, revision=revision, pull_request=pull_request,
+                                      inline=True)
 
-        q = ChangesetComment.query()\
-                .filter(ChangesetComment.repo_id == repo_id)\
-                .filter(ChangesetComment.line_no == None)\
+        paths = defaultdict(lambda: defaultdict(list))
+        for co in comments:
+            paths[co.f_path][co.line_no].append(co)
+        return paths.items()
+
+    def _get_comments(self, repo_id, revision=None, pull_request=None, inline=False):
+        """
+        Gets comments for either revision or pull_request_id, either inline or general.
+        """
+        q = Session().query(ChangesetComment)
+
+        if inline:
+            q = q.filter(ChangesetComment.line_no != None)\
+                .filter(ChangesetComment.f_path != None)
+        else:
+            q = q.filter(ChangesetComment.line_no == None)\
                 .filter(ChangesetComment.f_path == None)
+
         if revision:
-            q = q.filter(ChangesetComment.revision == revision)
+            q = q.filter(ChangesetComment.revision == revision)\
+                .filter(ChangesetComment.repo_id == repo_id)
         elif pull_request:
             pull_request = self.__get_pull_request(pull_request)
             q = q.filter(ChangesetComment.pull_request == pull_request)
         else:
-            raise Exception('Please specify revision or pull_request')
-        q = q.order_by(ChangesetComment.created_on)
-        return q.all()
-
-    def get_inline_comments(self, repo_id, revision=None, pull_request=None):
-        q = Session().query(ChangesetComment)\
-            .filter(ChangesetComment.repo_id == repo_id)\
-            .filter(ChangesetComment.line_no != None)\
-            .filter(ChangesetComment.f_path != None)\
-            .order_by(ChangesetComment.comment_id.asc())\
+            raise Exception('Please specify either revision or pull_request')
 
-        if revision:
-            q = q.filter(ChangesetComment.revision == revision)
-        elif pull_request:
-            pull_request = self.__get_pull_request(pull_request)
-            q = q.filter(ChangesetComment.pull_request == pull_request)
-        else:
-            raise Exception('Please specify revision or pull_request_id')
-
-        comments = q.all()
-
-        paths = defaultdict(lambda: defaultdict(list))
-
-        for co in comments:
-            paths[co.f_path][co.line_no].append(co)
-        return paths.items()
+        return q.order_by(ChangesetComment.created_on).all()
--- a/kallithea/model/db.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/db.py	Sun Sep 06 23:36:05 2015 +0200
@@ -43,9 +43,9 @@
 from pylons.i18n.translation import lazy_ugettext as _
 
 from kallithea import DB_PREFIX
+from kallithea.lib.exceptions import DefaultUserException
 from kallithea.lib.vcs import get_backend
 from kallithea.lib.vcs.utils.helpers import get_scm
-from kallithea.lib.vcs.exceptions import VCSError
 from kallithea.lib.vcs.utils.lazy import LazyProperty
 from kallithea.lib.vcs.backends.base import EmptyChangeset
 
@@ -129,7 +129,7 @@
             raise HTTPNotFound
 
         res = cls.query().get(id_)
-        if not res:
+        if res is None:
             raise HTTPNotFound
         return res
 
@@ -175,8 +175,8 @@
     }
     DEFAULT_UPDATE_URL = ''
 
-    app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    app_settings_name = Column("app_settings_name", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    app_settings_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    app_settings_name = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
     _app_settings_value = Column("app_settings_value", String(4096, convert_unicode=False), nullable=True, unique=None, default=None)
     _app_settings_type = Column("app_settings_type", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
 
@@ -231,7 +231,7 @@
     @classmethod
     def get_by_name_or_create(cls, key, val='', type='unicode'):
         res = cls.get_by_name(key)
-        if not res:
+        if res is None:
             res = cls(key, val, type)
         return res
 
@@ -247,7 +247,7 @@
         :return:
         """
         res = cls.get_by_name(key)
-        if not res:
+        if res is None:
             val = Optional.extract(val)
             type = Optional.extract(type)
             res = cls(key, val, type)
@@ -269,7 +269,7 @@
         if cache:
             ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
 
-        if not ret:
+        if ret is None:
             raise Exception('Could not get application settings !')
         settings = {}
         for each in ret:
@@ -338,11 +338,11 @@
     HOOK_PULL = 'outgoing.pull_logger'
     HOOK_PRE_PULL = 'preoutgoing.pre_pull'
 
-    ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    ui_section = Column("ui_section", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    ui_key = Column("ui_key", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    ui_value = Column("ui_value", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
+    ui_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    ui_section = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    ui_key = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    ui_value = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    ui_active = Column(Boolean(), nullable=True, unique=None, default=True)
 
     # def __init__(self, section='', key='', value=''):
     #     self.ui_section = section
@@ -401,20 +401,20 @@
     DEFAULT_USER = 'default'
     DEFAULT_GRAVATAR_URL = 'https://secure.gravatar.com/avatar/{md5email}?d=identicon&s={size}'
 
-    user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    username = Column("username", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    password = Column("password", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    active = Column("active", Boolean(), nullable=True, unique=None, default=True)
-    admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
+    user_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    username = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    password = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    active = Column(Boolean(), nullable=True, unique=None, default=True)
+    admin = Column(Boolean(), nullable=True, unique=None, default=False)
     name = Column("firstname", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    lastname = Column("lastname", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    lastname = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
     _email = Column("email", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
-    extern_type = Column("extern_type", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    extern_name = Column("extern_name", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    api_key = Column("api_key", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    inherit_default_permissions = Column("inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    last_login = Column(DateTime(timezone=False), nullable=True, unique=None, default=None)
+    extern_type = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    extern_name = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    api_key = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    inherit_default_permissions = Column(Boolean(), nullable=False, unique=None, default=True)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
     _user_data = Column("user_data", LargeBinary(), nullable=True)  # JSON data
 
     user_log = relationship('UserLog')
@@ -438,7 +438,7 @@
     user_comments = relationship('ChangesetComment', cascade='all')
     #extra emails for this user
     user_emails = relationship('UserEmailMap', cascade='all')
-    #extra api keys
+    #extra API keys
     user_api_keys = relationship('UserApiKeys', cascade='all')
 
 
@@ -471,19 +471,28 @@
         return [x.ip_addr for x in ret]
 
     @property
-    def username_and_name(self):
-        return '%s (%s %s)' % (self.username, self.firstname, self.lastname)
-
-    @property
     def full_name(self):
         return '%s %s' % (self.firstname, self.lastname)
 
     @property
     def full_name_or_username(self):
+        """
+        Show full name.
+        If full name is not set, fall back to username.
+        """
         return ('%s %s' % (self.firstname, self.lastname)
                 if (self.firstname and self.lastname) else self.username)
 
     @property
+    def full_name_and_username(self):
+        """
+        Show full name and username as 'Firstname Lastname (username)'.
+        If full name is not set, fall back to username.
+        """
+        return ('%s %s (%s)' % (self.firstname, self.lastname, self.username)
+                if (self.firstname and self.lastname) else self.username)
+
+    @property
     def full_contact(self):
         return '%s %s <%s>' % (self.firstname, self.lastname, self.email)
 
@@ -501,8 +510,7 @@
         Returns instance of AuthUser for this user
         """
         from kallithea.lib.auth import AuthUser
-        return AuthUser(user_id=self.user_id, api_key=self.api_key,
-                        username=self.username)
+        return AuthUser(dbuser=self)
 
     @hybrid_property
     def user_data(self):
@@ -526,6 +534,18 @@
                                       self.user_id, self.username)
 
     @classmethod
+    def get_or_404(cls, id_, allow_default=True):
+        '''
+        Overridden version of BaseModel.get_or_404, with an extra check on
+        the default user.
+        '''
+        user = super(User, cls).get_or_404(id_)
+        if allow_default == False:
+            if user.username == User.DEFAULT_USER:
+                raise DefaultUserException
+        return user
+
+    @classmethod
     def get_by_username(cls, username, case_insensitive=False, cache=False):
         if case_insensitive:
             q = cls.query().filter(cls.username.ilike(username))
@@ -602,19 +622,19 @@
         _email = email(author)
         if _email:
             user = cls.get_by_email(_email, case_insensitive=True)
-            if user:
+            if user is not None:
                 return user
         # Maybe we can match by username?
         _author = author_name(author)
         user = cls.get_by_username(_author, case_insensitive=True)
-        if user:
+        if user is not None:
             return user
 
     def update_lastlogin(self):
         """Update user lastlogin"""
         self.last_login = datetime.datetime.now()
         Session().add(self)
-        log.debug('updated user %s lastlogin' % self.username)
+        log.debug('updated user %s lastlogin', self.username)
 
     @classmethod
     def get_first_admin(cls):
@@ -678,12 +698,12 @@
     )
     __mapper_args__ = {}
 
-    user_api_key_id = Column("user_api_key_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
-    api_key = Column("api_key", String(255, convert_unicode=False), nullable=False, unique=True)
-    description = Column('description', UnicodeText(1024))
-    expires = Column('expires', Float(53), nullable=False)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    user_api_key_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    api_key = Column(String(255, convert_unicode=False), nullable=False, unique=True)
+    description = Column(UnicodeText(1024))
+    expires = Column(Float(53), nullable=False)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
 
     user = relationship('User')
 
@@ -704,8 +724,8 @@
     )
     __mapper_args__ = {}
 
-    email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    email_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
     _email = Column("email", String(255, convert_unicode=False), nullable=True, unique=False, default=None)
     user = relationship('User')
 
@@ -735,10 +755,10 @@
     )
     __mapper_args__ = {}
 
-    ip_id = Column("ip_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
-    ip_addr = Column("ip_addr", String(255, convert_unicode=False), nullable=True, unique=False, default=None)
-    active = Column("active", Boolean(), nullable=True, unique=None, default=True)
+    ip_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    ip_addr = Column(String(255, convert_unicode=False), nullable=True, unique=False, default=None)
+    active = Column(Boolean(), nullable=True, unique=None, default=True)
     user = relationship('User')
 
     @classmethod
@@ -763,14 +783,14 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True},
     )
-    user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
-    username = Column("username", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True)
-    repository_name = Column("repository_name", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    user_ip = Column("user_ip", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    action = Column("action", UnicodeText(1200000, convert_unicode=False), nullable=True, unique=None, default=None)
-    action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
+    user_log_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    username = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    repository_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=True)
+    repository_name = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    user_ip = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    action = Column(UnicodeText(1200000, convert_unicode=False), nullable=True, unique=None, default=None)
+    action_date = Column(DateTime(timezone=False), nullable=True, unique=None, default=None)
 
     def __unicode__(self):
         return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
@@ -792,13 +812,13 @@
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True},
     )
 
-    users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    users_group_name = Column("users_group_name", String(255, convert_unicode=False), nullable=False, unique=True, default=None)
-    user_group_description = Column("user_group_description", String(10000, convert_unicode=False), nullable=True, unique=None, default=None)
-    users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
+    users_group_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    users_group_name = Column(String(255, convert_unicode=False), nullable=False, unique=True, default=None)
+    user_group_description = Column(String(10000, convert_unicode=False), nullable=True, unique=None, default=None)
+    users_group_active = Column(Boolean(), nullable=True, unique=None, default=None)
     inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
     _group_data = Column("group_data", LargeBinary(), nullable=True)  # JSON data
 
     members = relationship('UserGroupMember', cascade="all, delete-orphan")
@@ -882,9 +902,9 @@
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True},
     )
 
-    users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    users_group_member_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    users_group_id = Column(Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
 
     user = relationship('User')
     users_group = relationship('UserGroup')
@@ -903,14 +923,14 @@
     )
     PREFIX = 'ex_'  # prefix used in form to not conflict with already existing fields
 
-    repo_field_id = Column("repo_field_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
-    field_key = Column("field_key", String(250, convert_unicode=False))
-    field_label = Column("field_label", String(1024, convert_unicode=False), nullable=False)
-    field_value = Column("field_value", String(10000, convert_unicode=False), nullable=False)
-    field_desc = Column("field_desc", String(1024, convert_unicode=False), nullable=False)
-    field_type = Column("field_type", String(255), nullable=False, unique=None)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    repo_field_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    repository_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
+    field_key = Column(String(250, convert_unicode=False))
+    field_label = Column(String(1024, convert_unicode=False), nullable=False)
+    field_value = Column(String(10000, convert_unicode=False), nullable=False)
+    field_desc = Column(String(1024, convert_unicode=False), nullable=False)
+    field_type = Column(String(255), nullable=False, unique=None)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
 
     repository = relationship('Repository')
 
@@ -947,26 +967,26 @@
     STATE_PENDING = 'repo_state_pending'
     STATE_ERROR = 'repo_state_error'
 
-    repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    repo_name = Column("repo_name", String(255, convert_unicode=False), nullable=False, unique=True, default=None)
-    repo_state = Column("repo_state", String(255), nullable=True)
-
-    clone_uri = Column("clone_uri", String(255, convert_unicode=False), nullable=True, unique=False, default=None)
-    repo_type = Column("repo_type", String(255, convert_unicode=False), nullable=False, unique=False, default=None)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
-    private = Column("private", Boolean(), nullable=True, unique=None, default=None)
+    repo_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    repo_name = Column(String(255, convert_unicode=False), nullable=False, unique=True, default=None)
+    repo_state = Column(String(255), nullable=True)
+
+    clone_uri = Column(String(255, convert_unicode=False), nullable=True, unique=False, default=None)
+    repo_type = Column(String(255, convert_unicode=False), nullable=False, unique=False, default=None)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
+    private = Column(Boolean(), nullable=True, unique=None, default=None)
     enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
     enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
-    description = Column("description", String(10000, convert_unicode=False), nullable=True, unique=None, default=None)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
-    updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
+    description = Column(String(10000, convert_unicode=False), nullable=True, unique=None, default=None)
+    created_on = Column(DateTime(timezone=False), nullable=False, unique=None, default=datetime.datetime.now)
+    updated_on = Column(DateTime(timezone=False), nullable=False, unique=None, default=datetime.datetime.now)
     _landing_revision = Column("landing_revision", String(255, convert_unicode=False), nullable=False, unique=False, default=None)
-    enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
+    enable_locking = Column(Boolean(), nullable=False, unique=None, default=False)
     _locked = Column("locked", String(255, convert_unicode=False), nullable=True, unique=False, default=None)
     _changeset_cache = Column("changeset_cache", LargeBinary(), nullable=True) #JSON data
 
-    fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
-    group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
+    fork_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
+    group_id = Column(Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
 
     user = relationship('User')
     fork = relationship('Repository', remote_side=repo_id)
@@ -1030,14 +1050,12 @@
 
     @hybrid_property
     def changeset_cache(self):
-        from kallithea.lib.vcs.backends.base import EmptyChangeset
-        dummy = EmptyChangeset().__json__()
-        if not self._changeset_cache:
-            return dummy
         try:
-            return json.loads(self._changeset_cache)
-        except TypeError:
-            return dummy
+            cs_cache = json.loads(self._changeset_cache) # might raise on bad data
+            cs_cache['raw_id'] # verify data, raise exception on error
+            return cs_cache
+        except (TypeError, KeyError, ValueError):
+            return EmptyChangeset().__json__()
 
     @changeset_cache.setter
     def changeset_cache(self, val):
@@ -1280,7 +1298,7 @@
                 pass
 
         return get_clone_url(uri_tmpl=uri_tmpl,
-                             qualifed_home_url=qualified_home_url,
+                             qualified_home_url=qualified_home_url,
                              repo_name=self.repo_name,
                              repo_id=self.repo_id, **override)
 
@@ -1331,15 +1349,15 @@
         if (not self.changeset_cache or cs_cache['raw_id'] != self.changeset_cache['raw_id']):
             _default = datetime.datetime.fromtimestamp(0)
             last_change = cs_cache.get('date') or _default
-            log.debug('updated repo %s with new cs cache %s'
-                      % (self.repo_name, cs_cache))
+            log.debug('updated repo %s with new cs cache %s',
+                      self.repo_name, cs_cache)
             self.updated_on = last_change
             self.changeset_cache = cs_cache
             Session().add(self)
             Session().commit()
         else:
-            log.debug('changeset_cache for %s already up to date with %s'
-                      % (self.repo_name, cs_cache['raw_id']))
+            log.debug('changeset_cache for %s already up to date with %s',
+                      self.repo_name, cs_cache['raw_id'])
 
     @property
     def tip(self):
@@ -1387,12 +1405,13 @@
 
         grouped = {}
         for stat in statuses.all():
-            pr_id = pr_repo = None
+            pr_id = pr_nice_id = pr_repo = None
             if stat.pull_request:
                 pr_id = stat.pull_request.pull_request_id
+                pr_nice_id = PullRequest.make_nice_id(pr_id)
                 pr_repo = stat.pull_request.other_repo.repo_name
             grouped[stat.revision] = [str(stat.status), stat.status_lbl,
-                                      pr_id, pr_repo]
+                                      pr_id, pr_repo, pr_nice_id]
         return grouped
 
     def _repo_size(self):
@@ -1429,18 +1448,18 @@
 
         valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
         if not valid:
-            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            log.debug('Cache for %s invalidated, getting new object', rn)
             region_invalidate(_c, None, rn)
         else:
-            log.debug('Getting scm_instance of %s from cache' % (rn))
+            log.debug('Getting scm_instance of %s from cache', rn)
         return _c(rn)
 
     def __get_instance(self):
         repo_full_path = self.repo_full_path
 
         alias = get_scm(repo_full_path)[0]
-        log.debug('Creating instance of %s repository from %s'
-                  % (alias, repo_full_path))
+        log.debug('Creating instance of %s repository from %s',
+                  alias, repo_full_path)
         backend = get_backend(alias)
 
         if alias == 'hg':
@@ -1466,13 +1485,13 @@
 
     SEP = ' &raquo; '
 
-    group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    group_name = Column("group_name", String(255, convert_unicode=False), nullable=False, unique=True, default=None)
-    group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
-    group_description = Column("group_description", String(10000, convert_unicode=False), nullable=True, unique=None, default=None)
-    enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    group_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    group_name = Column(String(255, convert_unicode=False), nullable=False, unique=True, default=None)
+    group_parent_id = Column(Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
+    group_description = Column(String(10000, convert_unicode=False), nullable=True, unique=None, default=None)
+    enable_locking = Column(Boolean(), nullable=False, unique=None, default=False)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
 
     repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
     users_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
@@ -1489,23 +1508,17 @@
 
     @classmethod
     def _generate_choice(cls, repo_group):
-        from webhelpers.html import literal as _literal
-        _name = lambda k: _literal(cls.SEP.join(k))
-        return repo_group.group_id, _name(repo_group.full_path_splitted)
+        """Return tuple with group_id and name as html literal"""
+        from webhelpers.html import literal
+        if repo_group is None:
+            return (-1, u'-- %s --' % _('top level'))
+        return repo_group.group_id, literal(cls.SEP.join(repo_group.full_path_splitted))
 
     @classmethod
-    def groups_choices(cls, groups=None, show_empty_group=True):
-        if not groups:
-            groups = cls.query().all()
-
-        repo_groups = []
-        if show_empty_group:
-            repo_groups = [('-1', u'-- %s --' % _('top level'))]
-
-        repo_groups.extend([cls._generate_choice(x) for x in groups])
-
-        repo_groups = sorted(repo_groups, key=lambda t: t[1].split(cls.SEP)[0])
-        return repo_groups
+    def groups_choices(cls, groups):
+        """Return tuples with group_id and name as html literal."""
+        return sorted((cls._generate_choice(g) for g in groups),
+                      key=lambda c: c[1].split(cls.SEP))
 
     @classmethod
     def url_sep(cls):
@@ -1651,29 +1664,29 @@
     PERMS = [
         ('hg.admin', _('Kallithea Administrator')),
 
-        ('repository.none', _('Default user has no access to new Repositories')),
-        ('repository.read', _('Default user has read access to new Repositories')),
-        ('repository.write', _('Default user has write access to new Repositories')),
-        ('repository.admin', _('Default user has admin access to new Repositories')),
-
-        ('group.none', _('Default user has no access to new Repository Groups')),
-        ('group.read', _('Default user has read access to new Repository Groups')),
-        ('group.write', _('Default user has write access to new Repository Groups')),
-        ('group.admin', _('Default user has admin access to new Repository Groups')),
-
-        ('usergroup.none', _('Default user has no access to new User Groups')),
-        ('usergroup.read', _('Default user has read access to new User Groups')),
-        ('usergroup.write', _('Default user has write access to new User Groups')),
-        ('usergroup.admin', _('Default user has admin access to new User Groups')),
-
-        ('hg.repogroup.create.false', _('Only admins can create Repository Groups')),
-        ('hg.repogroup.create.true', _('Non-admins can create Repository Groups')),
-
-        ('hg.usergroup.create.false', _('Only admins can create User Groups')),
-        ('hg.usergroup.create.true', _('Non-admins can create User Groups')),
-
-        ('hg.create.none', _('Only admins can create top level Repositories')),
-        ('hg.create.repository', _('Non-admins can create top level Repositories')),
+        ('repository.none', _('Default user has no access to new repositories')),
+        ('repository.read', _('Default user has read access to new repositories')),
+        ('repository.write', _('Default user has write access to new repositories')),
+        ('repository.admin', _('Default user has admin access to new repositories')),
+
+        ('group.none', _('Default user has no access to new repository groups')),
+        ('group.read', _('Default user has read access to new repository groups')),
+        ('group.write', _('Default user has write access to new repository groups')),
+        ('group.admin', _('Default user has admin access to new repository groups')),
+
+        ('usergroup.none', _('Default user has no access to new user groups')),
+        ('usergroup.read', _('Default user has read access to new user groups')),
+        ('usergroup.write', _('Default user has write access to new user groups')),
+        ('usergroup.admin', _('Default user has admin access to new user groups')),
+
+        ('hg.repogroup.create.false', _('Only admins can create repository groups')),
+        ('hg.repogroup.create.true', _('Non-admins can create repository groups')),
+
+        ('hg.usergroup.create.false', _('Only admins can create user groups')),
+        ('hg.usergroup.create.true', _('Non-admins can create user groups')),
+
+        ('hg.create.none', _('Only admins can create top level repositories')),
+        ('hg.create.repository', _('Non-admins can create top level repositories')),
 
         ('hg.create.write_on_repogroup.true', _('Repository creation enabled with write permission to a repository group')),
         ('hg.create.write_on_repogroup.false', _('Repository creation disabled with write permission to a repository group')),
@@ -1682,8 +1695,8 @@
         ('hg.fork.repository', _('Non-admins can can fork repositories')),
 
         ('hg.register.none', _('Registration disabled')),
-        ('hg.register.manual_activate', _('User Registration with manual account activation')),
-        ('hg.register.auto_activate', _('User Registration with automatic account activation')),
+        ('hg.register.manual_activate', _('User registration with manual account activation')),
+        ('hg.register.auto_activate', _('User registration with automatic account activation')),
 
         ('hg.extern_activate.manual', _('Manual activation of external account')),
         ('hg.extern_activate.auto', _('Automatic activation of external account')),
@@ -1719,6 +1732,7 @@
         'usergroup.read': 1,
         'usergroup.write': 3,
         'usergroup.admin': 4,
+
         'hg.repogroup.create.false': 0,
         'hg.repogroup.create.true': 1,
 
@@ -1727,13 +1741,14 @@
 
         'hg.fork.none': 0,
         'hg.fork.repository': 1,
+
         'hg.create.none': 0,
         'hg.create.repository': 1
     }
 
-    permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    permission_name = Column("permission_name", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    permission_longname = Column("permission_longname", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    permission_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    permission_name = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    permission_longname = Column(String(255, convert_unicode=False), nullable=True, unique=None, default=None)
 
     def __unicode__(self):
         return u"<%s('%s:%s')>" % (
@@ -1779,10 +1794,10 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
-    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
+    repo_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    repository_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
 
     user = relationship('User')
     repository = relationship('Repository')
@@ -1808,10 +1823,10 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    user_user_group_to_perm_id = Column("user_user_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
-    user_group_id = Column("user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    user_user_group_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    user_group_id = Column(Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
 
     user = relationship('User')
     user_group = relationship('UserGroup')
@@ -1837,9 +1852,9 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    user_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
 
     user = relationship('User')
     permission = relationship('Permission')
@@ -1855,10 +1870,10 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
-    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
+    users_group_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    users_group_id = Column(Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    repository_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
 
     users_group = relationship('UserGroup')
     permission = relationship('Permission')
@@ -1885,10 +1900,10 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    user_group_user_group_to_perm_id = Column("user_group_user_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    target_user_group_id = Column("target_user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
-    user_group_id = Column("user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    user_group_user_group_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    target_user_group_id = Column(Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    user_group_id = Column(Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
 
     target_user_group = relationship('UserGroup', primaryjoin='UserGroupUserGroupToPerm.target_user_group_id==UserGroup.users_group_id')
     user_group = relationship('UserGroup', primaryjoin='UserGroupUserGroupToPerm.user_group_id==UserGroup.users_group_id')
@@ -1914,9 +1929,9 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    users_group_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    users_group_id = Column(Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
 
     users_group = relationship('UserGroup')
     permission = relationship('Permission')
@@ -1930,10 +1945,10 @@
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
 
-    group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
-    group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    group_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    group_id = Column(Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
 
     user = relationship('User')
     group = relationship('RepoGroup')
@@ -1957,10 +1972,10 @@
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
 
-    users_group_repo_group_to_perm_id = Column("users_group_repo_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
-    group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
-    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    users_group_repo_group_to_perm_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    users_group_id = Column(Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    group_id = Column(Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column(Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
 
     users_group = relationship('UserGroup')
     permission = relationship('Permission')
@@ -1983,12 +1998,12 @@
          {'extend_existing': True, 'mysql_engine': 'InnoDB',
           'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
-    stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
-    commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
-    commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
-    languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
+    stat_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    repository_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
+    stat_on_revision = Column(Integer(), nullable=False)
+    commit_activity = Column(LargeBinary(1000000), nullable=False)#JSON data
+    commit_activity_combined = Column(LargeBinary(), nullable=False)#JSON data
+    languages = Column(LargeBinary(1000000), nullable=False)#JSON data
 
     repository = relationship('Repository', single_parent=True)
 
@@ -2002,11 +2017,11 @@
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
 
-    user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    user_following_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
     follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
-    follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
-    follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
+    follows_user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    follows_from = Column(DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
 
     user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
 
@@ -2027,14 +2042,14 @@
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True},
     )
     # cache_id, not used
-    cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    cache_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
     # cache_key as created by _get_cache_key
-    cache_key = Column("cache_key", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
+    cache_key = Column(String(255, convert_unicode=False))
     # cache_args is a repo_name
-    cache_args = Column("cache_args", String(255, convert_unicode=False), nullable=True, unique=None, default=None)
-    # instance sets cache_active True when it is caching,
-    # other instances set cache_active to False to indicate that this cache is invalid
-    cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
+    cache_args = Column(String(255, convert_unicode=False))
+    # instance sets cache_active True when it is caching, other instances set
+    # cache_active to False to indicate that this cache is invalid
+    cache_active = Column(Boolean(), nullable=True, unique=None, default=False)
 
     def __init__(self, cache_key, repo_name=''):
         self.cache_key = cache_key
@@ -2042,8 +2057,9 @@
         self.cache_active = False
 
     def __unicode__(self):
-        return u"<%s('%s:%s[%s]')>" % (self.__class__.__name__,
-                            self.cache_id, self.cache_key, self.cache_active)
+        return u"<%s('%s:%s[%s]')>" % (
+            self.__class__.__name__,
+            self.cache_id, self.cache_key, self.cache_active)
 
     def _cache_key_partition(self):
         prefix, repo_name, suffix = self.cache_key.partition(self.cache_args)
@@ -2092,12 +2108,12 @@
         Mark all caches of a repo as invalid in the database.
         """
         inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
-        log.debug('for repo %s got %s invalidation objects'
-                  % (safe_str(repo_name), inv_objs))
+        log.debug('for repo %s got %s invalidation objects',
+                  safe_str(repo_name), inv_objs)
 
         for inv_obj in inv_objs:
-            log.debug('marking %s key for invalidation based on repo_name=%s'
-                      % (inv_obj, safe_str(repo_name)))
+            log.debug('marking %s key for invalidation based on repo_name=%s',
+                      inv_obj, safe_str(repo_name))
             if delete:
                 Session().delete(inv_obj)
             else:
@@ -2146,24 +2162,24 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True},
     )
-    comment_id = Column('comment_id', Integer(), nullable=False, primary_key=True)
-    repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
-    revision = Column('revision', String(40), nullable=True)
-    pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
-    line_no = Column('line_no', Unicode(10), nullable=True)
-    hl_lines = Column('hl_lines', Unicode(512), nullable=True)
-    f_path = Column('f_path', Unicode(1000), nullable=True)
-    user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False)
-    text = Column('text', UnicodeText(25000), nullable=False)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
-    modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    comment_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    repo_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    revision = Column(String(40))
+    pull_request_id = Column(Integer(), ForeignKey('pull_requests.pull_request_id'))
+    line_no = Column(Unicode(10))
+    f_path = Column(Unicode(1000))
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False)
+    text = Column(UnicodeText(25000), nullable=False)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    modified_at = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
 
     author = relationship('User')
     repo = relationship('Repository')
     # status_change is frequently used directly in templates - make it a lazy
     # join to avoid fetching each related ChangesetStatus on demand.
     # There will only be one ChangesetStatus referencing each comment so the join will not explode.
-    status_change = relationship('ChangesetStatus', cascade="all, delete-orphan", lazy='joined')
+    status_change = relationship('ChangesetStatus',
+                                 cascade="all, delete-orphan", lazy='joined')
     pull_request = relationship('PullRequest')
 
     @classmethod
@@ -2183,6 +2199,13 @@
             q = q.filter(cls.pull_request_id == pull_request_id)
         return q.all()
 
+    def url(self):
+        anchor = "comment-%s" % self.comment_id
+        import kallithea.lib.helpers as h
+        if self.revision:
+            return h.url('changeset_home', repo_name=self.repo.repo_name, revision=self.revision, anchor=anchor)
+        elif self.pull_request_id is not None:
+            return self.pull_request.url(anchor=anchor)
 
 class ChangesetStatus(Base, BaseModel):
     __tablename__ = 'changeset_statuses'
@@ -2202,21 +2225,21 @@
     STATUS_UNDER_REVIEW = 'under_review'
 
     STATUSES = [
-        (STATUS_NOT_REVIEWED, _("Not Reviewed")),  # (no icon) and default
+        (STATUS_NOT_REVIEWED, _("Not reviewed")),  # (no icon) and default
         (STATUS_APPROVED, _("Approved")),
         (STATUS_REJECTED, _("Rejected")),
-        (STATUS_UNDER_REVIEW, _("Under Review")),
+        (STATUS_UNDER_REVIEW, _("Under review")),
     ]
 
-    changeset_status_id = Column('changeset_status_id', Integer(), nullable=False, primary_key=True)
-    repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
-    revision = Column('revision', String(40), nullable=False)
-    status = Column('status', String(128), nullable=False, default=DEFAULT)
-    changeset_comment_id = Column('changeset_comment_id', Integer(), ForeignKey('changeset_comments.comment_id'))
-    modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
-    version = Column('version', Integer(), nullable=False, default=0)
-    pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
+    changeset_status_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    repo_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
+    revision = Column(String(40), nullable=False)
+    status = Column(String(128), nullable=False, default=DEFAULT)
+    changeset_comment_id = Column(Integer(), ForeignKey('changeset_comments.comment_id'), nullable=False)
+    modified_at = Column(DateTime(), nullable=False, default=datetime.datetime.now)
+    version = Column(Integer(), nullable=False, default=0)
+    pull_request_id = Column(Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
 
     author = relationship('User')
     repo = relationship('Repository')
@@ -2251,18 +2274,18 @@
     STATUS_NEW = u'new'
     STATUS_CLOSED = u'closed'
 
-    pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True)
-    title = Column('title', Unicode(255), nullable=True)
-    description = Column('description', UnicodeText(10240), nullable=True)
-    status = Column('status', Unicode(255), nullable=False, default=STATUS_NEW) # only for closedness, not approve/reject/etc
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
-    updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
+    pull_request_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    title = Column(Unicode(255), nullable=True)
+    description = Column(UnicodeText(10240))
+    status = Column(Unicode(255), nullable=False, default=STATUS_NEW) # only for closedness, not approve/reject/etc
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    updated_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
     _revisions = Column('revisions', UnicodeText(20500))  # 500 revisions max
-    org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
-    org_ref = Column('org_ref', Unicode(255), nullable=False)
-    other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
-    other_ref = Column('other_ref', Unicode(255), nullable=False)
+    org_repo_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    org_ref = Column(Unicode(255), nullable=False)
+    other_repo_id = Column(Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    other_ref = Column(Unicode(255), nullable=False)
 
     @hybrid_property
     def revisions(self):
@@ -2280,7 +2303,7 @@
     def other_ref_parts(self):
         return self.other_ref.split(':')
 
-    author = relationship('User')
+    owner = relationship('User')
     reviewers = relationship('PullRequestReviewers',
                              cascade="all, delete-orphan")
     org_repo = relationship('Repository', primaryjoin='PullRequest.org_repo_id==Repository.repo_id')
@@ -2292,10 +2315,6 @@
     def is_closed(self):
         return self.status == self.STATUS_CLOSED
 
-    @property
-    def last_review_status(self):
-        return str(self.statuses[-1].status) if self.statuses else ''
-
     def user_review_status(self, user_id):
         """Return the user's latest status votes on PR"""
         # note: no filtering on repo - that would be redundant
@@ -2306,6 +2325,15 @@
             .first()
         return str(status.status) if status else ''
 
+    @classmethod
+    def make_nice_id(cls, pull_request_id):
+        '''Return pull request id nicely formatted for displaying'''
+        return '#%s' % pull_request_id
+
+    def nice_id(self):
+        '''Return the id of this pull request, nicely formatted for displaying'''
+        return self.make_nice_id(self.pull_request_id)
+
     def __json__(self):
         return dict(
             revisions=self.revisions
@@ -2337,9 +2365,9 @@
         self.user = user
         self.pull_request = pull_request
 
-    pull_requests_reviewers_id = Column('pull_requests_reviewers_id', Integer(), nullable=False, primary_key=True)
-    pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=False)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True)
+    pull_requests_reviewers_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    pull_request_id = Column(Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=False)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), nullable=True)
 
     user = relationship('User')
     pull_request = relationship('PullRequest')
@@ -2360,11 +2388,11 @@
     TYPE_PULL_REQUEST = u'pull_request'
     TYPE_PULL_REQUEST_COMMENT = u'pull_request_comment'
 
-    notification_id = Column('notification_id', Integer(), nullable=False, primary_key=True)
-    subject = Column('subject', Unicode(512), nullable=True)
-    body = Column('body', UnicodeText(50000), nullable=True)
-    created_by = Column("created_by", Integer(), ForeignKey('users.user_id'), nullable=True)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    notification_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    subject = Column(Unicode(512), nullable=True)
+    body = Column(UnicodeText(50000), nullable=True)
+    created_by = Column(Integer(), ForeignKey('users.user_id'), nullable=True)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
     type_ = Column('type', Unicode(255))
 
     created_by_user = relationship('User')
@@ -2372,8 +2400,8 @@
 
     @property
     def recipients(self):
-        return [x.user for x in UserNotification.query()\
-                .filter(UserNotification.notification == self)\
+        return [x.user for x in UserNotification.query()
+                .filter(UserNotification.notification == self)
                 .order_by(UserNotification.user_id.asc()).all()]
 
     @classmethod
@@ -2410,10 +2438,10 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
     )
-    user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), primary_key=True)
-    notification_id = Column("notification_id", Integer(), ForeignKey('notifications.notification_id'), primary_key=True)
-    read = Column('read', Boolean, default=False)
-    sent_on = Column('sent_on', DateTime(timezone=False), nullable=True, unique=None)
+    user_id = Column(Integer(), ForeignKey('users.user_id'), primary_key=True)
+    notification_id = Column(Integer(), ForeignKey('notifications.notification_id'), primary_key=True)
+    read = Column(Boolean, default=False)
+    sent_on = Column(DateTime(timezone=False), nullable=True, unique=None)
 
     user = relationship('User')
     notification = relationship('Notification')
@@ -2435,14 +2463,14 @@
     GIST_PRIVATE = u'private'
     DEFAULT_FILENAME = u'gistfile1.txt'
 
-    gist_id = Column('gist_id', Integer(), primary_key=True)
-    gist_access_id = Column('gist_access_id', Unicode(250))
-    gist_description = Column('gist_description', UnicodeText(1024))
+    gist_id = Column(Integer(), nullable=False, unique=True, primary_key=True)
+    gist_access_id = Column(Unicode(250))
+    gist_description = Column(UnicodeText(1024))
     gist_owner = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=True)
-    gist_expires = Column('gist_expires', Float(53), nullable=False)
-    gist_type = Column('gist_type', Unicode(128), nullable=False)
-    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
-    modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    gist_expires = Column(Float(53), nullable=False)
+    gist_type = Column(Unicode(128), nullable=False)
+    created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    modified_at = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
 
     owner = relationship('User')
 
@@ -2452,7 +2480,7 @@
     @classmethod
     def get_or_404(cls, id_):
         res = cls.query().filter(cls.gist_access_id == id_).scalar()
-        if not res:
+        if res is None:
             raise HTTPNotFound
         return res
 
@@ -2519,6 +2547,6 @@
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8', 'sqlite_autoincrement': True},
     )
-    repository_id = Column('repository_id', String(250), primary_key=True)
-    repository_path = Column('repository_path', Text)
-    version = Column('version', Integer)
+    repository_id = Column(String(250), nullable=False, unique=True, primary_key=True)
+    repository_path = Column(Text)
+    version = Column(Integer)
--- a/kallithea/model/forms.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/forms.py	Sun Sep 06 23:36:05 2015 +0200
@@ -54,8 +54,8 @@
         min=1,
         not_empty=True,
         messages={
-           'empty': _(u'Please enter a login'),
-           'tooShort': _(u'Enter a value %(min)i characters long or more')}
+           'empty': _('Please enter a login'),
+           'tooShort': _('Enter a value %(min)i characters long or more')}
     )
 
     password = v.UnicodeString(
@@ -63,8 +63,8 @@
         min=3,
         not_empty=True,
         messages={
-            'empty': _(u'Please enter a password'),
-            'tooShort': _(u'Enter %(min)i characters or more')}
+            'empty': _('Please enter a password'),
+            'tooShort': _('Enter %(min)i characters or more')}
     )
 
     remember = v.StringBoolean(if_missing=False)
@@ -102,6 +102,8 @@
                 v.UnicodeString(strip=False, min=6, not_empty=False),
             )
             admin = v.StringBoolean(if_missing=False)
+            chained_validators = [v.ValidPasswordsMatch('new_password',
+                                                        'password_confirmation')]
         else:
             password = All(
                 v.ValidPassword(),
@@ -111,14 +113,15 @@
                 v.ValidPassword(),
                 v.UnicodeString(strip=False, min=6, not_empty=False)
             )
+            chained_validators = [v.ValidPasswordsMatch('password',
+                                                        'password_confirmation')]
 
         active = v.StringBoolean(if_missing=False)
         firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
         lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
         email = All(v.Email(not_empty=True), v.UniqSystemEmail(old_data))
-        extern_name = v.UnicodeString(strip=True)
-        extern_type = v.UnicodeString(strip=True)
-        chained_validators = [v.ValidPasswordsMatch()]
+        extern_name = v.UnicodeString(strip=True, if_missing=None)
+        extern_type = v.UnicodeString(strip=True, if_missing=None)
     return _UserForm
 
 
@@ -145,8 +148,9 @@
     return _UserGroupForm
 
 
-def RepoGroupForm(edit=False, old_data={}, available_groups=[],
+def RepoGroupForm(edit=False, old_data={}, repo_groups=[],
                    can_create_in_root=False):
+    repo_group_ids = [rg[0] for rg in repo_groups]
     class _RepoGroupForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = False
@@ -162,10 +166,12 @@
             #FIXME: do a special check that we cannot move a group to one of
             #its children
             pass
+
         group_parent_id = All(v.CanCreateGroup(can_create_in_root),
-                              v.OneOf(available_groups, hideList=False,
+                              v.OneOf(repo_group_ids, hideList=False,
                                       testValueList=True,
-                                      if_missing=None, not_empty=True))
+                                      if_missing=None, not_empty=True),
+                              v.Int(min=-1, not_empty=True))
         enable_locking = v.StringBoolean(if_missing=False)
         chained_validators = [v.ValidRepoGroup(edit, old_data)]
 
@@ -193,28 +199,45 @@
         lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
         email = All(v.Email(not_empty=True), v.UniqSystemEmail(old_data))
 
-        chained_validators = [v.ValidPasswordsMatch()]
+        chained_validators = [v.ValidPasswordsMatch('password',
+                                                    'password_confirmation')]
 
     return _RegisterForm
 
 
-def PasswordResetForm():
-    class _PasswordResetForm(formencode.Schema):
+def PasswordResetRequestForm():
+    class _PasswordResetRequestForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = True
         email = v.Email(not_empty=True)
-    return _PasswordResetForm
+    return _PasswordResetRequestForm
+
+def PasswordResetConfirmationForm():
+    class _PasswordResetConfirmationForm(formencode.Schema):
+        allow_extra_fields = True
+        filter_extra_fields = True
 
+        email = v.UnicodeString(strip=True, not_empty=True)
+        timestamp = v.Number(strip=True, not_empty=True)
+        token = v.UnicodeString(strip=True, not_empty=True)
+        password = All(v.ValidPassword(), v.UnicodeString(strip=False, min=6))
+        password_confirm = All(v.ValidPassword(), v.UnicodeString(strip=False, min=6))
+
+        chained_validators = [v.ValidPasswordsMatch('password',
+                                                    'password_confirm')]
+    return _PasswordResetConfirmationForm
 
 def RepoForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
              repo_groups=[], landing_revs=[]):
+    repo_group_ids = [rg[0] for rg in repo_groups]
     class _RepoForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = False
         repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
                         v.SlugifyName())
         repo_group = All(v.CanWriteGroup(old_data),
-                         v.OneOf(repo_groups, hideList=True))
+                         v.OneOf(repo_group_ids, hideList=True),
+                         v.Int(min=-1, not_empty=True))
         repo_type = v.OneOf(supported_backends, required=False,
                             if_missing=old_data.get('repo_type'))
         repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
@@ -230,7 +253,8 @@
         if edit:
             #this is repo owner
             user = All(v.UnicodeString(not_empty=True), v.ValidRepoUser())
-            clone_uri_change = v.UnicodeString(not_empty=False, if_missing=v.Missing)
+            # Not a real field - just for reference for validation:
+            # clone_uri_hidden = v.UnicodeString(if_missing='')
 
         chained_validators = [v.ValidCloneUri(),
                               v.ValidRepoName(edit, old_data)]
@@ -280,13 +304,15 @@
 
 def RepoForkForm(edit=False, old_data={}, supported_backends=BACKENDS.keys(),
                  repo_groups=[], landing_revs=[]):
+    repo_group_ids = [rg[0] for rg in repo_groups]
     class _RepoForkForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = False
         repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
                         v.SlugifyName())
         repo_group = All(v.CanWriteGroup(),
-                         v.OneOf(repo_groups, hideList=True))
+                         v.OneOf(repo_group_ids, hideList=True),
+                         v.Int(min=-1, not_empty=True))
         repo_type = All(v.ValidForkType(old_data), v.OneOf(supported_backends))
         description = v.UnicodeString(strip=True, min=1, not_empty=True)
         private = v.StringBoolean(if_missing=False)
@@ -506,6 +532,8 @@
         pullrequest_desc = v.UnicodeString(strip=True, required=False)
         review_members = v.Set()
         updaterev = v.UnicodeString(strip=True, required=False, if_missing=None)
+        owner = All(v.UnicodeString(strip=True, required=True),
+                    v.ValidRepoUser())
 
     return _PullRequestPostForm
 
--- a/kallithea/model/gist.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/gist.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 import os
 import time
 import logging
@@ -33,7 +32,7 @@
 import shutil
 
 from kallithea.lib.utils2 import safe_unicode, unique_id, safe_int, \
-    time_to_datetime, safe_str, AttributeDict
+    time_to_datetime, AttributeDict
 from kallithea.lib.compat import json
 from kallithea.model import BaseModel
 from kallithea.model.db import Gist
@@ -65,7 +64,7 @@
         """
         root_path = RepoModel().repos_path
         rm_path = os.path.join(root_path, GIST_STORE_LOC, gist.gist_access_id)
-        log.info("Removing %s" % (rm_path,))
+        log.info("Removing %s", rm_path)
         shutil.rmtree(rm_path)
 
     def _store_metadata(self, repo, gist_id, gist_access_id, user_id, gist_type,
@@ -113,9 +112,9 @@
         gist_id = safe_unicode(unique_id(20))
         lifetime = safe_int(lifetime, -1)
         gist_expires = time.time() + (lifetime * 60) if lifetime != -1 else -1
-        log.debug('set GIST expiration date to: %s'
-                  % (time_to_datetime(gist_expires)
-                   if gist_expires != -1 else 'forever'))
+        log.debug('set GIST expiration date to: %s',
+                  time_to_datetime(gist_expires)
+                   if gist_expires != -1 else 'forever')
         #create the Database version
         gist = Gist()
         gist.gist_description = description
@@ -132,7 +131,7 @@
             self.sa.add(gist)
 
         gist_repo_path = os.path.join(GIST_STORE_LOC, gist_id)
-        log.debug('Creating new %s GIST repo in %s' % (gist_type, gist_repo_path))
+        log.debug('Creating new %s GIST repo in %s', gist_type, gist_repo_path)
         repo = RepoModel()._create_filesystem_repo(
             repo_name=gist_id, repo_type='hg', repo_group=GIST_STORE_LOC)
 
--- a/kallithea/model/notification.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/notification.py	Sun Sep 06 23:36:05 2015 +0200
@@ -53,7 +53,7 @@
         elif isinstance(notification, (int, long)):
             return Notification.get(notification)
         else:
-            if notification:
+            if notification is not None:
                 raise Exception('notification must be int, long or Instance'
                                 ' of Notification got %s' % type(notification))
 
@@ -85,20 +85,20 @@
         if recipients:
             for u in recipients:
                 obj = self._get_user(u)
-                if obj:
+                if obj is not None:
                     recipients_objs.append(obj)
                 else:
                     # TODO: inform user that requested operation couldn't be completed
                     log.error('cannot email unknown user %r', u)
             recipients_objs = set(recipients_objs)
-            log.debug('sending notifications %s to %s' % (
-                type_, recipients_objs)
+            log.debug('sending notifications %s to %s',
+                type_, recipients_objs
             )
         elif recipients is None:
             # empty recipients means to all admins
             recipients_objs = User.query().filter(User.admin == True).all()
-            log.debug('sending notifications %s to admins: %s' % (
-                type_, recipients_objs)
+            log.debug('sending notifications %s to admins: %s',
+                type_, recipients_objs
             )
         #else: silently skip notification mails?
 
@@ -145,7 +145,7 @@
                                 .get_email_tmpl(type_, 'html', **html_kwargs)
 
             run_task(tasks.send_email, [rec.email], email_subject, email_txt_body,
-                     email_html_body, headers)
+                     email_html_body, headers, author=created_by_obj)
 
         return notif
 
@@ -248,25 +248,31 @@
         """
         #alias
         _n = notification
-        _map = {
-            _n.TYPE_CHANGESET_COMMENT: _('%(user)s commented on changeset at %(when)s'),
-            _n.TYPE_MESSAGE: _('%(user)s sent message at %(when)s'),
-            _n.TYPE_MENTION: _('%(user)s mentioned you at %(when)s'),
-            _n.TYPE_REGISTRATION: _('%(user)s registered in Kallithea at %(when)s'),
-            _n.TYPE_PULL_REQUEST: _('%(user)s opened new pull request at %(when)s'),
-            _n.TYPE_PULL_REQUEST_COMMENT: _('%(user)s commented on pull request at %(when)s')
-        }
-        tmpl = _map[notification.type_]
 
         if show_age:
-            when = h.age(notification.created_on)
+            return {
+                    _n.TYPE_CHANGESET_COMMENT: _('%(user)s commented on changeset %(age)s'),
+                    _n.TYPE_MESSAGE: _('%(user)s sent message %(age)s'),
+                    _n.TYPE_MENTION: _('%(user)s mentioned you %(age)s'),
+                    _n.TYPE_REGISTRATION: _('%(user)s registered in Kallithea %(age)s'),
+                    _n.TYPE_PULL_REQUEST: _('%(user)s opened new pull request %(age)s'),
+                    _n.TYPE_PULL_REQUEST_COMMENT: _('%(user)s commented on pull request %(age)s'),
+                }[notification.type_] % dict(
+                    user=notification.created_by_user.username,
+                    age=h.age(notification.created_on),
+                )
         else:
-            when = h.fmt_date(notification.created_on)
-
-        return tmpl % dict(
-            user=notification.created_by_user.username,
-            when=when,
-            )
+            return {
+                    _n.TYPE_CHANGESET_COMMENT: _('%(user)s commented on changeset at %(when)s'),
+                    _n.TYPE_MESSAGE: _('%(user)s sent message at %(when)s'),
+                    _n.TYPE_MENTION: _('%(user)s mentioned you at %(when)s'),
+                    _n.TYPE_REGISTRATION: _('%(user)s registered in Kallithea at %(when)s'),
+                    _n.TYPE_PULL_REQUEST: _('%(user)s opened new pull request at %(when)s'),
+                    _n.TYPE_PULL_REQUEST_COMMENT: _('%(user)s commented on pull request at %(when)s'),
+                }[notification.type_] % dict(
+                    user=notification.created_by_user.username,
+                    when=h.fmt_date(notification.created_on),
+                )
 
 
 class EmailNotificationModel(BaseModel):
@@ -293,13 +299,13 @@
             self.TYPE_PULL_REQUEST_COMMENT: 'pull_request_comment',
         }
         self._subj_map = {
-            self.TYPE_CHANGESET_COMMENT: _('Comment on %(repo_name)s changeset %(short_id)s on %(branch)s by %(comment_username)s'),
+            self.TYPE_CHANGESET_COMMENT: _('[Comment] %(repo_name)s changeset %(short_id)s on %(branch)s'),
             self.TYPE_MESSAGE: 'Test Message',
             # self.TYPE_PASSWORD_RESET
             self.TYPE_REGISTRATION: _('New user %(new_username)s registered'),
             # self.TYPE_DEFAULT
-            self.TYPE_PULL_REQUEST: _('Review request on %(repo_name)s pull request #%(pr_id)s from %(ref)s by %(pr_username)s'),
-            self.TYPE_PULL_REQUEST_COMMENT: _('Comment on %(repo_name)s pull request #%(pr_id)s from %(ref)s by %(comment_username)s'),
+            self.TYPE_PULL_REQUEST: _('[Added] %(repo_name)s pull request %(pr_nice_id)s from %(ref)s'),
+            self.TYPE_PULL_REQUEST_COMMENT: _('[Comment] %(repo_name)s pull request %(pr_nice_id)s from %(ref)s'),
         }
 
     def get_email_description(self, type_, **kwargs):
@@ -309,12 +315,15 @@
         tmpl = self._subj_map[type_]
         try:
             subj = tmpl % kwargs
-        except KeyError, e:
+        except KeyError as e:
             log.error('error generating email subject for %r from %s: %s', type_, ','.join(self._subj_map.keys()), e)
             raise
         l = [safe_unicode(x) for x in [kwargs.get('status_change'), kwargs.get('closing_pr') and _('Closing')] if x]
         if l:
-            subj += ' (%s)' % (', '.join(l))
+            if subj.startswith('['):
+                subj = '[' + ', '.join(l) + ': ' + subj[1:]
+            else:
+                subj = '[' + ', '.join(l) + '] ' + subj
         return subj
 
     def get_email_tmpl(self, type_, content_type, **kwargs):
@@ -329,5 +338,5 @@
                    'h': h,
                    'c': c}
         _kwargs.update(kwargs)
-        log.debug('rendering tmpl %s with kwargs %s' % (base, _kwargs))
+        log.debug('rendering tmpl %s with kwargs %s', base, _kwargs)
         return email_template.render(**_kwargs)
--- a/kallithea/model/permission.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/permission.py	Sun Sep 06 23:36:05 2015 +0200
@@ -79,7 +79,7 @@
         perms = UserToPerm.query().filter(UserToPerm.user == user).all()
         defined_perms_groups = map(_get_group,
                                 (x.permission.permission_name for x in perms))
-        log.debug('GOT ALREADY DEFINED:%s' % perms)
+        log.debug('GOT ALREADY DEFINED:%s', perms)
         DEFAULT_PERMS = Permission.DEFAULT_USER_PERMISSIONS
 
         if force:
@@ -92,8 +92,8 @@
         for perm_name in DEFAULT_PERMS:
             gr = _get_group(perm_name)
             if gr not in defined_perms_groups:
-                log.debug('GR:%s not found, creating permission %s'
-                          % (gr, perm_name))
+                log.debug('GR:%s not found, creating permission %s',
+                          gr, perm_name)
                 new_perm = _make_perm(perm_name)
                 self.sa.add(new_perm)
 
@@ -108,7 +108,7 @@
 
             # stage 2 reset defaults and set them from form data
             def _make_new(usr, perm_name):
-                log.debug('Creating new permission:%s' % (perm_name))
+                log.debug('Creating new permission:%s', perm_name)
                 new = UserToPerm()
                 new.user = usr
                 new.permission = Permission.get_by_key(perm_name)
--- a/kallithea/model/pull_request.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/pull_request.py	Sun Sep 06 23:36:05 2015 +0200
@@ -32,6 +32,7 @@
 
 from kallithea.model.meta import Session
 from kallithea.lib import helpers as h
+from kallithea.lib.exceptions import UserInvalidException
 from kallithea.model import BaseModel
 from kallithea.model.db import PullRequest, PullRequestReviewers, Notification,\
     ChangesetStatus, User
@@ -86,23 +87,24 @@
         new.revisions = revisions
         new.title = title
         new.description = description
-        new.author = created_by_user
+        new.owner = created_by_user
         Session().add(new)
         Session().flush()
 
         #reset state to under-review
         from kallithea.model.comment import ChangesetCommentsModel
         comment = ChangesetCommentsModel().create(
-            text=u'Auto status change to %s' % (ChangesetStatus.get_status_lbl(ChangesetStatus.STATUS_UNDER_REVIEW)),
+            text=u'',
             repo=org_repo,
-            user=new.author,
+            user=new.owner,
             pull_request=new,
-            send_email=False
+            send_email=False,
+            status_change=ChangesetStatus.STATUS_UNDER_REVIEW,
         )
         ChangesetStatusModel().set_status(
             org_repo,
             ChangesetStatus.STATUS_UNDER_REVIEW,
-            new.author,
+            new.owner,
             comment,
             pull_request=new
         )
@@ -117,6 +119,8 @@
         #members
         for member in set(reviewers):
             _usr = self._get_user(member)
+            if _usr is None:
+                raise UserInvalidException(member)
             reviewer = PullRequestReviewers(_usr, pr)
             Session().add(reviewer)
 
@@ -130,29 +134,29 @@
                                       h.canonical_hostname())]
         subject = safe_unicode(
             h.link_to(
-              _('%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s') % \
-                {'user': pr.author.username,
+              _('%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s') % \
+                {'user': pr.owner.username,
                  'pr_title': pr.title,
-                 'pr_id': pr.pull_request_id},
+                 'pr_nice_id': pr.nice_id()},
                 pr_url)
             )
         body = pr.description
         _org_ref_type, org_ref_name, _org_rev = pr.org_ref.split(':')
         email_kwargs = {
             'pr_title': pr.title,
-            'pr_user_created': h.person(pr.author),
+            'pr_user_created': h.person(pr.owner),
             'pr_repo_url': h.canonical_url('summary_home', repo_name=pr.other_repo.repo_name),
             'pr_url': pr_url,
             'pr_revisions': revision_data,
             'repo_name': pr.other_repo.repo_name,
-            'pr_id': pr.pull_request_id,
+            'pr_nice_id': pr.nice_id(),
             'ref': org_ref_name,
-            'pr_username': pr.author.username,
+            'pr_username': pr.owner.username,
             'threading': threading,
             'is_mention': False,
             }
         if reviewers:
-            NotificationModel().create(created_by=pr.author, subject=subject, body=body,
+            NotificationModel().create(created_by=pr.owner, subject=subject, body=body,
                                        recipients=reviewers,
                                        type_=Notification.TYPE_PULL_REQUEST,
                                        email_kwargs=email_kwargs)
@@ -163,8 +167,7 @@
         if mention_recipients:
             email_kwargs['is_mention'] = True
             subject = _('[Mention]') + ' ' + subject
-
-            NotificationModel().create(created_by=pr.author, subject=subject, body=body,
+            NotificationModel().create(created_by=pr.owner, subject=subject, body=body,
                                        recipients=mention_recipients,
                                        type_=Notification.TYPE_PULL_REQUEST,
                                        email_kwargs=email_kwargs)
@@ -175,7 +178,7 @@
         mention_recipients.difference_update(User.get_by_username(username, case_insensitive=True)
                                              for username in extract_mentioned_users(old_description))
 
-        log.debug("Mentioning %s" % mention_recipients)
+        log.debug("Mentioning %s", mention_recipients)
         self.__add_reviewers(pr, [], mention_recipients)
 
     def update_reviewers(self, pull_request, reviewers_ids):
@@ -190,10 +193,10 @@
         to_add = reviewers_ids.difference(current_reviewers_ids)
         to_remove = current_reviewers_ids.difference(reviewers_ids)
 
-        log.debug("Adding %s reviewers" % to_add)
+        log.debug("Adding %s reviewers", to_add)
         self.__add_reviewers(pull_request, to_add)
 
-        log.debug("Removing %s reviewers" % to_remove)
+        log.debug("Removing %s reviewers", to_remove)
         for uid in to_remove:
             reviewer = PullRequestReviewers.query()\
                     .filter(PullRequestReviewers.user_id==uid,
--- a/kallithea/model/repo.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/repo.py	Sun Sep 06 23:36:05 2015 +0200
@@ -26,7 +26,6 @@
 
 """
 
-from __future__ import with_statement
 import os
 import shutil
 import logging
@@ -45,8 +44,7 @@
 from kallithea.model import BaseModel
 from kallithea.model.db import Repository, UserRepoToPerm, UserGroupRepoToPerm, \
     UserRepoGroupToPerm, UserGroupRepoGroupToPerm, User, Permission, \
-    Statistics, UserGroup, UserGroupMember, Ui, RepoGroup, \
-    Setting, RepositoryField
+    Statistics, UserGroup, Ui, RepoGroup, RepositoryField
 
 from kallithea.lib import helpers as h
 from kallithea.lib.auth import HasRepoPermissionAny, HasUserGroupPermissionAny
@@ -209,10 +207,7 @@
                            cs_cache.get('message'))
 
         def desc(desc):
-            if c.visual.stylify_metatags:
-                return h.urlify_text(h.desc_stylize(h.html_escape(h.truncate(desc, 60))))
-            else:
-                return h.urlify_text(h.html_escape(h.truncate(desc, 60)))
+            return h.urlify_text(desc, truncate=60, stylize=c.visual.stylify_metatags)
 
         def state(repo_state):
             return _render("repo_state", repo_state)
@@ -327,26 +322,19 @@
 
             if 'repo_group' in kwargs:
                 cur_repo.group = RepoGroup.get(kwargs['repo_group'])
-            log.debug('Updating repo %s with params:%s' % (cur_repo, kwargs))
-            for strip, k in [(1, 'repo_enable_downloads'),
-                             (1, 'repo_description'),
-                             (1, 'repo_enable_locking'),
-                             (1, 'repo_landing_rev'),
-                             (1, 'repo_private'),
-                             (1, 'repo_enable_statistics'),
-                             (0, 'clone_uri'),]:
+            log.debug('Updating repo %s with params:%s', cur_repo, kwargs)
+            for k in ['repo_enable_downloads',
+                      'repo_description',
+                      'repo_enable_locking',
+                      'repo_landing_rev',
+                      'repo_private',
+                      'repo_enable_statistics',
+                      ]:
                 if k in kwargs:
-                    val = kwargs[k]
-                    if strip:
-                        k = remove_prefix(k, 'repo_')
-                    if k == 'clone_uri':
-                        from kallithea.model.validators import Missing
-                        _change = kwargs.get('clone_uri_change')
-                        if _change == Missing:
-                            # we don't change the value, so use original one
-                            val = cur_repo.clone_uri
-
-                    setattr(cur_repo, k, val)
+                    setattr(cur_repo, remove_prefix(k, 'repo_'), kwargs[k])
+            clone_uri = kwargs.get('clone_uri')
+            if clone_uri is not None and clone_uri != cur_repo.clone_uri_hidden:
+                cur_repo.clone_uri = clone_uri
 
             new_name = cur_repo.get_new_name(kwargs['repo_name'])
             cur_repo.repo_name = new_name
@@ -545,7 +533,7 @@
         if not cur_user:
             cur_user = getattr(get_current_authuser(), 'username', None)
         repo = self._get_repo(repo)
-        if repo:
+        if repo is not None:
             if forks == 'detach':
                 for r in repo.forks:
                     r.fork = None
@@ -594,7 +582,7 @@
         obj.user = user
         obj.permission = permission
         self.sa.add(obj)
-        log.debug('Granted perm %s to %s on %s' % (perm, user, repo))
+        log.debug('Granted perm %s to %s on %s', perm, user, repo)
         return obj
 
     def revoke_user_permission(self, repo, user):
@@ -612,9 +600,9 @@
             .filter(UserRepoToPerm.repository == repo) \
             .filter(UserRepoToPerm.user == user) \
             .scalar()
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
-            log.debug('Revoked perm on %s on %s' % (repo, user))
+            log.debug('Revoked perm on %s on %s', repo, user)
 
     def grant_user_group_permission(self, repo, group_name, perm):
         """
@@ -644,7 +632,7 @@
         obj.users_group = group_name
         obj.permission = permission
         self.sa.add(obj)
-        log.debug('Granted perm %s to %s on %s' % (perm, group_name, repo))
+        log.debug('Granted perm %s to %s on %s', perm, group_name, repo)
         return obj
 
     def revoke_user_group_permission(self, repo, group_name):
@@ -662,9 +650,9 @@
             .filter(UserGroupRepoToPerm.repository == repo) \
             .filter(UserGroupRepoToPerm.users_group == group_name) \
             .scalar()
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
-            log.debug('Revoked perm to %s on %s' % (repo, group_name))
+            log.debug('Revoked perm to %s on %s', repo, group_name)
 
     def delete_stats(self, repo_name):
         """
@@ -676,7 +664,7 @@
         try:
             obj = self.sa.query(Statistics) \
                 .filter(Statistics.repository == repo).scalar()
-            if obj:
+            if obj is not None:
                 self.sa.delete(obj)
         except Exception:
             log.error(traceback.format_exc())
@@ -720,9 +708,9 @@
         if is_valid_repo_group(repo_path, self.repos_path):
             raise Exception('This path %s is a valid group' % repo_path)
 
-        log.info('creating repo %s in %s from url: `%s`' % (
+        log.info('creating repo %s in %s from url: `%s`',
             repo_name, safe_unicode(repo_path),
-            obfuscate_url_pw(clone_uri)))
+            obfuscate_url_pw(clone_uri))
 
         backend = get_backend(repo_type)
 
@@ -737,12 +725,12 @@
         elif repo_type == 'git':
             repo = backend(repo_path, create=True, src_url=clone_uri, bare=True)
             # add kallithea hook into this repo
-            ScmModel().install_git_hook(repo=repo)
+            ScmModel().install_git_hooks(repo=repo)
         else:
             raise Exception('Not supported repo_type %s expected hg/git' % repo_type)
 
-        log.debug('Created repo %s with %s backend'
-                  % (safe_unicode(repo_name), safe_unicode(repo_type)))
+        log.debug('Created repo %s with %s backend',
+                  safe_unicode(repo_name), safe_unicode(repo_type))
         return repo
 
     def _rename_filesystem_repo(self, old, new):
@@ -752,7 +740,7 @@
         :param old: old name
         :param new: new name
         """
-        log.info('renaming repo from %s to %s' % (old, new))
+        log.info('renaming repo from %s to %s', old, new)
 
         old_path = os.path.join(self.repos_path, old)
         new_path = os.path.join(self.repos_path, new)
@@ -771,7 +759,7 @@
         :param repo: repo object
         """
         rm_path = os.path.join(self.repos_path, repo.repo_name)
-        log.info("Removing %s" % (rm_path))
+        log.info("Removing %s", rm_path)
 
         _now = datetime.now()
         _ms = str(_now.microsecond).rjust(6, '0')
--- a/kallithea/model/repo_group.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/repo_group.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,7 +12,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.user_group
+kallithea.model.repo_group
 ~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 repo group model for Kallithea
@@ -87,13 +87,13 @@
         """
 
         create_path = os.path.join(self.repos_path, group_name)
-        log.debug('creating new group in %s' % create_path)
+        log.debug('creating new group in %s', create_path)
 
         if os.path.isdir(create_path):
             raise Exception('That directory already exists !')
 
         os.makedirs(create_path)
-        log.debug('Created group in %s' % create_path)
+        log.debug('Created group in %s', create_path)
 
     def _rename_group(self, old, new):
         """
@@ -106,12 +106,12 @@
             log.debug('skipping group rename')
             return
 
-        log.debug('renaming repository group from %s to %s' % (old, new))
+        log.debug('renaming repository group from %s to %s', old, new)
 
         old_path = os.path.join(self.repos_path, old)
         new_path = os.path.join(self.repos_path, new)
 
-        log.debug('renaming repos paths from %s to %s' % (old_path, new_path))
+        log.debug('renaming repos paths from %s to %s', old_path, new_path)
 
         if os.path.isdir(new_path):
             raise Exception('Was trying to rename to already '
@@ -129,7 +129,7 @@
         paths = os.sep.join(paths)
 
         rm_path = os.path.join(self.repos_path, paths)
-        log.info("Removing group %s" % (rm_path))
+        log.info("Removing group %s", rm_path)
         # delete only if that path really exists
         if os.path.isdir(rm_path):
             if force_delete:
@@ -235,8 +235,8 @@
 
         # start updates
         updates = []
-        log.debug('Now updating permissions for %s in recursive mode:%s'
-                  % (repo_group, recursive))
+        log.debug('Now updating permissions for %s in recursive mode:%s',
+                  repo_group, recursive)
 
         for obj in repo_group.recursive_groups_and_repos():
             # iterated obj is an instance of a repos group or repository in
@@ -336,7 +336,7 @@
             self.sa.delete(repo_group)
             self._delete_group(repo_group, force_delete)
         except Exception:
-            log.error('Error removing repo_group %s' % repo_group)
+            log.error('Error removing repo_group %s', repo_group)
             raise
 
     def add_permission(self, repo_group, obj, obj_type, perm, recursive):
@@ -466,7 +466,7 @@
         obj.user = user
         obj.permission = permission
         self.sa.add(obj)
-        log.debug('Granted perm %s to %s on %s' % (perm, user, repo_group))
+        log.debug('Granted perm %s to %s on %s', perm, user, repo_group)
         return obj
 
     def revoke_user_permission(self, repo_group, user):
@@ -485,9 +485,9 @@
             .filter(UserRepoGroupToPerm.user == user)\
             .filter(UserRepoGroupToPerm.group == repo_group)\
             .scalar()
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
-            log.debug('Revoked perm on %s on %s' % (repo_group, user))
+            log.debug('Revoked perm on %s on %s', repo_group, user)
 
     def grant_user_group_permission(self, repo_group, group_name, perm):
         """
@@ -518,7 +518,7 @@
         obj.users_group = group_name
         obj.permission = permission
         self.sa.add(obj)
-        log.debug('Granted perm %s to %s on %s' % (perm, group_name, repo_group))
+        log.debug('Granted perm %s to %s on %s', perm, group_name, repo_group)
         return obj
 
     def revoke_user_group_permission(self, repo_group, group_name):
@@ -537,6 +537,6 @@
             .filter(UserGroupRepoGroupToPerm.group == repo_group)\
             .filter(UserGroupRepoGroupToPerm.users_group == group_name)\
             .scalar()
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
-            log.debug('Revoked perm to %s on %s' % (repo_group, group_name))
+            log.debug('Revoked perm to %s on %s', repo_group, group_name)
--- a/kallithea/model/repo_permission.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/repo_permission.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.users_group
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.model.repo_permission
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 repository permission model for Kallithea
 
--- a/kallithea/model/scm.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/scm.py	Sun Sep 06 23:36:05 2015 +0200
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 import os
 import re
 import time
@@ -50,7 +49,7 @@
 from kallithea.lib.utils2 import safe_str, safe_unicode, get_server_url,\
     _set_extras
 from kallithea.lib.auth import HasRepoPermissionAny, HasRepoGroupPermissionAny,\
-    HasUserGroupPermissionAny
+    HasUserGroupPermissionAny, HasPermissionAny, HasPermissionAll
 from kallithea.lib.utils import get_filesystem_repos, make_ui, \
     action_logger
 from kallithea.model import BaseModel
@@ -247,7 +246,7 @@
             return cls.get(instance)
         elif isinstance(instance, basestring):
             return cls.get_by_repo_name(instance)
-        elif instance:
+        elif instance is not None:
             raise Exception('given object must be int, basestr or Instance'
                             ' of %s got %s' % (type(cls), type(instance)))
 
@@ -272,7 +271,7 @@
         if repos_path is None:
             repos_path = self.repos_path
 
-        log.info('scanning for repositories in %s' % repos_path)
+        log.info('scanning for repositories in %s', repos_path)
 
         baseui = make_ui('db')
         repos = {}
@@ -297,7 +296,7 @@
                         repos[name] = klass(path[1])
             except OSError:
                 continue
-        log.debug('found %s paths with repositories' % (len(repos)))
+        log.debug('found %s paths with repositories', len(repos))
         return repos
 
     def get_repos(self, all_repos=None, sort_key=None, simple=False):
@@ -340,7 +339,7 @@
         """
         CacheInvalidation.set_invalidate(repo_name, delete=delete)
         repo = Repository.get_by_repo_name(repo_name)
-        if repo:
+        if repo is not None:
             repo.update_changeset_cache()
 
     def toggle_following_repo(self, follow_repo_id, user_id):
@@ -505,6 +504,9 @@
                         % (scm_type,))
 
     def pull_changes(self, repo, username):
+        """
+        Pull from "clone URL".
+        """
         dbrepo = self.__get_repo(repo)
         clone_uri = dbrepo.clone_uri
         if not clone_uri:
@@ -536,10 +538,9 @@
     def commit_change(self, repo, repo_name, cs, user, author, message,
                       content, f_path):
         """
-        Commits changes
+        Commit a change to a single file
 
-        :param repo: SCM instance
-
+        :param repo: a db_repo.scm_instance
         """
         user = self._get_user(user)
         IMC = self._get_IMC_module(repo.alias)
@@ -557,7 +558,7 @@
         try:
             tip = imc.commit(message=message, author=author,
                              parents=[cs], branch=cs.branch)
-        except Exception, e:
+        except Exception as e:
             log.error(traceback.format_exc())
             raise IMCCommitError(str(e))
         finally:
@@ -677,6 +678,9 @@
 
     def update_nodes(self, user, repo, message, nodes, parent_cs=None,
                      author=None, trigger_push_hook=True):
+        """
+        Commits specified nodes to repo. Again.
+        """
         user = self._get_user(user)
         scm_instance = repo.scm_instance_no_cache()
 
@@ -807,7 +811,7 @@
         repo = self.__get_repo(repo)
         hist_l.append(['rev:tip', _('latest tip')])
         choices.append('rev:tip')
-        if not repo:
+        if repo is None:
             return choices, hist_l
 
         repo = repo.scm_instance
@@ -830,7 +834,7 @@
 
         return choices, hist_l
 
-    def install_git_hook(self, repo, force_create=False):
+    def install_git_hooks(self, repo, force_create=False):
         """
         Creates a kallithea hook inside a git repository
 
@@ -854,7 +858,7 @@
         for h_type, tmpl in [('pre', tmpl_pre), ('post', tmpl_post)]:
             _hook_file = jn(loc, '%s-receive' % h_type)
             has_hook = False
-            log.debug('Installing git hook in repo %s' % repo)
+            log.debug('Installing git hook in repo %s', repo)
             if os.path.exists(_hook_file):
                 # let's take a look at this hook, maybe it's kallithea ?
                 log.debug('hook exists, checking if it is from kallithea')
@@ -865,7 +869,7 @@
                     if matches:
                         try:
                             ver = matches.groups()[0]
-                            log.debug('got %s it is kallithea' % (ver))
+                            log.debug('got %s it is kallithea', ver)
                             has_hook = True
                         except Exception:
                             log.error(traceback.format_exc())
@@ -874,13 +878,31 @@
                 has_hook = True
 
             if has_hook or force_create:
-                log.debug('writing %s hook file !' % (h_type,))
+                log.debug('writing %s hook file !', h_type)
                 try:
                     with open(_hook_file, 'wb') as f:
                         tmpl = tmpl.replace('_TMPL_', kallithea.__version__)
                         f.write(tmpl)
                     os.chmod(_hook_file, 0755)
-                except IOError, e:
-                    log.error('error writing %s: %s' % (_hook_file, e))
+                except IOError as e:
+                    log.error('error writing %s: %s', _hook_file, e)
             else:
                 log.debug('skipping writing hook file')
+
+def AvailableRepoGroupChoices(top_perms, repo_group_perms, extras=()):
+    """Return group_id,string tuples with choices for all the repo groups where
+    the user has the necessary permissions.
+
+    Top level is -1.
+    """
+    groups = RepoGroup.query().all()
+    if HasPermissionAll('hg.admin')('available repo groups'):
+        groups.append(None)
+    else:
+        groups = list(RepoGroupList(groups, perm_set=repo_group_perms))
+        if top_perms and HasPermissionAny(*top_perms)('available repo groups'):
+            groups.append(None)
+        for extra in extras:
+            if not any(rg == extra for rg in groups):
+                groups.append(extra)
+    return RepoGroup.groups_choices(groups=groups)
--- a/kallithea/model/user.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/user.py	Sun Sep 06 23:36:05 2015 +0200
@@ -26,8 +26,13 @@
 """
 
 
+import hashlib
+import hmac
 import logging
+import time
 import traceback
+
+from pylons import config
 from pylons.i18n.translation import _
 
 from sqlalchemy.exc import DatabaseError
@@ -47,6 +52,8 @@
 
 
 class UserModel(BaseModel):
+    password_reset_token_lifetime = 86400 # 24 hours
+
     cls = User
 
     def get(self, user_id, cache=False):
@@ -59,34 +66,21 @@
     def get_user(self, user):
         return self._get_user(user)
 
-    def get_by_username(self, username, cache=False, case_insensitive=False):
-
-        if case_insensitive:
-            user = self.sa.query(User).filter(User.username.ilike(username))
-        else:
-            user = self.sa.query(User)\
-                .filter(User.username == username)
-        if cache:
-            user = user.options(FromCache("sql_cache_short",
-                                          "get_user_%s" % username))
-        return user.scalar()
-
-    def get_by_email(self, email, cache=False, case_insensitive=False):
-        return User.get_by_email(email, case_insensitive, cache)
-
-    def get_by_api_key(self, api_key, cache=False):
-        return User.get_by_api_key(api_key, cache)
-
     def create(self, form_data, cur_user=None):
         if not cur_user:
             cur_user = getattr(get_current_authuser(), 'username', None)
 
-        from kallithea.lib.hooks import log_create_user, check_allowed_create_user
+        from kallithea.lib.hooks import log_create_user, \
+            check_allowed_create_user
         _fd = form_data
         user_data = {
-            'username': _fd['username'], 'password': _fd['password'],
-            'email': _fd['email'], 'firstname': _fd['firstname'], 'lastname': _fd['lastname'],
-            'active': _fd['active'], 'admin': False
+            'username': _fd['username'],
+            'password': _fd['password'],
+            'email': _fd['email'],
+            'firstname': _fd['firstname'],
+            'lastname': _fd['lastname'],
+            'active': _fd['active'],
+            'admin': False
         }
         # raises UserCreationError if it's not allowed
         check_allowed_create_user(user_data, cur_user)
@@ -128,7 +122,8 @@
             cur_user = getattr(get_current_authuser(), 'username', None)
 
         from kallithea.lib.auth import get_crypt_password, check_password
-        from kallithea.lib.hooks import log_create_user, check_allowed_create_user
+        from kallithea.lib.hooks import log_create_user, \
+            check_allowed_create_user
         user_data = {
             'username': username, 'password': password,
             'email': email, 'firstname': firstname, 'lastname': lastname,
@@ -137,14 +132,14 @@
         # raises UserCreationError if it's not allowed
         check_allowed_create_user(user_data, cur_user)
 
-        log.debug('Checking for %s account in Kallithea database' % username)
+        log.debug('Checking for %s account in Kallithea database', username)
         user = User.get_by_username(username, case_insensitive=True)
         if user is None:
-            log.debug('creating new user %s' % username)
+            log.debug('creating new user %s', username)
             new_user = User()
             edit = False
         else:
-            log.debug('updating user %s' % username)
+            log.debug('updating user %s', username)
             new_user = user
             edit = True
 
@@ -153,8 +148,10 @@
             new_user.admin = admin
             new_user.email = email
             new_user.active = active
-            new_user.extern_name = safe_unicode(extern_name) if extern_name else None
-            new_user.extern_type = safe_unicode(extern_type) if extern_type else None
+            new_user.extern_name = safe_unicode(extern_name) \
+                if extern_name else None
+            new_user.extern_type = safe_unicode(extern_type) \
+                if extern_type else None
             new_user.name = firstname
             new_user.lastname = lastname
 
@@ -162,12 +159,13 @@
                 new_user.api_key = generate_api_key()
 
             # set password only if creating an user or password is changed
-            password_change = new_user.password and not check_password(password,
-                                                            new_user.password)
+            password_change = new_user.password and \
+                not check_password(password, new_user.password)
             if not edit or password_change:
                 reason = 'new password' if edit else 'new user'
-                log.debug('Updating password reason=>%s' % (reason,))
-                new_user.password = get_crypt_password(password) if password else None
+                log.debug('Updating password reason=>%s', reason)
+                new_user.password = get_crypt_password(password) \
+                    if password else None
 
             self.sa.add(new_user)
 
@@ -192,14 +190,17 @@
 
         # notification to admins
         subject = _('New user registration')
-        body = ('New user registration\n'
-                '---------------------\n'
-                '- Username: %s\n'
-                '- Full Name: %s\n'
-                '- Email: %s\n')
-        body = body % (new_user.username, new_user.full_name, new_user.email)
+        body = (
+            'New user registration\n'
+            '---------------------\n'
+            '- Username: {user.username}\n'
+            '- Full Name: {user.full_name}\n'
+            '- Email: {user.email}\n'
+            ).format(user=new_user)
         edit_url = h.canonical_url('edit_user', id=new_user.user_id)
-        email_kwargs = {'registered_user_url': edit_url, 'new_username': new_user.username}
+        email_kwargs = {
+            'registered_user_url': edit_url,
+            'new_username': new_user.username}
         NotificationModel().create(created_by=new_user, subject=subject,
                                    body=body, recipients=None,
                                    type_=Notification.TYPE_REGISTRATION,
@@ -211,7 +212,7 @@
         user = self.get(user_id, cache=False)
         if user.username == User.DEFAULT_USER:
             raise DefaultUserException(
-                            _("You can't Edit this user since it's "
+                            _("You can't edit this user since it's "
                               "crucial for entire application"))
 
         for k, v in form_data.items():
@@ -233,7 +234,7 @@
         user = self._get_user(user)
         if user.username == User.DEFAULT_USER:
             raise DefaultUserException(
-                _("You can't Edit this user since it's"
+                _("You can't edit this user since it's"
                   " crucial for entire application")
             )
 
@@ -246,122 +247,170 @@
         return user
 
     def delete(self, user, cur_user=None):
-        if not cur_user:
+        if cur_user is None:
             cur_user = getattr(get_current_authuser(), 'username', None)
         user = self._get_user(user)
 
         if user.username == User.DEFAULT_USER:
             raise DefaultUserException(
-                _(u"You can't remove this user since it's"
-                  " crucial for entire application")
-            )
+                _("You can't remove this user since it is"
+                  " crucial for the entire application"))
         if user.repositories:
             repos = [x.repo_name for x in user.repositories]
             raise UserOwnsReposException(
-                _(u'User "%s" still owns %s repositories and cannot be '
+                _('User "%s" still owns %s repositories and cannot be '
                   'removed. Switch owners or remove those repositories: %s')
-                % (user.username, len(repos), ', '.join(repos))
-            )
+                % (user.username, len(repos), ', '.join(repos)))
         if user.repo_groups:
             repogroups = [x.group_name for x in user.repo_groups]
-            raise UserOwnsReposException(
-                _(u'User "%s" still owns %s repository groups and cannot be '
-                  'removed. Switch owners or remove those repository groups: %s')
-                % (user.username, len(repogroups), ', '.join(repogroups))
-            )
+            raise UserOwnsReposException(_(
+                'User "%s" still owns %s repository groups and cannot be '
+                'removed. Switch owners or remove those repository groups: %s')
+                % (user.username, len(repogroups), ', '.join(repogroups)))
         if user.user_groups:
             usergroups = [x.users_group_name for x in user.user_groups]
             raise UserOwnsReposException(
-                _(u'User "%s" still owns %s user groups and cannot be '
+                _('User "%s" still owns %s user groups and cannot be '
                   'removed. Switch owners or remove those user groups: %s')
-                % (user.username, len(usergroups), ', '.join(usergroups))
-            )
+                % (user.username, len(usergroups), ', '.join(usergroups)))
         self.sa.delete(user)
 
         from kallithea.lib.hooks import log_delete_user
         log_delete_user(user.get_dict(), cur_user)
 
-    def reset_password_link(self, data):
+    def get_reset_password_token(self, user, timestamp, session_id):
+        """
+        The token is a 40-digit hexstring, calculated as a HMAC-SHA1.
+
+        In a traditional HMAC scenario, an attacker is unable to know or
+        influence the secret key, but can know or influence the message
+        and token. This scenario is slightly different (in particular
+        since the message sender is also the message recipient), but
+        sufficiently similar to use an HMAC. Benefits compared to a plain
+        SHA1 hash includes resistance against a length extension attack.
+
+        The HMAC key consists of the following values (known only to the
+        server and authorized users):
+
+        * per-application secret (the `app_instance_uuid` setting), without
+          which an attacker cannot counterfeit tokens
+        * hashed user password, invalidating the token upon password change
+
+        The HMAC message consists of the following values (potentially known
+        to an attacker):
+
+        * session ID (the anti-CSRF token), requiring an attacker to have
+          access to the browser session in which the token was created
+        * numeric user ID, limiting the token to a specific user (yet allowing
+          users to be renamed)
+        * user email address
+        * time of token issue (a Unix timestamp, to enable token expiration)
+
+        The key and message values are separated by NUL characters, which are
+        guaranteed not to occur in any of the values.
+        """
+        app_secret = config.get('app_instance_uuid')
+        return hmac.HMAC(
+            key=u'\0'.join([app_secret, user.password]).encode('utf-8'),
+            msg=u'\0'.join([session_id, str(user.user_id), user.email, str(timestamp)]).encode('utf-8'),
+            digestmod=hashlib.sha1,
+        ).hexdigest()
+
+    def send_reset_password_email(self, data):
+        """
+        Sends email with a password reset token and link to the password
+        reset confirmation page with all information (including the token)
+        pre-filled. Also returns URL of that page, only without the token,
+        allowing users to copy-paste or manually enter the token from the
+        email.
+        """
         from kallithea.lib.celerylib import tasks, run_task
         from kallithea.model.notification import EmailNotificationModel
         import kallithea.lib.helpers as h
 
         user_email = data['email']
         user = User.get_by_email(user_email)
-        if user:
-            log.debug('password reset user found %s' % user)
-            link = h.canonical_url('reset_password_confirmation', key=user.api_key)
+        timestamp = int(time.time())
+        if user is not None:
+            log.debug('password reset user %s found', user)
+            token = self.get_reset_password_token(user,
+                                                  timestamp,
+                                                  h.authentication_token())
+            # URL must be fully qualified; but since the token is locked to
+            # the current browser session, we must provide a URL with the
+            # current scheme and hostname, rather than the canonical_url.
+            link = h.url('reset_password_confirmation', qualified=True,
+                         email=user_email,
+                         timestamp=timestamp,
+                         token=token)
+
             reg_type = EmailNotificationModel.TYPE_PASSWORD_RESET
-            body = EmailNotificationModel().get_email_tmpl(reg_type,
-                                                           'txt',
-                                                           user=user.short_contact,
-                                                           reset_url=link)
-            html_body = EmailNotificationModel().get_email_tmpl(reg_type,
-                                                           'html',
-                                                           user=user.short_contact,
-                                                           reset_url=link)
+            body = EmailNotificationModel().get_email_tmpl(
+                reg_type, 'txt',
+                user=user.short_contact,
+                reset_token=token,
+                reset_url=link)
+            html_body = EmailNotificationModel().get_email_tmpl(
+                reg_type, 'html',
+                user=user.short_contact,
+                reset_token=token,
+                reset_url=link)
             log.debug('sending email')
             run_task(tasks.send_email, [user_email],
                      _("Password reset link"), body, html_body)
-            log.info('send new password mail to %s' % user_email)
+            log.info('send new password mail to %s', user_email)
         else:
-            log.debug("password reset email %s not found" % user_email)
+            log.debug("password reset email %s not found", user_email)
 
-        return True
+        return h.url('reset_password_confirmation',
+                     email=user_email,
+                     timestamp=timestamp)
 
-    def reset_password(self, data):
+    def verify_reset_password_token(self, email, timestamp, token):
         from kallithea.lib.celerylib import tasks, run_task
         from kallithea.lib import auth
-        user_email = data['email']
+        import kallithea.lib.helpers as h
+        user = User.get_by_email(email)
+        if user is None:
+            log.debug("user with email %s not found", email)
+            return False
+
+        token_age = int(time.time()) - int(timestamp)
+
+        if token_age < 0:
+            log.debug('timestamp is from the future')
+            return False
+
+        if token_age > UserModel.password_reset_token_lifetime:
+            log.debug('password reset token expired')
+            return False
+
+        expected_token = self.get_reset_password_token(user,
+                                                       timestamp,
+                                                       h.authentication_token())
+        log.debug('computed password reset token: %s', expected_token)
+        log.debug('received password reset token: %s', token)
+        return expected_token == token
+
+    def reset_password(self, user_email, new_passwd):
+        from kallithea.lib.celerylib import tasks, run_task
+        from kallithea.lib import auth
         user = User.get_by_email(user_email)
-        new_passwd = auth.PasswordGenerator().gen_password(8,
-                        auth.PasswordGenerator.ALPHABETS_BIG_SMALL)
-        if user:
+        if user is not None:
             user.password = auth.get_crypt_password(new_passwd)
             Session().add(user)
             Session().commit()
-            log.info('change password for %s' % user_email)
+            log.info('change password for %s', user_email)
         if new_passwd is None:
-            raise Exception('unable to generate new password')
+            raise Exception('unable to set new password')
 
         run_task(tasks.send_email, [user_email],
-                 _('Your new password'),
-                 _('Your new Kallithea password:%s') % (new_passwd,))
-        log.info('send new password mail to %s' % user_email)
+                 _('Password reset notification'),
+                 _('The password to your account %s has been changed using password reset form.') % (user.username,))
+        log.info('send password reset mail to %s', user_email)
 
         return True
 
-    def fill_data(self, auth_user, user_id=None, api_key=None, username=None):
-        """
-        Fetches auth_user by user_id,or api_key if present.
-        Fills auth_user attributes with those taken from database.
-        Additionally sets is_authenticated if lookup fails
-        present in database
-
-        :param auth_user: instance of user to set attributes
-        :param user_id: user id to fetch by
-        :param api_key: api key to fetch by
-        :param username: username to fetch by
-        """
-        if user_id is None and api_key is None and username is None:
-            raise Exception('You need to pass user_id, api_key or username')
-
-        dbuser = None
-        if user_id is not None:
-            dbuser = self.get(user_id)
-        elif api_key is not None:
-            dbuser = self.get_by_api_key(api_key)
-        elif username is not None:
-            dbuser = self.get_by_username(username)
-
-        if dbuser is not None and dbuser.active:
-            log.debug('filling %s data' % dbuser)
-            for k, v in dbuser.get_dict().iteritems():
-                if k not in ['api_keys', 'permissions']:
-                    setattr(auth_user, k, v)
-            return True
-        return False
-
     def has_perm(self, user, perm):
         perm = self._get_perm(perm)
         user = self._get_user(user)
@@ -401,12 +450,10 @@
         user = self._get_user(user)
         perm = self._get_perm(perm)
 
-        obj = UserToPerm.query()\
-                .filter(UserToPerm.user == user)\
-                .filter(UserToPerm.permission == perm)\
-                .scalar()
-        if obj:
-            self.sa.delete(obj)
+        UserToPerm.query().filter(
+            UserToPerm.user == user,
+            UserToPerm.permission == perm,
+        ).delete()
 
     def add_extra_email(self, user, email):
         """
@@ -435,12 +482,12 @@
         """
         user = self._get_user(user)
         obj = UserEmailMap.query().get(email_id)
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
 
     def add_extra_ip(self, user, ip):
         """
-        Adds ip address to UserIpMap
+        Adds IP address to UserIpMap
 
         :param user:
         :param ip:
@@ -458,7 +505,7 @@
 
     def delete_extra_ip(self, user, ip_id):
         """
-        Removes ip address from UserIpMap
+        Removes IP address from UserIpMap
 
         :param user:
         :param ip_id:
--- a/kallithea/model/user_group.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/user_group.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.model.users_group
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.model.user_group
+~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 user group model for Kallithea
 
@@ -253,7 +253,7 @@
         obj = UserGroupToPerm.query()\
             .filter(UserGroupToPerm.users_group == user_group)\
             .filter(UserGroupToPerm.permission == perm).scalar()
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
 
     def grant_user_permission(self, user_group, user, perm):
@@ -283,7 +283,7 @@
         obj.user = user
         obj.permission = permission
         self.sa.add(obj)
-        log.debug('Granted perm %s to %s on %s' % (perm, user, user_group))
+        log.debug('Granted perm %s to %s on %s', perm, user, user_group)
         return obj
 
     def revoke_user_permission(self, user_group, user):
@@ -302,9 +302,9 @@
             .filter(UserUserGroupToPerm.user == user)\
             .filter(UserUserGroupToPerm.user_group == user_group)\
             .scalar()
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
-            log.debug('Revoked perm on %s on %s' % (user_group, user))
+            log.debug('Revoked perm on %s on %s', user_group, user)
 
     def grant_user_group_permission(self, target_user_group, user_group, perm):
         """
@@ -334,7 +334,7 @@
         obj.target_user_group = target_user_group
         obj.permission = permission
         self.sa.add(obj)
-        log.debug('Granted perm %s to %s on %s' % (perm, target_user_group, user_group))
+        log.debug('Granted perm %s to %s on %s', perm, target_user_group, user_group)
         return obj
 
     def revoke_user_group_permission(self, target_user_group, user_group):
@@ -351,13 +351,13 @@
             .filter(UserGroupUserGroupToPerm.target_user_group == target_user_group)\
             .filter(UserGroupUserGroupToPerm.user_group == user_group)\
             .scalar()
-        if obj:
+        if obj is not None:
             self.sa.delete(obj)
-            log.debug('Revoked perm on %s on %s' % (target_user_group, user_group))
+            log.debug('Revoked perm on %s on %s', target_user_group, user_group)
 
     def enforce_groups(self, user, groups, extern_type=None):
         user = self._get_user(user)
-        log.debug('Enforcing groups %s on user %s' % (user, groups))
+        log.debug('Enforcing groups %s on user %s', user, groups)
         current_groups = user.group_member
         # find the external created groups
         externals = [x.users_group for x in current_groups
@@ -367,7 +367,7 @@
         # externals that are not in groups
         for gr in externals:
             if gr.users_group_name not in groups:
-                log.debug('Removing user %s from user group %s' % (user, gr))
+                log.debug('Removing user %s from user group %s', user, gr)
                 self.remove_user_from_group(gr, user)
 
         # now we calculate in which groups user should be == groups params
@@ -383,7 +383,7 @@
             # we can only add users to special groups created via plugins
             managed = 'extern_type' in existing_group.group_data
             if managed:
-                log.debug('Adding user %s to user group %s' % (user, gr))
+                log.debug('Adding user %s to user group %s', user, gr)
                 UserGroupModel().add_user_to_group(existing_group, user)
             else:
                 log.debug('Skipping addition to group %s since it is '
--- a/kallithea/model/validators.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/model/validators.py	Sun Sep 06 23:36:05 2015 +0200
@@ -31,9 +31,8 @@
 from kallithea.lib.compat import OrderedSet
 from kallithea.lib import ipaddr
 from kallithea.lib.utils import repo_name_slug
-from kallithea.lib.utils2 import safe_int, str2bool, aslist
-from kallithea.model.db import RepoGroup, Repository, UserGroup, User,\
-    ChangesetStatus
+from kallithea.lib.utils2 import str2bool, aslist
+from kallithea.model.db import RepoGroup, Repository, UserGroup, User
 from kallithea.lib.exceptions import LdapImportError
 from kallithea.config.routing import ADMIN_PREFIX
 from kallithea.lib.auth import HasRepoGroupPermissionAny, HasPermissionAny
@@ -44,11 +43,6 @@
 
 log = logging.getLogger(__name__)
 
-class _Missing(object):
-    pass
-
-Missing = _Missing()
-
 
 class StateObj(object):
     """
@@ -98,13 +92,13 @@
 def ValidUsername(edit=False, old_data={}):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'username_exists': _(u'Username "%(username)s" already exists'),
+            'username_exists': _('Username "%(username)s" already exists'),
             'system_invalid_username':
-                _(u'Username "%(username)s" is forbidden'),
+                _('Username "%(username)s" cannot be used'),
             'invalid_username':
-                _(u'Username may only contain alphanumeric characters '
-                    'underscores, periods or dashes and must begin with '
-                    'alphanumeric character or underscore')
+                _('Username may only contain alphanumeric characters '
+                  'underscores, periods or dashes and must begin with an '
+                  'alphanumeric character or underscore')
         }
 
         def validate_python(self, value, state):
@@ -136,7 +130,7 @@
 def ValidRepoUser():
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_username': _(u'Username %(username)s is not valid')
+            'invalid_username': _('Username %(username)s is not valid')
         }
 
         def validate_python(self, value, state):
@@ -155,10 +149,10 @@
 def ValidUserGroup(edit=False, old_data={}):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_group': _(u'Invalid user group name'),
-            'group_exist': _(u'User group "%(usergroup)s" already exists'),
+            'invalid_group': _('Invalid user group name'),
+            'group_exist': _('User group "%(usergroup)s" already exists'),
             'invalid_usergroup_name':
-                _(u'user group name may only contain alphanumeric '
+                _('user group name may only contain alphanumeric '
                   'characters underscores, periods or dashes and must begin '
                   'with alphanumeric character')
         }
@@ -196,10 +190,10 @@
 def ValidRepoGroup(edit=False, old_data={}):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'group_parent_id': _(u'Cannot assign this group as parent'),
-            'group_exists': _(u'Group "%(group_name)s" already exists'),
+            'group_parent_id': _('Cannot assign this group as parent'),
+            'group_exists': _('Group "%(group_name)s" already exists'),
             'repo_exists':
-                _(u'Repository with name "%(group_name)s" already exists')
+                _('Repository with name "%(group_name)s" already exists')
         }
 
         def validate_python(self, value, state):
@@ -212,7 +206,7 @@
 
             # check for parent of self
             parent_of_self = lambda: (
-                old_data['group_id'] == int(group_parent_id)
+                old_data['group_id'] == group_parent_id
                 if group_parent_id else False
             )
             if edit and parent_of_self():
@@ -233,7 +227,7 @@
                       .filter(RepoGroup.group_parent_id == group_parent_id)\
                       .scalar()
 
-                if gr:
+                if gr is not None:
                     msg = M(self, 'group_exists', state, group_name=slug)
                     raise formencode.Invalid(msg, value, state,
                             error_dict=dict(group_name=msg)
@@ -244,7 +238,7 @@
                       .filter(Repository.repo_name == slug)\
                       .scalar()
 
-                if repo:
+                if repo is not None:
                     msg = M(self, 'repo_exists', state, group_name=slug)
                     raise formencode.Invalid(msg, value, state,
                             error_dict=dict(group_name=msg)
@@ -257,7 +251,7 @@
     class _validator(formencode.validators.FancyValidator):
         messages = {
             'invalid_password':
-                _(u'Invalid characters (non-ascii) in password')
+                _('Invalid characters (non-ascii) in password')
         }
 
         def validate_python(self, value, state):
@@ -272,12 +266,12 @@
 def ValidOldPassword(username):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_password': _(u'Invalid old password')
+            'invalid_password': _('Invalid old password')
         }
 
         def validate_python(self, value, state):
             from kallithea.lib import auth_modules
-            if not auth_modules.authenticate(username, value, ''):
+            if auth_modules.authenticate(username, value, '') is None:
                 msg = M(self, 'invalid_password', state)
                 raise formencode.Invalid(msg, value, state,
                     error_dict=dict(current_password=msg)
@@ -285,19 +279,17 @@
     return _validator
 
 
-def ValidPasswordsMatch(passwd='new_password', passwd_confirmation='password_confirmation'):
+def ValidPasswordsMatch(password_field, password_confirmation_field):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'password_mismatch': _(u'Passwords do not match'),
+            'password_mismatch': _('Passwords do not match'),
         }
 
         def validate_python(self, value, state):
-
-            pass_val = value.get('password') or value.get(passwd)
-            if pass_val != value[passwd_confirmation]:
+            if value.get(password_field) != value[password_confirmation_field]:
                 msg = M(self, 'password_mismatch', state)
                 raise formencode.Invalid(msg, value, state,
-                     error_dict={passwd:msg, passwd_confirmation: msg}
+                     error_dict={password_field:msg, password_confirmation_field: msg}
                 )
     return _validator
 
@@ -305,9 +297,7 @@
 def ValidAuth():
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_password': _(u'invalid password'),
-            'invalid_username': _(u'invalid user name'),
-            'disabled_account': _(u'Your account is disabled')
+            'invalid_auth': _(u'Invalid username or password'),
         }
 
         def validate_python(self, value, state):
@@ -316,20 +306,21 @@
             password = value['password']
             username = value['username']
 
-            if not auth_modules.authenticate(username, password):
+            # authenticate returns unused dict but has called
+            # plugin._authenticate which has create_or_update'ed the username user in db
+            if auth_modules.authenticate(username, password) is None:
                 user = User.get_by_username(username)
                 if user and not user.active:
-                    log.warning('user %s is disabled' % username)
-                    msg = M(self, 'disabled_account', state)
+                    log.warning('user %s is disabled', username)
+                    msg = M(self, 'invalid_auth', state)
                     raise formencode.Invalid(msg, value, state,
-                        error_dict=dict(username=msg)
+                        error_dict=dict(username=' ', password=msg)
                     )
                 else:
-                    log.warning('user %s failed to authenticate' % username)
-                    msg = M(self, 'invalid_username', state)
-                    msg2 = M(self, 'invalid_password', state)
+                    log.warning('user %s failed to authenticate', username)
+                    msg = M(self, 'invalid_auth', state)
                     raise formencode.Invalid(msg, value, state,
-                        error_dict=dict(username=msg, password=msg2)
+                        error_dict=dict(username=' ', password=msg)
                     )
     return _validator
 
@@ -337,7 +328,7 @@
 def ValidAuthToken():
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_token': _(u'Token mismatch')
+            'invalid_token': _('Token mismatch')
         }
 
         def validate_python(self, value, state):
@@ -351,12 +342,12 @@
     class _validator(formencode.validators.FancyValidator):
         messages = {
             'invalid_repo_name':
-                _(u'Repository name %(repo)s is disallowed'),
+                _('Repository name %(repo)s is not allowed'),
             'repository_exists':
-                _(u'Repository named %(repo)s already exists'),
-            'repository_in_group_exists': _(u'Repository "%(repo)s" already '
+                _('Repository named %(repo)s already exists'),
+            'repository_in_group_exists': _('Repository "%(repo)s" already '
                                             'exists in group "%(group)s"'),
-            'same_group_exists': _(u'Repository group with name "%(repo)s" '
+            'same_group_exists': _('Repository group with name "%(repo)s" '
                                    'already exists')
         }
 
@@ -458,7 +449,7 @@
 
         elif repo_type == 'git':
             from kallithea.lib.vcs.backends.git.repository import GitRepository
-            if url.startswith('http'):
+            if url.startswith('http') or url.startswith('git'):
                 # initially check if it's at least the proper URL
                 # or does it pass basic auth
                 GitRepository._check_url(url)
@@ -471,18 +462,16 @@
 
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'clone_uri': _(u'invalid clone URL'),
-            'invalid_clone_uri': _(u'Invalid clone URL, provide a '
-                                    'valid clone http(s)/svn+http(s)/ssh URL')
+            'clone_uri': _('Invalid repository URL'),
+            'invalid_clone_uri': _('Invalid repository URL. It must be a '
+                                   'valid http, https, ssh, svn+http or svn+https URL'),
         }
 
         def validate_python(self, value, state):
             repo_type = value.get('repo_type')
             url = value.get('clone_uri')
 
-            if not url:
-                pass
-            else:
+            if url and url != value.get('clone_uri_hidden'):
                 try:
                     url_handler(repo_type, url, make_ui('db', clear_session=False))
                 except Exception:
@@ -497,7 +486,7 @@
 def ValidForkType(old_data={}):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_fork_type': _(u'Fork has to be the same type as parent')
+            'invalid_fork_type': _('Fork has to be the same type as parent')
         }
 
         def validate_python(self, value, state):
@@ -512,21 +501,22 @@
 def CanWriteGroup(old_data=None):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'permission_denied': _(u"You don't have permissions "
+            'permission_denied': _("You don't have permissions "
                                    "to create repository in this group"),
-            'permission_denied_root': _(u"no permission to create repository "
+            'permission_denied_root': _("no permission to create repository "
                                         "in root location")
         }
 
         def _to_python(self, value, state):
             #root location
-            if value in [-1, "-1"]:
+            if value == -1:
                 return None
             return value
 
         def validate_python(self, value, state):
             gr = RepoGroup.get(value)
-            gr_name = gr.group_name if gr else None  # None means ROOT location
+            gr_name = gr.group_name if gr is not None else None # None means ROOT location
+
             # create repositories with write permission on group is set to true
             create_on_write = HasPermissionAny('hg.create.write_on_repogroup.true')()
             group_admin = HasRepoGroupPermissionAny('group.admin')(gr_name,
@@ -537,7 +527,7 @@
             can_create_repos = HasPermissionAny('hg.admin', 'hg.create.repository')
             gid = (old_data['repo_group'].get('group_id')
                    if (old_data and 'repo_group' in old_data) else None)
-            value_changed = gid != safe_int(value)
+            value_changed = gid != value
             new = not old_data
             # do check if we changed the value, there's a case that someone got
             # revoked write permissions to a repository, he still created, we
@@ -563,19 +553,19 @@
 def CanCreateGroup(can_create_in_root=False):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'permission_denied': _(u"You don't have permissions "
+            'permission_denied': _("You don't have permissions "
                                    "to create a group in this location")
         }
 
         def to_python(self, value, state):
             #root location
-            if value in [-1, "-1"]:
+            if value == -1:
                 return None
             return value
 
         def validate_python(self, value, state):
             gr = RepoGroup.get(value)
-            gr_name = gr.group_name if gr else None  # None means ROOT location
+            gr_name = gr.group_name if gr is not None else None # None means ROOT location
 
             if can_create_in_root and gr is None:
                 #we can create in root, we're fine no validations required
@@ -604,7 +594,7 @@
     class _validator(formencode.validators.FancyValidator):
         messages = {
             'perm_new_member_name':
-                _(u'This username or user group name is not valid')
+                _('This username or user group name is not valid')
         }
 
         def to_python(self, value, state):
@@ -697,7 +687,7 @@
 def ValidPath():
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'invalid_path': _(u'This is not a valid path')
+            'invalid_path': _('This is not a valid path')
         }
 
         def validate_python(self, value, state):
@@ -712,7 +702,7 @@
 def UniqSystemEmail(old_data={}):
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'email_taken': _(u'This e-mail address is already taken')
+            'email_taken': _('This email address is already in use')
         }
 
         def _to_python(self, value, state):
@@ -721,7 +711,7 @@
         def validate_python(self, value, state):
             if (old_data.get('email') or '').lower() != value:
                 user = User.get_by_email(value, case_insensitive=True)
-                if user:
+                if user is not None:
                     msg = M(self, 'email_taken', state)
                     raise formencode.Invalid(msg, value, state,
                         error_dict=dict(email=msg)
@@ -732,7 +722,7 @@
 def ValidSystemEmail():
     class _validator(formencode.validators.FancyValidator):
         messages = {
-            'non_existing_email': _(u'e-mail "%(email)s" does not exist.')
+            'non_existing_email': _('Email address "%(email)s" not found')
         }
 
         def _to_python(self, value, state):
@@ -769,7 +759,7 @@
     class _validator(formencode.validators.UnicodeString):
         messages = {
             'invalid_cn':
-                  _(u'The LDAP Login attribute of the CN must be specified - '
+                  _('The LDAP Login attribute of the CN must be specified - '
                     'this is the name of the attribute that is equivalent '
                     'to "username"')
         }
@@ -778,43 +768,10 @@
     return _validator
 
 
-def NotReviewedRevisions(repo_id):
-    class _validator(formencode.validators.FancyValidator):
-        messages = {
-            'rev_already_reviewed':
-                  _(u'Revisions %(revs)s are already part of pull request '
-                    'or have set status')
-        }
-
-        def validate_python(self, value, state):
-            # check revisions if they are not reviewed, or a part of another
-            # pull request
-            statuses = ChangesetStatus.query()\
-                .filter(ChangesetStatus.revision.in_(value))\
-                .filter(ChangesetStatus.repo_id == repo_id)\
-                .all()
-
-            errors = []
-            for cs in statuses:
-                if cs.pull_request_id:
-                    errors.append(['pull_req', cs.revision[:12]])
-                elif cs.status:
-                    errors.append(['status', cs.revision[:12]])
-
-            if errors:
-                revs = ','.join([x[1] for x in errors])
-                msg = M(self, 'rev_already_reviewed', state, revs=revs)
-                raise formencode.Invalid(msg, value, state,
-                    error_dict=dict(revisions=revs)
-                )
-
-    return _validator
-
-
 def ValidIp():
     class _validator(CIDR):
         messages = dict(
-            badFormat=_('Please enter a valid IPv4 or IpV6 address'),
+            badFormat=_('Please enter a valid IPv4 or IPv6 address'),
             illegalBits=_('The network size (bits) must be within the range'
                 ' of 0-32 (not %(bits)r)')
         )
@@ -836,7 +793,7 @@
         def validate_python(self, value, state):
             try:
                 addr = value.strip()
-                #this raises an ValueError if address is not IpV4 or IpV6
+                #this raises an ValueError if address is not IPv4 or IPv6
                 ipaddr.IPNetwork(address=addr)
             except ValueError:
                 raise formencode.Invalid(self.message('badFormat', state),
@@ -899,7 +856,7 @@
                                 next_to_load=plugin_name)
                         raise formencode.Invalid(msg, value, state)
                     unique_names[plugin_name] = plugin
-            except (ImportError, AttributeError, TypeError), e:
+            except (ImportError, AttributeError, TypeError) as e:
                 raise formencode.Invalid(str(e), value, state)
 
     return _validator
--- a/kallithea/public/css/bootstrap.css	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/css/bootstrap.css	Sun Sep 06 23:36:05 2015 +0200
@@ -6802,4 +6802,4 @@
   td.hidden-print {
     display: none !important;
   }
-}
\ No newline at end of file
+}
--- a/kallithea/public/css/contextbar.css	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/css/contextbar.css	Sun Sep 06 23:36:05 2015 +0200
@@ -10,7 +10,6 @@
     min-height: 16px;
     margin: -2px 0 -4px 0;
     /* background-color: red; /* for debugging */
-
 }
 
 /* css classes for diff file status ... it'd be nice if css had a way to
@@ -19,19 +18,19 @@
 
 .icon-diff-M:before {
     font-family: 'kallithea';
-    content: '\e805';
+    content: '\22a1';
     color: #d0b44c;
 }
 
 .icon-diff-D:before {
     font-family: 'kallithea';
-    content: '\e807';
+    content: '\229f';
     color: #bd2c00;
 }
 
 .icon-diff-A:before {
     font-family: 'kallithea';
-    content: '\e806';
+    content: '\229e';
     color: #6cc644;
 }
 
@@ -134,11 +133,6 @@
 #context-pages,
 #context-pages ul {
     background: #3b6998; /* Old browsers */
-    background: -moz-linear-gradient(top, #577632 0%, #577632 100%); /* FF3.6+ */
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#577632), color-stop(100%,#577632)); /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, #577632 0%, #577632 100%); /* Chrome10+,Safari5.1+ */
-    background: -o-linear-gradient(top, #577632 0%, #577632 100%); /* Opera 11.10+ */
-    background: -ms-linear-gradient(top, #577632 0%, #577632 100%); /* IE10+ */
     background: linear-gradient(to bottom, #577632 0%, #577632 100%); /* W3C */
 }
 
@@ -159,7 +153,7 @@
     display: inline-block;
     float: right;
     border-radius: 4px;
-    background-image: linear-gradient(top, #577632 0%, #577632 100%);
+    background-image: linear-gradient(to bottom, #577632 0%, #577632 100%);
 }
 
 #content ul#context-actions li {
@@ -193,11 +187,6 @@
 #header #header-inner #quick li.current,
 #context-pages li.current {
     background: #6388ad; /* Old browsers */
-    background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
-    background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
-    background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
     background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
 }
 
@@ -279,7 +268,8 @@
 #revision-changer:before,
 #context-pages a.childs:after,
 #context-pages a.dropdown:after {
-    content: ' \25BE';
+    font-family: 'kallithea';
+    content: ' \23f7';
 }
 #context-pages a.childs {
     padding-right: 30px;
--- a/kallithea/public/css/style.css	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/css/style.css	Sun Sep 06 23:36:05 2015 +0200
@@ -162,54 +162,38 @@
 div.rst-block pre,
 .CodeMirror .CodeMirror-code pre {
     font-size: 12px;
-    font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
+    font-family: Lucida Console, Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
 }
 
 .top-left-rounded-corner {
-    -webkit-border-top-left-radius: 8px;
-    -khtml-border-radius-topleft: 8px;
     border-top-left-radius: 8px;
 }
 
 .top-right-rounded-corner {
-    -webkit-border-top-right-radius: 8px;
-    -khtml-border-radius-topright: 8px;
     border-top-right-radius: 8px;
 }
 
 .bottom-left-rounded-corner {
-    -webkit-border-bottom-left-radius: 8px;
-    -khtml-border-radius-bottomleft: 8px;
     border-bottom-left-radius: 8px;
 }
 
 .bottom-right-rounded-corner {
-    -webkit-border-bottom-right-radius: 8px;
-    -khtml-border-radius-bottomright: 8px;
     border-bottom-right-radius: 8px;
 }
 
 .top-left-rounded-corner-mid {
-    -webkit-border-top-left-radius: 4px;
-    -khtml-border-radius-topleft: 4px;
     border-top-left-radius: 4px;
 }
 
 .top-right-rounded-corner-mid {
-    -webkit-border-top-right-radius: 4px;
-    -khtml-border-radius-topright: 4px;
     border-top-right-radius: 4px;
 }
 
 .bottom-left-rounded-corner-mid {
-    -webkit-border-bottom-left-radius: 4px;
-    -khtml-border-radius-bottomleft: 4px;
     border-bottom-left-radius: 4px;
 }
 
 .bottom-right-rounded-corner-mid {
-    -webkit-border-bottom-right-radius: 4px;
-    -khtml-border-radius-bottomright: 4px;
     border-bottom-right-radius: 4px;
 }
 
@@ -233,7 +217,6 @@
 }
 
 .truncate.autoexpand:hover {
-    text-overflow: none;
     overflow: visible;
 }
 
@@ -253,7 +236,8 @@
 h4:hover > a.permalink,
 h5:hover > a.permalink,
 h6:hover > a.permalink,
-div:hover > a.permalink {
+div:hover > a.permalink,
+div:hover > span > a.permalink {
     visibility: visible;
 }
 
@@ -277,18 +261,10 @@
 
 #header ul#logged-user {
     margin-bottom: 5px !important;
-    -webkit-border-radius: 0px 0px 8px 8px;
-    -khtml-border-radius: 0px 0px 8px 8px;
     border-radius: 0px 0px 8px 8px;
     height: 37px;
     background-color: #577632;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
-    background-image: -moz-linear-gradient(top, #577632, #577632);
-    background-image: -ms-linear-gradient(top, #577632, #577632);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
-    background-image: -webkit-linear-gradient(top, #577632, #577632);
-    background-image: -o-linear-gradient(top, #577632, #577632);
     background-image: linear-gradient(to bottom, #577632, #577632);
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
 }
@@ -344,15 +320,11 @@
     cursor: pointer;
     min-height: 10px;
     width: 100% !important;
-    -webkit-border-radius: 0px 0px 4px 4px;
-    -khtml-border-radius: 0px 0px 4px 4px;
     border-radius: 0px 0px 4px 4px;
 }
 
 #header-dd:hover {
     opacity: 0.2;
-    -webkit-transition: opacity 0.5s ease-in-out;
-    -moz-transition: opacity 0.5s ease-in-out;
     transition: opacity 0.5s ease-in-out;
 }
 
@@ -362,37 +334,20 @@
     position: relative;
     background-color: #577632;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
-    background-image: -moz-linear-gradient(top, #577632, #577632);
-    background-image: -ms-linear-gradient(top, #577632, #577632);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632),color-stop(100%, #577632) );
-    background-image: -webkit-linear-gradient(top, #577632, #577632);
-    background-image: -o-linear-gradient(top, #577632, #577632);
     background-image: linear-gradient(to bottom, #577632, #577632);
     margin: 0;
     padding: 0;
     display: block;
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
-    -webkit-border-radius: 0px 0px 4px 4px;
-    -khtml-border-radius: 0px 0px 4px 4px;
     border-radius: 0px 0px 4px 4px;
 }
 #header #header-inner.hover {
     width: 100% !important;
-    -webkit-border-radius: 0px 0px 0px 0px;
-    -khtml-border-radius: 0px 0px 0px 0px;
     border-radius: 0px 0px 0px 0px;
     position: fixed !important;
     z-index: 10000;
 }
 
-.ie7 #header #header-inner.hover,
-.ie8 #header #header-inner.hover,
-.ie9 #header #header-inner.hover
-{
-    z-index: auto !important;
-}
-
 .header-pos-fix, .anchor {
     margin-top: -46px;
     padding-top: 46px;
@@ -510,7 +465,7 @@
 
 td.quick_repo_menu:before {
     font-family: "kallithea";
-    content: "\e80f";           /* triangle-right */
+    content: "\23f5";           /* triangle-right */
     margin-left: 3px;
     padding-right: 3px;
 }
@@ -523,7 +478,7 @@
 
 td.quick_repo_menu.active:before {
     font-family: "kallithea";
-    content: "\e80d";           /* triangle-down */
+    content: "\23f7";           /* triangle-down */
     margin-left: 1px;
     padding-right: 1px;
 }
@@ -624,7 +579,6 @@
     position: absolute;
     left: -1500px;
 }
-.yui-dt-scrollable tbody { -moz-outline: 0 }
 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
 .yui-dt-coltarget {
@@ -642,7 +596,6 @@
     cursor: col-resize;
     background-color: #CCC;
     opacity: 0;
-    filter: alpha(opacity=0);
 }
 .yui-dt-resizerproxy {
     visibility: hidden;
@@ -650,7 +603,6 @@
     z-index: 9000;
     background-color: #CCC;
     opacity: 0;
-    filter: alpha(opacity=0);
 }
 th.yui-dt-hidden .yui-dt-liner,
 td.yui-dt-hidden .yui-dt-liner,
@@ -714,7 +666,6 @@
 .yui-skin-sam .yui-dt-mask {
     background-color: #000;
     opacity: .25;
-    filter: alpha(opacity=25);
 }
 .yui-skin-sam .yui-dt-message { background-color: #FFF }
 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
@@ -735,12 +686,12 @@
 
 .yui-skin-sam th.yui-dt-asc .yui-dt-liner:after {
     font-family: "kallithea";
-    content: "\e810";           /* triangle-up */
+    content: "\23f6";           /* triangle-up */
 }
 
 .yui-skin-sam th.yui-dt-desc .yui-dt-liner:after {
     font-family: "kallithea";
-    content: "\e80d";           /* triangle-down */
+    content: "\23f7";           /* triangle-down */
 }
 
 tbody .yui-dt-editable { cursor: pointer }
@@ -758,25 +709,11 @@
     padding-top: 6px;
     text-align: right;
 }
-.yui-skin-sam tr.yui-dt-even { background-color: #FFF }
-.yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
-.yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
-.yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
-.yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
-.yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
-.yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
-.yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
-.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
-.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
-.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
-.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
 .yui-skin-sam th.yui-dt-highlighted,
 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
 .yui-skin-sam tr.yui-dt-highlighted,
 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
-.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
-.yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
-.yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
+.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc {
     cursor: pointer;
     background-color: #b2d2ff;
 }
@@ -784,9 +721,7 @@
 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
-.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
-.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
-.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
+.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc {
     cursor: pointer;
     background-color: #b2d2ff;
 }
@@ -798,11 +733,6 @@
     background-color: #426fd9;
     color: #FFF;
 }
-.yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
-.yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
-    background-color: #446cd7;
-    color: #FFF;
-}
 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
@@ -811,11 +741,6 @@
     background-color: #426fd9;
     color: #FFF;
 }
-.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
-.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
-    background-color: #446cd7;
-    color: #FFF;
-}
 .yui-skin-sam .yui-dt-paginator {
     display: block;
     margin: 6px 0;
@@ -854,8 +779,6 @@
     background: #fff;
     margin: 0 0 10px;
     padding: 0 0 10px;
-    -webkit-border-radius: 4px 4px 4px 4px;
-    -khtml-border-radius: 4px 4px 4px 4px;
     border-radius: 4px 4px 4px 4px;
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
 }
@@ -879,12 +802,6 @@
     overflow: hidden;
     background-color: #577632;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
-    background-image: -moz-linear-gradient(top, #577632, #577632);
-    background-image: -ms-linear-gradient(top, #577632, #577632);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
-    background-image: -webkit-linear-gradient(top, #577632, #577632);
-    background-image: -o-linear-gradient(top, #577632, #577632);
     background-image: linear-gradient(to bottom, #577632, #577632);
     margin: 0 0 20px;
     padding: 0;
@@ -1042,14 +959,7 @@
     text-align: center;
     cursor: pointer;
     color: #666;
-
-    background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
-    background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
-    background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
-    background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
-    background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
     background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
-
     display: none;
     overflow: hidden;
 }
@@ -1291,9 +1201,11 @@
     padding: 7px 7px 6px;
 }
 
+input[readonly],
 input.disabled {
     background-color: #F5F5F5 !important;
 }
+
 #content div.box div.form div.fields div.field div.input input.small {
     width: 30%;
 }
@@ -1407,7 +1319,6 @@
     margin: 0;
     padding: 0;
     border: 1px solid #eee;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
 }
 
@@ -1739,8 +1650,6 @@
 .metatag {
     display: inline-block;
     margin-right: 1px;
-    -webkit-border-radius: 4px 4px 4px 4px;
-    -khtml-border-radius: 4px 4px 4px 4px;
     border-radius: 4px 4px 4px 4px;
 
     border: solid 1px #9CF;
@@ -1775,7 +1684,6 @@
 .metatag[tag="license"] {
     border: solid 1px #9CF;
     background-color: #DEF;
-    target-new: tab !important;
 }
 .metatag[tag="see"] {
     border: solid 1px #CBD;
@@ -1812,16 +1720,8 @@
 #footer div#footer-inner {
     background-color: #577632;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
-    background-image: -moz-linear-gradient(top, #577632, #577632);
-    background-image: -ms-linear-gradient( top, #577632, #577632);
-    background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
-    background-image: -webkit-linear-gradient( top, #577632, #577632);
-    background-image: -o-linear-gradient( top, #577632, #577632);
     background-image: linear-gradient(to bottom, #577632, #577632);
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
-    -webkit-border-radius: 4px 4px 4px 4px;
-    -khtml-border-radius: 4px 4px 4px 4px;
     border-radius: 4px 4px 4px 4px;
 }
 
@@ -1847,12 +1747,6 @@
     position: relative;
     background-color: #577632;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
-    background-image: -moz-linear-gradient( top, #577632, #577632);
-    background-image: -ms-linear-gradient( top, #577632, #577632);
-    background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
-    background-image: -webkit-linear-gradient( top, #577632, #577632);
-    background-image: -o-linear-gradient( top, #577632, #577632);
     background-image: linear-gradient(to bottom, #577632, #577632);
     margin: 0 auto;
     padding: 0;
@@ -1871,7 +1765,7 @@
     padding: 20px;
 }
 
-#login div.form div.fields div.field div.label {
+#login div.form div.form-horizontal div.form-group > label {
     width: 173px;
     float: left;
     text-align: right;
@@ -1879,7 +1773,7 @@
     padding: 5px 0 0 5px;
 }
 
-#login div.form div.fields div.field div.input input {
+#login div.form div.form-horizontal div.form-group div input {
     background: #FFF;
     border-top: 1px solid #b3b3b3;
     border-left: 1px solid #b3b3b3;
@@ -1891,20 +1785,16 @@
     padding: 7px 7px 6px;
 }
 
-#login div.form div.fields div.buttons {
-    clear: both;
-    overflow: hidden;
-    border-top: 1px solid #DDD;
-    text-align: right;
-    margin: 0;
-    padding: 10px 0 0;
+#login div.form .buttons {
+    float: right;
 }
 
 #login div.form div.links {
     clear: both;
     overflow: hidden;
     margin: 10px 0 0;
-    padding: 0 0 2px;
+    border-top: 1px solid #DDD;
+    padding: 10px 0 0;
 }
 
 .user-menu {
@@ -1934,17 +1824,9 @@
     right: 0;
     background-color: #577632;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
-    background-image: -moz-linear-gradient(top, #577632, #577632);
-    background-image: -ms-linear-gradient(top, #577632, #577632);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
-    background-image: -webkit-linear-gradient(top, #577632, #577632);
-    background-image: -o-linear-gradient(top, #577632, #577632);
     background-image: linear-gradient(to bottom, #577632, #577632);
 
     z-index: 999;
-    -webkit-border-radius: 0px 0px 4px 4px;
-    -khtml-border-radius: 0px 0px 4px 4px;
     border-radius: 0px 0px 4px 4px;
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
 
@@ -2101,12 +1983,6 @@
     position: relative;
     background-color: #577632;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
-    background-image: -moz-linear-gradient(top, #577632, #577632);
-    background-image: -ms-linear-gradient(top, #577632, #577632);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
-    background-image: -webkit-linear-gradient(top, #577632, #577632);
-    background-image: -o-linear-gradient(top, #577632, #577632);
     background-image: linear-gradient(to bottom, #577632, #577632);
     margin: 0 auto;
     padding: 0;
@@ -2297,19 +2173,19 @@
     color: #888;
 }
 
-.tablerow0 {
-    background-color: #F8F8F8;
-}
-
-.tablerow1 {
-    background-color: #FFFFFF;
-}
-
 .changeset_id {
     color: #666666;
     margin-right: -3px;
 }
 
+.changeset-logical-index {
+    color: #666666;
+    font-style: italic;
+    font-size: 85%;
+    padding-right: 0.5em;
+    text-align: right;
+}
+
 .changeset_hash {
     color: #000000;
 }
@@ -2499,6 +2375,11 @@
     border-color: #cdcdcd;
 }
 
+#graph_content #changesets tr.out-of-range,
+#graph_content #changesets tr.mergerow {
+    opacity: 0.5;
+}
+
 #graph_content #changesets td {
     overflow: hidden;
     text-overflow: ellipsis;
@@ -2509,7 +2390,7 @@
 }
 
 #graph_content .container .checkbox {
-    width: 12px;
+    width: 14px;
     font-size: 0.85em;
 }
 
@@ -2554,6 +2435,7 @@
     position: relative;
 }
 
+#graph_content .container #singlerange,
 #graph_content .container .changeset_range {
     float: left;
     margin: 6px 3px;
@@ -2690,15 +2572,11 @@
     float: left;
     padding: 2px 0px 0px 2px;
 }
-.changeset-status-container .changeset-status-lbl {
-    float: left;
-    padding: 3px 4px 0px 0px
-}
 .code-header .changeset-status-container .changeset-status-lbl {
     float: left;
     padding: 0px 4px 0px 0px;
 }
-.changeset-status-container .changeset-status-ico {
+.changeset-status-container div.changeset-status-ico {
     float: left;
 }
 .code-header .changeset-status-container .changeset-status-ico,
@@ -2742,7 +2620,6 @@
     cursor: pointer;
     color: #444444;
     background: #FEA;
-    -webkit-border-radius: 0px 0px 0px 6px;
     border-radius: 0px 0px 0px 6px;
     padding: 1px;
 }
@@ -2776,7 +2653,6 @@
     color: #ffffff;
     text-transform: uppercase;
     white-space: nowrap;
-    -webkit-border-radius: 3px;
     border-radius: 3px;
     margin-right: 2px;
 }
@@ -2801,7 +2677,6 @@
     font-size: 10px;
     color: #577632;
     white-space: nowrap;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
     border: 1px solid #d9e8f8;
     line-height: 1.5em;
@@ -2874,7 +2749,6 @@
     font-size: 10px;
     color: #ffffff;
     white-space: nowrap;
-    -webkit-border-radius: 3px;
     border-radius: 3px;
 }
 
@@ -2894,7 +2768,6 @@
     font-size: 10px;
     color: #ffffff;
     white-space: nowrap;
-    -webkit-border-radius: 3px;
     border-radius: 3px;
 }
 .logbooks .booktag,
@@ -2920,7 +2793,6 @@
     font-size: 100%;
     line-height: 125%;
     padding: 0;
-    -webkit-border-radius: 6px 6px 0px 0px;
     border-radius: 6px 6px 0px 0px;
 }
 
@@ -3144,11 +3016,8 @@
     padding: 8px;
 
     white-space: pre-wrap;
-    -webkit-border-radius: 8px 8px 8px 8px;
-    -khtml-border-radius: 8px 8px 8px 8px;
     border-radius: 8px 8px 8px 8px;
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
-    -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
     z-index: 100000;
 }
 
@@ -3163,8 +3032,6 @@
     opacity: 1;
     padding: 8px;
     white-space: pre-wrap;
-    -webkit-border-radius: 8px 8px 8px 8px;
-    -khtml-border-radius: 8px 8px 8px 8px;
     border-radius: 8px 8px 8px 8px;
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
 }
@@ -3212,7 +3079,6 @@
     width: 100%;
     background: #000;
     opacity: .10;
-    filter: alpha(opacity = 10);
     z-index: 9049;
     margin: .3em;
 }
@@ -3320,12 +3186,6 @@
 .flash_msg .alert-error {
     background-color: #c43c35;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
-    background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
-    background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
     background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
     border-color: #c43c35 #c43c35 #882a25;
 }
@@ -3338,12 +3198,6 @@
     color: #404040 !important;
     background-color: #eedc94;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
-    background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
-    background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
-    background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
-    background-image: -o-linear-gradient(top, #fceec1, #eedc94);
     background-image: linear-gradient(to bottom, #fceec1, #eedc94);
     border-color: #eedc94 #eedc94 #e4c652;
 }
@@ -3355,12 +3209,6 @@
 .flash_msg .alert-success {
     background-color: #57a957;
     background-repeat: repeat-x !important;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
-    background-image: -moz-linear-gradient(top, #62c462, #57a957);
-    background-image: -ms-linear-gradient(top, #62c462, #57a957);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
-    background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-    background-image: -o-linear-gradient(top, #62c462, #57a957);
     background-image: linear-gradient(to bottom, #62c462, #57a957);
     border-color: #57a957 #57a957 #3d773d;
 }
@@ -3373,12 +3221,6 @@
 .flash_msg .alert-info {
     background-color: #339bb9;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
-    background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
-    background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
     background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
     border-color: #339bb9 #339bb9 #22697d;
 }
@@ -3405,9 +3247,7 @@
     color: #FFF;
     border-width: 1px;
     border-style: solid;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
     box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
 }
 
@@ -3445,14 +3285,10 @@
     margin-right: 0.7em;
     padding: 1px 1px 1px 1px;
     line-height: 0;
-    -webkit-border-radius: 3px;
-    -khtml-border-radius: 3px;
     border-radius: 3px;
 }
 
 div.gravatar img {
-    -webkit-border-radius: 2px;
-    -khtml-border-radius: 2px;
     border-radius: 2px;
 }
 
@@ -3481,12 +3317,6 @@
     color: #515151;
     background-color: #DADADA;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
-    background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
-    background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
-    background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA);
-    background-image: -o-linear-gradient(top, #F4F4F4, #DADADA);
     background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
 
     border-top: 1px solid #DDD;
@@ -3495,8 +3325,6 @@
     border-bottom: 1px solid #c6c6c6;
     outline: none;
     margin: 0px 3px 3px 0px;
-    -webkit-border-radius: 4px 4px 4px 4px !important;
-    -khtml-border-radius: 4px 4px 4px 4px !important;
     border-radius: 4px 4px 4px 4px !important;
     cursor: pointer !important;
     padding: 3px 3px 3px 3px;
@@ -3575,12 +3403,6 @@
     color: #fff;
     background-color: #c43c35;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
-    background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
-    background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
     background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
     border-color: #c43c35 #c43c35 #882a25;
     border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -3591,12 +3413,6 @@
     color: #fff;
     background-color: #339bb9;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
-    background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
-    background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
     background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
     border-color: #339bb9 #339bb9 #22697d;
     border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -3606,12 +3422,6 @@
     color: #fff;
     background-color: #57a957;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
-    background-image: -moz-linear-gradient(top, #62c462, #57a957);
-    background-image: -ms-linear-gradient(top, #62c462, #57a957);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
-    background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-    background-image: -o-linear-gradient(top, #62c462, #57a957);
     background-image: linear-gradient(to bottom, #62c462, #57a957);
     border-color: #57a957 #57a957 #3d773d;
     border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -3621,12 +3431,6 @@
     color: #fff;
     background-color: #faa732;
     background-repeat: repeat-x;
-    background-image: -khtml-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406));
-    background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-    background-image: -ms-linear-gradient(top, #fbb450, #f89406);
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbb450), color-stop(100%, #f89406));
-    background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-    background-image: -o-linear-gradient(top, #fbb450, #f89406);
     background-image: linear-gradient(to bottom, #fbb450, #f89406);
     border-color: #f89406 #f89406 #ad6704;
     border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
@@ -3719,13 +3523,11 @@
 }
 
 .repo-switcher .select2-chosen:after {
-    content: ' \25BE';
+    font-family: 'kallithea';
+    content: ' \23f7';
 }
 
 .repo-switcher-dropdown.select2-drop.select2-drop-active {
-    xborder-color: black;
-    -webkit-box-shadow: none;
-    -moz-box-shadow: none;
     box-shadow: none;
     color: #fff;
     background-color: #576622;
@@ -3758,8 +3560,8 @@
 }
 
 #content div.box div.form div.fields,
-#login div.form,
-#login div.form div.fields,
+#login div.form-horizontal,
+#login div.form-horizontal div.form-group,
 #register div.form,
 #register div.form div.fields {
     clear: both;
@@ -3769,7 +3571,7 @@
 }
 
 #content div.box div.form div.fields div.field div.label span,
-#login div.form div.fields div.field div.label span,
+#login div.form div.form-horizontal div.form-group div.label span,
 #register div.form div.fields div.field div.label span {
     height: 1%;
     display: block;
@@ -3779,7 +3581,7 @@
 }
 
 #content div.box div.form div.fields div.field div.input input.error,
-#login div.form div.fields div.field div.input input.error,
+#login div.form div.form-horizontal div.form-group div.input input.error,
 #register div.form div.fields div.field div.input input.error {
     background: #FBE3E4;
     border-top: 1px solid #e1b2b3;
@@ -3789,7 +3591,7 @@
 }
 
 #content div.box div.form div.fields div.field div.input input.success,
-#login div.form div.fields div.field div.input input.success,
+#login div.form div.form-horizontal div.form-group div.input input.success,
 #register div.form div.fields div.field div.input input.success {
     background: #E6EFC2;
     border-top: 1px solid #cebb98;
@@ -3891,7 +3693,7 @@
 }
 
 #content div.box div.action div.button,
-#login div.form div.fields div.field div.input div.link,
+#login div.form div.form-horizontal div.form-group div.input div.link,
 #register div.form div.fields div.field div.input div.link {
     text-align: right;
     margin: 6px 0 0;
@@ -3960,7 +3762,7 @@
     padding: 0;
 }
 
-#login div.form div.fields div.field,
+#login div.form div.form-horizontal div.form-group,
 #register div.form div.fields div.field {
     clear: both;
     overflow: hidden;
@@ -3968,7 +3770,7 @@
     padding: 0 0 10px;
 }
 
-#login div.form div.fields div.field span.error-message,
+#login div.form div.form-horizontal div.form-group span.error-message,
 #register div.form div.fields div.field span.error-message {
     height: 1%;
     display: block;
@@ -3978,36 +3780,36 @@
     max-width: 320px;
 }
 
-#login div.form div.fields div.field div.label label,
+#login div.form div.form-horizontal div.form-group label,
 #register div.form div.fields div.field div.label label {
     color: #000;
     font-weight: 700;
 }
 
-#login div.form div.fields div.field div.input,
+#login div.form div.form-horizontal div.form-group div,
 #register div.form div.fields div.field div.input {
     float: left;
     margin: 0;
     padding: 0;
 }
 
-#login div.form div.fields div.field div.input input.large {
+#login div.form div.form-horizontal div.form-group div input.large {
     width: 250px;
 }
 
-#login div.form div.fields div.field div.checkbox,
+#login div.form div.form-horizontal div.form-group div.checkbox,
 #register div.form div.fields div.field div.checkbox {
     margin: 0 0 0 184px;
     padding: 0;
 }
 
-#login div.form div.fields div.field div.checkbox label,
+#login div.form div.form-horizontal div.form-group div.checkbox label,
 #register div.form div.fields div.field div.checkbox label {
     color: #565656;
     font-weight: 700;
 }
 
-#login div.form div.fields div.buttons input,
+#login div.form div.buttons input,
 #register div.form div.fields div.buttons input {
     color: #000;
     font-size: 1em;
@@ -4035,8 +3837,6 @@
 }
 
 .q_filter_box {
-    -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
     border: 0 none;
     margin-bottom: -4px;
@@ -4189,8 +3989,6 @@
     padding: 5px;
     color: #444;
     overflow: auto;
-    -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
-    -webkit-border-radius: 3px;
     border-radius: 3px;
 }
 
@@ -4222,7 +4020,7 @@
     clear: both;
     overflow: hidden;
     margin: 0;
-    padding: 0 20px 10px;
+    padding: 0 20px;
 }
 
 div.rst-block h1,
@@ -4292,8 +4090,6 @@
     padding: 5px;
     color: #444;
     overflow: auto;
-    -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
-    -webkit-border-radius: 3px;
     border-radius: 3px;
 }
 
@@ -4304,10 +4100,9 @@
     max-width: 978px;
 }
 
-.comments .comment {
+.comments .comment .comment-wrapp {
     border: 1px solid #ddd;
     margin-top: 10px;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
 }
 
@@ -4341,8 +4136,7 @@
     margin: 0.5em 0px !important;
 }
 
-.comments .comments-number,
-.pr-comments-number {
+.comments-number {
     margin: 5px;
     padding: 0px 0px 10px 0px;
     font-weight: bold;
@@ -4350,6 +4144,10 @@
     font-size: 16px;
 }
 
+.automatic-comment {
+    font-style: italic;
+}
+
 /** comment form **/
 
 .status-block {
@@ -4357,15 +4155,10 @@
     clear: both
 }
 
-
-div.comment-form {
-    margin-top: 20px;
-}
-
 .comment-form textarea {
     width: 100%;
     height: 100px;
-    font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
+    font-family: Lucida Console, Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
 }
 
 form.comment-form {
@@ -4377,8 +4170,6 @@
 .comment-form .comment-block-ta {
     border: 1px solid #ccc;
     border-radius: 3px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
     box-sizing: border-box;
 }
 
@@ -4450,7 +4241,6 @@
 .comment-inline-form .clearfix,
 .comment-form .clearfix {
     background: #EEE;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
     padding: 5px;
     margin: 0px;
@@ -4463,7 +4253,7 @@
 .comment-inline-form textarea {
     width: 100%;
     height: 100px;
-    font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
+    font-family: Lucida Console, Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
 }
 
 form.comment-inline-form {
@@ -4501,7 +4291,7 @@
 
 /** comment inline **/
 .inline-comments {
-    padding: 10px 20px;
+    padding: 0 20px;
 }
 
 .inline-comments div.rst-block {
@@ -4510,21 +4300,19 @@
     margin: 0;
     padding: 0 20px 0px;
 }
-.inline-comments .comment {
+
+.inline-comments .comment .comment-wrapp {
     max-width: 978px;
     border: 1px solid #ddd;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
     margin: 3px 3px 5px 5px;
     background-color: #FAFAFA;
 }
+
 .inline-comments .add-comment {
     padding: 2px 4px 8px 5px;
 }
 
-.inline-comments .comment-wrapp {
-    padding: 1px;
-}
 .inline-comments .comment .meta {
     background: #f8f8f8;
     padding: 4px;
@@ -4562,6 +4350,11 @@
     margin: 2px 0px 8px 5px !important
 }
 
+input.status_change_radio {
+    margin: 2px 0 5px 15px;
+    vertical-align: middle;
+}
+
 .notification-paginator {
     padding: 0px 0px 4px 16px;
 }
@@ -4573,7 +4366,6 @@
     color: #888 !important;
     background-color: #DEDEDE !important;
     border-radius: 4px !important;
-    -webkit-border-radius: 4px !important;
 }
 
 #context-pages .forks span,
@@ -4583,7 +4375,6 @@
     color: #888 !important;
     background-color: #DEDEDE !important;
     border-radius: 4px !important;
-    -webkit-border-radius: 4px !important;
 }
 
 
@@ -4608,7 +4399,6 @@
 }
 .notification-table {
     border: 1px solid #ccc;
-    -webkit-border-radius: 6px 6px 6px 6px;
     border-radius: 6px 6px 6px 6px;
     clear: both;
     margin: 0px 20px 0px 20px;
@@ -4675,7 +4465,6 @@
     font-size: 10px;
     color: #577632;
     white-space: nowrap;
-    -webkit-border-radius: 4px;
     border-radius: 4px;
     border: 1px solid #d9e8f8;
     line-height: 1.5em;
@@ -4713,7 +4502,6 @@
     font-weight: bold;
     text-transform: uppercase;
     white-space: nowrap;
-    -webkit-border-radius: 3px;
     border-radius: 3px;
 }
 
@@ -4779,7 +4567,6 @@
     line-height: 100%;
     /* new */
     line-height: 125%;
-    -webkit-border-radius: 6px 6px 0px 0px;
     border-radius: 6px 6px 0px 0px;
 }
 div.diffblock.margined {
@@ -4925,12 +4712,10 @@
 }
 table.code-difftable .lineno a {
     color: #aaa !important;
-    font: 11px Consolas, Monaco, Inconsolata, Liberation Mono, monospace !important;
+    font: 11px Lucida Console, Consolas, Monaco, Inconsolata, Liberation Mono, monospace !important;
     letter-spacing: -1px;
     padding-left: 10px;
     padding-right: 8px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
     box-sizing: border-box;
     cursor: pointer;
     display: block;
@@ -4972,7 +4757,7 @@
     position: relative;
     width: 0;
 }
- 
+
 table.code-difftable .add .code pre:before {
     content: "+";
     color: #080;
@@ -4981,7 +4766,7 @@
     position: relative;
     width: 0;
 }
- 
+
 table.code-difftable .unmod .code pre:before {
     content: " ";
     float: left;
@@ -4989,7 +4774,7 @@
     position: relative;
     width: 0;
 }
- 
+
 .add-bubble {
     position: relative;
     display: none;
@@ -4997,14 +4782,13 @@
     width: 0px;
     height: 0px;
     left: -8px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
     box-sizing: border-box;
 }
 
-tr.line.add:hover td .add-bubble,
-tr.line.del:hover td .add-bubble,
-tr.line.unmod:hover td .add-bubble {
+/* comment bubble, only visible when in a commentable diff */
+.commentable-diff tr.line.add:hover td .add-bubble,
+.commentable-diff tr.line.del:hover td .add-bubble,
+.commentable-diff tr.line.unmod:hover td .add-bubble {
     display: block;
     z-index: 1;
 }
@@ -5017,8 +4801,6 @@
     padding: 0 2px 2px 0.5px;
     border: 1px solid #577632;
     border-radius: 3px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
     box-sizing: border-box;
 }
 
@@ -5026,13 +4808,22 @@
     font-size: 14px;
     color: #ffffff;
     font-family: "kallithea";
-    content: '\e80c';
+    content: '\1f5ea';
 }
 
 .add-bubble div:hover {
     transform: scale(1.2, 1.2);
 }
 
+/* show some context of link targets - but only works when the link target
+   can be extended with any visual difference */
+div.comment:target:before {
+  display: block;
+  height: 100px;
+  margin: -100px 0 0;
+  content: "";
+}
+
 div.comment:target>.comment-wrapp {
     border: solid 2px #ee0 !important;
 }
@@ -5067,8 +4858,8 @@
     margin: 5px;
 }
 
-div.prev-next-comment div.prev-comment,
-div.prev-next-comment div.next-comment {
+div.comment-prev-next-links div.prev-comment,
+div.comment-prev-next-links div.next-comment {
     display: inline-block;
     min-width: 150px;
     margin: 3px 6px;
--- a/kallithea/public/fontello/config.json	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/fontello/config.json	Sun Sep 06 23:36:05 2015 +0200
@@ -401,7 +401,7 @@
     {
       "uid": "c04672812513206682a859166c207252",
       "css": "clippy",
-      "code": 59419,
+      "code": 128203,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -457,7 +457,7 @@
     {
       "uid": "c9e14800494dc6027b3dcee0817cf984",
       "css": "code",
-      "code": 59425,
+      "code": 8596,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -485,7 +485,7 @@
     {
       "uid": "7aeda197b5b0fba630669530807d736d",
       "css": "comment",
-      "code": 59403,
+      "code": 128489,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -499,7 +499,7 @@
     {
       "uid": "28655242f029e97efd1bf5379e22c4ba",
       "css": "comment-discussion",
-      "code": 59404,
+      "code": 128490,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -555,7 +555,7 @@
     {
       "uid": "776af96a4db73c51c13fd256f12d6f40",
       "css": "database",
-      "code": 59392,
+      "code": 9923,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -639,7 +639,7 @@
     {
       "uid": "ccc8f787411138446b85c9fe52e33b8b",
       "css": "diff-added",
-      "code": 59398,
+      "code": 8862,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -667,7 +667,7 @@
     {
       "uid": "2672a84540d3632649f01108e2db0341",
       "css": "diff-modified",
-      "code": 59397,
+      "code": 8865,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -681,7 +681,7 @@
     {
       "uid": "1ce39df7ee1648c4054633b371546367",
       "css": "diff-removed",
-      "code": 59399,
+      "code": 8863,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -905,7 +905,7 @@
     {
       "uid": "c59600c892bd7e46476f38e89812fbbf",
       "css": "gear",
-      "code": 59441,
+      "code": 9965,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -1031,7 +1031,7 @@
     {
       "uid": "b00e349d8883c0b89796940a9913e8e8",
       "css": "globe",
-      "code": 59410,
+      "code": 127758,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -1283,7 +1283,7 @@
     {
       "uid": "3617d121a15ef91892d5083aeead6ce3",
       "css": "key",
-      "code": 59430,
+      "code": 128273,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -1591,7 +1591,7 @@
     {
       "uid": "ef6263a57a35ecee2f8ddda2fe20dcab",
       "css": "move-down",
-      "code": 59395,
+      "code": 11123,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -1633,7 +1633,7 @@
     {
       "uid": "13e7ebf511552da48a5bc1d2e7cf6de2",
       "css": "move-up",
-      "code": 59396,
+      "code": 11121,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2123,7 +2123,7 @@
     {
       "uid": "809bb7ea7bf6ca7e94029eae402f922f",
       "css": "search",
-      "code": 59435,
+      "code": 128269,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2333,7 +2333,7 @@
     {
       "uid": "92dd16866a2367537f47bec5ee11484f",
       "css": "tools",
-      "code": 59400,
+      "code": 128736,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2347,7 +2347,7 @@
     {
       "uid": "448bfec39235117b6a7e3e8d46aa184f",
       "css": "trashcan",
-      "code": 59433,
+      "code": 128465,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2361,7 +2361,7 @@
     {
       "uid": "ebbb1978bedc8e562ab0d462a832919f",
       "css": "triangle-down",
-      "code": 59405,
+      "code": 9207,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2375,7 +2375,7 @@
     {
       "uid": "814cb1fe473de29d20b3d4e366ed434b",
       "css": "triangle-left",
-      "code": 59406,
+      "code": 9204,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2389,7 +2389,7 @@
     {
       "uid": "d191392505c6a27bbeafd2d283a18d23",
       "css": "triangle-right",
-      "code": 59407,
+      "code": 9205,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2403,7 +2403,7 @@
     {
       "uid": "14bdc9ddaebbaecf5bad552a14cae637",
       "css": "triangle-up",
-      "code": 59408,
+      "code": 9206,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2501,7 +2501,7 @@
     {
       "uid": "16b70cc2a5fbff7de2cbf73498e25b5c",
       "css": "keyhole-circled",
-      "code": 59426,
+      "code": 128272,
       "src": "custom_icons",
       "selected": true,
       "svg": {
@@ -2543,91 +2543,91 @@
     {
       "uid": "d73eceadda1f594cec0536087539afbf",
       "css": "heart",
-      "code": 59436,
+      "code": 9829,
       "src": "fontawesome"
     },
     {
       "uid": "f3dc2d6d8fe9cf9ebff84dc260888cdf",
       "css": "heart-empty",
-      "code": 59437,
+      "code": 9825,
       "src": "fontawesome"
     },
     {
       "uid": "8b80d36d4ef43889db10bc1f0dc9a862",
       "css": "user",
-      "code": 59438,
+      "code": 128100,
       "src": "fontawesome"
     },
     {
       "uid": "31972e4e9d080eaa796290349ae6c1fd",
       "css": "users",
-      "code": 59439,
+      "code": 128101,
       "src": "fontawesome"
     },
     {
       "uid": "12f4ece88e46abd864e40b35e05b11cd",
       "css": "ok",
-      "code": 59440,
+      "code": 128504,
       "src": "fontawesome"
     },
     {
       "uid": "43ab845088317bd348dee1d975700c48",
       "css": "ok-circled",
-      "code": 59402,
+      "code": 128505,
       "src": "fontawesome"
     },
     {
       "uid": "5211af474d3a9848f67f945e2ccaf143",
       "css": "cancel",
-      "code": 59434,
+      "code": 128500,
       "src": "fontawesome"
     },
     {
       "uid": "0f4cae16f34ae243a6144c18a003f2d8",
       "css": "cancel-circled",
-      "code": 59401,
+      "code": 128501,
       "src": "fontawesome"
     },
     {
       "uid": "44e04715aecbca7f266a17d5a7863c68",
       "css": "plus",
-      "code": 59471,
+      "code": 10133,
       "src": "fontawesome"
     },
     {
       "uid": "4ba33d2607902cf690dd45df09774cb0",
       "css": "plus-circled",
-      "code": 59468,
+      "code": 8853,
       "src": "fontawesome"
     },
     {
       "uid": "861ab06e455e2de3232ebef67d60d708",
       "css": "minus",
-      "code": 59472,
+      "code": 10134,
       "src": "fontawesome"
     },
     {
       "uid": "eeadb020bb75d089b25d8424aabe19e0",
       "css": "minus-circled",
-      "code": 59469,
+      "code": 8854,
       "src": "fontawesome"
     },
     {
       "uid": "c1f1975c885aa9f3dad7810c53b82074",
       "css": "lock",
-      "code": 59450,
+      "code": 128274,
       "src": "fontawesome"
     },
     {
       "uid": "05376be04a27d5a46e855a233d6e8508",
       "css": "lock-open-alt",
-      "code": 59451,
+      "code": 128275,
       "src": "fontawesome"
     },
     {
       "uid": "c5fd349cbd3d23e4ade333789c29c729",
       "css": "eye",
-      "code": 59474,
+      "code": 128065,
       "src": "fontawesome"
     },
     {
@@ -2639,7 +2639,7 @@
     {
       "uid": "3db5347bd219f3bce6025780f5d9ef45",
       "css": "tag",
-      "code": 59452,
+      "code": 128278,
       "src": "fontawesome"
     },
     {
@@ -2675,25 +2675,25 @@
     {
       "uid": "d35a1d35efeb784d1dc9ac18b9b6c2b6",
       "css": "pencil",
-      "code": 59458,
+      "code": 128393,
       "src": "fontawesome"
     },
     {
       "uid": "44fae3bfdd54754dc68ec50d37efea37",
       "css": "pencil-squared",
-      "code": 59460,
+      "code": 128394,
       "src": "fontawesome"
     },
     {
       "uid": "41087bc74d4b20b55059c60a33bf4008",
       "css": "edit",
-      "code": 59461,
+      "code": 128395,
       "src": "fontawesome"
     },
     {
       "uid": "1b5a5d7b7e3c71437f5a26befdd045ed",
       "css": "doc",
-      "code": 59443,
+      "code": 128453,
       "src": "fontawesome"
     },
     {
@@ -2705,7 +2705,7 @@
     {
       "uid": "5408be43f7c42bccee419c6be53fdef5",
       "css": "doc-text",
-      "code": 59445,
+      "code": 128456,
       "src": "fontawesome"
     },
     {
@@ -2729,25 +2729,25 @@
     {
       "uid": "f8aa663c489bcbd6e68ec8147dca841e",
       "css": "folder",
-      "code": 59475,
+      "code": 128448,
       "src": "fontawesome"
     },
     {
       "uid": "c95735c17a10af81448c7fed98a04546",
       "css": "folder-open",
-      "code": 59462,
+      "code": 128449,
       "src": "fontawesome"
     },
     {
       "uid": "b091a8bd0fdade174951f17d936f51e4",
       "css": "folder-empty",
-      "code": 59476,
+      "code": 128193,
       "src": "fontawesome"
     },
     {
       "uid": "6533bdc16ab201eb3f3b27ce989cab33",
       "css": "folder-open-empty",
-      "code": 59463,
+      "code": 128194,
       "src": "fontawesome"
     },
     {
@@ -2771,13 +2771,13 @@
     {
       "uid": "98687378abd1faf8f6af97c254eb6cd6",
       "css": "cog-alt",
-      "code": 59442,
+      "code": 9881,
       "src": "fontawesome"
     },
     {
       "uid": "5bb103cd29de77e0e06a52638527b575",
       "css": "wrench",
-      "code": 59479,
+      "code": 128295,
       "src": "fontawesome"
     },
     {
@@ -2789,19 +2789,19 @@
     {
       "uid": "598a5f2bcf3521d1615de8e1881ccd17",
       "css": "clock",
-      "code": 59449,
+      "code": 8986,
       "src": "fontawesome"
     },
     {
       "uid": "98d9c83c1ee7c2c25af784b518c522c5",
       "css": "block",
-      "code": 59470,
+      "code": 128683,
       "src": "fontawesome"
     },
     {
       "uid": "d3b3f17bc3eb7cd809a07bbd4d178bee",
       "css": "resize-vertical",
-      "code": 59415,
+      "code": 11109,
       "src": "fontawesome"
     },
     {
@@ -2825,25 +2825,25 @@
     {
       "uid": "ccddff8e8670dcd130e3cb55fdfc2fd0",
       "css": "down-open",
-      "code": 59464,
+      "code": 8595,
       "src": "fontawesome"
     },
     {
       "uid": "d870630ff8f81e6de3958ecaeac532f2",
       "css": "left-open",
-      "code": 59465,
+      "code": 8594,
       "src": "fontawesome"
     },
     {
       "uid": "399ef63b1e23ab1b761dfbb5591fa4da",
       "css": "right-open",
-      "code": 59466,
+      "code": 8592,
       "src": "fontawesome"
     },
     {
       "uid": "fe6697b391355dec12f3d86d6d490397",
       "css": "up-open",
-      "code": 59467,
+      "code": 8593,
       "src": "fontawesome"
     },
     {
@@ -2879,13 +2879,13 @@
     {
       "uid": "a73c5deb486c8d66249811642e5d719a",
       "css": "arrows-cw",
-      "code": 59448,
+      "code": 128472,
       "src": "fontawesome"
     },
     {
       "uid": "6020aff067fc3c119cdd75daa5249220",
       "css": "exchange",
-      "code": 59483,
+      "code": 8644,
       "src": "fontawesome"
     },
     {
@@ -2909,25 +2909,25 @@
     {
       "uid": "9755f76110ae4d12ac5f9466c9152031",
       "css": "book",
-      "code": 59454,
+      "code": 128210,
       "src": "fontawesome"
     },
     {
       "uid": "130380e481a7defc690dfb24123a1f0c",
       "css": "circle",
-      "code": 59485,
+      "code": 8226,
       "src": "fontawesome"
     },
     {
       "uid": "422e07e5afb80258a9c4ed1706498f8a",
       "css": "circle-empty",
-      "code": 59484,
+      "code": 9702,
       "src": "fontawesome"
     },
     {
       "uid": "f4445feb55521283572ee88bc304f928",
       "css": "floppy",
-      "code": 59480,
+      "code": 128190,
       "src": "fontawesome"
     },
     {
@@ -2939,7 +2939,7 @@
     {
       "uid": "56a21935a5d4d79b2e91ec00f760b369",
       "css": "sort",
-      "code": 59482,
+      "code": 8597,
       "src": "fontawesome"
     }
   ]
--- a/kallithea/public/fontello/css/kallithea.css	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/fontello/css/kallithea.css	Sun Sep 06 23:36:05 2015 +0200
@@ -1,10 +1,12 @@
-@font-face {
+@charset "UTF-8";
+
+ @font-face {
   font-family: 'kallithea';
-  src: url('../font/kallithea.eot?81834162');
-  src: url('../font/kallithea.eot?81834162#iefix') format('embedded-opentype'),
-       url('../font/kallithea.woff?81834162') format('woff'),
-       url('../font/kallithea.ttf?81834162') format('truetype'),
-       url('../font/kallithea.svg?81834162#kallithea') format('svg');
+  src: url('../font/kallithea.eot?23730278');
+  src: url('../font/kallithea.eot?23730278#iefix') format('embedded-opentype'),
+       url('../font/kallithea.woff?23730278') format('woff'),
+       url('../font/kallithea.ttf?23730278') format('truetype'),
+       url('../font/kallithea.svg?23730278#kallithea') format('svg');
   font-weight: normal;
   font-style: normal;
 }
@@ -14,7 +16,7 @@
 @media screen and (-webkit-min-device-pixel-ratio:0) {
   @font-face {
     font-family: 'kallithea';
-    src: url('../font/kallithea.svg?81834162#kallithea') format('svg');
+    src: url('../font/kallithea.svg?23730278#kallithea') format('svg');
   }
 }
 */
@@ -35,7 +37,7 @@
   /* For safety - reset parent styles, that can break glyph codes*/
   font-variant: normal;
   text-transform: none;
-     
+ 
   /* fix buttons height, for twitter bootstrap */
   line-height: 1em;
  
@@ -46,102 +48,73 @@
   /* you can be more comfortable with increased icons size */
   /* font-size: 120%; */
  
+  /* Font smoothing. That was taken from TWBS */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+ 
   /* Uncomment for 3D effect */
   /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
 }
  
-.icon-database:before { content: '\e800'; } /* '' */
+.icon-circle:before { content: '\2022'; } /* '•' */
+.icon-right-open:before { content: '\2190'; } /* '←' */
+.icon-up-open:before { content: '\2191'; } /* '↑' */
+.icon-left-open:before { content: '\2192'; } /* '→' */
+.icon-down-open:before { content: '\2193'; } /* '↓' */
+.icon-code:before { content: '\2194'; } /* '↔' */
+.icon-sort:before { content: '\2195'; } /* '↕' */
+.icon-exchange:before { content: '\21c4'; } /* '⇄' */
+.icon-plus-circled:before { content: '\2295'; } /* '⊕' */
+.icon-minus-circled:before { content: '\2296'; } /* '⊖' */
+.icon-diff-added:before { content: '\229e'; } /* '⊞' */
+.icon-diff-removed:before { content: '\229f'; } /* '⊟' */
+.icon-diff-modified:before { content: '\22a1'; } /* '⊡' */
+.icon-clock:before { content: '\231a'; } /* '⌚' */
+.icon-triangle-left:before { content: '\23f4'; } /* '⏴' */
+.icon-triangle-right:before { content: '\23f5'; } /* '⏵' */
+.icon-triangle-up:before { content: '\23f6'; } /* '⏶' */
+.icon-triangle-down:before { content: '\23f7'; } /* '⏷' */
+.icon-circle-empty:before { content: '\25e6'; } /* '◦' */
+.icon-heart-empty:before { content: '\2661'; } /* '♡' */
+.icon-heart:before { content: '\2665'; } /* '♥' */
+.icon-cog-alt:before { content: '\2699'; } /* '⚙' */
+.icon-database:before { content: '\26c3'; } /* '⛃' */
+.icon-gear:before { content: '\26ed'; } /* '⛭' */
+.icon-plus:before { content: '\2795'; } /* '➕' */
+.icon-minus:before { content: '\2796'; } /* '➖' */
+.icon-resize-vertical:before { content: '\2b65'; } /* '⭥' */
+.icon-move-up:before { content: '\2b71'; } /* '⭱' */
+.icon-move-down:before { content: '\2b73'; } /* '⭳' */
 .icon-file-submodule:before { content: '\e801'; } /* '' */
 .icon-git-merge:before { content: '\e802'; } /* '' */
-.icon-move-down:before { content: '\e803'; } /* '' */
-.icon-move-up:before { content: '\e804'; } /* '' */
-.icon-diff-modified:before { content: '\e805'; } /* '' */
-.icon-diff-added:before { content: '\e806'; } /* '' */
-.icon-diff-removed:before { content: '\e807'; } /* '' */
-.icon-tools:before { content: '\e808'; } /* '' */
-.icon-cancel-circled:before { content: '\e809'; } /* '' */
-.icon-ok-circled:before { content: '\e80a'; } /* '' */
-.icon-comment:before { content: '\e80b'; } /* '' */
-.icon-comment-discussion:before { content: '\e80c'; } /* '' */
-.icon-triangle-down:before { content: '\e80d'; } /* '' */
-.icon-triangle-left:before { content: '\e80e'; } /* '' */
-.icon-triangle-right:before { content: '\e80f'; } /* '' */
-.icon-triangle-up:before { content: '\e810'; } /* '' */
 .icon-ruler:before { content: '\e811'; } /* '' */
-.icon-globe:before { content: '\e812'; } /* '' */
 .icon-download-cloud:before { content: '\e813'; } /* '' */
 .icon-upload-cloud:before { content: '\e814'; } /* '' */
 .icon-graph:before { content: '\e815'; } /* '' */
 .icon-file-zip:before { content: '\e816'; } /* '' */
-.icon-resize-vertical:before { content: '\e817'; } /* '' */
 .icon-file-code:before { content: '\e81a'; } /* '' */
-.icon-clippy:before { content: '\e81b'; } /* '' */
 .icon-doc-text-inv:before { content: '\e81c'; } /* '' */
 .icon-diff:before { content: '\e81d'; } /* '' */
 .icon-diff-ignored:before { content: '\e81e'; } /* '' */
 .icon-diff-renamed:before { content: '\e81f'; } /* '' */
 .icon-paste:before { content: '\e820'; } /* '' */
-.icon-code:before { content: '\e821'; } /* '' */
-.icon-keyhole-circled:before { content: '\e822'; } /* '' */
 .icon-file-directory:before { content: '\e823'; } /* '' */
 .icon-git-compare:before { content: '\e824'; } /* '' */
 .icon-git-pull-request:before { content: '\e825'; } /* '' */
-.icon-key:before { content: '\e826'; } /* '' */
 .icon-repo-forked:before { content: '\e827'; } /* '' */
 .icon-fork:before { content: '\e828'; } /* '' */
-.icon-trashcan:before { content: '\e829'; } /* '' */
-.icon-cancel:before { content: '\e82a'; } /* '' */
-.icon-search:before { content: '\e82b'; } /* '' */
-.icon-heart:before { content: '\e82c'; } /* '' */
-.icon-heart-empty:before { content: '\e82d'; } /* '' */
-.icon-user:before { content: '\e82e'; } /* '' */
-.icon-users:before { content: '\e82f'; } /* '' */
-.icon-ok:before { content: '\e830'; } /* '' */
-.icon-gear:before { content: '\e831'; } /* '' */
-.icon-cog-alt:before { content: '\e832'; } /* '' */
-.icon-doc:before { content: '\e833'; } /* '' */
 .icon-docs:before { content: '\e834'; } /* '' */
-.icon-doc-text:before { content: '\e835'; } /* '' */
 .icon-doc-inv:before { content: '\e836'; } /* '' */
 .icon-file-powerpoint:before { content: '\e837'; } /* '' */
-.icon-arrows-cw:before { content: '\e838'; } /* '' */
-.icon-clock:before { content: '\e839'; } /* '' */
-.icon-lock:before { content: '\e83a'; } /* '' */
-.icon-lock-open-alt:before { content: '\e83b'; } /* '' */
-.icon-tag:before { content: '\e83c'; } /* '' */
 .icon-tags:before { content: '\e83d'; } /* '' */
-.icon-book:before { content: '\e83e'; } /* '' */
 .icon-bookmark-empty:before { content: '\e83f'; } /* '' */
 .icon-bookmark:before { content: '\e840'; } /* '' */
 .icon-align-left:before { content: '\e841'; } /* '' */
-.icon-pencil:before { content: '\e842'; } /* '' */
 .icon-sliders:before { content: '\e843'; } /* '' */
-.icon-pencil-squared:before { content: '\e844'; } /* '' */
-.icon-edit:before { content: '\e845'; } /* '' */
-.icon-folder-open:before { content: '\e846'; } /* '' */
-.icon-folder-open-empty:before { content: '\e847'; } /* '' */
-.icon-down-open:before { content: '\e848'; } /* '' */
-.icon-left-open:before { content: '\e849'; } /* '' */
-.icon-right-open:before { content: '\e84a'; } /* '' */
-.icon-up-open:before { content: '\e84b'; } /* '' */
-.icon-plus-circled:before { content: '\e84c'; } /* '' */
-.icon-minus-circled:before { content: '\e84d'; } /* '' */
-.icon-block:before { content: '\e84e'; } /* '' */
-.icon-plus:before { content: '\e84f'; } /* '' */
-.icon-minus:before { content: '\e850'; } /* '' */
 .icon-eye-off:before { content: '\e851'; } /* '' */
-.icon-eye:before { content: '\e852'; } /* '' */
-.icon-folder:before { content: '\e853'; } /* '' */
-.icon-folder-empty:before { content: '\e854'; } /* '' */
 .icon-rss:before { content: '\e855'; } /* '' */
 .icon-rss-squared:before { content: '\e856'; } /* '' */
-.icon-wrench:before { content: '\e857'; } /* '' */
-.icon-floppy:before { content: '\e858'; } /* '' */
 .icon-strike:before { content: '\e859'; } /* '' */
-.icon-sort:before { content: '\e85a'; } /* '' */
-.icon-exchange:before { content: '\e85b'; } /* '' */
-.icon-circle-empty:before { content: '\e85c'; } /* '' */
-.icon-circle:before { content: '\e85d'; } /* '' */
 .icon-box:before { content: '\e85e'; } /* '' */
 .icon-right:before { content: '\e85f'; } /* '' */
 .icon-left:before { content: '\e860'; } /* '' */
@@ -150,4 +123,37 @@
 .icon-up-circled:before { content: '\e863'; } /* '' */
 .icon-up:before { content: '\e864'; } /* '' */
 .icon-down:before { content: '\e865'; } /* '' */
-.icon-down-circled:before { content: '\e866'; } /* '' */
\ No newline at end of file
+.icon-down-circled:before { content: '\e866'; } /* '' */
+.icon-globe:before { content: '🌎'; } /* '\1f30e' */
+.icon-eye:before { content: '👁'; } /* '\1f441' */
+.icon-user:before { content: '👤'; } /* '\1f464' */
+.icon-users:before { content: '👥'; } /* '\1f465' */
+.icon-floppy:before { content: '💾'; } /* '\1f4be' */
+.icon-folder-empty:before { content: '📁'; } /* '\1f4c1' */
+.icon-folder-open-empty:before { content: '📂'; } /* '\1f4c2' */
+.icon-clippy:before { content: '📋'; } /* '\1f4cb' */
+.icon-book:before { content: '📒'; } /* '\1f4d2' */
+.icon-search:before { content: '🔍'; } /* '\1f50d' */
+.icon-keyhole-circled:before { content: '🔐'; } /* '\1f510' */
+.icon-key:before { content: '🔑'; } /* '\1f511' */
+.icon-lock:before { content: '🔒'; } /* '\1f512' */
+.icon-lock-open-alt:before { content: '🔓'; } /* '\1f513' */
+.icon-tag:before { content: '🔖'; } /* '\1f516' */
+.icon-wrench:before { content: '🔧'; } /* '\1f527' */
+.icon-pencil:before { content: '🖉'; } /* '\1f589' */
+.icon-pencil-squared:before { content: '🖊'; } /* '\1f58a' */
+.icon-edit:before { content: '🖋'; } /* '\1f58b' */
+.icon-folder:before { content: '🗀'; } /* '\1f5c0' */
+.icon-folder-open:before { content: '🗁'; } /* '\1f5c1' */
+.icon-doc:before { content: '🗅'; } /* '\1f5c5' */
+.icon-doc-text:before { content: '🗈'; } /* '\1f5c8' */
+.icon-trashcan:before { content: '🗑'; } /* '\1f5d1' */
+.icon-arrows-cw:before { content: '🗘'; } /* '\1f5d8' */
+.icon-comment:before { content: '🗩'; } /* '\1f5e9' */
+.icon-comment-discussion:before { content: '🗪'; } /* '\1f5ea' */
+.icon-cancel:before { content: '🗴'; } /* '\1f5f4' */
+.icon-cancel-circled:before { content: '🗵'; } /* '\1f5f5' */
+.icon-ok:before { content: '🗸'; } /* '\1f5f8' */
+.icon-ok-circled:before { content: '🗹'; } /* '\1f5f9' */
+.icon-block:before { content: '🚫'; } /* '\1f6ab' */
+.icon-tools:before { content: '🛠'; } /* '\1f6e0' */
\ No newline at end of file
Binary file kallithea/public/fontello/font/kallithea.eot has changed
--- a/kallithea/public/fontello/font/kallithea.svg	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/fontello/font/kallithea.svg	Sun Sep 06 23:36:05 2015 +0200
@@ -6,98 +6,65 @@
 <font id="kallithea" horiz-adv-x="1000" >
 <font-face font-family="kallithea" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
 <missing-glyph horiz-adv-x="1000" />
-<glyph glyph-name="database" unicode="&#xe800;" d="m375-88c-207 0-375 56-375 126 0 37 0 79 0 125 0 10 5 21 13 31 42-54 187-94 362-94s320 40 362 94c8-10 13-21 13-31 0-37 0-75 0-125 0-70-168-126-375-126z m0 251c-207 0-375 56-375 125 0 37 0 78 0 125 0 6 3 13 6 19l0 0c2 4 4 8 7 12 42-54 187-94 362-94s320 40 362 94c3-4 5-8 7-12l0 0c4-6 6-13 6-19 0-37 0-75 0-125 0-69-168-125-375-125z m0 250c-207 0-375 56-375 125 0 19 0 40 0 62 0 20 0 41 0 63 0 69 168 125 375 125 207 0 375-56 375-125 0-20 0-41 0-63 0-19 0-39 0-62 0-69-168-125-375-125z m0 312c-138 0-250-28-250-62s112-63 250-63 250 28 250 63-112 62-250 62z" horiz-adv-x="750" />
+<glyph glyph-name="circle" unicode="&#x2022;" d="m857 350q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="right-open" unicode="&#x2190;" d="m618 361l-414-415q-11-10-25-10t-26 10l-92 93q-11 11-11 25t11 25l296 297-296 296q-11 11-11 25t11 25l92 93q11 10 26 10t25-10l414-414q10-11 10-25t-10-25z" horiz-adv-x="714.3" />
+<glyph glyph-name="up-open" unicode="&#x2191;" d="m939 107l-92-92q-11-10-26-10t-25 10l-296 297-296-297q-11-10-25-10t-26 10l-92 92q-11 11-11 26t11 25l414 414q11 10 25 10t25-10l414-414q11-11 11-25t-11-26z" horiz-adv-x="1000" />
+<glyph glyph-name="left-open" unicode="&#x2192;" d="m653 682l-296-296 296-297q11-10 11-25t-11-25l-92-93q-11-10-25-10t-25 10l-414 415q-11 10-11 25t11 25l414 414q10 10 25 10t25-10l92-93q11-10 11-25t-11-25z" horiz-adv-x="714.3" />
+<glyph glyph-name="down-open" unicode="&#x2193;" d="m939 399l-414-413q-10-11-25-11t-25 11l-414 413q-11 11-11 26t11 25l92 92q11 11 26 11t25-11l296-296 296 296q11 11 25 11t26-11l92-92q11-11 11-25t-11-26z" horiz-adv-x="1000" />
+<glyph glyph-name="code" unicode="&#x2194;" d="m594 663l-94-94 219-219-219-219 94-93 281 312-281 313z m-313 0l-281-313 281-312 94 93-219 219 219 219-94 94z" horiz-adv-x="875" />
+<glyph glyph-name="sort" unicode="&#x2195;" d="m571 243q0-15-10-25l-250-250q-11-11-25-11t-25 11l-250 250q-11 10-11 25t11 25 25 11h500q14 0 25-11t10-25z m0 214q0-14-10-25t-25-11h-500q-15 0-25 11t-11 25 11 25l250 250q10 11 25 11t25-11l250-250q10-10 10-25z" horiz-adv-x="571.4" />
+<glyph glyph-name="exchange" unicode="&#x21c4;" d="m1000 189v-107q0-7-5-12t-13-6h-768v-107q0-7-5-12t-13-6q-6 0-13 6l-178 178q-5 5-5 13 0 8 5 13l179 178q5 5 12 5 8 0 13-5t5-13v-107h768q7 0 13-5t5-13z m0 304q0-8-5-13l-179-179q-5-5-12-5-8 0-13 6t-5 12v107h-768q-7 0-13 6t-5 12v107q0 8 5 13t13 5h768v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13z" horiz-adv-x="1000" />
+<glyph glyph-name="plus-circled" unicode="&#x2295;" d="m679 314v72q0 14-11 25t-25 10h-143v143q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-143h-143q-14 0-25-10t-10-25v-72q0-14 10-25t25-11h143v-142q0-15 11-25t25-11h71q15 0 25 11t11 25v142h143q14 0 25 11t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="minus-circled" unicode="&#x2296;" d="m679 314v72q0 14-11 25t-25 10h-429q-14 0-25-10t-10-25v-72q0-14 10-25t25-10h429q14 0 25 10t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="diff-added" unicode="&#x229e;" d="m500 538h-125v-125h-125v-125h125v-125h125v125h125v125h-125v125z m313 250c-32 0-719 0-750 0s-63-32-63-63 0-719 0-750 31-63 63-63 718 0 750 0 62 32 62 63 0 719 0 750-31 63-62 63z m-63-719c0-16-17-31-31-31s-545 0-563 0-31 11-31 31c0 15 0 547 0 562s16 32 31 32 548 0 563 0 31-16 31-32 0-547 0-562z" horiz-adv-x="875" />
+<glyph glyph-name="diff-removed" unicode="&#x229f;" d="m813 788h-750c-32 0-63-32-63-63v-750c0-31 31-63 63-63h750c31 0 62 32 62 63v750c0 31-31 63-62 63z m-63-719c0-16-17-31-31-31h-563c-17 0-31 11-31 31v562c0 16 16 32 31 32h563c14 0 31-16 31-32v-562z m-500 219h375v125h-375v-125z" horiz-adv-x="875" />
+<glyph glyph-name="diff-modified" unicode="&#x22a1;" d="m813 788h-750c-32 0-63-32-63-63v-750c0-31 31-63 63-63h750c31 0 62 32 62 63v750c0 31-31 63-62 63z m-63-719c0-16-17-31-31-31h-563c-17 0-31 11-31 31v562c0 16 16 32 31 32h563c14 0 31-16 31-32v-562z m-312 406c-70 0-125-56-125-125s55-125 125-125 125 56 125 125-56 125-125 125z" horiz-adv-x="875" />
+<glyph glyph-name="clock" unicode="&#x231a;" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="triangle-left" unicode="&#x23f4;" d="m0 350l375-375v750l-375-375z" horiz-adv-x="374.8" />
+<glyph glyph-name="triangle-right" unicode="&#x23f5;" d="m0 725l375-375-375-375v750z" horiz-adv-x="374.9" />
+<glyph glyph-name="triangle-up" unicode="&#x23f6;" d="m375 600l-375-375h750l-375 375z" horiz-adv-x="749.5" />
+<glyph glyph-name="triangle-down" unicode="&#x23f7;" d="m0 475l375-375 375 375h-750z" horiz-adv-x="749.5" />
+<glyph glyph-name="circle-empty" unicode="&#x25e6;" d="m429 654q-83 0-153-41t-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152-41 152-110 111-152 41z m428-304q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="heart-empty" unicode="&#x2661;" d="m929 517q0 46-12 80t-31 55-46 33-52 18-55 4-62-14-62-36-48-40-34-34q-10-13-27-13t-27 13q-14 15-34 34t-48 40-62 36-62 14-55-4-52-18-46-33-31-55-12-80q0-93 105-198l324-312 324 312q105 105 105 198z m71 0q0-123-128-251l-347-335q-10-10-25-10t-25 10l-348 336q-5 5-15 15t-31 36-38 55-30 67-13 77q0 123 71 192t196 70q34 0 70-12t67-33 54-38 42-38q20 20 42 38t54 38 67 33 70 12q125 0 196-70t71-192z" horiz-adv-x="1000" />
+<glyph glyph-name="heart" unicode="&#x2665;" d="m500-79q-14 0-25 10l-348 336q-5 5-15 15t-31 36-38 55-30 67-13 77q0 123 71 192t196 70q34 0 70-12t67-33 54-38 42-38q20 20 42 38t54 38 67 33 70 12q125 0 196-70t71-192q0-123-128-251l-347-335q-10-10-25-10z" horiz-adv-x="1000" />
+<glyph glyph-name="cog-alt" unicode="&#x2699;" d="m500 350q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m429-286q0 29-22 51t-50 21-50-21-21-51q0-29 21-50t50-21 51 21 21 50z m0 572q0 29-22 50t-50 21-50-21-21-50q0-30 21-51t50-21 51 21 21 51z m-215-235v-103q0-6-4-11t-9-6l-86-14q-6-19-18-42 19-27 50-64 4-6 4-11 0-7-4-11-13-17-46-50t-44-33q-6 0-11 4l-64 50q-21-11-43-17-6-60-13-87-4-13-17-13h-104q-6 0-11 4t-5 10l-13 85q-19 6-42 18l-66-50q-4-4-11-4-6 0-12 4-80 75-80 90 0 5 4 10 5 8 23 30t26 34q-13 24-20 46l-85 13q-5 1-9 5t-4 11v103q0 6 4 11t9 6l86 14q7 19 18 42-19 27-50 64-4 6-4 11 0 7 4 11 12 17 46 50t44 33q6 0 12-4l64-50q19 10 43 18 6 60 13 86 3 13 16 13h104q6 0 11-4t6-10l13-85q19-6 41-17l66 49q5 4 11 4 7 0 12-4 81-75 81-90 0-5-4-10-7-9-24-30t-25-34q13-27 19-46l85-12q5-2 9-6t4-11z m357-298v-78q0-9-83-17-6-15-16-29 28-63 28-77 0-2-2-4-68-40-69-40-5 0-26 27t-29 37q-11-1-17-1t-17 1q-7-11-29-37t-25-27q-1 0-69 40-3 2-3 4 0 14 29 77-10 14-17 29-83 8-83 17v78q0 9 83 18 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 1 17 1t17-1q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-9 83-18z m0 572v-78q0-9-83-18-6-15-16-29 28-63 28-77 0-2-2-4-68-39-69-39-5 0-26 26t-29 38q-11-1-17-1t-17 1q-7-12-29-38t-25-26q-1 0-69 39-3 2-3 4 0 14 29 77-10 14-17 29-83 9-83 18v78q0 9 83 17 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 2 17 2t17-2q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-8 83-17z" horiz-adv-x="1071.4" />
+<glyph glyph-name="database" unicode="&#x26c3;" d="m375-88c-207 0-375 56-375 126 0 37 0 79 0 125 0 10 5 21 13 31 42-54 187-94 362-94s320 40 362 94c8-10 13-21 13-31 0-37 0-75 0-125 0-70-168-126-375-126z m0 251c-207 0-375 56-375 125 0 37 0 78 0 125 0 6 3 13 6 19l0 0c2 4 4 8 7 12 42-54 187-94 362-94s320 40 362 94c3-4 5-8 7-12l0 0c4-6 6-13 6-19 0-37 0-75 0-125 0-69-168-125-375-125z m0 250c-207 0-375 56-375 125 0 19 0 40 0 62 0 20 0 41 0 63 0 69 168 125 375 125 207 0 375-56 375-125 0-20 0-41 0-63 0-19 0-39 0-62 0-69-168-125-375-125z m0 312c-138 0-250-28-250-62s112-63 250-63 250 28 250 63-112 62-250 62z" horiz-adv-x="750" />
+<glyph glyph-name="gear" unicode="&#x26ed;" d="m437 508c-87 0-158-71-158-158 0-87 71-158 158-158 88 0 158 71 158 158 0 87-70 158-158 158z m318-249l-29-68 51-100 7-14-71-70-116 55-68-29-35-106-5-15h-99l-43 121-69 28-100-50-13-7-71 70 55 116-28 69-107 35-14 4v100l121 43 28 68-51 100-7 14 71 70 116-55 68 29 35 106 5 15h99l43-121 69-28 100 50 13 7 71-70-55-116 28-69 107-34 14-5v-99l-120-44z" horiz-adv-x="875" />
+<glyph glyph-name="plus" unicode="&#x2795;" d="m786 439v-107q0-22-16-38t-38-15h-232v-233q0-22-16-37t-38-16h-107q-22 0-38 16t-15 37v233h-232q-23 0-38 15t-16 38v107q0 23 16 38t38 16h232v232q0 22 15 38t38 16h107q23 0 38-16t16-38v-232h232q22 0 38-16t16-38z" horiz-adv-x="785.7" />
+<glyph glyph-name="minus" unicode="&#x2796;" d="m786 439v-107q0-22-16-38t-38-15h-678q-23 0-38 15t-16 38v107q0 23 16 38t38 16h678q22 0 38-16t16-38z" horiz-adv-x="785.7" />
+<glyph glyph-name="resize-vertical" unicode="&#x2b65;" d="m393 671q0-14-11-25t-25-10h-71v-572h71q15 0 25-10t11-25-11-26l-143-142q-10-11-25-11t-25 11l-143 142q-10 11-10 26t10 25 25 10h72v572h-72q-14 0-25 10t-10 25 10 26l143 142q11 11 25 11t25-11l143-142q11-11 11-26z" horiz-adv-x="428.6" />
+<glyph glyph-name="move-up" unicode="&#x2b71;" d="m0 163h188v-313h250v313h187l-312 375-313-375z m0 687v-187h625v187h-625z" horiz-adv-x="625" />
+<glyph glyph-name="move-down" unicode="&#x2b73;" d="m625 538h-187v312h-250v-312h-188l313-375 312 375z m-625-688h625v188h-625v-188z" horiz-adv-x="625" />
 <glyph glyph-name="file-submodule" unicode="&#xe801;" d="m813 350c-32 0-188 0-188 0 0 31-31 63-62 63s-94 0-125 0-63-32-63-63 0-312 0-312h500s0 218 0 250-31 62-62 62z m-250-62h-125s0 16 0 31 14 31 31 31 47 0 62 0 32-15 32-31 0-31 0-31z m250 312c-32 0-329 0-344 0s-31 17-31 31 0 0 0 32-32 62-63 62-281 0-312 0-63-31-63-62 0-625 0-625h313s0 343 0 375 31 62 62 62 219 0 250 0 63-31 63-62h187s0 93 0 125-31 62-62 62z m-438 0h-312s0 16 0 31 15 32 31 32 234 0 250 0 31-17 31-32 0-31 0-31z" horiz-adv-x="875" />
 <glyph glyph-name="git-merge" unicode="&#xe802;" d="m625 413c-46 0-86-26-108-64-6 1-11 1-17 1-128 0-249 98-294 218 27 23 44 57 44 95 0 69-56 125-125 125s-125-56-125-125c0-47 25-86 63-108v-410c-38-21-63-61-63-107 0-70 56-126 125-126s125 56 125 126c0 46-25 86-62 107v225c82-87 195-145 312-145 6 0 11 0 17 1 22-38 62-63 108-63 69 0 125 56 125 125 0 69-56 125-125 125z m-500-438c-34 0-62 28-62 63 0 34 28 62 62 62 35 0 63-28 63-62 0-35-28-63-63-63z m0 625c-34 0-62 28-62 63s28 62 62 62c35 0 63-28 63-62s-28-63-63-63z m500-375c-34 0-62 28-62 63 0 34 28 62 62 62 35 0 63-28 63-62 0-35-28-63-63-63z" horiz-adv-x="750" />
-<glyph glyph-name="move-down" unicode="&#xe803;" d="m625 538h-187v312h-250v-312h-188l313-375 312 375z m-625-688h625v188h-625v-188z" horiz-adv-x="625" />
-<glyph glyph-name="move-up" unicode="&#xe804;" d="m0 163h188v-313h250v313h187l-312 375-313-375z m0 687v-187h625v187h-625z" horiz-adv-x="625" />
-<glyph glyph-name="diff-modified" unicode="&#xe805;" d="m813 788h-750c-32 0-63-32-63-63v-750c0-31 31-63 63-63h750c31 0 62 32 62 63v750c0 31-31 63-62 63z m-63-719c0-16-17-31-31-31h-563c-17 0-31 11-31 31v562c0 16 16 32 31 32h563c14 0 31-16 31-32v-562z m-312 406c-70 0-125-56-125-125s55-125 125-125 125 56 125 125-56 125-125 125z" horiz-adv-x="875" />
-<glyph glyph-name="diff-added" unicode="&#xe806;" d="m500 538h-125v-125h-125v-125h125v-125h125v125h125v125h-125v125z m313 250c-32 0-719 0-750 0s-63-32-63-63 0-719 0-750 31-63 63-63 718 0 750 0 62 32 62 63 0 719 0 750-31 63-62 63z m-63-719c0-16-17-31-31-31s-545 0-563 0-31 11-31 31c0 15 0 547 0 562s16 32 31 32 548 0 563 0 31-16 31-32 0-547 0-562z" horiz-adv-x="875" />
-<glyph glyph-name="diff-removed" unicode="&#xe807;" d="m813 788h-750c-32 0-63-32-63-63v-750c0-31 31-63 63-63h750c31 0 62 32 62 63v750c0 31-31 63-62 63z m-63-719c0-16-17-31-31-31h-563c-17 0-31 11-31 31v562c0 16 16 32 31 32h563c14 0 31-16 31-32v-562z m-500 219h375v125h-375v-125z" horiz-adv-x="875" />
-<glyph glyph-name="tools" unicode="&#xe808;" d="m280 396c16-16 80-83 80-83l35 36-55 57 105 112c0 0-47 47-26 28 20 74 1 157-55 215-56 58-135 77-206 57l120-125-31-122-119-33-120 125c-20-74-1-156 55-214 58-60 143-78 217-53z m402-121l-145-144 240-249c20-20 45-31 71-31 26 0 52 11 71 31 40 40 40 106 0 147l-237 246z m318 417l-153 158-451-466 55-57-270-279-62-33-87-142 23-23 137 90 32 64 270 279 55-57 451 466z" horiz-adv-x="1000" />
-<glyph glyph-name="cancel-circled" unicode="&#xe809;" d="m641 224q0 14-10 25l-101 101 101 101q10 11 10 25 0 15-10 26l-51 50q-10 11-25 11-15 0-25-11l-101-101-101 101q-11 11-26 11-15 0-25-11l-50-50q-11-11-11-26 0-14 11-25l101-101-101-101q-11-11-11-25 0-15 11-26l50-50q10-11 25-11 15 0 26 11l101 101 101-101q10-11 25-11 15 0 25 11l51 50q10 11 10 26z m216 126q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
-<glyph glyph-name="ok-circled" unicode="&#xe80a;" d="m717 440q0 16-11 26l-50 50q-11 11-25 11t-26-11l-227-227-126 126q-11 11-25 11t-26-11l-50-50q-10-10-10-26 0-15 10-25l202-202q10-10 25-10 15 0 25 10l303 303q11 10 11 25z m140-90q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
-<glyph glyph-name="comment" unicode="&#xe80b;" d="m750 725h-625c-60 0-125-62-125-125v-375c0-125 125-125 125-125h63v-250l250 250c0 0 252 0 312 0s125 66 125 125v375c0 61-62 125-125 125z" horiz-adv-x="875" />
-<glyph glyph-name="comment-discussion" unicode="&#xe80c;" d="m250 350c0 63 0 188 0 188s-156 0-187 0-63-32-63-63 0-281 0-312 31-63 63-63 62 0 62 0v-188l190 188s158 0 187 0 61 31 61 63 0 62 0 62-125 0-188 0-125 63-125 125z m563 375c-32 0-407 0-438 0s-62-31-62-62 0-282 0-313 31-62 62-62 186 0 186 0l189-188v188s31 0 63 0 62 31 62 62 0 281 0 313-31 62-62 62z" horiz-adv-x="875" />
-<glyph glyph-name="triangle-down" unicode="&#xe80d;" d="m0 475l375-375 375 375h-750z" horiz-adv-x="749.5" />
-<glyph glyph-name="triangle-left" unicode="&#xe80e;" d="m0 350l375-375v750l-375-375z" horiz-adv-x="374.8" />
-<glyph glyph-name="triangle-right" unicode="&#xe80f;" d="m0 725l375-375-375-375v750z" horiz-adv-x="374.9" />
-<glyph glyph-name="triangle-up" unicode="&#xe810;" d="m375 600l-375-375h750l-375 375z" horiz-adv-x="749.5" />
 <glyph glyph-name="ruler" unicode="&#xe811;" d="m125 267h42v41h-42v-41z m42 416h-42v-41h42v41z m0-750h-42v-41h-83v-42h208v42h-83v41z m-42 584h42v41h-42v-41z m0-125h42v41h-42v-41z m250 458v-1000h542v1000h-542z m333-917h-250v834h250v-834z m125 0h-83v84h83v-84z m0 125h-83v84h83v-84z m0 125h-83v84h83v-84z m0 125h-83v84h83v-84z m0 125h-83v84h83v-84z m0 125h-83v84h83v-84z m0 125h-83v84h83v-84z m-791 125h83v-41h42v41h83v42h-208v-42z m83-791h42v41h-42v-41z m0 125h42v41h-42v-41z" horiz-adv-x="1000" />
-<glyph glyph-name="globe" unicode="&#xe812;" d="m500 725c-207 0-375-168-375-375s168-375 375-375c25 0 50 2 74 7-10 5-11 40-1 59 11 22 44 78 11 97s-24 27-44 48-12 25-13 31c-5 19 19 47 20 50s1 14 1 17-15 13-19 13-5-6-10-6-28 13-32 17-7 12-14 19-7 1-18 5-43 17-68 27-28 24-28 35-15 25-22 35c-7 11-9 25-11 22s13-42 10-43-8 11-15 20 8 5-16 51 8 70 9 94 20-9 10 6 1 48-6 60-49-14-49-14c1 12 36 31 62 49s41 4 62-2 22-5 15 2 3 10 19 7 20-22 45-20 2-5 6-11-4-6-20-17 0-10 29-31 20 14 17 29 21 3 21 3c17-11 14 0 27-4s47-34 47-34c-43-24-16-26-8-32s-16-16-16-16c-9 9-10 0-16-3s0-12 0-12c-31-5-24-37-23-45s-20-19-25-30 13-35 4-36-19 36-71 22c-15-4-49-22-31-58s49 10 59 5-3-28-1-29 29-1 31-32 40-29 49-29 36 23 40 24 20 14 56-6 53-17 65-25 3-26 15-31 56 2 68-17-47-112-65-123-27-33-45-48-44-34-68-48c-22-13-26-36-35-43 168 37 293 187 293 366 0 207-168 375-375 375z m88-352c-5-1-16-11-42 5s-44 12-46 15c0 0-2 6 9 7 24 2 53-22 60-22s9 6 21 3c12-4 3-6-2-8z m-123 315c-2 2 2 4 5 7 2 3 1 6 3 8 5 6 32 13 27-2-5-15-31-16-35-13z m66-48c-9 0-31 3-27 7 16 15-6 19-19 21s-19 8-12 9 33-1 37-4 29-14 30-20 0-13-9-13z m79 3c-7-6-44 21-51 27-31 26-47 17-54 22-6 4-4 10 6 19s38-3 54-5 35-14 35-29c0-15 18-28 10-34z" horiz-adv-x="1000" />
 <glyph glyph-name="download-cloud" unicode="&#xe813;" d="m714 332q0 8-5 13t-13 5h-125v196q0 8-5 13t-12 5h-108q-7 0-12-5t-5-13v-196h-125q-8 0-13-5t-5-13q0-8 5-13l196-196q5-5 13-5t13 5l196 196q5 6 5 13z m357-125q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
 <glyph glyph-name="upload-cloud" unicode="&#xe814;" d="m714 368q0 8-5 13l-196 196q-5 5-13 5t-13-5l-196-196q-5-6-5-13 0-8 5-13t13-5h125v-196q0-8 5-13t12-5h108q7 0 12 5t5 13v196h125q8 0 13 5t5 13z m357-161q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 72 39 134t105 92q-1 17-1 24 0 118 84 202t202 84q87 0 159-49t105-129q40 35 93 35 59 0 101-42t42-101q0-43-23-77 72-17 119-76t46-133z" horiz-adv-x="1071.4" />
 <glyph glyph-name="graph" unicode="&#xe815;" d="m688 600h-188v-625h188v625z m250-187h-188v-438h188v438z m-875-501v126h62v62h-62v125h62v63h-62v125h62v62h-62v125h62v63h-62v125h62v62h-125v-1000h1000v62h-937z m375 376h-188v-313h188v313z" horiz-adv-x="1000" />
 <glyph glyph-name="file-zip" unicode="&#xe816;" d="m313 288v62h-63v-62h63z m0 125v62h-63v-62h63z m0 125v62h-63v-62h63z m-125-63h62v63h-62v-63z m375 313h-563v-876h750v688l-187 188z m125-813h-625v750h187v-62h63v62h187l188-187v-563z m-500 625h62v63h-62v-63z m0-250h62v63h-62v-63z m0-125l-63-62v-125h250v125l-62 62h-63v63h-62v-63z m125-62v-63h-125v63h125z" horiz-adv-x="750" />
-<glyph glyph-name="resize-vertical" unicode="&#xe817;" d="m393 671q0-14-11-25t-25-10h-71v-572h71q15 0 25-10t11-25-11-26l-143-142q-10-11-25-11t-25 11l-143 142q-10 11-10 26t10 25 25 10h72v572h-72q-14 0-25 10t-10 25 10 26l143 142q11 11 25 11t25-11l143-142q11-11 11-26z" horiz-adv-x="428.6" />
 <glyph glyph-name="file-code" unicode="&#xe81a;" d="m281 475l-156-156 156-156 63 62-94 94 94 94-63 62z m125-62l94-94-94-94 63-62 156 156-156 156-63-62z m157 375h-563v-876h750v688l-187 188z m125-813h-625v750h437l188-187v-563z" horiz-adv-x="750" />
-<glyph glyph-name="clippy" unicode="&#xe81b;" d="m688-25h-625v563h625v-188h62v313c0 34-28 62-62 62h-188c0 69-56 125-125 125s-125-56-125-125h-187c-35 0-63-28-63-62v-688c0-34 28-63 63-63h625c34 0 62 29 62 63v125h-62v-125z m-500 688c28 0 28 0 62 0s63 28 63 62 28 63 62 63 63-29 63-63 31-62 62-62 32 0 63 0 62-29 62-63h-500c0 38 27 63 63 63z m-63-500h125v62h-125v-62z m438 125v125l-250-188 250-187v125h312v125h-312z m-438-250h188v62h-188v-62z m313 437h-313v-62h313v62z m-188-125h-125v-62h125v62z" horiz-adv-x="875" />
 <glyph glyph-name="doc-text-inv" unicode="&#xe81c;" d="m819 584q8-7 16-20h-264v264q13-8 21-16z m-265-91h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304q0-22 16-38t38-15z m89-411v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 7-5 12t-13 5h-393q-8 0-13-5t-5-12v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v35q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-35q0-8 5-13t13-5h393q8 0 13 5t5 13z" horiz-adv-x="857.1" />
 <glyph glyph-name="diff" unicode="&#xe81d;" d="m438 600h-125v-125h-125v-125h125v-125h125v125h125v125h-125v125z m-250-625h375v125h-375v-125z m437 875h-500v-62h469l219-219v-594h62v625l-250 250z m-625-125v-875h750v688l-187 187h-563z m688-813h-625v751h468l157-157v-594z" horiz-adv-x="875" />
 <glyph glyph-name="diff-ignored" unicode="&#xe81e;" d="m813 788h-750c-32 0-63-32-63-63v-750c0-31 31-63 63-63h750c31 0 62 32 62 63v750c0 31-31 63-62 63z m-63-719c0-16-17-31-31-31h-563c-17 0-31 11-31 31v562c0 16 16 32 31 32h563c14 0 31-16 31-32v-562z m-500 189v-95h96l279 279v96h-96l-279-280z" horiz-adv-x="875" />
 <glyph glyph-name="diff-renamed" unicode="&#xe81f;" d="m813 788h-750c-32 0-63-32-63-63v-750c0-31 31-63 63-63h750c31 0 62 32 62 63v750c0 31-31 63-62 63z m-63-719c0-16-17-31-31-31h-563c-17 0-31 11-31 31v562c0 16 16 32 31 32h563c14 0 31-16 31-32v-562z m-312 344h-188v-125h188v-125l250 187-250 188v-125z" horiz-adv-x="875" />
 <glyph glyph-name="paste" unicode="&#xe820;" d="m429-79h500v358h-233q-22 0-38 15t-15 38v232h-214v-643z m142 804v36q0 7-5 12t-12 6h-393q-7 0-13-6t-5-12v-36q0-7 5-13t13-5h393q7 0 12 5t5 13z m143-375h167l-167 167v-167z m286-71v-375q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v89h-303q-23 0-38 16t-16 37v750q0 23 16 38t38 16h607q22 0 38-16t15-38v-183q12-7 20-15l228-228q16-16 27-42t11-50z" horiz-adv-x="1000" />
-<glyph glyph-name="code" unicode="&#xe821;" d="m594 663l-94-94 219-219-219-219 94-93 281 312-281 313z m-313 0l-281-313 281-312 94 93-219 219 219 219-94 94z" horiz-adv-x="875" />
-<glyph glyph-name="keyhole-circled" unicode="&#xe822;" d="m500 734c-212 0-384-172-384-384 0-212 172-384 384-384 212 0 384 172 384 384 0 212-172 384-384 384z m131-646h-262l57 285c-34 24-57 63-57 108 0 72 59 131 131 131 72 0 131-59 131-131 0-45-23-84-57-108l57-285z" horiz-adv-x="1000" />
 <glyph glyph-name="file-directory" unicode="&#xe823;" d="m813 663c-32 0-329 0-344 0s-31 15-31 31 0 0 0 31-32 63-63 63-281 0-312 0-63-32-63-63 0-687 0-687h875s0 531 0 562-31 63-62 63z m-438 0h-312s0 14 0 31 15 31 31 31 235 0 250 0 31-15 31-31 0-31 0-31z" horiz-adv-x="875" />
 <glyph glyph-name="git-compare" unicode="&#xe824;" d="m813 145s0 299 0 393-94 187-188 187c-62 0-62 0-62 0v125l-188-187 188-188v125s31 0 62 0 63-31 63-62 0-393 0-393c-38-22-63-62-63-107 0-70 56-126 125-126s125 56 125 126c0 45-25 85-62 107z m-63-170c-34 0-62 28-62 63s28 62 62 62 63-28 63-62-29-63-63-63z m-437 125s-32 0-63 0-62 31-62 63 0 392 0 392c37 22 62 62 62 108 0 69-56 125-125 125s-125-56-125-125c0-46 25-86 63-108 0 0 0-299 0-392s93-188 187-188c63 0 63 0 63 0v-125l187 188-187 187v-125z m-188 500c-34 0-62 28-62 63s28 62 62 62 63-28 63-62-29-63-63-63z" horiz-adv-x="875" />
 <glyph glyph-name="git-pull-request" unicode="&#xe825;" d="m688 145s0 299 0 393-94 187-188 187c-62 0-62 0-62 0v125l-188-187 188-188v125s31 0 62 0 63-31 63-62 0-393 0-393c-38-22-63-62-63-107 0-70 56-126 125-126s125 56 125 126c0 45-25 85-62 107z m-63-170c-34 0-62 28-62 63s28 62 62 62 63-28 63-62-29-63-63-63z m-500 813c-69 0-125-56-125-125 0-46 25-86 63-108v-409c-38-22-63-62-63-107 0-70 56-126 125-126s125 56 125 126c0 45-25 85-62 107v409c37 22 62 62 62 108 0 69-56 125-125 125z m0-813c-34 0-62 28-62 63s28 62 62 62 63-28 63-62-29-63-63-63z m0 625c-34 0-62 28-62 63s28 62 62 62 63-28 63-62-29-63-63-63z" horiz-adv-x="750" />
-<glyph glyph-name="key" unicode="&#xe826;" d="m626 788c-138 0-250-112-250-250 0-19 2-38 6-56l-382-382v-62l63-63h125l62 63v62h63v63h62v62h125l69 69c18-4 37-6 57-6 138 0 250 112 250 250s-112 250-250 250z m-251-438l-312-312v62l312 313v-63z m313 188c-35 0-63 28-63 62 0 35 28 63 63 63s62-28 62-63c0-34-28-62-62-62z" horiz-adv-x="875.9" />
 <glyph glyph-name="repo-forked" unicode="&#xe827;" d="m750 725c0 69-56 125-125 125s-125-56-125-125c0-46 25-87 63-108v-104l-188-207-187 207v104c37 21 62 61 62 108 0 69-56 125-125 125s-125-56-125-125c0-46 25-87 63-108v-153l250-275v-107c-38-21-63-61-63-108 0-69 56-125 125-125s125 56 125 125c0 46-25 87-62 108v107l250 275v153c37 21 62 61 62 108z m-625 62c33 0 61-28 61-61s-28-61-61-61-60 28-60 61 27 61 60 61z m250-871c-33 0-60 28-60 61s27 61 60 61 61-28 61-61-28-61-61-61z m250 871c33 0 61-28 61-61s-28-61-61-61-60 28-60 61 27 61 60 61z" horiz-adv-x="750" />
 <glyph glyph-name="fork" unicode="&#xe828;" d="m161 29q0 22-16 38t-38 15-38-15-15-38 15-38 38-16 38 16 16 38z m0 642q0 23-16 38t-38 16-38-16-15-38 15-38 38-15 38 15 16 38z m357-71q0 22-16 38t-38 16-38-16-15-38 15-38 38-16 38 16 16 38z m53 0q0-29-14-54t-39-39q-1-160-126-231-38-21-114-45-71-22-94-39t-23-56v-15q24-14 39-39t14-53q0-45-31-76t-76-32-76 32-31 76q0 29 15 53t39 39v458q-25 14-39 39t-15 53q0 45 31 76t76 32 76-32 31-76q0-29-14-53t-39-39v-278q30 15 86 32 30 10 49 17t39 17 33 22 22 29 16 38 5 51q-25 14-39 39t-15 54q0 45 31 76t76 31 76-31 31-76z" horiz-adv-x="571.4" />
-<glyph glyph-name="trashcan" unicode="&#xe829;" d="m688 725h-250c0 0 0 24 0 31 0 18-14 32-32 32s-31-14-31-32c0-17 0-31 0-31h-250c-34 0-62-28-62-62v-63c0-34 28-62 62-62v-563c0-35 28-63 63-63h437c35 0 63 28 63 63v563c34 0 62 28 62 62v63c0 34-28 62-62 62z m-63-719c0-17-14-31-31-31h-375c-17 0-31 14-31 31v532h62v-469c0-17 14-31 31-31s32 14 32 31l0 469h62v-469c0-17 14-31 31-31s32 14 32 31l0 469h62l0-469c0-17 14-31 31-31s32 14 32 31v469h62v-532z m63 610c0-9-7-16-16-16h-531c-9 0-16 7-16 16v31c0 9 7 16 16 16h531c9 0 16-7 16-16v-31z" horiz-adv-x="750" />
-<glyph glyph-name="cancel" unicode="&#xe82a;" d="m724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
-<glyph glyph-name="search" unicode="&#xe82b;" d="m938 38l-244 243c35 57 56 123 56 194 0 207-168 375-375 375-207 0-375-168-375-375 0-207 168-375 375-375 71 0 138 21 194 56l244-244c17-17 45-17 62 0l63 63c17 17 17 45 0 63z m-563 187c-138 0-250 112-250 250s112 250 250 250 250-112 250-250-112-250-250-250z" horiz-adv-x="950.3" />
-<glyph glyph-name="heart" unicode="&#xe82c;" d="m500-79q-14 0-25 10l-348 336q-5 5-15 15t-31 36-38 55-30 67-13 77q0 123 71 192t196 70q34 0 70-12t67-33 54-38 42-38q20 20 42 38t54 38 67 33 70 12q125 0 196-70t71-192q0-123-128-251l-347-335q-10-10-25-10z" horiz-adv-x="1000" />
-<glyph glyph-name="heart-empty" unicode="&#xe82d;" d="m929 517q0 46-12 80t-31 55-46 33-52 18-55 4-62-14-62-36-48-40-34-34q-10-13-27-13t-27 13q-14 15-34 34t-48 40-62 36-62 14-55-4-52-18-46-33-31-55-12-80q0-93 105-198l324-312 324 312q105 105 105 198z m71 0q0-123-128-251l-347-335q-10-10-25-10t-25 10l-348 336q-5 5-15 15t-31 36-38 55-30 67-13 77q0 123 71 192t196 70q34 0 70-12t67-33 54-38 42-38q20 20 42 38t54 38 67 33 70 12q125 0 196-70t71-192z" horiz-adv-x="1000" />
-<glyph glyph-name="user" unicode="&#xe82e;" d="m786 66q0-67-41-106t-108-39h-488q-67 0-108 39t-41 106q0 30 2 58t8 61 15 60 24 55 34 45 48 30 62 11q5 0 24-12t41-27 60-27 75-12 74 12 61 27 41 27 24 12q34 0 62-11t48-30 34-45 24-55 15-60 8-61 2-58z m-179 498q0-88-63-151t-151-63-152 63-62 151 62 152 152 63 151-63 63-152z" horiz-adv-x="785.7" />
-<glyph glyph-name="users" unicode="&#xe82f;" d="m331 350q-90-3-148-71h-75q-45 0-77 22t-31 66q0 197 69 197 4 0 25-11t54-24 66-12q38 0 75 13-3-21-3-37 0-78 45-143z m598-356q0-66-41-105t-108-39h-488q-68 0-108 39t-41 105q0 30 2 58t8 61 14 61 24 54 35 45 48 30 62 11q6 0 24-12t41-26 59-27 76-12 75 12 60 27 41 26 23 12q35 0 63-11t47-30 35-45 24-54 15-61 8-61 2-58z m-572 713q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m393-214q0-89-63-152t-151-62-152 62-63 152 63 151 152 63 151-63 63-151z m321-126q0-43-31-66t-77-22h-75q-57 68-147 71 45 65 45 143 0 16-3 37 37-13 74-13 33 0 67 12t54 24 24 11q69 0 69-197z m-71 340q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z" horiz-adv-x="1071.4" />
-<glyph glyph-name="ok" unicode="&#xe830;" d="m932 534q0-22-15-38l-404-404-76-76q-16-15-38-15t-38 15l-76 76-202 202q-15 16-15 38t15 38l76 76q16 16 38 16t38-16l164-165 366 367q16 16 38 16t38-16l76-76q15-16 15-38z" horiz-adv-x="1000" />
-<glyph glyph-name="gear" unicode="&#xe831;" d="m437 508c-87 0-158-71-158-158 0-87 71-158 158-158 88 0 158 71 158 158 0 87-70 158-158 158z m318-249l-29-68 51-100 7-14-71-70-116 55-68-29-35-106-5-15h-99l-43 121-69 28-100-50-13-7-71 70 55 116-28 69-107 35-14 4v100l121 43 28 68-51 100-7 14 71 70 116-55 68 29 35 106 5 15h99l43-121 69-28 100 50 13 7 71-70-55-116 28-69 107-34 14-5v-99l-120-44z" horiz-adv-x="875" />
-<glyph glyph-name="cog-alt" unicode="&#xe832;" d="m500 350q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m429-286q0 29-22 51t-50 21-50-21-21-51q0-29 21-50t50-21 51 21 21 50z m0 572q0 29-22 50t-50 21-50-21-21-50q0-30 21-51t50-21 51 21 21 51z m-215-235v-103q0-6-4-11t-9-6l-86-14q-6-19-18-42 19-27 50-64 4-6 4-11 0-7-4-11-13-17-46-50t-44-33q-6 0-11 4l-64 50q-21-11-43-17-6-60-13-87-4-13-17-13h-104q-6 0-11 4t-5 10l-13 85q-19 6-42 18l-66-50q-4-4-11-4-6 0-12 4-80 75-80 90 0 5 4 10 5 8 23 30t26 34q-13 24-20 46l-85 13q-5 1-9 5t-4 11v103q0 6 4 11t9 6l86 14q7 19 18 42-19 27-50 64-4 6-4 11 0 7 4 11 12 17 46 50t44 33q6 0 12-4l64-50q19 10 43 18 6 60 13 86 3 13 16 13h104q6 0 11-4t6-10l13-85q19-6 41-17l66 49q5 4 11 4 7 0 12-4 81-75 81-90 0-5-4-10-7-9-24-30t-25-34q13-27 19-46l85-12q5-2 9-6t4-11z m357-298v-78q0-9-83-17-6-15-16-29 28-63 28-77 0-2-2-4-68-40-69-40-5 0-26 27t-29 37q-11-1-17-1t-17 1q-7-11-29-37t-25-27q-1 0-69 40-3 2-3 4 0 14 29 77-10 14-17 29-83 8-83 17v78q0 9 83 18 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 1 17 1t17-1q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-9 83-18z m0 572v-78q0-9-83-18-6-15-16-29 28-63 28-77 0-2-2-4-68-39-69-39-5 0-26 26t-29 38q-11-1-17-1t-17 1q-7-12-29-38t-25-26q-1 0-69 39-3 2-3 4 0 14 29 77-10 14-17 29-83 9-83 18v78q0 9 83 17 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 2 17 2t17-2q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-8 83-17z" horiz-adv-x="1071.4" />
-<glyph glyph-name="doc" unicode="&#xe833;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z" horiz-adv-x="857.1" />
 <glyph glyph-name="docs" unicode="&#xe834;" d="m946 636q23 0 38-16t16-38v-678q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v160h-303q-23 0-38 16t-16 38v375q0 22 11 49t27 42l228 228q15 16 42 27t49 11h232q23 0 38-16t16-38v-183q38 23 71 23h232z m-303-119l-167-167h167v167z m-357 214l-167-167h167v167z m109-361l176 176v233h-214v-233q0-22-15-38t-38-15h-233v-357h286v143q0 22 11 49t27 42z m534-449v643h-215v-232q0-22-15-38t-38-15h-232v-358h500z" horiz-adv-x="1000" />
-<glyph glyph-name="doc-text" unicode="&#xe835;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-572 483q0 7 5 12t13 5h393q8 0 13-5t5-12v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36z m411-125q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z m0-143q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z" horiz-adv-x="857.1" />
 <glyph glyph-name="doc-inv" unicode="&#xe836;" d="m571 564v264q13-8 21-16l227-228q8-7 16-20h-264z m-71-18q0-22 16-38t38-15h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304z" horiz-adv-x="857.1" />
 <glyph glyph-name="file-powerpoint" unicode="&#xe837;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-554 131v-59h183v59h-52v93h76q43 0 66 9 37 12 59 48t23 82q0 45-21 78t-56 49q-27 10-72 10h-206v-59h52v-310h-52z m197 156h-66v150h67q29 0 46-10 31-19 31-64 0-50-34-67-18-9-44-9z" horiz-adv-x="857.1" />
-<glyph glyph-name="arrows-cw" unicode="&#xe838;" d="m843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66 5 13 17 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
-<glyph glyph-name="clock" unicode="&#xe839;" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
-<glyph glyph-name="lock" unicode="&#xe83a;" d="m179 421h285v108q0 59-42 101t-101 41-101-41-41-101v-108z m464-53v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v108q0 102 74 176t176 74 177-74 73-176v-108h18q23 0 38-15t16-38z" horiz-adv-x="642.9" />
-<glyph glyph-name="lock-open-alt" unicode="&#xe83b;" d="m589 421q23 0 38-15t16-38v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v179q0 103 74 177t176 73 177-73 73-177q0-15-10-25t-25-11h-36q-14 0-25 11t-11 25q0 59-42 101t-101 42-101-42-41-101v-179h410z" horiz-adv-x="642.9" />
-<glyph glyph-name="tag" unicode="&#xe83c;" d="m250 600q0 30-21 51t-50 20-51-20-21-51 21-50 51-21 50 21 21 50z m595-321q0-30-20-51l-274-274q-22-21-51-21-30 0-50 21l-399 399q-21 21-36 57t-15 65v232q0 29 21 50t50 22h233q29 0 65-15t57-36l399-399q20-21 20-50z" horiz-adv-x="857.1" />
 <glyph glyph-name="tags" unicode="&#xe83d;" d="m250 600q0 30-21 51t-50 20-51-20-21-51 21-50 51-21 50 21 21 50z m595-321q0-30-20-51l-274-274q-22-21-51-21-30 0-50 21l-399 399q-21 21-36 57t-15 65v232q0 29 21 50t50 22h233q29 0 65-15t57-36l399-399q20-21 20-50z m215 0q0-30-21-51l-274-274q-22-21-51-21-20 0-33 8t-29 25l262 262q21 21 21 51 0 29-21 50l-399 399q-21 21-57 36t-65 15h125q29 0 65-15t57-36l399-399q21-21 21-50z" horiz-adv-x="1071.4" />
-<glyph glyph-name="book" unicode="&#xe83e;" d="m915 583q22-32 10-72l-154-505q-10-36-42-60t-69-25h-515q-43 0-83 30t-55 74q-14 37-1 71 0 2 1 15t3 20q0 5-2 12t-2 11q1 6 5 12t9 13 9 13q13 21 25 51t17 51q2 6 0 17t0 16q2 6 9 15t10 13q12 20 23 51t14 51q1 5-1 17t0 16q2 7 12 17t13 13q10 14 23 47t16 54q0 4-2 14t-1 15q1 4 5 10t10 13 10 11q4 7 9 17t8 20 9 20 11 18 15 13 20 6 26-3l0-1q21 5 28 5h425q41 0 63-32t10-72l-152-506q-20-66-40-85t-72-20h-485q-15 0-21-8-6-9-1-24 14-39 81-39h515q16 0 31 9t19 23l168 550q4 13 3 32 21-8 33-24z m-594-1q-2-7 1-12t11-6h339q8 0 15 6t9 12l12 36q2 7-2 12t-11 6h-339q-7 0-14-6t-9-12z m-46-143q-3-7 1-12t11-6h339q7 0 14 6t10 12l11 36q3 7-1 13t-11 5h-339q-8 0-14-5t-10-13z" horiz-adv-x="928.6" />
 <glyph glyph-name="bookmark-empty" unicode="&#xe83f;" d="m643 707h-572v-693l237 227 49 47 50-47 236-227v693z m7 72q12 0 24-5 19-8 29-23t11-35v-719q0-19-11-35t-29-23q-10-4-24-4-27 0-47 18l-246 236-246-236q-20-19-46-19-13 0-25 5-18 7-29 23t-11 35v719q0 19 11 35t29 23q12 5 25 5h585z" horiz-adv-x="714.3" />
 <glyph glyph-name="bookmark" unicode="&#xe840;" d="m650 779q12 0 24-5 19-8 29-23t11-35v-719q0-19-11-35t-29-23q-10-4-24-4-27 0-47 18l-246 236-246-236q-20-19-46-19-13 0-25 5-18 7-29 23t-11 35v719q0 19 11 35t29 23q12 5 25 5h585z" horiz-adv-x="714.3" />
 <glyph glyph-name="align-left" unicode="&#xe841;" d="m1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-714q-15 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-857q-15 0-25 11t-11 25v72q0 14 11 25t25 10h857q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-643q-15 0-25 10t-11 25v72q0 14 11 25t25 11h643q14 0 25-11t10-25z" horiz-adv-x="1000" />
-<glyph glyph-name="pencil" unicode="&#xe842;" d="m203-7l50 51-131 131-51-51v-60h72v-71h60z m291 518q0 12-12 12-5 0-9-4l-303-302q-4-4-4-10 0-12 13-12 5 0 9 4l303 302q3 4 3 10z m-30 107l232-232-464-465h-232v233z m381-54q0-29-20-50l-93-93-232 233 93 92q20 21 50 21 29 0 51-21l131-131q20-22 20-51z" horiz-adv-x="857.1" />
 <glyph glyph-name="sliders" unicode="&#xe843;" d="m196 64v-71h-196v71h196z m197 72q14 0 25-11t11-25v-143q0-14-11-25t-25-11h-143q-14 0-25 11t-11 25v143q0 15 11 25t25 11h143z m89 214v-71h-482v71h482z m-357 286v-72h-125v72h125z m732-572v-71h-411v71h411z m-536 643q15 0 26-10t10-26v-142q0-15-10-26t-26-10h-142q-15 0-26 10t-10 26v142q0 15 10 26t26 10h142z m358-286q14 0 25-10t10-25v-143q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v143q0 14 11 25t25 10h143z m178-71v-71h-125v71h125z m0 286v-72h-482v72h482z" horiz-adv-x="857.1" />
-<glyph glyph-name="pencil-squared" unicode="&#xe844;" d="m225 232l85-85-29-29h-31v53h-54v32z m231 217q8-7-1-16l-163-163q-9-9-16-1-8 7 1 16l163 163q9 9 16 1z m-152-385l303 304-161 161-303-304v-161h161z m339 340l51 51q16 16 16 38t-16 38l-85 85q-15 15-38 15t-38-15l-51-52z m214 214v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" />
-<glyph glyph-name="edit" unicode="&#xe845;" d="m496 189l64 65-85 85-64-65v-31h53v-54h32z m245 402q-9 9-18 0l-196-196q-9-9 0-18t18 0l196 196q9 9 0 18z m45-331v-106q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q35 0 65-14 9-4 10-13 2-10-5-16l-27-28q-8-8-18-4-13 3-25 3h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v70q0 7 5 12l36 36q8 8 20 4t11-16z m-54 411l161-160-375-375h-161v160z m248-73l-51-52-161 161 51 51q16 16 38 16t38-16l85-84q16-16 16-38t-16-38z" horiz-adv-x="1000" />
-<glyph glyph-name="folder-open" unicode="&#xe846;" d="m1049 319q0-18-18-37l-187-221q-24-28-67-48t-81-20h-607q-19 0-33 7t-15 24q0 17 17 37l188 221q24 28 67 48t80 20h607q19 0 34-7t15-24z m-192 192v-90h-464q-53 0-110-26t-92-67l-188-221-2-3q0 2-1 7t0 7v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q51 0 88-37t37-88z" horiz-adv-x="1071.4" />
-<glyph glyph-name="folder-open-empty" unicode="&#xe847;" d="m994 330q0 20-30 20h-607q-22 0-48-12t-39-29l-164-203q-11-13-11-22 0-20 30-20h607q22 0 48 13t40 29l164 203q10 12 10 21z m-637 91h429v90q0 22-16 38t-38 15h-321q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-476l143 175q25 30 65 49t78 19z m708-91q0-34-25-66l-165-203q-24-30-65-49t-78-19h-607q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q51 0 88-37t37-88v-90h107q30 0 56-13t37-40q8-17 8-38z" horiz-adv-x="1071.4" />
-<glyph glyph-name="down-open" unicode="&#xe848;" d="m939 399l-414-413q-10-11-25-11t-25 11l-414 413q-11 11-11 26t11 25l92 92q11 11 26 11t25-11l296-296 296 296q11 11 25 11t26-11l92-92q11-11 11-25t-11-26z" horiz-adv-x="1000" />
-<glyph glyph-name="left-open" unicode="&#xe849;" d="m653 682l-296-296 296-297q11-10 11-25t-11-25l-92-93q-11-10-25-10t-25 10l-414 415q-11 10-11 25t11 25l414 414q10 10 25 10t25-10l92-93q11-10 11-25t-11-25z" horiz-adv-x="714.3" />
-<glyph glyph-name="right-open" unicode="&#xe84a;" d="m618 361l-414-415q-11-10-25-10t-26 10l-92 93q-11 11-11 25t11 25l296 297-296 296q-11 11-11 25t11 25l92 93q11 10 26 10t25-10l414-414q10-11 10-25t-10-25z" horiz-adv-x="714.3" />
-<glyph glyph-name="up-open" unicode="&#xe84b;" d="m939 107l-92-92q-11-10-26-10t-25 10l-296 297-296-297q-11-10-25-10t-26 10l-92 92q-11 11-11 26t11 25l414 414q11 10 25 10t25-10l414-414q11-11 11-25t-11-26z" horiz-adv-x="1000" />
-<glyph glyph-name="plus-circled" unicode="&#xe84c;" d="m679 314v72q0 14-11 25t-25 10h-143v143q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-143h-143q-14 0-25-10t-10-25v-72q0-14 10-25t25-11h143v-142q0-15 11-25t25-11h71q15 0 25 11t11 25v142h143q14 0 25 11t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
-<glyph glyph-name="minus-circled" unicode="&#xe84d;" d="m679 314v72q0 14-11 25t-25 10h-429q-14 0-25-10t-10-25v-72q0-14 10-25t25-10h429q14 0 25 10t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
-<glyph glyph-name="block" unicode="&#xe84e;" d="m732 352q0 90-48 164l-421-420q76-50 166-50 62 0 118 25t96 65 65 97 24 119z m-557-167l421 421q-75 50-167 50-83 0-153-40t-110-112-41-152q0-91 50-167z m682 167q0-88-34-168t-91-137-137-92-166-34-167 34-137 92-91 137-34 168 34 167 91 137 137 91 167 34 166-34 137-91 91-137 34-167z" horiz-adv-x="857.1" />
-<glyph glyph-name="plus" unicode="&#xe84f;" d="m786 439v-107q0-22-16-38t-38-15h-232v-233q0-22-16-37t-38-16h-107q-22 0-38 16t-15 37v233h-232q-23 0-38 15t-16 38v107q0 23 16 38t38 16h232v232q0 22 15 38t38 16h107q23 0 38-16t16-38v-232h232q22 0 38-16t16-38z" horiz-adv-x="785.7" />
-<glyph glyph-name="minus" unicode="&#xe850;" d="m786 439v-107q0-22-16-38t-38-15h-678q-23 0-38 15t-16 38v107q0 23 16 38t38 16h678q22 0 38-16t16-38z" horiz-adv-x="785.7" />
 <glyph glyph-name="eye-off" unicode="&#xe851;" d="m310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-92l157 281q4-26 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-86t81-102q11-19 11-39z" horiz-adv-x="1000" />
-<glyph glyph-name="eye" unicode="&#xe852;" d="m929 314q-85 132-213 197 34-58 34-125 0-104-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 242 68 187 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" />
-<glyph glyph-name="folder" unicode="&#xe853;" d="m929 511v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" />
-<glyph glyph-name="folder-empty" unicode="&#xe854;" d="m857 118v393q0 22-15 38t-38 15h-393q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-536q0-22 16-38t38-16h679q22 0 38 16t15 38z m72 393v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" />
 <glyph glyph-name="rss" unicode="&#xe855;" d="m214 100q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m286-69q1-15-9-26-11-12-27-12h-75q-14 0-24 9t-11 23q-12 128-103 219t-219 103q-14 1-23 11t-9 24v75q0 16 12 26 9 10 24 10h3q89-7 170-45t145-101q63-63 101-145t45-171z m286-1q1-15-10-26-10-11-26-11h-80q-14 0-25 10t-11 23q-6 120-56 228t-129 188-188 129-227 57q-14 0-24 11t-10 24v80q0 15 11 26 10 10 25 10h1q147-8 280-67t238-164q104-104 164-238t67-280z" horiz-adv-x="785.7" />
 <glyph glyph-name="rss-squared" unicode="&#xe856;" d="m286 136q0 29-21 50t-51 21-50-21-21-50 21-51 50-21 51 21 21 51z m196-53q-8 130-99 221t-221 99q-8 1-14-5t-5-13v-71q0-8 5-13t12-5q86-6 147-68t67-147q1-7 6-12t12-5h72q7 0 13 6t5 13z m214 0q-3 86-31 166t-78 145-115 114-145 78-166 31q-8 1-13-5-5-5-5-13v-71q0-7 5-12t12-6q114-4 211-62t156-155 62-211q0-8 5-13t13-5h71q7 0 13 6 6 5 5 13z m161 535v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" />
-<glyph glyph-name="wrench" unicode="&#xe857;" d="m214 29q0 14-10 25t-25 10-26-10-10-25 10-26 26-10 25 10 10 26z m360 234l-381-381q-21-20-50-20-29 0-51 20l-59 61q-21 20-21 50 0 29 21 51l380 380q22-55 64-97t97-64z m353 243q0-22-12-59-27-75-92-122t-144-46q-104 0-177 73t-73 177 73 176 177 74q32 0 67-10t60-26q9-6 9-15t-9-16l-163-94v-125l108-60q2 2 44 27t75 45 40 20q8 0 13-5t4-14z" horiz-adv-x="928.6" />
-<glyph glyph-name="floppy" unicode="&#xe858;" d="m214-7h429v214h-429v-214z m500 0h72v500q0 8-6 21t-11 20l-157 156q-5 6-19 12t-22 5v-232q0-22-15-38t-38-16h-322q-22 0-37 16t-16 38v232h-72v-714h72v232q0 22 16 38t37 16h465q22 0 38-16t15-38v-232z m-214 518v178q0 8-5 13t-13 5h-107q-7 0-13-5t-5-13v-178q0-8 5-13t13-5h107q7 0 13 5t5 13z m357-18v-518q0-22-15-38t-38-16h-750q-23 0-38 16t-16 38v750q0 22 16 38t38 16h517q23 0 50-12t42-26l156-157q16-15 27-42t11-49z" horiz-adv-x="857.1" />
 <glyph glyph-name="strike" unicode="&#xe859;" d="m982 350q8 0 13-5t5-13v-36q0-7-5-12t-13-5h-964q-8 0-13 5t-5 12v36q0 8 5 13t13 5h964z m-712 36q-16 19-29 44-27 54-27 105 0 101 75 173 74 71 219 71 28 0 94-11 36-7 98-27 6-21 12-66 8-68 8-102 0-10-3-25l-7-2-46 4-8 1q-28 83-58 114-49 51-117 51-64 0-102-33-37-32-37-81 0-41 37-79t156-72q38-11 96-36 33-16 53-29h-414z m282-143h230q4-22 4-51 0-62-23-119-13-30-40-58-20-19-61-45-44-27-85-37-45-12-113-12-64 0-109 13l-78 23q-32 8-40 15-5 5-5 12v8q0 60-1 87 0 17 0 38l1 20v25l57 1q8-19 17-40t12-31 7-15q20-32 45-52 24-20 59-32 33-12 73-12 36 0 78 15 43 14 68 48 26 34 26 72 0 47-45 87-19 16-77 40z" horiz-adv-x="1000" />
-<glyph glyph-name="sort" unicode="&#xe85a;" d="m571 243q0-15-10-25l-250-250q-11-11-25-11t-25 11l-250 250q-11 10-11 25t11 25 25 11h500q14 0 25-11t10-25z m0 214q0-14-10-25t-25-11h-500q-15 0-25 11t-11 25 11 25l250 250q10 11 25 11t25-11l250-250q10-10 10-25z" horiz-adv-x="571.4" />
-<glyph glyph-name="exchange" unicode="&#xe85b;" d="m1000 189v-107q0-7-5-12t-13-6h-768v-107q0-7-5-12t-13-6q-6 0-13 6l-178 178q-5 5-5 13 0 8 5 13l179 178q5 5 12 5 8 0 13-5t5-13v-107h768q7 0 13-5t5-13z m0 304q0-8-5-13l-179-179q-5-5-12-5-8 0-13 6t-5 12v107h-768q-7 0-13 6t-5 12v107q0 8 5 13t13 5h768v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13z" horiz-adv-x="1000" />
-<glyph glyph-name="circle-empty" unicode="&#xe85c;" d="m429 654q-83 0-153-41t-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152-41 152-110 111-152 41z m428-304q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
-<glyph glyph-name="circle" unicode="&#xe85d;" d="m857 350q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
 <glyph glyph-name="box" unicode="&#xe85e;" d="m607 386q0 14-10 25t-26 10h-142q-15 0-26-10t-10-25 10-25 26-11h142q15 0 26 11t10 25z m322 107v-536q0-14-11-25t-25-11h-786q-14 0-25 11t-11 25v536q0 14 11 25t25 11h786q14 0 25-11t11-25z m35 250v-143q0-15-10-25t-25-11h-858q-14 0-25 11t-10 25v143q0 14 10 25t25 11h858q14 0 25-11t10-25z" horiz-adv-x="1000" />
 <glyph glyph-name="right" unicode="&#xe85f;" d="m964 352q0-8-5-14l-215-197q-9-8-19-4-11 5-11 17v125h-696q-8 0-13 5t-5 12v108q0 7 5 12t13 5h696v125q0 12 11 17t19-3l215-196q5-5 5-12z" horiz-adv-x="1000" />
 <glyph glyph-name="left" unicode="&#xe860;" d="m1000 404v-108q0-7-5-12t-13-5h-696v-125q0-12-11-17t-19 3l-215 196q-5 5-5 12 0 8 5 14l215 197q9 8 19 4 11-5 11-17v-125h696q8 0 13-5t5-12z" horiz-adv-x="1000" />
@@ -107,6 +74,39 @@
 <glyph glyph-name="up" unicode="&#xe864;" d="m427 575q-5-11-16-11h-125v-696q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v696h-125q-12 0-16 11t3 19l195 215q5 5 13 5 7 0 13-5l198-215q7-9 3-19z" horiz-adv-x="428.6" />
 <glyph glyph-name="down" unicode="&#xe865;" d="m427 125q4-10-3-19l-195-215q-6-5-13-5-8 0-13 5l-198 215q-8 9-3 19 5 11 16 11h125v696q0 8 5 13t13 5h107q8 0 13-5t5-13v-696h125q11 0 16-11z" horiz-adv-x="428.6" />
 <glyph glyph-name="down-circled" unicode="&#xe866;" d="m625 332q0-7-6-13l-178-178q-6-5-12-5t-13 5l-179 178q-8 9-4 20 5 11 17 11h107v196q0 8 5 13t13 5h107q8 0 13-5t5-13v-196h107q8 0 13-5t5-13z m-196 322q-83 0-153-41t-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152-41 152-110 111-152 41z m428-304q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="globe" unicode="&#x1f30e;" d="m500 725c-207 0-375-168-375-375s168-375 375-375c25 0 50 2 74 7-10 5-11 40-1 59 11 22 44 78 11 97s-24 27-44 48-12 25-13 31c-5 19 19 47 20 50s1 14 1 17-15 13-19 13-5-6-10-6-28 13-32 17-7 12-14 19-7 1-18 5-43 17-68 27-28 24-28 35-15 25-22 35c-7 11-9 25-11 22s13-42 10-43-8 11-15 20 8 5-16 51 8 70 9 94 20-9 10 6 1 48-6 60-49-14-49-14c1 12 36 31 62 49s41 4 62-2 22-5 15 2 3 10 19 7 20-22 45-20 2-5 6-11-4-6-20-17 0-10 29-31 20 14 17 29 21 3 21 3c17-11 14 0 27-4s47-34 47-34c-43-24-16-26-8-32s-16-16-16-16c-9 9-10 0-16-3s0-12 0-12c-31-5-24-37-23-45s-20-19-25-30 13-35 4-36-19 36-71 22c-15-4-49-22-31-58s49 10 59 5-3-28-1-29 29-1 31-32 40-29 49-29 36 23 40 24 20 14 56-6 53-17 65-25 3-26 15-31 56 2 68-17-47-112-65-123-27-33-45-48-44-34-68-48c-22-13-26-36-35-43 168 37 293 187 293 366 0 207-168 375-375 375z m88-352c-5-1-16-11-42 5s-44 12-46 15c0 0-2 6 9 7 24 2 53-22 60-22s9 6 21 3c12-4 3-6-2-8z m-123 315c-2 2 2 4 5 7 2 3 1 6 3 8 5 6 32 13 27-2-5-15-31-16-35-13z m66-48c-9 0-31 3-27 7 16 15-6 19-19 21s-19 8-12 9 33-1 37-4 29-14 30-20 0-13-9-13z m79 3c-7-6-44 21-51 27-31 26-47 17-54 22-6 4-4 10 6 19s38-3 54-5 35-14 35-29c0-15 18-28 10-34z" horiz-adv-x="1000" />
+<glyph glyph-name="eye" unicode="&#x1f441;" d="m929 314q-85 132-213 197 34-58 34-125 0-104-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 242 68 187 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" />
+<glyph glyph-name="user" unicode="&#x1f464;" d="m786 66q0-67-41-106t-108-39h-488q-67 0-108 39t-41 106q0 30 2 58t8 61 15 60 24 55 34 45 48 30 62 11q5 0 24-12t41-27 60-27 75-12 74 12 61 27 41 27 24 12q34 0 62-11t48-30 34-45 24-55 15-60 8-61 2-58z m-179 498q0-88-63-151t-151-63-152 63-62 151 62 152 152 63 151-63 63-152z" horiz-adv-x="785.7" />
+<glyph glyph-name="users" unicode="&#x1f465;" d="m331 350q-90-3-148-71h-75q-45 0-77 22t-31 66q0 197 69 197 4 0 25-11t54-24 66-12q38 0 75 13-3-21-3-37 0-78 45-143z m598-356q0-66-41-105t-108-39h-488q-68 0-108 39t-41 105q0 30 2 58t8 61 14 61 24 54 35 45 48 30 62 11q6 0 24-12t41-26 59-27 76-12 75 12 60 27 41 26 23 12q35 0 63-11t47-30 35-45 24-54 15-61 8-61 2-58z m-572 713q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m393-214q0-89-63-152t-151-62-152 62-63 152 63 151 152 63 151-63 63-151z m321-126q0-43-31-66t-77-22h-75q-57 68-147 71 45 65 45 143 0 16-3 37 37-13 74-13 33 0 67 12t54 24 24 11q69 0 69-197z m-71 340q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z" horiz-adv-x="1071.4" />
+<glyph glyph-name="floppy" unicode="&#x1f4be;" d="m214-7h429v214h-429v-214z m500 0h72v500q0 8-6 21t-11 20l-157 156q-5 6-19 12t-22 5v-232q0-22-15-38t-38-16h-322q-22 0-37 16t-16 38v232h-72v-714h72v232q0 22 16 38t37 16h465q22 0 38-16t15-38v-232z m-214 518v178q0 8-5 13t-13 5h-107q-7 0-13-5t-5-13v-178q0-8 5-13t13-5h107q7 0 13 5t5 13z m357-18v-518q0-22-15-38t-38-16h-750q-23 0-38 16t-16 38v750q0 22 16 38t38 16h517q23 0 50-12t42-26l156-157q16-15 27-42t11-49z" horiz-adv-x="857.1" />
+<glyph glyph-name="folder-empty" unicode="&#x1f4c1;" d="m857 118v393q0 22-15 38t-38 15h-393q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-536q0-22 16-38t38-16h679q22 0 38 16t15 38z m72 393v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" />
+<glyph glyph-name="folder-open-empty" unicode="&#x1f4c2;" d="m994 330q0 20-30 20h-607q-22 0-48-12t-39-29l-164-203q-11-13-11-22 0-20 30-20h607q22 0 48 13t40 29l164 203q10 12 10 21z m-637 91h429v90q0 22-16 38t-38 15h-321q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-476l143 175q25 30 65 49t78 19z m708-91q0-34-25-66l-165-203q-24-30-65-49t-78-19h-607q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q51 0 88-37t37-88v-90h107q30 0 56-13t37-40q8-17 8-38z" horiz-adv-x="1071.4" />
+<glyph glyph-name="clippy" unicode="&#x1f4cb;" d="m688-25h-625v563h625v-188h62v313c0 34-28 62-62 62h-188c0 69-56 125-125 125s-125-56-125-125h-187c-35 0-63-28-63-62v-688c0-34 28-63 63-63h625c34 0 62 29 62 63v125h-62v-125z m-500 688c28 0 28 0 62 0s63 28 63 62 28 63 62 63 63-29 63-63 31-62 62-62 32 0 63 0 62-29 62-63h-500c0 38 27 63 63 63z m-63-500h125v62h-125v-62z m438 125v125l-250-188 250-187v125h312v125h-312z m-438-250h188v62h-188v-62z m313 437h-313v-62h313v62z m-188-125h-125v-62h125v62z" horiz-adv-x="875" />
+<glyph glyph-name="book" unicode="&#x1f4d2;" d="m915 583q22-32 10-72l-154-505q-10-36-42-60t-69-25h-515q-43 0-83 30t-55 74q-14 37-1 71 0 2 1 15t3 20q0 5-2 12t-2 11q1 6 5 12t9 13 9 13q13 21 25 51t17 51q2 6 0 17t0 16q2 6 9 15t10 13q12 20 23 51t14 51q1 5-1 17t0 16q2 7 12 17t13 13q10 14 23 47t16 54q0 4-2 14t-1 15q1 4 5 10t10 13 10 11q4 7 9 17t8 20 9 20 11 18 15 13 20 6 26-3l0-1q21 5 28 5h425q41 0 63-32t10-72l-152-506q-20-66-40-85t-72-20h-485q-15 0-21-8-6-9-1-24 14-39 81-39h515q16 0 31 9t19 23l168 550q4 13 3 32 21-8 33-24z m-594-1q-2-7 1-12t11-6h339q8 0 15 6t9 12l12 36q2 7-2 12t-11 6h-339q-7 0-14-6t-9-12z m-46-143q-3-7 1-12t11-6h339q7 0 14 6t10 12l11 36q3 7-1 13t-11 5h-339q-8 0-14-5t-10-13z" horiz-adv-x="928.6" />
+<glyph glyph-name="search" unicode="&#x1f50d;" d="m938 38l-244 243c35 57 56 123 56 194 0 207-168 375-375 375-207 0-375-168-375-375 0-207 168-375 375-375 71 0 138 21 194 56l244-244c17-17 45-17 62 0l63 63c17 17 17 45 0 63z m-563 187c-138 0-250 112-250 250s112 250 250 250 250-112 250-250-112-250-250-250z" horiz-adv-x="950.3" />
+<glyph glyph-name="keyhole-circled" unicode="&#x1f510;" d="m500 734c-212 0-384-172-384-384 0-212 172-384 384-384 212 0 384 172 384 384 0 212-172 384-384 384z m131-646h-262l57 285c-34 24-57 63-57 108 0 72 59 131 131 131 72 0 131-59 131-131 0-45-23-84-57-108l57-285z" horiz-adv-x="1000" />
+<glyph glyph-name="key" unicode="&#x1f511;" d="m626 788c-138 0-250-112-250-250 0-19 2-38 6-56l-382-382v-62l63-63h125l62 63v62h63v63h62v62h125l69 69c18-4 37-6 57-6 138 0 250 112 250 250s-112 250-250 250z m-251-438l-312-312v62l312 313v-63z m313 188c-35 0-63 28-63 62 0 35 28 63 63 63s62-28 62-63c0-34-28-62-62-62z" horiz-adv-x="875.9" />
+<glyph glyph-name="lock" unicode="&#x1f512;" d="m179 421h285v108q0 59-42 101t-101 41-101-41-41-101v-108z m464-53v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v108q0 102 74 176t176 74 177-74 73-176v-108h18q23 0 38-15t16-38z" horiz-adv-x="642.9" />
+<glyph glyph-name="lock-open-alt" unicode="&#x1f513;" d="m589 421q23 0 38-15t16-38v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v179q0 103 74 177t176 73 177-73 73-177q0-15-10-25t-25-11h-36q-14 0-25 11t-11 25q0 59-42 101t-101 42-101-42-41-101v-179h410z" horiz-adv-x="642.9" />
+<glyph glyph-name="tag" unicode="&#x1f516;" d="m250 600q0 30-21 51t-50 20-51-20-21-51 21-50 51-21 50 21 21 50z m595-321q0-30-20-51l-274-274q-22-21-51-21-30 0-50 21l-399 399q-21 21-36 57t-15 65v232q0 29 21 50t50 22h233q29 0 65-15t57-36l399-399q20-21 20-50z" horiz-adv-x="857.1" />
+<glyph glyph-name="wrench" unicode="&#x1f527;" d="m214 29q0 14-10 25t-25 10-26-10-10-25 10-26 26-10 25 10 10 26z m360 234l-381-381q-21-20-50-20-29 0-51 20l-59 61q-21 20-21 50 0 29 21 51l380 380q22-55 64-97t97-64z m353 243q0-22-12-59-27-75-92-122t-144-46q-104 0-177 73t-73 177 73 176 177 74q32 0 67-10t60-26q9-6 9-15t-9-16l-163-94v-125l108-60q2 2 44 27t75 45 40 20q8 0 13-5t4-14z" horiz-adv-x="928.6" />
+<glyph glyph-name="pencil" unicode="&#x1f589;" d="m203-7l50 51-131 131-51-51v-60h72v-71h60z m291 518q0 12-12 12-5 0-9-4l-303-302q-4-4-4-10 0-12 13-12 5 0 9 4l303 302q3 4 3 10z m-30 107l232-232-464-465h-232v233z m381-54q0-29-20-50l-93-93-232 233 93 92q20 21 50 21 29 0 51-21l131-131q20-22 20-51z" horiz-adv-x="857.1" />
+<glyph glyph-name="pencil-squared" unicode="&#x1f58a;" d="m225 232l85-85-29-29h-31v53h-54v32z m231 217q8-7-1-16l-163-163q-9-9-16-1-8 7 1 16l163 163q9 9 16 1z m-152-385l303 304-161 161-303-304v-161h161z m339 340l51 51q16 16 16 38t-16 38l-85 85q-15 15-38 15t-38-15l-51-52z m214 214v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" />
+<glyph glyph-name="edit" unicode="&#x1f58b;" d="m496 189l64 65-85 85-64-65v-31h53v-54h32z m245 402q-9 9-18 0l-196-196q-9-9 0-18t18 0l196 196q9 9 0 18z m45-331v-106q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q35 0 65-14 9-4 10-13 2-10-5-16l-27-28q-8-8-18-4-13 3-25 3h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v70q0 7 5 12l36 36q8 8 20 4t11-16z m-54 411l161-160-375-375h-161v160z m248-73l-51-52-161 161 51 51q16 16 38 16t38-16l85-84q16-16 16-38t-16-38z" horiz-adv-x="1000" />
+<glyph glyph-name="folder" unicode="&#x1f5c0;" d="m929 511v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" />
+<glyph glyph-name="folder-open" unicode="&#x1f5c1;" d="m1049 319q0-18-18-37l-187-221q-24-28-67-48t-81-20h-607q-19 0-33 7t-15 24q0 17 17 37l188 221q24 28 67 48t80 20h607q19 0 34-7t15-24z m-192 192v-90h-464q-53 0-110-26t-92-67l-188-221-2-3q0 2-1 7t0 7v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q51 0 88-37t37-88z" horiz-adv-x="1071.4" />
+<glyph glyph-name="doc" unicode="&#x1f5c5;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z" horiz-adv-x="857.1" />
+<glyph glyph-name="doc-text" unicode="&#x1f5c8;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-572 483q0 7 5 12t13 5h393q8 0 13-5t5-12v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36z m411-125q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z m0-143q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z" horiz-adv-x="857.1" />
+<glyph glyph-name="trashcan" unicode="&#x1f5d1;" d="m688 725h-250c0 0 0 24 0 31 0 18-14 32-32 32s-31-14-31-32c0-17 0-31 0-31h-250c-34 0-62-28-62-62v-63c0-34 28-62 62-62v-563c0-35 28-63 63-63h437c35 0 63 28 63 63v563c34 0 62 28 62 62v63c0 34-28 62-62 62z m-63-719c0-17-14-31-31-31h-375c-17 0-31 14-31 31v532h62v-469c0-17 14-31 31-31s32 14 32 31l0 469h62v-469c0-17 14-31 31-31s32 14 32 31l0 469h62l0-469c0-17 14-31 31-31s32 14 32 31v469h62v-532z m63 610c0-9-7-16-16-16h-531c-9 0-16 7-16 16v31c0 9 7 16 16 16h531c9 0 16-7 16-16v-31z" horiz-adv-x="750" />
+<glyph glyph-name="arrows-cw" unicode="&#x1f5d8;" d="m843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66 5 13 17 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
+<glyph glyph-name="comment" unicode="&#x1f5e9;" d="m750 725h-625c-60 0-125-62-125-125v-375c0-125 125-125 125-125h63v-250l250 250c0 0 252 0 312 0s125 66 125 125v375c0 61-62 125-125 125z" horiz-adv-x="875" />
+<glyph glyph-name="comment-discussion" unicode="&#x1f5ea;" d="m250 350c0 63 0 188 0 188s-156 0-187 0-63-32-63-63 0-281 0-312 31-63 63-63 62 0 62 0v-188l190 188s158 0 187 0 61 31 61 63 0 62 0 62-125 0-188 0-125 63-125 125z m563 375c-32 0-407 0-438 0s-62-31-62-62 0-282 0-313 31-62 62-62 186 0 186 0l189-188v188s31 0 63 0 62 31 62 62 0 281 0 313-31 62-62 62z" horiz-adv-x="875" />
+<glyph glyph-name="cancel" unicode="&#x1f5f4;" d="m724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
+<glyph glyph-name="cancel-circled" unicode="&#x1f5f5;" d="m641 224q0 14-10 25l-101 101 101 101q10 11 10 25 0 15-10 26l-51 50q-10 11-25 11-15 0-25-11l-101-101-101 101q-11 11-26 11-15 0-25-11l-50-50q-11-11-11-26 0-14 11-25l101-101-101-101q-11-11-11-25 0-15 11-26l50-50q10-11 25-11 15 0 26 11l101 101 101-101q10-11 25-11 15 0 25 11l51 50q10 11 10 26z m216 126q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="ok" unicode="&#x1f5f8;" d="m932 534q0-22-15-38l-404-404-76-76q-16-15-38-15t-38 15l-76 76-202 202q-15 16-15 38t15 38l76 76q16 16 38 16t38-16l164-165 366 367q16 16 38 16t38-16l76-76q15-16 15-38z" horiz-adv-x="1000" />
+<glyph glyph-name="ok-circled" unicode="&#x1f5f9;" d="m717 440q0 16-11 26l-50 50q-11 11-25 11t-26-11l-227-227-126 126q-11 11-25 11t-26-11l-50-50q-10-10-10-26 0-15 10-25l202-202q10-10 25-10 15 0 25 10l303 303q11 10 11 25z m140-90q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="block" unicode="&#x1f6ab;" d="m732 352q0 90-48 164l-421-420q76-50 166-50 62 0 118 25t96 65 65 97 24 119z m-557-167l421 421q-75 50-167 50-83 0-153-40t-110-112-41-152q0-91 50-167z m682 167q0-88-34-168t-91-137-137-92-166-34-167 34-137 92-91 137-34 168 34 167 91 137 137 91 167 34 166-34 137-91 91-137 34-167z" horiz-adv-x="857.1" />
+<glyph glyph-name="tools" unicode="&#x1f6e0;" d="m280 396c16-16 80-83 80-83l35 36-55 57 105 112c0 0-47 47-26 28 20 74 1 157-55 215-56 58-135 77-206 57l120-125-31-122-119-33-120 125c-20-74-1-156 55-214 58-60 143-78 217-53z m402-121l-145-144 240-249c20-20 45-31 71-31 26 0 52 11 71 31 40 40 40 106 0 147l-237 246z m318 417l-153 158-451-466 55-57-270-279-62-33-87-142 23-23 137 90 32 64 270 279 55-57 451 466z" horiz-adv-x="1000" />
 </font>
 </defs>
 </svg>
\ No newline at end of file
Binary file kallithea/public/fontello/font/kallithea.ttf has changed
Binary file kallithea/public/fontello/font/kallithea.woff has changed
--- a/kallithea/public/js/base.js	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/js/base.js	Sun Sep 06 23:36:05 2015 +0200
@@ -137,8 +137,7 @@
  * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
  */
 var pyroutes = (function() {
-    // access global map defined in special file pyroutes
-    var matchlist = PROUTES_MAP;
+    var matchlist = {};
     var sprintf = (function() {
         function get_type(variable) {
             return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
@@ -298,7 +297,7 @@
             }
             var keys = [];
             for (var i=0; i < req_params.length; i++) {
-                keys.push(req_params[i])
+                keys.push(req_params[i]);
             }
             matchlist[route_name] = [
                 unescape(route_tmpl),
@@ -372,7 +371,6 @@
         .fail(function(jqXHR, textStatus, errorThrown) {
                 if (textStatus == "abort")
                     return;
-                console.log('Ajax failure: ' + textStatus);
                 $target.html('<span class="error_red">ERROR: {0}</span>'.format(textStatus));
                 $target.css('opacity','1.0');
             })
@@ -430,7 +428,7 @@
             _show_tooltip(e, _TM['loading ...']);
             var url = pyroutes.url('changeset_info', {"repo_name": repo_name, "revision": rid});
             ajaxGET(url, function(json){
-                    $target.addClass('tooltip')
+                    $target.addClass('tooltip');
                     _show_tooltip(e, json['message']);
                     _activate_tooltip($target);
                 });
@@ -441,18 +439,17 @@
 var _onSuccessFollow = function(target){
     var $target = $(target);
     var $f_cnt = $('#current_followers_count');
-    if($target.hasClass('follow')){
-        $target.attr('class', 'following');
-        $target.attr('title', _TM['Stop following this repository']);
-        if($f_cnt.html()){
+    if ($target.hasClass('follow')) {
+        $target.removeClass('follow').addClass('following');
+        $target.prop('title', _TM['Stop following this repository']);
+        if ($f_cnt.html()) {
             var cnt = Number($f_cnt.html())+1;
             $f_cnt.html(cnt);
         }
-    }
-    else{
-        $target.attr('class', 'follow');
-        $target.attr('title', _TM['Start following this repository']);
-        if($f_cnt.html()){
+    } else {
+        $target.removeClass('following').addClass('follow');
+        $target.prop('title', _TM['Start following this repository']);
+        if ($f_cnt.html()) {
             var cnt = Number($f_cnt.html())-1;
             $f_cnt.html(cnt);
         }
@@ -499,7 +496,7 @@
 var _init_tooltip = function(){
     var $tipBox = $('#tip-box');
     if(!$tipBox.length){
-        $tipBox = $('<div id="tip-box"></div>')
+        $tipBox = $('<div id="tip-box"></div>');
         $(document.body).append($tipBox);
     }
 
@@ -527,7 +524,7 @@
         // save org title
         $el.attr('tt_title', tipText);
         // reset title to not show org tooltips
-        $el.attr('title', '');
+        $el.prop('title', '');
 
         var $tipBox = $('#tip-box');
         if (safe) {
@@ -551,7 +548,7 @@
     var $tipBox = $('#tip-box');
     $tipBox.hide();
     var el = e.currentTarget;
-    $(el).attr('title', $(el).attr('tt_title'));
+    $(el).prop('title', $(el).attr('tt_title'));
 };
 
 /**
@@ -609,258 +606,168 @@
     }
 })();
 
-/* return jQuery expression with a tr with body in 3rd column and class cls and id named after the body */
-var _table_tr = function(cls, body){
-    // like: <div class="comment" id="comment-8" line="o92"><div class="comment-wrapp">...
-    // except new inlines which are different ...
-    var comment_id = ($(body).attr('id') || 'comment-new').split('comment-')[1];
-    var tr_id = 'comment-tr-{0}'.format(comment_id);
-    return $(('<tr id="{0}" class="{1}">'+
-                  '<td class="lineno-inline new-inline"></td>'+
-                  '<td class="lineno-inline old-inline"></td>'+
-                  '<td>{2}</td>'+
-                 '</tr>').format(tr_id, cls, body));
-};
-
-/** return jQuery expression with new inline form based on template **/
-var _createInlineForm = function(parent_tr, f_path, line) {
-    var $tmpl = $('#comment-inline-form-template').html().format(f_path, line);
-    var $form = _table_tr('comment-form-inline', $tmpl)
-
-    // create event for hide button
-    $form.find('.hide-inline-form').click(function(e) {
-        var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
-        if($(newtr).next().hasClass('inline-comments-button')){
-            $(newtr).next().show();
-        }
-        $(newtr).remove();
-        $(parent_tr).removeClass('form-open');
-        $(parent_tr).removeClass('hl-comment');
-    });
-
-    return $form
-};
 
 /**
- * Inject inline comment for an given TR. This tr should always be a .line .
- * The form will be inject after any comments.
+ * Comment handling
  */
-var injectInlineForm = function(tr){
-    var $tr = $(tr);
-    if(!$tr.hasClass('line')){
-        return
-    }
-    var submit_url = AJAX_COMMENT_URL;
-    var $td = $tr.find('.code');
-    if($tr.hasClass('form-open') || $tr.hasClass('context') || $td.hasClass('no-comment')){
-        return
+
+// move comments to their right location, inside new trs
+function move_comments($anchorcomments) {
+    $anchorcomments.each(function(i, anchorcomment) {
+        var $anchorcomment = $(anchorcomment);
+        var target_id = $anchorcomment.data('target-id');
+        var $comment_div = _get_add_comment_div(target_id);
+        var f_path = $anchorcomment.data('f_path');
+        var line_no = $anchorcomment.data('line_no');
+        if ($comment_div[0]) {
+            $comment_div.append($anchorcomment.children());
+            _comment_div_append_add($comment_div, f_path, line_no);
+        } else {
+           $anchorcomment.before("Comment to {0} line {1} which is outside the diff context:".format(f_path || '?', line_no || '?'));
+        }
+    });
+    linkInlineComments($('.firstlink'), $('.comment:first-child'));
+}
+
+// comment bubble was clicked - insert new tr and show form
+function show_comment_form($bubble) {
+    var children = $bubble.closest('tr.line').children('[id]');
+    var line_td_id = children[children.length - 1].id;
+    var $comment_div = _get_add_comment_div(line_td_id);
+    var f_path = $bubble.closest('div.full_f_path').data('f_path');
+    var parts = line_td_id.split('_');
+    var line_no = parts[parts.length-1];
+    comment_div_state($comment_div, f_path, line_no, true);
+}
+
+// return comment div for target_id - add it if it doesn't exist yet
+function _get_add_comment_div(target_id) {
+    var comments_box_id = 'comments-' + target_id;
+    var $comments_box = $('#' + comments_box_id);
+    if (!$comments_box.length) {
+        var html = '<tr><td id="{0}" colspan="3" class="inline-comments"></td></tr>'.format(comments_box_id);
+        $('#' + target_id).closest('tr').after(html);
+        $comments_box = $('#' + comments_box_id);
     }
-    $tr.addClass('form-open hl-comment');
-    var $node = $tr.parent().parent().parent().find('.full_f_path');
-    var f_path = $node.attr('path');
-    var lineno = _getLineNo(tr);
-    var $form = _createInlineForm(tr, f_path, lineno, submit_url);
+    return $comments_box;
+}
 
-    var $parent = $tr;
-    while ($parent.next().hasClass('inline-comments')){
-        var $parent = $parent.next();
+// set $comment_div state - showing or not showing form and Add button
+function comment_div_state($comment_div, f_path, line_no, show_form) {
+    var $forms = $comment_div.children('.comment-inline-form');
+    var $buttons = $comment_div.children('.add-comment');
+    var $comments = $comment_div.children('.comment');
+    if (show_form) {
+        if (!$forms.length) {
+            _comment_div_append_form($comment_div, f_path, line_no);
+        }
+    } else {
+        $forms.remove();
+    }
+    $buttons.remove();
+    if ($comments.length && !show_form) {
+        _comment_div_append_add($comment_div, f_path, line_no);
     }
-    $form.insertAfter($parent);
-    var $overlay = $form.find('.submitting-overlay');
-    var $inlineform = $form.find('.inline-form');
+}
 
-    $form.submit(function(e){
+// append an Add button to $comment_div and hook it up to show form
+function _comment_div_append_add($comment_div, f_path, line_no) {
+    var addlabel = TRANSLATION_MAP['Add Another Comment'];
+    var $add = $('<div class="add-comment"><span class="btn btn-mini">{0}</span></div>'.format(addlabel));
+    $comment_div.append($add);
+    $add.click(function(e) {
+        comment_div_state($comment_div, f_path, line_no, true);
+    });
+}
+
+// append a comment form to $comment_div
+function _comment_div_append_form($comment_div, f_path, line_no) {
+    var $form_div = $($('#comment-inline-form-template').html().format(f_path, line_no))
+        .addClass('comment-inline-form');
+    $comment_div.append($form_div);
+    var $form = $comment_div.find("form");
+
+    $form.submit(function(e) {
         e.preventDefault();
 
-        if(lineno === undefined){
-            alert('Error submitting, line ' + lineno + ' not found.');
-            return;
-        }
-        if(f_path === undefined){
-            alert('Error submitting, file path ' + f_path + ' not found.');
+        var text = $('#text_'+line_no).val();
+        if (!text){
             return;
         }
 
-        var text = $('#text_'+lineno).val();
-        if(text == ""){
-            return;
-        }
+        $form.find('.submitting-overlay').show();
 
-        $overlay.show();
-
-        var success = function(json_data){
-            $tr.removeClass('form-open');
-            $form.remove();
-            _renderInlineComment(json_data);
+        var success = function(json_data) {
+            $comment_div.append(json_data['rendered_text']);
+            comment_div_state($comment_div, f_path, line_no, false);
+            linkInlineComments($('.firstlink'), $('.comment:first-child'));
         };
         var postData = {
-                'text': text,
-                'f_path': f_path,
-                'line': lineno
+            'text': text,
+            'f_path': f_path,
+            'line': line_no
         };
-        ajaxPOST(submit_url, postData, success);
+        ajaxPOST(AJAX_COMMENT_URL, postData, success);
     });
 
-    $('#preview-btn_'+lineno).click(function(e){
-        var text = $('#text_'+lineno).val();
+    $('#preview-btn_'+line_no).click(function(e){
+        var text = $('#text_'+line_no).val();
         if(!text){
             return
         }
-        $('#preview-box_'+lineno).addClass('unloaded');
-        $('#preview-box_'+lineno).html(_TM['Loading ...']);
-        $('#edit-container_'+lineno).hide();
-        $('#edit-btn_'+lineno).show();
-        $('#preview-container_'+lineno).show();
-        $('#preview-btn_'+lineno).hide();
+        $('#preview-box_'+line_no).addClass('unloaded');
+        $('#preview-box_'+line_no).html(_TM['Loading ...']);
+        $('#edit-container_'+line_no).hide();
+        $('#edit-btn_'+line_no).show();
+        $('#preview-container_'+line_no).show();
+        $('#preview-btn_'+line_no).hide();
 
         var url = pyroutes.url('changeset_comment_preview', {'repo_name': REPO_NAME});
         var post_data = {'text': text};
-        ajaxPOST(url, post_data, function(html){
-            $('#preview-box_'+lineno).html(html);
-            $('#preview-box_'+lineno).removeClass('unloaded');
+        ajaxPOST(url, post_data, function(html) {
+            $('#preview-box_'+line_no).html(html);
+            $('#preview-box_'+line_no).removeClass('unloaded');
         })
     })
-    $('#edit-btn_'+lineno).click(function(e){
-        $('#edit-container_'+lineno).show();
-        $('#edit-btn_'+lineno).hide();
-        $('#preview-container_'+lineno).hide();
-        $('#preview-btn_'+lineno).show();
+    $('#edit-btn_'+line_no).click(function(e) {
+        $('#edit-container_'+line_no).show();
+        $('#edit-btn_'+line_no).hide();
+        $('#preview-container_'+line_no).hide();
+        $('#preview-btn_'+line_no).show();
     })
 
-    setTimeout(function(){
+    // create event for hide button
+    $form.find('.hide-inline-form').click(function(e) {
+        comment_div_state($comment_div, f_path, line_no, false);
+    });
+
+    setTimeout(function() {
         // callbacks
         tooltip_activate();
-        MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
-                             _USERS_AC_DATA, _GROUPS_AC_DATA);
-        $('#text_'+lineno).focus();
-    },10)
-};
-
-var deleteComment = function(comment_id){
-    var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
-    var postData = {'_method':'delete'};
-    var success = function(o){
-        var $deleted = $('#comment-tr-'+comment_id);
-        var $prev = $deleted.prev('tr');
-        while ($prev.hasClass('inline-comments')){
-            $prev = $prev.prev('tr');
-        }
-        $deleted.remove();
-        _placeAddButton($prev);
-    }
-    ajaxPOST(url,postData,success);
+        MentionsAutoComplete($('#text_'+line_no), $('#mentions_container_'+line_no),
+                             _USERS_AC_DATA);
+        $('#text_'+line_no).focus();
+    }, 10);
 }
 
-var _getLineNo = function(tr) {
-    var line;
-    var o = $(tr).children()[0].id.split('_');
-    var n = $(tr).children()[1].id.split('_');
 
-    if (n.length >= 2) {
-        line = n[n.length-1];
-    } else if (o.length >= 2) {
-        line = o[o.length-1];
-    }
-
-    return line
-};
-
-var _placeAddButton = function($line_tr){
-    var $tr = $line_tr;
-    while ($tr.next().hasClass('inline-comments')){
-        $tr.find('.add-comment').remove();
-        $tr = $tr.next();
+function deleteComment(comment_id) {
+    var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__', comment_id);
+    var postData = {'_method': 'delete'};
+    var success = function(o) {
+        $('#comment-'+comment_id).remove();
+        // Ignore that this might leave a stray Add button (or have a pending form with another comment) ...
     }
-    $tr.find('.add-comment').remove();
-    var label = TRANSLATION_MAP['Add Another Comment'];
-    var $html_el = $('<div class="add-comment"><span class="btn btn-mini">{0}</span></div>'.format(label));
-    $html_el.click(function(e) {
-        injectInlineForm($line_tr);
-    });
-    $tr.find('.comment').after($html_el);
-};
-
-/**
- * Places the inline comment into the changeset block in proper line position
- */
-var _placeInline = function(target_id, lineno, html){
-    var $td = $("#{0}_{1}".format(target_id, lineno));
-    if (!$td.length){
-        return false;
-    }
-
-    // check if there are comments already !
-    var $line_tr = $td.parent(); // the tr
-    var $after_tr = $line_tr;
-    while ($after_tr.next().hasClass('inline-comments')){
-        $after_tr = $after_tr.next();
-    }
-    // put in the comment at the bottom
-    var $tr = _table_tr('inline-comments', html)
-    $tr.find('div.comment').addClass('inline-comment');
-    $after_tr.after($tr);
-
-    // scan nodes, and attach add button to last one
-    _placeAddButton($line_tr);
-    return true;
+    ajaxPOST(url, postData, success);
 }
 
-/**
- * make a single inline comment and place it inside
- */
-var _renderInlineComment = function(json_data){
-    var html =  json_data['rendered_text'];
-    var lineno = json_data['line_no'];
-    var target_id = json_data['target_id'];
-    return _placeInline(target_id, lineno, html);
-}
-
-/**
- * Iterates over all the inlines, and places them inside proper blocks of data
- */
-var renderInlineComments = function(file_comments){
-    for (var f in file_comments){
-        // holding all comments for a FILE
-        var box = file_comments[f];
-
-        var target_id = $(box).attr('target_id');
-        // actual comments with line numbers
-        var comments = box.children;
-        var obsolete_comments = [];
-        for(var i=0; i<comments.length; i++){
-            var data = {
-                'rendered_text': comments[i].outerHTML,
-                'line_no': $(comments[i]).attr('line'),
-                'target_id': target_id
-            }
-            if (_renderInlineComment(data)) {
-                obsolete_comments.push(comments[i]);
-                $(comments[i]).hide();
-            }else{
-                var txt = document.createTextNode(
-                        "Comment to " + YUD.getAttribute(comments[i].parentNode,'path') +
-                        " line " + data.line_no +
-                        " which is outside the diff context:");
-                comments[i].insertBefore(txt, comments[i].firstChild);
-            }
-        }
-        // now remove all the obsolete comments that have been copied to their
-        // respective locations.
-        for (var i=0; i < obsolete_comments.length; i++) {
-            obsolete_comments[i].parentNode.removeChild(obsolete_comments[i]);
-        }
-
-        $(box).show();
-    }
-}
 
 /**
  * Double link comments
  */
-var linkInlineComments = function(firstlinks, comments){
-    var $comments = $(comments);
+var linkInlineComments = function($firstlinks, $comments){
     if ($comments.length > 0) {
-        $(firstlinks).html('<a href="#{0}">First comment</a>'.format($comments.attr('id')));
+        $firstlinks.html('<a href="#{0}">First comment</a>'.format($comments.prop('id')));
     }
     if ($comments.length <= 1) {
         return;
@@ -869,18 +776,17 @@
     $comments.each(function(i, e){
             var prev = '';
             if (i > 0){
-                var prev_anchor = YUD.getAttribute(comments.item(i-1),'id');
+                var prev_anchor = $($comments.get(i-1)).prop('id');
                 prev = '<a href="#{0}">Previous comment</a>'.format(prev_anchor);
             }
             var next = '';
-            if (i+1 < comments.length){
-                var next_anchor = YUD.getAttribute(comments.item(i+1),'id');
+            if (i+1 < $comments.length){
+                var next_anchor = $($comments.get(i+1)).prop('id');
                 next = '<a href="#{0}">Next comment</a>'.format(next_anchor);
             }
-            var $div = $(('<div class="prev-next-comment">'+
-                          '<div class="prev-comment">{0}</div>'+
-                          '<div class="next-comment">{1}</div>').format(prev, next));
-            $div.prependTo(this);
+            $(this).find('.comment-prev-next-links').html(
+                '<div class="prev-comment">{0}</div>'.format(prev) +
+                '<div class="next-comment">{0}</div>'.format(next));
         });
 }
 
@@ -897,7 +803,7 @@
         else{
             window.location = current_url;
         }
-    })
+    });
 
     var $node_filter = $('#node_filter');
 
@@ -920,7 +826,7 @@
                     }
                 })
             .fail(function() {
-                    console.log('failed to load');
+                    console.log('fileBrowserListeners initFilter failed to load');
                 })
         ;
     }
@@ -935,7 +841,7 @@
             var matches_max = 20;
             if (query != ""){
                 for(var i=0;i<nodes.length;i++){
-                    var pos = nodes[i].name.toLowerCase().indexOf(query)
+                    var pos = nodes[i].name.toLowerCase().indexOf(query);
                     if(query && pos != -1){
                         matches++
                         //show only certain amount to not kill browser
@@ -946,8 +852,8 @@
                         var n = nodes[i].name;
                         var t = nodes[i].type;
                         var n_hl = n.substring(0,pos)
-                          +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
-                          +n.substring(pos+query.length)
+                            + "<b>{0}</b>".format(n.substring(pos,pos+query.length))
+                            + n.substring(pos+query.length);
                         var new_url = url_base.replace('__FPATH__',n);
                         match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
                     }
@@ -1070,7 +976,7 @@
                 $('body').prepend($hl_div);
             }
 
-            $hl_div.append($('<a>').html(_TM['Selection link']).attr('href', location.href.substring(0, location.href.indexOf('#')) + '#L' + ranges[0] + '-'+ranges[1]));
+            $hl_div.append($('<a>').html(_TM['Selection link']).prop('href', location.href.substring(0, location.href.indexOf('#')) + '#L' + ranges[0] + '-'+ranges[1]));
             var xy = $(till).offset();
             $hl_div.css('top', (xy.top + yoffset) + 'px').css('left', xy.left + 'px');
             $hl_div.show();
@@ -1109,336 +1015,244 @@
     ajaxPOST(sUrl, postData, success, failure);
 };
 
-/** MEMBERS AUTOCOMPLETE WIDGET **/
+/**
+ * Autocomplete functionality
+ */
+
+// Custom search function for the DataSource of users
+var autocompleteMatchUsers = function (sQuery, myUsers) {
+    // Case insensitive matching
+    var query = sQuery.toLowerCase();
+    var i = 0;
+    var l = myUsers.length;
+    var matches = [];
 
-var _MembersAutoComplete = function (divid, cont, users_list, groups_list) {
-    var myUsers = users_list;
-    var myGroups = groups_list;
+    // Match against each name of each contact
+    for (; i < l; i++) {
+        var contact = myUsers[i];
+        if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
+             ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
+             ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
+            matches[matches.length] = contact;
+        }
+    }
+    return matches;
+};
+
+// Custom search function for the DataSource of userGroups
+var autocompleteMatchGroups = function (sQuery, myGroups) {
+    // Case insensitive matching
+    var query = sQuery.toLowerCase();
+    var i = 0;
+    var l = myGroups.length;
+    var matches = [];
 
-    // Define a custom search function for the DataSource of users
-    var matchUsers = function (sQuery) {
-            // Case insensitive matching
-            var query = sQuery.toLowerCase();
-            var i = 0;
-            var l = myUsers.length;
-            var matches = [];
+    // Match against each name of each group
+    for (; i < l; i++) {
+        var matched_group = myGroups[i];
+        if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
+            matches[matches.length] = matched_group;
+        }
+    }
+    return matches;
+};
+
+// Helper highlight function for the formatter
+var autocompleteHighlightMatch = function (full, snippet, matchindex) {
+    return full.substring(0, matchindex)
+        + "<span class='match'>"
+        + full.substr(matchindex, snippet.length)
+        + "</span>" + full.substring(matchindex + snippet.length);
+};
 
-            // Match against each name of each contact
-            for (; i < l; i++) {
-                var contact = myUsers[i];
-                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
-                     ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
-                     ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
-                    matches[matches.length] = contact;
-                }
-            }
-            return matches;
-        };
+var gravatar = function(link, size, cssclass) {
+    var elem = '<img alt="" class="{2}" style="width: {0}px; height: {0}px" src="{1}"/>'.format(size, link, cssclass);
+    if (!link) {
+        elem = '<i class="icon-user {1}" style="font-size: {0}px;"></i>'.format(size, cssclass);
+    }
+    return elem;
+}
+
+var autocompleteGravatar = function(res, link, size, group) {
+    var elem = gravatar(link, size, "perm-gravatar-ac");
+    if (group !== undefined) {
+        elem = '<i class="perm-gravatar-ac icon-users"></i>';
+    }
+    return '<div class="ac-container-wrap">{0}{1}</div>'.format(elem, res);
+}
+
+// Custom formatter to highlight the matching letters
+var autocompleteFormatter = function (oResultData, sQuery, sResultMatch) {
+    var query = sQuery.toLowerCase();
+
+    // group
+    if (oResultData.grname != undefined) {
+        var grname = oResultData.grname;
+        var grmembers = oResultData.grmembers;
+        var grnameMatchIndex = grname.toLowerCase().indexOf(query);
+        var grprefix = "{0}: ".format(_TM['Group']);
+        var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
 
-    // Define a custom search function for the DataSource of userGroups
-    var matchGroups = function (sQuery) {
-            // Case insensitive matching
-            var query = sQuery.toLowerCase();
-            var i = 0;
-            var l = myGroups.length;
-            var matches = [];
+        if (grnameMatchIndex > -1) {
+            return autocompleteGravatar(grprefix + autocompleteHighlightMatch(grname, query, grnameMatchIndex) + grsuffix, null, null, true);
+        }
+        return autocompleteGravatar(grprefix + oResultData.grname + grsuffix, null, null, true);
+
+    // users
+    } else if (oResultData.nname != undefined) {
+        var fname = oResultData.fname || "";
+        var lname = oResultData.lname || "";
+        var nname = oResultData.nname;
+
+        // Guard against null value
+        var fnameMatchIndex = fname.toLowerCase().indexOf(query),
+            lnameMatchIndex = lname.toLowerCase().indexOf(query),
+            nnameMatchIndex = nname.toLowerCase().indexOf(query),
+            displayfname, displaylname, displaynname, displayname;
 
-            // Match against each name of each contact
-            for (; i < l; i++) {
-                var matched_group = myGroups[i];
-                if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
-                    matches[matches.length] = matched_group;
-                }
-            }
-            return matches;
-        };
+        if (fnameMatchIndex > -1) {
+            displayfname = autocompleteHighlightMatch(fname, query, fnameMatchIndex);
+        } else {
+            displayfname = fname;
+        }
+
+        if (lnameMatchIndex > -1) {
+            displaylname = autocompleteHighlightMatch(lname, query, lnameMatchIndex);
+        } else {
+            displaylname = lname;
+        }
+
+        if (nnameMatchIndex > -1) {
+            displaynname = autocompleteHighlightMatch(nname, query, nnameMatchIndex);
+        } else {
+            displaynname = nname;
+        }
+
+        displayname = displaynname;
+        if (displayfname && displaylname) {
+            displayname = "{0} {1} ({2})".format(displayfname, displaylname, displayname);
+        }
 
-    //match all
-    var matchAll = function (sQuery) {
-            var u = matchUsers(sQuery);
-            var g = matchGroups(sQuery);
-            return u.concat(g);
-        };
+        return autocompleteGravatar(displayname, oResultData.gravatar_lnk, oResultData.gravatar_size);
+    } else {
+        return '';
+    }
+};
+
+// Generate a basic autocomplete instance that can be tweaked further by the caller
+var autocompleteCreate = function ($inputElement, $container, matchFunc) {
+    var datasource = new YAHOO.util.FunctionDataSource(matchFunc);
+
+    var autocomplete = new YAHOO.widget.AutoComplete($inputElement[0], $container[0], datasource);
+    autocomplete.useShadow = false;
+    autocomplete.resultTypeList = false;
+    autocomplete.animVert = false;
+    autocomplete.animHoriz = false;
+    autocomplete.animSpeed = 0.1;
+    autocomplete.formatResult = autocompleteFormatter;
+
+    return autocomplete;
+}
+
+var SimpleUserAutoComplete = function ($inputElement, $container, users_list) {
 
-    // DataScheme for members
-    var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
-    memberDS.responseSchema = {
-        fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk", "gravatar_size"]
+    var matchUsers = function (sQuery) {
+        return autocompleteMatchUsers(sQuery, users_list);
+    }
+
+    var userAC = autocompleteCreate($inputElement, $container, matchUsers);
+
+    // Handler for selection of an entry
+    var itemSelectHandler = function (sType, aArgs) {
+        var myAC = aArgs[0]; // reference back to the AC instance
+        var elLI = aArgs[1]; // reference to the selected LI element
+        var oData = aArgs[2]; // object literal of selected item's result data
+        myAC.getInputEl().value = oData.nname;
     };
+    userAC.itemSelectEvent.subscribe(itemSelectHandler);
+}
 
-    // DataScheme for owner
-    var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
-    ownerDS.responseSchema = {
-        fields: ["id", "fname", "lname", "nname", "gravatar_lnk", "gravatar_size"]
+var MembersAutoComplete = function ($inputElement, $container, users_list, groups_list) {
+
+    var matchAll = function (sQuery) {
+        var u = autocompleteMatchUsers(sQuery, users_list);
+        var g = autocompleteMatchGroups(sQuery, groups_list);
+        return u.concat(g);
     };
 
-    // Instantiate AutoComplete for perms
-    var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
-    membersAC.useShadow = false;
-    membersAC.resultTypeList = false;
-    membersAC.animVert = false;
-    membersAC.animHoriz = false;
-    membersAC.animSpeed = 0.1;
-
-    // Instantiate AutoComplete for owner
-    var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
-    ownerAC.useShadow = false;
-    ownerAC.resultTypeList = false;
-    ownerAC.animVert = false;
-    ownerAC.animHoriz = false;
-    ownerAC.animSpeed = 0.1;
-
-    // Helper highlight function for the formatter
-    var highlightMatch = function (full, snippet, matchindex) {
-            return full.substring(0, matchindex)
-            + "<span class='match'>"
-            + full.substr(matchindex, snippet.length)
-            + "</span>" + full.substring(matchindex + snippet.length);
-        };
-
-    // Custom formatter to highlight the matching letters
-    var custom_formatter = function (oResultData, sQuery, sResultMatch) {
-            var query = sQuery.toLowerCase();
-            var _gravatar = function(res, em, size, group){
-                var elem = '<img alt="gravatar" class="perm-gravatar-ac" style="width: {0}px; height: {0}px" src="{1}"/>'.format(size, em);
-                if (!em) {
-                    elem = '<i class="icon-user perm-gravatar-ac" style="font-size: {0}px;"></i>'.format(size);
-                }
-                if (group !== undefined){
-                    elem = '<i class="perm-gravatar-ac icon-users"></i>'
-                }
-                var tmpl = '<div class="ac-container-wrap">{0}{1}</div>'
-                return tmpl.format(elem,res)
-            }
-            // group
-            if (oResultData.grname != undefined) {
-                var grname = oResultData.grname;
-                var grmembers = oResultData.grmembers;
-                var grnameMatchIndex = grname.toLowerCase().indexOf(query);
-                var grprefix = "{0}: ".format(_TM['Group']);
-                var grsuffix = " (" + grmembers + "  )";
-                var grsuffix = " ({0}  {1})".format(grmembers, _TM['members']);
-
-                if (grnameMatchIndex > -1) {
-                    return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,null,true);
-                }
-                return _gravatar(grprefix + oResultData.grname + grsuffix, null, null, true);
-            // Users
-            } else if (oResultData.nname != undefined) {
-                var fname = oResultData.fname || "";
-                var lname = oResultData.lname || "";
-                var nname = oResultData.nname;
+    var membersAC = autocompleteCreate($inputElement, $container, matchAll);
 
-                // Guard against null value
-                var fnameMatchIndex = fname.toLowerCase().indexOf(query),
-                    lnameMatchIndex = lname.toLowerCase().indexOf(query),
-                    nnameMatchIndex = nname.toLowerCase().indexOf(query),
-                    displayfname, displaylname, displaynname;
-
-                if (fnameMatchIndex > -1) {
-                    displayfname = highlightMatch(fname, query, fnameMatchIndex);
-                } else {
-                    displayfname = fname;
-                }
-
-                if (lnameMatchIndex > -1) {
-                    displaylname = highlightMatch(lname, query, lnameMatchIndex);
-                } else {
-                    displaylname = lname;
-                }
-
-                if (nnameMatchIndex > -1) {
-                    displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
-                } else {
-                    displaynname = nname ? "(" + nname + ")" : "";
-                }
-
-                return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk, oResultData.gravatar_size);
-            } else {
-                return '';
-            }
-        };
-    membersAC.formatResult = custom_formatter;
-    ownerAC.formatResult = custom_formatter;
-
-    var myHandler = function (sType, aArgs) {
-            var nextId = divid.split('perm_new_member_name_')[1];
-            var myAC = aArgs[0]; // reference back to the AC instance
-            var elLI = aArgs[1]; // reference to the selected LI element
-            var oData = aArgs[2]; // object literal of selected item's result data
-            //fill the autocomplete with value
-            if (oData.nname != undefined) {
-                //users
-                myAC.getInputEl().value = oData.nname;
-                $('#perm_new_member_type_'+nextId).val('user');
-            } else {
-                //groups
-                myAC.getInputEl().value = oData.grname;
-                $('#perm_new_member_type_'+nextId).val('users_group');
-            }
-        };
-
-    membersAC.itemSelectEvent.subscribe(myHandler);
-    if(ownerAC.itemSelectEvent){
-        ownerAC.itemSelectEvent.subscribe(myHandler);
-    }
-
-    return {
-        memberDS: memberDS,
-        ownerDS: ownerDS,
-        membersAC: membersAC,
-        ownerAC: ownerAC
+    // Handler for selection of an entry
+    var itemSelectHandler = function (sType, aArgs) {
+        var nextId = $inputElement.prop('id').split('perm_new_member_name_')[1];
+        var myAC = aArgs[0]; // reference back to the AC instance
+        var elLI = aArgs[1]; // reference to the selected LI element
+        var oData = aArgs[2]; // object literal of selected item's result data
+        //fill the autocomplete with value
+        if (oData.nname != undefined) {
+            //users
+            myAC.getInputEl().value = oData.nname;
+            $('#perm_new_member_type_'+nextId).val('user');
+        } else {
+            //groups
+            myAC.getInputEl().value = oData.grname;
+            $('#perm_new_member_type_'+nextId).val('users_group');
+        }
     };
+    membersAC.itemSelectEvent.subscribe(itemSelectHandler);
 }
 
-var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
-    var myUsers = users_list;
-    var myGroups = groups_list;
+var MentionsAutoComplete = function ($inputElement, $container, users_list) {
 
-    // Define a custom search function for the DataSource of users
     var matchUsers = function (sQuery) {
             var org_sQuery = sQuery;
             if(this.mentionQuery == null){
                 return []
             }
             sQuery = this.mentionQuery;
-            // Case insensitive matching
-            var query = sQuery.toLowerCase();
-            var i = 0;
-            var l = myUsers.length;
-            var matches = [];
-
-            // Match against each name of each contact
-            for (; i < l; i++) {
-                var contact = myUsers[i];
-                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
-                     ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
-                     ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
-                    matches[matches.length] = contact;
-                }
-            }
-            return matches
-        };
-
-    //match all
-    var matchAll = function (sQuery) {
-            return matchUsers(sQuery);
-        };
-
-    // DataScheme for owner
-    var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
-
-    ownerDS.responseSchema = {
-        fields: ["id", "fname", "lname", "nname", "gravatar_lnk", "gravatar_size"]
-    };
-
-    // Instantiate AutoComplete for mentions
-    var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
-    ownerAC.useShadow = false;
-    ownerAC.resultTypeList = false;
-    ownerAC.suppressInputUpdate = true;
-    ownerAC.animVert = false;
-    ownerAC.animHoriz = false;
-    ownerAC.animSpeed = 0.1;
-
-    // Helper highlight function for the formatter
-    var highlightMatch = function (full, snippet, matchindex) {
-            return full.substring(0, matchindex)
-                + "<span class='match'>"
-                + full.substr(matchindex, snippet.length)
-                + "</span>" + full.substring(matchindex + snippet.length);
-        };
+            return autocompleteMatchUsers(sQuery, users_list);
+    }
 
-    // Custom formatter to highlight the matching letters
-    ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
-            var org_sQuery = sQuery;
-            if(this.dataSource.mentionQuery != null){
-                sQuery = this.dataSource.mentionQuery;
-            }
-
-            var query = sQuery.toLowerCase();
-            var _gravatar = function(res, em, size, group){
-                var elem = '<img alt="gravatar" class="perm-gravatar-ac" style="width: {0}px; height: {0}px" src="{1}"/>'.format(size, em);
-                if (!em) {
-                    elem = '<i class="icon-user perm-gravatar-ac" style="font-size: {0}px;"></i>'.format(size);
-                }
-                if (group !== undefined){
-                    elem = '<i class="perm-gravatar-ac icon-users"></i>'
-                }
-                var tmpl = '<div class="ac-container-wrap">{0}{1}</div>'
-                return tmpl.format(elem,res)
-            }
-            if (oResultData.nname != undefined) {
-                var fname = oResultData.fname || "";
-                var lname = oResultData.lname || "";
-                var nname = oResultData.nname;
+    var mentionsAC = autocompleteCreate($inputElement, $container, matchUsers);
+    mentionsAC.suppressInputUpdate = true;
+    // Overwrite formatResult to take into account mentionQuery
+    mentionsAC.formatResult = function (oResultData, sQuery, sResultMatch) {
+        var org_sQuery = sQuery;
+        if (this.dataSource.mentionQuery != null) {
+            sQuery = this.dataSource.mentionQuery;
+        }
+        return autocompleteFormatter(oResultData, sQuery, sResultMatch);
+    }
 
-                // Guard against null value
-                var fnameMatchIndex = fname.toLowerCase().indexOf(query),
-                    lnameMatchIndex = lname.toLowerCase().indexOf(query),
-                    nnameMatchIndex = nname.toLowerCase().indexOf(query),
-                    displayfname, displaylname, displaynname;
-
-                if (fnameMatchIndex > -1) {
-                    displayfname = highlightMatch(fname, query, fnameMatchIndex);
-                } else {
-                    displayfname = fname;
-                }
-
-                if (lnameMatchIndex > -1) {
-                    displaylname = highlightMatch(lname, query, lnameMatchIndex);
-                } else {
-                    displaylname = lname;
-                }
-
-                if (nnameMatchIndex > -1) {
-                    displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
-                } else {
-                    displaynname = nname ? "(" + nname + ")" : "";
-                }
-
-                return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk, oResultData.gravatar_size);
-            } else {
-                return '';
-            }
-        };
-
-    if(ownerAC.itemSelectEvent){
-        ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
+    // Handler for selection of an entry
+    if(mentionsAC.itemSelectEvent){
+        mentionsAC.itemSelectEvent.subscribe(function (sType, aArgs) {
             var myAC = aArgs[0]; // reference back to the AC instance
             var elLI = aArgs[1]; // reference to the selected LI element
             var oData = aArgs[2]; // object literal of selected item's result data
-            //fill the autocomplete with value
-            if (oData.nname != undefined) {
-                //users
-                //Replace the mention name with replaced
-                var re = new RegExp();
-                var org = myAC.getInputEl().value;
-                var chunks = myAC.dataSource.chunks
-                // replace middle chunk(the search term) with actuall  match
-                chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
-                                              '@'+oData.nname+' ');
-                myAC.getInputEl().value = chunks.join('')
-                myAC.getInputEl().focus(); // Y U NO WORK !?
-            } else {
-                //groups
-                myAC.getInputEl().value = oData.grname;
-                $('#perm_new_member_type').val('users_group');
-            }
+            //Replace the mention name with replaced
+            var re = new RegExp();
+            var org = myAC.getInputEl().value;
+            var chunks = myAC.dataSource.chunks
+            // replace middle chunk(the search term) with actuall  match
+            chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
+                                          '@'+oData.nname+' ');
+            myAC.getInputEl().value = chunks.join('');
+            myAC.getInputEl().focus(); // Y U NO WORK !?
         });
     }
 
     // in this keybuffer we will gather current value of search !
     // since we need to get this just when someone does `@` then we do the
     // search
-    ownerAC.dataSource.chunks = [];
-    ownerAC.dataSource.mentionQuery = null;
+    mentionsAC.dataSource.chunks = [];
+    mentionsAC.dataSource.mentionQuery = null;
 
-    ownerAC.get_mention = function(msg, max_pos) {
+    mentionsAC.get_mention = function(msg, max_pos) {
         var org = msg;
         // Must match utils2.py MENTIONS_REGEX.
         // Only matching on string up to cursor, so it must end with $
-        var re = new RegExp('(?:^|[^a-zA-Z0-9])@([a-zA-Z0-9][-_.a-zA-Z0-9]*[a-zA-Z0-9])$')
+        var re = new RegExp('(?:^|[^a-zA-Z0-9])@([a-zA-Z0-9][-_.a-zA-Z0-9]*[a-zA-Z0-9])$');
         var chunks  = [];
 
         // cut first chunk until current pos
@@ -1446,9 +1260,9 @@
         var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
         var msg2 = to_max.substr(at_pos);
 
-        chunks.push(org.substr(0,at_pos))// prefix chunk
-        chunks.push(msg2)                // search chunk
-        chunks.push(org.substr(max_pos)) // postfix chunk
+        chunks.push(org.substr(0,at_pos)); // prefix chunk
+        chunks.push(msg2);                 // search chunk
+        chunks.push(org.substr(max_pos));  // postfix chunk
 
         // clean up msg2 for filtering and regex match
         var msg2 = msg2.lstrip(' ').lstrip('\n');
@@ -1460,27 +1274,30 @@
         return [null, null];
     };
 
-    var $divid = $('#'+divid);
-    $divid.keyup(function(e){
-            var currentMessage = $divid.val();
-            var currentCaretPosition = $divid[0].selectionStart;
+    $inputElement.keyup(function(e){
+            var currentMessage = $inputElement.val();
+            var currentCaretPosition = $inputElement[0].selectionStart;
 
-            var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
+            var unam = mentionsAC.get_mention(currentMessage, currentCaretPosition);
             var curr_search = null;
             if(unam[0]){
                 curr_search = unam[0];
             }
 
-            ownerAC.dataSource.chunks = unam[1];
-            ownerAC.dataSource.mentionQuery = curr_search;
+            mentionsAC.dataSource.chunks = unam[1];
+            mentionsAC.dataSource.mentionQuery = curr_search;
         });
 }
 
 var addReviewMember = function(id,fname,lname,nname,gravatar_link,gravatar_size){
-    var displayname = "{0} {1} ({2})".format(fname, lname, nname);
-    var gravatarelm = '<img alt="gravatar" style="width: {0}px; height: {0}px" src="{1}"/>'.format(gravatar_size, gravatar_link);
-    if (!gravatar_link)
-        gravatarelm = '<i class="icon-user" style="font-size: {0}px;"></i>'.format(gravatar_size);
+    var displayname = nname;
+    if ((fname != "") && (lname != "")) {
+        displayname = "{0} {1} ({2})".format(fname, lname, nname);
+    }
+    var gravatarelm = gravatar(gravatar_link, gravatar_size, "");
+    // WARNING: the HTML below is duplicate with
+    // kallithea/templates/pullrequests/pullrequest_show.html
+    // If you change something here it should be reflected in the template too.
     var element = (
         '     <li id="reviewer_{2}">\n'+
         '       <div class="reviewers_member">\n'+
@@ -1510,153 +1327,30 @@
 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
     var $li = $('#reviewer_{0}'.format(reviewer_id));
     $li.find('div div').css("text-decoration", "line-through");
-    $li.find('input').attr('name', 'review_members_removed');
+    $li.find('input').prop('name', 'review_members_removed');
     $li.find('.reviewer_member_remove').replaceWith('&nbsp;(remove not saved)');
 }
 
-/* activate auto completion of users and groups ... but only used for users as PR reviewers */
-var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
-    var myUsers = users_list;
-    var myGroups = groups_list;
-
-    // Define a custom search function for the DataSource of users
-    var matchUsers = function (sQuery) {
-            // Case insensitive matching
-            var query = sQuery.toLowerCase();
-            var i = 0;
-            var l = myUsers.length;
-            var matches = [];
-
-            // Match against each name of each contact
-            for (; i < l; i++) {
-                var contact = myUsers[i];
-                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
-                     ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
-                     ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
-                    matches[matches.length] = contact;
-                }
-            }
-            return matches;
-        };
+/* activate auto completion of users as PR reviewers */
+var PullRequestAutoComplete = function ($inputElement, $container, users_list) {
 
-    // Define a custom search function for the DataSource of userGroups
-    var matchGroups = function (sQuery) {
-            // Case insensitive matching
-            var query = sQuery.toLowerCase();
-            var i = 0;
-            var l = myGroups.length;
-            var matches = [];
-
-            // Match against each name of each contact
-            for (; i < l; i++) {
-                matched_group = myGroups[i];
-                if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
-                    matches[matches.length] = matched_group;
-                }
-            }
-            return matches;
-        };
-
-    //match all
-    var matchAll = function (sQuery) {
-            return matchUsers(sQuery);
-        };
-
-    // DataScheme for owner
-    var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
-
-    ownerDS.responseSchema = {
-        fields: ["id", "fname", "lname", "nname", "gravatar_lnk", "gravatar_size"]
+    var matchUsers = function (sQuery) {
+        return autocompleteMatchUsers(sQuery, users_list);
     };
 
-    // Instantiate AutoComplete for mentions
-    var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
-    reviewerAC.useShadow = false;
-    reviewerAC.resultTypeList = false;
+    var reviewerAC = autocompleteCreate($inputElement, $container, matchUsers);
     reviewerAC.suppressInputUpdate = true;
-    reviewerAC.animVert = false;
-    reviewerAC.animHoriz = false;
-    reviewerAC.animSpeed = 0.1;
-
-    // Helper highlight function for the formatter
-    var highlightMatch = function (full, snippet, matchindex) {
-            return full.substring(0, matchindex)
-                + "<span class='match'>"
-                + full.substr(matchindex, snippet.length)
-                + "</span>" + full.substring(matchindex + snippet.length);
-        };
-
-    // Custom formatter to highlight the matching letters
-    reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
-            var org_sQuery = sQuery;
-            if(this.dataSource.mentionQuery != null){
-                sQuery = this.dataSource.mentionQuery;
-            }
 
-            var query = sQuery.toLowerCase();
-            var _gravatar = function(res, em, size, group){
-                var elem = '<img alt="gravatar" class="perm-gravatar-ac" style="width: {0}px; height: {0}px" src="{1}"/>'.format(size, em);
-                if (!em) {
-                    elem = '<i class="icon-user perm-gravatar-ac" style="font-size: {0}px;"></i>'.format(size);
-                }
-                if (group !== undefined){
-                    elem = '<i class="perm-gravatar-ac icon-users"></i>'
-                }
-                var tmpl = '<div class="ac-container-wrap">{0}{1}</div>'
-                return tmpl.format(elem,res)
-            }
-            if (oResultData.nname != undefined) {
-                var fname = oResultData.fname || "";
-                var lname = oResultData.lname || "";
-                var nname = oResultData.nname;
-
-                // Guard against null value
-                var fnameMatchIndex = fname.toLowerCase().indexOf(query),
-                    lnameMatchIndex = lname.toLowerCase().indexOf(query),
-                    nnameMatchIndex = nname.toLowerCase().indexOf(query),
-                    displayfname, displaylname, displaynname;
-
-                if (fnameMatchIndex > -1) {
-                    displayfname = highlightMatch(fname, query, fnameMatchIndex);
-                } else {
-                    displayfname = fname;
-                }
-
-                if (lnameMatchIndex > -1) {
-                    displaylname = highlightMatch(lname, query, lnameMatchIndex);
-                } else {
-                    displaylname = lname;
-                }
-
-                if (nnameMatchIndex > -1) {
-                    displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
-                } else {
-                    displaynname = nname ? "(" + nname + ")" : "";
-                }
-
-                return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk, oResultData.gravatar_size);
-            } else {
-                return '';
-            }
-        };
-
-    //members cache to catch duplicates
-    reviewerAC.dataSource.cache = [];
-    // hack into select event
+    // Handler for selection of an entry
     if(reviewerAC.itemSelectEvent){
         reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
-
             var myAC = aArgs[0]; // reference back to the AC instance
             var elLI = aArgs[1]; // reference to the selected LI element
             var oData = aArgs[2]; // object literal of selected item's result data
 
-            //fill the autocomplete with value
-            if (oData.nname != undefined) {
-                addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
-                                oData.gravatar_lnk, oData.gravatar_size);
-                myAC.dataSource.cache.push(oData.id);
-                $('#user').val('');
-            }
+            addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
+                            oData.gravatar_lnk, oData.gravatar_size);
+            myAC.getInputEl().value = '';
         });
     }
 }
@@ -1671,14 +1365,14 @@
                 $menu.removeClass('hidden').addClass('active');
                 $(e.currentTarget).removeClass('hidden').addClass('active');
             }
-        })
+        });
     $(".quick_repo_menu").mouseleave(function(e) {
             var $menu = $(e.currentTarget).children().first().children().first();
             if($menu.hasClass('active')){
                 $menu.removeClass('active').addClass('hidden');
                 $(e.currentTarget).removeClass('active').addClass('hidden');
             }
-        })
+        });
 };
 
 
@@ -1726,8 +1420,8 @@
     var $last_node = $('.last_new_member').last(); // empty tr between last and add
     var next_id = $('.new_members').length;
     $last_node.before($('<tr class="new_members">').append(_html.format(next_id)));
-    _MembersAutoComplete("perm_new_member_name_"+next_id,
-            "perm_container_"+next_id, users_list, groups_list);
+    MembersAutoComplete($("#perm_new_member_name_"+next_id),
+            $("#perm_container_"+next_id), users_list, groups_list);
 }
 
 function ajaxActionRevokePermission(url, obj_id, obj_type, field_id, extra_data) {
@@ -1847,8 +1541,8 @@
                     var radius = parseInt(items / 2);
                 }
 
-                var left = Math.max(1, (cur_page - (radius)))
-                var right = Math.min(max_page, cur_page + (radius))
+                var left = Math.max(1, (cur_page - (radius)));
+                var right = Math.min(max_page, cur_page + (radius));
                 return [left, cur_page, right]
             },
             render : function (id_base) {
@@ -1971,8 +1665,8 @@
                     var radius = parseInt(items / 2);
                 }
 
-                var left = Math.max(1, (cur_page - (radius)))
-                var right = Math.min(max_page, cur_page + (radius))
+                var left = Math.max(1, (cur_page - (radius)));
+                var right = Math.min(max_page, cur_page + (radius));
                 return [left, cur_page, right]
             },
             render : function (id_base) {
@@ -2069,7 +1763,7 @@
         nextPageLinkLabel: '&gt;',
         previousPageLinkLabel: '&lt;',
         containers:containers
-    })
+    });
 
     return pagi
 }
@@ -2090,7 +1784,7 @@
         if (req) {
             req = req.toLowerCase();
             for (i = 0; i<data.length; i++) {
-                var pos = data[i].raw_name.toLowerCase().indexOf(req)
+                var pos = data[i].raw_name.toLowerCase().indexOf(req);
                 if (pos != -1) {
                     filtered.push(data[i]);
                 }
@@ -2147,12 +1841,52 @@
         });
 }
 
+/**
+ Branch Sorting callback for select2, modifying the filtered result so prefix
+ matches come before matches in the line.
+ **/
+var branchSort = function(results, container, query) {
+    if (query.term) {
+        return results.sort(function (a, b) {
+            // Put closed branches after open ones (a bit of a hack ...)
+            var aClosed = a.text.indexOf("(closed)") > -1,
+                bClosed = b.text.indexOf("(closed)") > -1;
+            if (aClosed && !bClosed) {
+                return 1;
+            }
+            if (bClosed && !aClosed) {
+                return -1;
+            }
+
+            // Put prefix matches before matches in the line
+            var aPos = a.text.indexOf(query.term),
+                bPos = b.text.indexOf(query.term);
+            if (aPos === 0 && bPos !== 0) {
+                return -1;
+            }
+            if (bPos === 0 && aPos !== 0) {
+                return 1;
+            }
+
+            // Default sorting
+            if (a.text > b.text) {
+                return 1;
+            }
+            if (a.text < b.text) {
+                return -1;
+            }
+            return 0;
+        });
+    }
+    return results;
+};
+
 // global hooks after DOM is loaded
 
 $(document).ready(function(){
     $('.diff-collapse-button').click(function(e) {
         var $button = $(e.currentTarget);
-        var $target = $('#' + $button.attr('target'));
+        var $target = $('#' + $button.prop('target'));
         if($target.hasClass('hidden')){
             $target.removeClass('hidden');
             $button.html("&uarr; {0} &uarr;".format(_TM['Collapse Diff']));
--- a/kallithea/public/js/excanvas.js	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,884 +0,0 @@
-// Copyright 2006 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-// Known Issues:
-//
-// * Patterns are not implemented.
-// * Radial gradient are not implemented. The VML version of these look very
-//   different from the canvas one.
-// * Clipping paths are not implemented.
-// * Coordsize. The width and height attribute have higher priority than the
-//   width and height style values which isn't correct.
-// * Painting mode isn't implemented.
-// * Canvas width/height should is using content-box by default. IE in
-//   Quirks mode will draw the canvas using border-box. Either change your
-//   doctype to HTML5
-//   (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
-//   or use Box Sizing Behavior from WebFX
-//   (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
-// * Non uniform scaling does not correctly scale strokes.
-// * Optimize. There is always room for speed improvements.
-
-// Only add this code if we do not already have a canvas implementation
-if (!document.createElement('canvas').getContext) {
-
-(function() {
-
-  // alias some functions to make (compiled) code shorter
-  var m = Math;
-  var mr = m.round;
-  var ms = m.sin;
-  var mc = m.cos;
-  var abs = m.abs;
-  var sqrt = m.sqrt;
-
-  // this is used for sub pixel precision
-  var Z = 10;
-  var Z2 = Z / 2;
-
-  /**
-   * This funtion is assigned to the <canvas> elements as element.getContext().
-   * @this {HTMLElement}
-   * @return {CanvasRenderingContext2D_}
-   */
-  function getContext() {
-    return this.context_ ||
-        (this.context_ = new CanvasRenderingContext2D_(this));
-  }
-
-  var slice = Array.prototype.slice;
-
-  /**
-   * Binds a function to an object. The returned function will always use the
-   * passed in {@code obj} as {@code this}.
-   *
-   * Example:
-   *
-   *   g = bind(f, obj, a, b)
-   *   g(c, d) // will do f.call(obj, a, b, c, d)
-   *
-   * @param {Function} f The function to bind the object to
-   * @param {Object} obj The object that should act as this when the function
-   *     is called
-   * @param {*} var_args Rest arguments that will be used as the initial
-   *     arguments when the function is called
-   * @return {Function} A new function that has bound this
-   */
-  function bind(f, obj, var_args) {
-    var a = slice.call(arguments, 2);
-    return function() {
-      return f.apply(obj, a.concat(slice.call(arguments)));
-    };
-  }
-
-  var G_vmlCanvasManager_ = {
-    init: function(opt_doc) {
-      if (/MSIE/.test(navigator.userAgent) && !window.opera) {
-        var doc = opt_doc || document;
-        // Create a dummy element so that IE will allow canvas elements to be
-        // recognized.
-        doc.createElement('canvas');
-        doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));
-      }
-    },
-
-    init_: function(doc) {
-      // create xmlns
-      if (!doc.namespaces['g_vml_']) {
-        doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml',
-                           '#default#VML');
-
-      }
-      if (!doc.namespaces['g_o_']) {
-        doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office',
-                           '#default#VML');
-      }
-
-      // Setup default CSS.  Only add one style sheet per document
-      if (!doc.styleSheets['ex_canvas_']) {
-        var ss = doc.createStyleSheet();
-        ss.owningElement.id = 'ex_canvas_';
-        ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +
-            // default size is 300x150 in Gecko and Opera
-            'text-align:left;width:300px;height:150px}' +
-            'g_vml_\\:*{behavior:url(#default#VML)}' +
-            'g_o_\\:*{behavior:url(#default#VML)}';
-
-      }
-
-      // find all canvas elements
-      var els = doc.getElementsByTagName('canvas');
-      for (var i = 0; i < els.length; i++) {
-        this.initElement(els[i]);
-      }
-    },
-
-    /**
-     * Public initializes a canvas element so that it can be used as canvas
-     * element from now on. This is called automatically before the page is
-     * loaded but if you are creating elements using createElement you need to
-     * make sure this is called on the element.
-     * @param {HTMLElement} el The canvas element to initialize.
-     * @return {HTMLElement} the element that was created.
-     */
-    initElement: function(el) {
-      if (!el.getContext) {
-
-        el.getContext = getContext;
-
-        // Remove fallback content. There is no way to hide text nodes so we
-        // just remove all childNodes. We could hide all elements and remove
-        // text nodes but who really cares about the fallback content.
-        el.innerHTML = '';
-
-        // do not use inline function because that will leak memory
-        el.attachEvent('onpropertychange', onPropertyChange);
-        el.attachEvent('onresize', onResize);
-
-        var attrs = el.attributes;
-        if (attrs.width && attrs.width.specified) {
-          // TODO: use runtimeStyle and coordsize
-          // el.getContext().setWidth_(attrs.width.nodeValue);
-          el.style.width = attrs.width.nodeValue + 'px';
-        } else {
-          el.width = el.clientWidth;
-        }
-        if (attrs.height && attrs.height.specified) {
-          // TODO: use runtimeStyle and coordsize
-          // el.getContext().setHeight_(attrs.height.nodeValue);
-          el.style.height = attrs.height.nodeValue + 'px';
-        } else {
-          el.height = el.clientHeight;
-        }
-        //el.getContext().setCoordsize_()
-      }
-      return el;
-    }
-  };
-
-  function onPropertyChange(e) {
-    var el = e.srcElement;
-
-    switch (e.propertyName) {
-      case 'width':
-        el.style.width = el.attributes.width.nodeValue + 'px';
-        el.getContext().clearRect();
-        break;
-      case 'height':
-        el.style.height = el.attributes.height.nodeValue + 'px';
-        el.getContext().clearRect();
-        break;
-    }
-  }
-
-  function onResize(e) {
-    var el = e.srcElement;
-    if (el.firstChild) {
-      el.firstChild.style.width =  el.clientWidth + 'px';
-      el.firstChild.style.height = el.clientHeight + 'px';
-    }
-  }
-
-  G_vmlCanvasManager_.init();
-
-  // precompute "00" to "FF"
-  var dec2hex = [];
-  for (var i = 0; i < 16; i++) {
-    for (var j = 0; j < 16; j++) {
-      dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);
-    }
-  }
-
-  function createMatrixIdentity() {
-    return [
-      [1, 0, 0],
-      [0, 1, 0],
-      [0, 0, 1]
-    ];
-  }
-
-  function matrixMultiply(m1, m2) {
-    var result = createMatrixIdentity();
-
-    for (var x = 0; x < 3; x++) {
-      for (var y = 0; y < 3; y++) {
-        var sum = 0;
-
-        for (var z = 0; z < 3; z++) {
-          sum += m1[x][z] * m2[z][y];
-        }
-
-        result[x][y] = sum;
-      }
-    }
-    return result;
-  }
-
-  function copyState(o1, o2) {
-    o2.fillStyle     = o1.fillStyle;
-    o2.lineCap       = o1.lineCap;
-    o2.lineJoin      = o1.lineJoin;
-    o2.lineWidth     = o1.lineWidth;
-    o2.miterLimit    = o1.miterLimit;
-    o2.shadowBlur    = o1.shadowBlur;
-    o2.shadowColor   = o1.shadowColor;
-    o2.shadowOffsetX = o1.shadowOffsetX;
-    o2.shadowOffsetY = o1.shadowOffsetY;
-    o2.strokeStyle   = o1.strokeStyle;
-    o2.globalAlpha   = o1.globalAlpha;
-    o2.arcScaleX_    = o1.arcScaleX_;
-    o2.arcScaleY_    = o1.arcScaleY_;
-    o2.lineScale_    = o1.lineScale_;
-  }
-
-  function processStyle(styleString) {
-    var str, alpha = 1;
-
-    styleString = String(styleString);
-    if (styleString.substring(0, 3) == 'rgb') {
-      var start = styleString.indexOf('(', 3);
-      var end = styleString.indexOf(')', start + 1);
-      var guts = styleString.substring(start + 1, end).split(',');
-
-      str = '#';
-      for (var i = 0; i < 3; i++) {
-        str += dec2hex[Number(guts[i])];
-      }
-
-      if (guts.length == 4 && styleString.substr(3, 1) == 'a') {
-        alpha = guts[3];
-      }
-    } else {
-      str = styleString;
-    }
-
-    return {color: str, alpha: alpha};
-  }
-
-  function processLineCap(lineCap) {
-    switch (lineCap) {
-      case 'butt':
-        return 'flat';
-      case 'round':
-        return 'round';
-      case 'square':
-      default:
-        return 'square';
-    }
-  }
-
-  /**
-   * This class implements CanvasRenderingContext2D interface as described by
-   * the WHATWG.
-   * @param {HTMLElement} surfaceElement The element that the 2D context should
-   * be associated with
-   */
-  function CanvasRenderingContext2D_(surfaceElement) {
-    this.m_ = createMatrixIdentity();
-
-    this.mStack_ = [];
-    this.aStack_ = [];
-    this.currentPath_ = [];
-
-    // Canvas context properties
-    this.strokeStyle = '#000';
-    this.fillStyle = '#000';
-
-    this.lineWidth = 1;
-    this.lineJoin = 'miter';
-    this.lineCap = 'butt';
-    this.miterLimit = Z * 1;
-    this.globalAlpha = 1;
-    this.canvas = surfaceElement;
-
-    var el = surfaceElement.ownerDocument.createElement('div');
-    el.style.width =  surfaceElement.clientWidth + 'px';
-    el.style.height = surfaceElement.clientHeight + 'px';
-    el.style.overflow = 'hidden';
-    el.style.position = 'absolute';
-    surfaceElement.appendChild(el);
-
-    this.element_ = el;
-    this.arcScaleX_ = 1;
-    this.arcScaleY_ = 1;
-    this.lineScale_ = 1;
-  }
-
-  var contextPrototype = CanvasRenderingContext2D_.prototype;
-  contextPrototype.clearRect = function() {
-    this.element_.innerHTML = '';
-  };
-
-  contextPrototype.beginPath = function() {
-    // TODO: Branch current matrix so that save/restore has no effect
-    //       as per safari docs.
-    this.currentPath_ = [];
-  };
-
-  contextPrototype.moveTo = function(aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});
-    this.currentX_ = p.x;
-    this.currentY_ = p.y;
-  };
-
-  contextPrototype.lineTo = function(aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});
-
-    this.currentX_ = p.x;
-    this.currentY_ = p.y;
-  };
-
-  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
-                                            aCP2x, aCP2y,
-                                            aX, aY) {
-    var p = this.getCoords_(aX, aY);
-    var cp1 = this.getCoords_(aCP1x, aCP1y);
-    var cp2 = this.getCoords_(aCP2x, aCP2y);
-    bezierCurveTo(this, cp1, cp2, p);
-  };
-
-  // Helper function that takes the already fixed cordinates.
-  function bezierCurveTo(self, cp1, cp2, p) {
-    self.currentPath_.push({
-      type: 'bezierCurveTo',
-      cp1x: cp1.x,
-      cp1y: cp1.y,
-      cp2x: cp2.x,
-      cp2y: cp2.y,
-      x: p.x,
-      y: p.y
-    });
-    self.currentX_ = p.x;
-    self.currentY_ = p.y;
-  }
-
-  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
-    // the following is lifted almost directly from
-    // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
-
-    var cp = this.getCoords_(aCPx, aCPy);
-    var p = this.getCoords_(aX, aY);
-
-    var cp1 = {
-      x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
-      y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
-    };
-    var cp2 = {
-      x: cp1.x + (p.x - this.currentX_) / 3.0,
-      y: cp1.y + (p.y - this.currentY_) / 3.0
-    };
-
-    bezierCurveTo(this, cp1, cp2, p);
-  };
-
-  contextPrototype.arc = function(aX, aY, aRadius,
-                                  aStartAngle, aEndAngle, aClockwise) {
-    aRadius *= Z;
-    var arcType = aClockwise ? 'at' : 'wa';
-
-    var xStart = aX + mc(aStartAngle) * aRadius - Z2;
-    var yStart = aY + ms(aStartAngle) * aRadius - Z2;
-
-    var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
-    var yEnd = aY + ms(aEndAngle) * aRadius - Z2;
-
-    // IE won't render arches drawn counter clockwise if xStart == xEnd.
-    if (xStart == xEnd && !aClockwise) {
-      xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
-                       // that can be represented in binary
-    }
-
-    var p = this.getCoords_(aX, aY);
-    var pStart = this.getCoords_(xStart, yStart);
-    var pEnd = this.getCoords_(xEnd, yEnd);
-
-    this.currentPath_.push({type: arcType,
-                           x: p.x,
-                           y: p.y,
-                           radius: aRadius,
-                           xStart: pStart.x,
-                           yStart: pStart.y,
-                           xEnd: pEnd.x,
-                           yEnd: pEnd.y});
-
-  };
-
-  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-  };
-
-  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
-    var oldPath = this.currentPath_;
-    this.beginPath();
-
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-    this.stroke();
-
-    this.currentPath_ = oldPath;
-  };
-
-  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
-    var oldPath = this.currentPath_;
-    this.beginPath();
-
-    this.moveTo(aX, aY);
-    this.lineTo(aX + aWidth, aY);
-    this.lineTo(aX + aWidth, aY + aHeight);
-    this.lineTo(aX, aY + aHeight);
-    this.closePath();
-    this.fill();
-
-    this.currentPath_ = oldPath;
-  };
-
-  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
-    var gradient = new CanvasGradient_('gradient');
-    gradient.x0_ = aX0;
-    gradient.y0_ = aY0;
-    gradient.x1_ = aX1;
-    gradient.y1_ = aY1;
-    return gradient;
-  };
-
-  contextPrototype.createRadialGradient = function(aX0, aY0, aR0,
-                                                   aX1, aY1, aR1) {
-    var gradient = new CanvasGradient_('gradientradial');
-    gradient.x0_ = aX0;
-    gradient.y0_ = aY0;
-    gradient.r0_ = aR0;
-    gradient.x1_ = aX1;
-    gradient.y1_ = aY1;
-    gradient.r1_ = aR1;
-    return gradient;
-  };
-
-  contextPrototype.drawImage = function(image, var_args) {
-    var dx, dy, dw, dh, sx, sy, sw, sh;
-
-    // to find the original width we overide the width and height
-    var oldRuntimeWidth = image.runtimeStyle.width;
-    var oldRuntimeHeight = image.runtimeStyle.height;
-    image.runtimeStyle.width = 'auto';
-    image.runtimeStyle.height = 'auto';
-
-    // get the original size
-    var w = image.width;
-    var h = image.height;
-
-    // and remove overides
-    image.runtimeStyle.width = oldRuntimeWidth;
-    image.runtimeStyle.height = oldRuntimeHeight;
-
-    if (arguments.length == 3) {
-      dx = arguments[1];
-      dy = arguments[2];
-      sx = sy = 0;
-      sw = dw = w;
-      sh = dh = h;
-    } else if (arguments.length == 5) {
-      dx = arguments[1];
-      dy = arguments[2];
-      dw = arguments[3];
-      dh = arguments[4];
-      sx = sy = 0;
-      sw = w;
-      sh = h;
-    } else if (arguments.length == 9) {
-      sx = arguments[1];
-      sy = arguments[2];
-      sw = arguments[3];
-      sh = arguments[4];
-      dx = arguments[5];
-      dy = arguments[6];
-      dw = arguments[7];
-      dh = arguments[8];
-    } else {
-      throw Error('Invalid number of arguments');
-    }
-
-    var d = this.getCoords_(dx, dy);
-
-    var w2 = sw / 2;
-    var h2 = sh / 2;
-
-    var vmlStr = [];
-
-    var W = 10;
-    var H = 10;
-
-    // For some reason that I've now forgotten, using divs didn't work
-    vmlStr.push(' <g_vml_:group',
-                ' coordsize="', Z * W, ',', Z * H, '"',
-                ' coordorigin="0,0"' ,
-                ' style="width:', W, 'px;height:', H, 'px;position:absolute;');
-
-    // If filters are necessary (rotation exists), create them
-    // filters are bog-slow, so only create them if abbsolutely necessary
-    // The following check doesn't account for skews (which don't exist
-    // in the canvas spec (yet) anyway.
-
-    if (this.m_[0][0] != 1 || this.m_[0][1]) {
-      var filter = [];
-
-      // Note the 12/21 reversal
-      filter.push('M11=', this.m_[0][0], ',',
-                  'M12=', this.m_[1][0], ',',
-                  'M21=', this.m_[0][1], ',',
-                  'M22=', this.m_[1][1], ',',
-                  'Dx=', mr(d.x / Z), ',',
-                  'Dy=', mr(d.y / Z), '');
-
-      // Bounding box calculation (need to minimize displayed area so that
-      // filters don't waste time on unused pixels.
-      var max = d;
-      var c2 = this.getCoords_(dx + dw, dy);
-      var c3 = this.getCoords_(dx, dy + dh);
-      var c4 = this.getCoords_(dx + dw, dy + dh);
-
-      max.x = m.max(max.x, c2.x, c3.x, c4.x);
-      max.y = m.max(max.y, c2.y, c3.y, c4.y);
-
-      vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z),
-                  'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(',
-                  filter.join(''), ", sizingmethod='clip');")
-    } else {
-      vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;');
-    }
-
-    vmlStr.push(' ">' ,
-                '<g_vml_:image src="', image.src, '"',
-                ' style="width:', Z * dw, 'px;',
-                ' height:', Z * dh, 'px;"',
-                ' cropleft="', sx / w, '"',
-                ' croptop="', sy / h, '"',
-                ' cropright="', (w - sx - sw) / w, '"',
-                ' cropbottom="', (h - sy - sh) / h, '"',
-                ' />',
-                '</g_vml_:group>');
-
-    this.element_.insertAdjacentHTML('BeforeEnd',
-                                    vmlStr.join(''));
-  };
-
-  contextPrototype.stroke = function(aFill) {
-    var lineStr = [];
-    var lineOpen = false;
-    var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);
-    var color = a.color;
-    var opacity = a.alpha * this.globalAlpha;
-
-    var W = 10;
-    var H = 10;
-
-    lineStr.push('<g_vml_:shape',
-                 ' filled="', !!aFill, '"',
-                 ' style="position:absolute;width:', W, 'px;height:', H, 'px;"',
-                 ' coordorigin="0 0" coordsize="', Z * W, ' ', Z * H, '"',
-                 ' stroked="', !aFill, '"',
-                 ' path="');
-
-    var newSeq = false;
-    var min = {x: null, y: null};
-    var max = {x: null, y: null};
-
-    for (var i = 0; i < this.currentPath_.length; i++) {
-      var p = this.currentPath_[i];
-      var c;
-
-      switch (p.type) {
-        case 'moveTo':
-          c = p;
-          lineStr.push(' m ', mr(p.x), ',', mr(p.y));
-          break;
-        case 'lineTo':
-          lineStr.push(' l ', mr(p.x), ',', mr(p.y));
-          break;
-        case 'close':
-          lineStr.push(' x ');
-          p = null;
-          break;
-        case 'bezierCurveTo':
-          lineStr.push(' c ',
-                       mr(p.cp1x), ',', mr(p.cp1y), ',',
-                       mr(p.cp2x), ',', mr(p.cp2y), ',',
-                       mr(p.x), ',', mr(p.y));
-          break;
-        case 'at':
-        case 'wa':
-          lineStr.push(' ', p.type, ' ',
-                       mr(p.x - this.arcScaleX_ * p.radius), ',',
-                       mr(p.y - this.arcScaleY_ * p.radius), ' ',
-                       mr(p.x + this.arcScaleX_ * p.radius), ',',
-                       mr(p.y + this.arcScaleY_ * p.radius), ' ',
-                       mr(p.xStart), ',', mr(p.yStart), ' ',
-                       mr(p.xEnd), ',', mr(p.yEnd));
-          break;
-      }
-
-
-      // TODO: Following is broken for curves due to
-      //       move to proper paths.
-
-      // Figure out dimensions so we can do gradient fills
-      // properly
-      if (p) {
-        if (min.x == null || p.x < min.x) {
-          min.x = p.x;
-        }
-        if (max.x == null || p.x > max.x) {
-          max.x = p.x;
-        }
-        if (min.y == null || p.y < min.y) {
-          min.y = p.y;
-        }
-        if (max.y == null || p.y > max.y) {
-          max.y = p.y;
-        }
-      }
-    }
-    lineStr.push(' ">');
-
-    if (!aFill) {
-      var lineWidth = this.lineScale_ * this.lineWidth;
-
-      // VML cannot correctly render a line if the width is less than 1px.
-      // In that case, we dilute the color to make the line look thinner.
-      if (lineWidth < 1) {
-        opacity *= lineWidth;
-      }
-
-      lineStr.push(
-        '<g_vml_:stroke',
-        ' opacity="', opacity, '"',
-        ' joinstyle="', this.lineJoin, '"',
-        ' miterlimit="', this.miterLimit, '"',
-        ' endcap="', processLineCap(this.lineCap), '"',
-        ' weight="', lineWidth, 'px"',
-        ' color="', color, '" />'
-      );
-    } else if (typeof this.fillStyle == 'object') {
-      var fillStyle = this.fillStyle;
-      var angle = 0;
-      var focus = {x: 0, y: 0};
-
-      // additional offset
-      var shift = 0;
-      // scale factor for offset
-      var expansion = 1;
-
-      if (fillStyle.type_ == 'gradient') {
-        var x0 = fillStyle.x0_ / this.arcScaleX_;
-        var y0 = fillStyle.y0_ / this.arcScaleY_;
-        var x1 = fillStyle.x1_ / this.arcScaleX_;
-        var y1 = fillStyle.y1_ / this.arcScaleY_;
-        var p0 = this.getCoords_(x0, y0);
-        var p1 = this.getCoords_(x1, y1);
-        var dx = p1.x - p0.x;
-        var dy = p1.y - p0.y;
-        angle = Math.atan2(dx, dy) * 180 / Math.PI;
-
-        // The angle should be a non-negative number.
-        if (angle < 0) {
-          angle += 360;
-        }
-
-        // Very small angles produce an unexpected result because they are
-        // converted to a scientific notation string.
-        if (angle < 1e-6) {
-          angle = 0;
-        }
-      } else {
-        var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_);
-        var width  = max.x - min.x;
-        var height = max.y - min.y;
-        focus = {
-          x: (p0.x - min.x) / width,
-          y: (p0.y - min.y) / height
-        };
-
-        width  /= this.arcScaleX_ * Z;
-        height /= this.arcScaleY_ * Z;
-        var dimension = m.max(width, height);
-        shift = 2 * fillStyle.r0_ / dimension;
-        expansion = 2 * fillStyle.r1_ / dimension - shift;
-      }
-
-      // We need to sort the color stops in ascending order by offset,
-      // otherwise IE won't interpret it correctly.
-      var stops = fillStyle.colors_;
-      stops.sort(function(cs1, cs2) {
-        return cs1.offset - cs2.offset;
-      });
-
-      var length = stops.length;
-      var color1 = stops[0].color;
-      var color2 = stops[length - 1].color;
-      var opacity1 = stops[0].alpha * this.globalAlpha;
-      var opacity2 = stops[length - 1].alpha * this.globalAlpha;
-
-      var colors = [];
-      for (var i = 0; i < length; i++) {
-        var stop = stops[i];
-        colors.push(stop.offset * expansion + shift + ' ' + stop.color);
-      }
-
-      // When colors attribute is used, the meanings of opacity and o:opacity2
-      // are reversed.
-      lineStr.push('<g_vml_:fill type="', fillStyle.type_, '"',
-                   ' method="none" focus="100%"',
-                   ' color="', color1, '"',
-                   ' color2="', color2, '"',
-                   ' colors="', colors.join(','), '"',
-                   ' opacity="', opacity2, '"',
-                   ' g_o_:opacity2="', opacity1, '"',
-                   ' angle="', angle, '"',
-                   ' focusposition="', focus.x, ',', focus.y, '" />');
-    } else {
-      lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity,
-                   '" />');
-    }
-
-    lineStr.push('</g_vml_:shape>');
-
-    this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
-  };
-
-  contextPrototype.fill = function() {
-    this.stroke(true);
-  }
-
-  contextPrototype.closePath = function() {
-    this.currentPath_.push({type: 'close'});
-  };
-
-  /**
-   * @private
-   */
-  contextPrototype.getCoords_ = function(aX, aY) {
-    var m = this.m_;
-    return {
-      x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
-      y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
-    }
-  };
-
-  contextPrototype.save = function() {
-    var o = {};
-    copyState(this, o);
-    this.aStack_.push(o);
-    this.mStack_.push(this.m_);
-    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
-  };
-
-  contextPrototype.restore = function() {
-    copyState(this.aStack_.pop(), this);
-    this.m_ = this.mStack_.pop();
-  };
-
-  contextPrototype.translate = function(aX, aY) {
-    var m1 = [
-      [1,  0,  0],
-      [0,  1,  0],
-      [aX, aY, 1]
-    ];
-
-    this.m_ = matrixMultiply(m1, this.m_);
-  };
-
-  contextPrototype.rotate = function(aRot) {
-    var c = mc(aRot);
-    var s = ms(aRot);
-
-    var m1 = [
-      [c,  s, 0],
-      [-s, c, 0],
-      [0,  0, 1]
-    ];
-
-    this.m_ = matrixMultiply(m1, this.m_);
-  };
-
-  contextPrototype.scale = function(aX, aY) {
-    this.arcScaleX_ *= aX;
-    this.arcScaleY_ *= aY;
-    var m1 = [
-      [aX, 0,  0],
-      [0,  aY, 0],
-      [0,  0,  1]
-    ];
-
-    var m = this.m_ = matrixMultiply(m1, this.m_);
-
-    // Get the line scale.
-    // Determinant of this.m_ means how much the area is enlarged by the
-    // transformation. So its square root can be used as a scale factor
-    // for width.
-    var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
-    this.lineScale_ = sqrt(abs(det));
-  };
-
-  /******** STUBS ********/
-  contextPrototype.clip = function() {
-    // TODO: Implement
-  };
-
-  contextPrototype.arcTo = function() {
-    // TODO: Implement
-  };
-
-  contextPrototype.createPattern = function() {
-    return new CanvasPattern_;
-  };
-
-  // Gradient / Pattern Stubs
-  function CanvasGradient_(aType) {
-    this.type_ = aType;
-    this.x0_ = 0;
-    this.y0_ = 0;
-    this.r0_ = 0;
-    this.x1_ = 0;
-    this.y1_ = 0;
-    this.r1_ = 0;
-    this.colors_ = [];
-  }
-
-  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
-    aColor = processStyle(aColor);
-    this.colors_.push({offset: aOffset,
-                       color: aColor.color,
-                       alpha: aColor.alpha});
-  };
-
-  function CanvasPattern_() {}
-
-  // set up externs
-  G_vmlCanvasManager = G_vmlCanvasManager_;
-  CanvasRenderingContext2D = CanvasRenderingContext2D_;
-  CanvasGradient = CanvasGradient_;
-  CanvasPattern = CanvasPattern_;
-
-})();
-
-} // if
--- a/kallithea/public/js/excanvas.min.js	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-if(!document.createElement("canvas").getContext){(function(){var R=Math;var S=R.round;var O=R.sin;var a=R.cos;var J=R.abs;var Y=R.sqrt;var A=10;var K=A/2;function G(){return this.context_||(this.context_=new M(this))}var Q=Array.prototype.slice;function b(c,d,e){var Z=Q.call(arguments,2);return function(){return c.apply(d,Z.concat(Q.call(arguments)))}}var H={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var c=Z||document;c.createElement("canvas");c.attachEvent("onreadystatechange",b(this.init_,this,c))}},init_:function(e){if(!e.namespaces.g_vml_){e.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!e.namespaces.g_o_){e.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!e.styleSheets.ex_canvas_){var d=e.createStyleSheet();d.owningElement.id="ex_canvas_";d.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=e.getElementsByTagName("canvas");for(var Z=0;Z<c.length;Z++){this.initElement(c[Z])}},initElement:function(c){if(!c.getContext){c.getContext=G;c.innerHTML="";c.attachEvent("onpropertychange",X);c.attachEvent("onresize",B);var Z=c.attributes;if(Z.width&&Z.width.specified){c.style.width=Z.width.nodeValue+"px"}else{c.width=c.clientWidth}if(Z.height&&Z.height.specified){c.style.height=Z.height.nodeValue+"px"}else{c.height=c.clientHeight}}return c}};function X(c){var Z=c.srcElement;switch(c.propertyName){case"width":Z.style.width=Z.attributes.width.nodeValue+"px";Z.getContext().clearRect();break;case"height":Z.style.height=Z.attributes.height.nodeValue+"px";Z.getContext().clearRect();break}}function B(c){var Z=c.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}H.init();var E=[];for(var V=0;V<16;V++){for(var U=0;U<16;U++){E[V*16+U]=V.toString(16)+U.toString(16)}}function N(){return[[1,0,0],[0,1,0],[0,0,1]]}function D(e,d){var c=N();for(var Z=0;Z<3;Z++){for(var h=0;h<3;h++){var f=0;for(var g=0;g<3;g++){f+=e[Z][g]*d[g][h]}c[Z][h]=f}}return c}function T(c,Z){Z.fillStyle=c.fillStyle;Z.lineCap=c.lineCap;Z.lineJoin=c.lineJoin;Z.lineWidth=c.lineWidth;Z.miterLimit=c.miterLimit;Z.shadowBlur=c.shadowBlur;Z.shadowColor=c.shadowColor;Z.shadowOffsetX=c.shadowOffsetX;Z.shadowOffsetY=c.shadowOffsetY;Z.strokeStyle=c.strokeStyle;Z.globalAlpha=c.globalAlpha;Z.arcScaleX_=c.arcScaleX_;Z.arcScaleY_=c.arcScaleY_;Z.lineScale_=c.lineScale_}function C(c){var f,e=1;c=String(c);if(c.substring(0,3)=="rgb"){var h=c.indexOf("(",3);var Z=c.indexOf(")",h+1);var g=c.substring(h+1,Z).split(",");f="#";for(var d=0;d<3;d++){f+=E[Number(g[d])]}if(g.length==4&&c.substr(3,1)=="a"){e=g[3]}}else{f=c}return{color:f,alpha:e}}function P(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function M(c){this.m_=N();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=A*1;this.globalAlpha=1;this.canvas=c;var Z=c.ownerDocument.createElement("div");Z.style.width=c.clientWidth+"px";Z.style.height=c.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";c.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var I=M.prototype;I.clearRect=function(){this.element_.innerHTML=""};I.beginPath=function(){this.currentPath_=[]};I.moveTo=function(c,Z){var d=this.getCoords_(c,Z);this.currentPath_.push({type:"moveTo",x:d.x,y:d.y});this.currentX_=d.x;this.currentY_=d.y};I.lineTo=function(c,Z){var d=this.getCoords_(c,Z);this.currentPath_.push({type:"lineTo",x:d.x,y:d.y});this.currentX_=d.x;this.currentY_=d.y};I.bezierCurveTo=function(d,c,j,i,h,f){var Z=this.getCoords_(h,f);var g=this.getCoords_(d,c);var e=this.getCoords_(j,i);L(this,g,e,Z)};function L(Z,e,d,c){Z.currentPath_.push({type:"bezierCurveTo",cp1x:e.x,cp1y:e.y,cp2x:d.x,cp2y:d.y,x:c.x,y:c.y});Z.currentX_=c.x;Z.currentY_=c.y}I.quadraticCurveTo=function(h,d,c,Z){var g=this.getCoords_(h,d);var f=this.getCoords_(c,Z);var i={x:this.currentX_+2/3*(g.x-this.currentX_),y:this.currentY_+2/3*(g.y-this.currentY_)};var e={x:i.x+(f.x-this.currentX_)/3,y:i.y+(f.y-this.currentY_)/3};L(this,i,e,f)};I.arc=function(k,i,j,f,c,d){j*=A;var o=d?"at":"wa";var l=k+a(f)*j-K;var n=i+O(f)*j-K;var Z=k+a(c)*j-K;var m=i+O(c)*j-K;if(l==Z&&!d){l+=0.125}var e=this.getCoords_(k,i);var h=this.getCoords_(l,n);var g=this.getCoords_(Z,m);this.currentPath_.push({type:o,x:e.x,y:e.y,radius:j,xStart:h.x,yStart:h.y,xEnd:g.x,yEnd:g.y})};I.rect=function(d,c,Z,e){this.moveTo(d,c);this.lineTo(d+Z,c);this.lineTo(d+Z,c+e);this.lineTo(d,c+e);this.closePath()};I.strokeRect=function(d,c,Z,e){var f=this.currentPath_;this.beginPath();this.moveTo(d,c);this.lineTo(d+Z,c);this.lineTo(d+Z,c+e);this.lineTo(d,c+e);this.closePath();this.stroke();this.currentPath_=f};I.fillRect=function(d,c,Z,e){var f=this.currentPath_;this.beginPath();this.moveTo(d,c);this.lineTo(d+Z,c);this.lineTo(d+Z,c+e);this.lineTo(d,c+e);this.closePath();this.fill();this.currentPath_=f};I.createLinearGradient=function(c,e,Z,d){var f=new W("gradient");f.x0_=c;f.y0_=e;f.x1_=Z;f.y1_=d;return f};I.createRadialGradient=function(e,g,d,c,f,Z){var h=new W("gradientradial");h.x0_=e;h.y0_=g;h.r0_=d;h.x1_=c;h.y1_=f;h.r1_=Z;return h};I.drawImage=function(s,e){var l,j,n,AA,q,o,u,AC;var m=s.runtimeStyle.width;var r=s.runtimeStyle.height;s.runtimeStyle.width="auto";s.runtimeStyle.height="auto";var k=s.width;var y=s.height;s.runtimeStyle.width=m;s.runtimeStyle.height=r;if(arguments.length==3){l=arguments[1];j=arguments[2];q=o=0;u=n=k;AC=AA=y}else{if(arguments.length==5){l=arguments[1];j=arguments[2];n=arguments[3];AA=arguments[4];q=o=0;u=k;AC=y}else{if(arguments.length==9){q=arguments[1];o=arguments[2];u=arguments[3];AC=arguments[4];l=arguments[5];j=arguments[6];n=arguments[7];AA=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AB=this.getCoords_(l,j);var f=u/2;var c=AC/2;var z=[];var Z=10;var i=10;z.push(" <g_vml_:group",' coordsize="',A*Z,",",A*i,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",i,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]){var g=[];g.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",S(AB.x/A),",","Dy=",S(AB.y/A),"");var x=AB;var v=this.getCoords_(l+n,j);var t=this.getCoords_(l,j+AA);var p=this.getCoords_(l+n,j+AA);x.x=R.max(x.x,v.x,t.x,p.x);x.y=R.max(x.y,v.y,t.y,p.y);z.push("padding:0 ",S(x.x/A),"px ",S(x.y/A),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",g.join(""),", sizingmethod='clip');")}else{z.push("top:",S(AB.y/A),"px;left:",S(AB.x/A),"px;")}z.push(' ">','<g_vml_:image src="',s.src,'"',' style="width:',A*n,"px;"," height:",A*AA,'px;"',' cropleft="',q/k,'"',' croptop="',o/y,'"',' cropright="',(k-q-u)/k,'"',' cropbottom="',(y-o-AC)/y,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",z.join(""))};I.stroke=function(AE){var j=[];var k=false;var AP=C(AE?this.fillStyle:this.strokeStyle);var AA=AP.color;var AK=AP.alpha*this.globalAlpha;var f=10;var m=10;j.push("<g_vml_:shape",' filled="',!!AE,'"',' style="position:absolute;width:',f,"px;height:",m,'px;"',' coordorigin="0 0" coordsize="',A*f," ",A*m,'"',' stroked="',!AE,'"',' path="');var l=false;var AO={x:null,y:null};var w={x:null,y:null};for(var AJ=0;AJ<this.currentPath_.length;AJ++){var AI=this.currentPath_[AJ];var AN;switch(AI.type){case"moveTo":AN=AI;j.push(" m ",S(AI.x),",",S(AI.y));break;case"lineTo":j.push(" l ",S(AI.x),",",S(AI.y));break;case"close":j.push(" x ");AI=null;break;case"bezierCurveTo":j.push(" c ",S(AI.cp1x),",",S(AI.cp1y),",",S(AI.cp2x),",",S(AI.cp2y),",",S(AI.x),",",S(AI.y));break;case"at":case"wa":j.push(" ",AI.type," ",S(AI.x-this.arcScaleX_*AI.radius),",",S(AI.y-this.arcScaleY_*AI.radius)," ",S(AI.x+this.arcScaleX_*AI.radius),",",S(AI.y+this.arcScaleY_*AI.radius)," ",S(AI.xStart),",",S(AI.yStart)," ",S(AI.xEnd),",",S(AI.yEnd));break}if(AI){if(AO.x==null||AI.x<AO.x){AO.x=AI.x}if(w.x==null||AI.x>w.x){w.x=AI.x}if(AO.y==null||AI.y<AO.y){AO.y=AI.y}if(w.y==null||AI.y>w.y){w.y=AI.y}}}j.push(' ">');if(!AE){var v=this.lineScale_*this.lineWidth;if(v<1){AK*=v}j.push("<g_vml_:stroke",' opacity="',AK,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',P(this.lineCap),'"',' weight="',v,'px"',' color="',AA,'" />')}else{if(typeof this.fillStyle=="object"){var n=this.fillStyle;var t=0;var AH={x:0,y:0};var AB=0;var r=1;if(n.type_=="gradient"){var q=n.x0_/this.arcScaleX_;var d=n.y0_/this.arcScaleY_;var o=n.x1_/this.arcScaleX_;var AQ=n.y1_/this.arcScaleY_;var AM=this.getCoords_(q,d);var AL=this.getCoords_(o,AQ);var h=AL.x-AM.x;var g=AL.y-AM.y;t=Math.atan2(h,g)*180/Math.PI;if(t<0){t+=360}if(t<0.000001){t=0}}else{var AM=this.getCoords_(n.x0_,n.y0_);var Z=w.x-AO.x;var e=w.y-AO.y;AH={x:(AM.x-AO.x)/Z,y:(AM.y-AO.y)/e};Z/=this.arcScaleX_*A;e/=this.arcScaleY_*A;var AG=R.max(Z,e);AB=2*n.r0_/AG;r=2*n.r1_/AG-AB}var z=n.colors_;z.sort(function(i,c){return i.offset-c.offset});var u=z.length;var y=z[0].color;var x=z[u-1].color;var AD=z[0].alpha*this.globalAlpha;var AC=z[u-1].alpha*this.globalAlpha;var AF=[];for(var AJ=0;AJ<u;AJ++){var s=z[AJ];AF.push(s.offset*r+AB+" "+s.color)}j.push('<g_vml_:fill type="',n.type_,'"',' method="none" focus="100%"',' color="',y,'"',' color2="',x,'"',' colors="',AF.join(","),'"',' opacity="',AC,'"',' g_o_:opacity2="',AD,'"',' angle="',t,'"',' focusposition="',AH.x,",",AH.y,'" />')}else{j.push('<g_vml_:fill color="',AA,'" opacity="',AK,'" />')}}j.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",j.join(""))};I.fill=function(){this.stroke(true)};I.closePath=function(){this.currentPath_.push({type:"close"})};I.getCoords_=function(d,c){var Z=this.m_;return{x:A*(d*Z[0][0]+c*Z[1][0]+Z[2][0])-K,y:A*(d*Z[0][1]+c*Z[1][1]+Z[2][1])-K}};I.save=function(){var Z={};T(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=D(N(),this.m_)};I.restore=function(){T(this.aStack_.pop(),this);this.m_=this.mStack_.pop()};I.translate=function(d,c){var Z=[[1,0,0],[0,1,0],[d,c,1]];this.m_=D(Z,this.m_)};I.rotate=function(d){var f=a(d);var e=O(d);var Z=[[f,e,0],[-e,f,0],[0,0,1]];this.m_=D(Z,this.m_)};I.scale=function(f,e){this.arcScaleX_*=f;this.arcScaleY_*=e;var c=[[f,0,0],[0,e,0],[0,0,1]];var Z=this.m_=D(c,this.m_);var d=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];this.lineScale_=Y(J(d))};I.clip=function(){};I.arcTo=function(){};I.createPattern=function(){return new F};function W(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}W.prototype.addColorStop=function(c,Z){Z=C(Z);this.colors_.push({offset:c,color:Z.color,alpha:Z.alpha})};function F(){}G_vmlCanvasManager=H;CanvasRenderingContext2D=M;CanvasGradient=W;CanvasPattern=F})()};
\ No newline at end of file
--- a/kallithea/public/js/graph.js	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/public/js/graph.js	Sun Sep 06 23:36:05 2015 +0200
@@ -105,6 +105,7 @@
 			node = cur[0];
 			in_l = cur[1];
 			closing = cur[2];
+			obsolete_node = cur[3];
 
 			var rowY = row.offsetTop + row.offsetHeight/2;
 			var nextY = (next == null) ? rowY + row.offsetHeight/2 : next.offsetTop + next.offsetHeight/2;
@@ -114,6 +115,7 @@
 				start = line[0];
 				end = line[1];
 				color = line[2];
+				obsolete_line = line[3];
 				
 				x = Math.floor(base_x - box_size * start);
 
@@ -158,6 +160,11 @@
 				
 				this.ctx.lineWidth=this.line_width;
 				this.ctx.beginPath();
+				if (obsolete_line)
+				{
+					this.ctx.setLineDash([5]);
+				}
+				this.ctx.beginPath();
 				this.ctx.moveTo(x, rowY);
 				if (start == end)
 				{
@@ -167,9 +174,14 @@
 				{
 					var x2 = Math.floor(base_x - box_size * end);
 					var ymid = (rowY+nextY) / 2;
+					if (obsolete_node)
+					{
+						this.ctx.setLineDash([5]);
+					}
 					this.ctx.bezierCurveTo (x,ymid,x2,ymid,x2,nextY);
 				}
 				this.ctx.stroke();
+				this.ctx.setLineDash([]); // reset the dashed line, if any
 			}
 			
 			column = node[0];
@@ -178,6 +190,19 @@
 			x = Math.floor(base_x - box_size * column);
 		
 			this.setColor(color, 0.25, 0.75);
+
+
+			r = this.dot_radius
+			if (obsolete_node)
+			{
+				this.ctx.beginPath();
+				this.ctx.moveTo(x - this.close_x, rowY - this.close_y - 3);
+				this.ctx.lineTo(x - this.close_x + 2*this.close_x, rowY - this.close_y + 4*this.close_y - 1);
+				this.ctx.moveTo(x - this.close_x, rowY - this.close_y + 4*this.close_y - 1);
+				this.ctx.lineTo(x - this.close_x + 2*this.close_x, rowY - this.close_y - 3);
+				this.ctx.stroke();
+				r -= 0.5
+			}
 			if (closing)
 			{
 				this.ctx.fillRect(x - this.close_x, rowY - this.close_y, 2*this.close_x, 2*this.close_y);
@@ -185,7 +210,7 @@
 			else
 			{
 				this.ctx.beginPath();
-				this.ctx.arc(x, rowY, this.dot_radius, 0, Math.PI * 2, true);
+				this.ctx.arc(x, rowY, r, 0, Math.PI * 2, true);
 				this.ctx.fill();
 			}
 
--- a/kallithea/public/js/pyroutes_map.js	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-//Format is key == name
-//    "mark_error_fixed": [ # key
-//        "/mark_error_fixed/%(error_id)s", #url template
-//        [
-//            "error_id" # list of args
-//        ]
-//    ],
-//
-var PROUTES_MAP = {
-
-}
\ No newline at end of file
--- a/kallithea/templates/about.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/about.html	Sun Sep 06 23:36:05 2015 +0200
@@ -26,43 +26,98 @@
   <p>Kallithea is copyrighted by various authors, including but not
   necessarily limited to the following:
   <ul style="margin: 0 0 0 50px;">
-  <li>Copyright &copy; 2010&ndash;2013, RhodeCode GmbH</li>
-  <li>Copyright &copy; 2011&ndash;2015, Unity Technologies</li>
+
+  <li>Copyright &copy; 2012&ndash;2015, Mads Kiilerich</li>
+  <li>Copyright &copy; 2012&ndash;2015, Takumi IINO</li>
+  <li>Copyright &copy; 2012&ndash;2015, Unity Technologies</li>
   <li>Copyright &copy; 2012, 2014&ndash;2015, Andrew Shadura</li>
-  <li>Copyright &copy; 2012, Augusto Herrmann</li>
-  <li>Copyright &copy; 2012, Dan Sheridan</li>
-  <li>Copyright &copy; 2012, 2014&ndash;2015, Dominik Ruf</li>
-  <li>Copyright &copy; 2012, Vincent Duvert</li>
-  <li>Copyright &copy; 2011, Liad Shani</li>
-  <li>Copyright &copy; 2013, Jonathan Sternberg</li>
-  <li>Copyright &copy; 2011, Jason F. Harris</li>
-  <li>Copyright &copy; 2011, Lorenzo M. Catucci</li>
+  <li>Copyright &copy; 2012&ndash;2013, 2015, Aras Pranckevičius</li>
+  <li>Copyright &copy; 2014&ndash;2015, Christian Oyarzun</li>
+  <li>Copyright &copy; 2014&ndash;2015, Joseph Rivera</li>
+  <li>Copyright &copy; 2014&ndash;2015, Sean Farley</li>
+  <li>Copyright &copy; 2014&ndash;2015, Thomas De Schampheleire</li>
+  <li>Copyright &copy; 2015, Anatoly Bubenkov</li>
+  <li>Copyright &copy; 2015, Andrew Bartlett</li>
+  <li>Copyright &copy; 2015, Balázs Úr</li>
+  <li>Copyright &copy; 2015, Ben Finney</li>
+  <li>Copyright &copy; 2015, Branko Majic</li>
+  <li>Copyright &copy; 2015, Daniel Hobley</li>
+  <li>Copyright &copy; 2015, David Avigni</li>
+  <li>Copyright &copy; 2015, Denis Blanchette</li>
+  <li>Copyright &copy; 2015, duanhongyi</li>
+  <li>Copyright &copy; 2015, EriCSN Chang</li>
+  <li>Copyright &copy; 2015, Étienne Gilli</li>
+  <li>Copyright &copy; 2015, Grzegorz Krason</li>
+  <li>Copyright &copy; 2015, Jan Heylen</li>
+  <li>Copyright &copy; 2015, Kazunari Kobayashi</li>
+  <li>Copyright &copy; 2015, Kevin Bullock</li>
+  <li>Copyright &copy; 2015, kobanari</li>
+  <li>Copyright &copy; 2015, Marc Abramowitz</li>
+  <li>Copyright &copy; 2015, Marc Villetard</li>
+  <li>Copyright &copy; 2015, Matthias Zilk</li>
+  <li>Copyright &copy; 2015, Michael Pohl</li>
+  <li>Copyright &copy; 2015, Michael V. DePalatis</li>
+  <li>Copyright &copy; 2015, Morten Skaaning</li>
+  <li>Copyright &copy; 2015, Nick High</li>
+  <li>Copyright &copy; 2015, Niemand Jedermann</li>
+  <li>Copyright &copy; 2015, Peter Vitt</li>
+  <li>Copyright &copy; 2015, Robert Martinez</li>
+  <li>Copyright &copy; 2015, Ronny Pfannschmidt</li>
+  <li>Copyright &copy; 2015, Sam Jaques</li>
+  <li>Copyright &copy; 2015, Søren Løvborg</li>
+  <li>Copyright &copy; 2015, Tuux</li>
+  <li>Copyright &copy; 2015, Viktar Palstsiuk</li>
+  <li>Copyright &copy; 2012, 2014, Dominik Ruf</li>
+  <li>Copyright &copy; 2014, Bradley M. Kuhn</li>
+  <li>Copyright &copy; 2014, Calinou</li>
+  <li>Copyright &copy; 2014, Daniel Anderson</li>
+  <li>Copyright &copy; 2014, Henrik Stuart</li>
+  <li>Copyright &copy; 2014, Ingo von Borstel</li>
+  <li>Copyright &copy; 2014, Jelmer Vernooij</li>
+  <li>Copyright &copy; 2014, Jim Hague</li>
+  <li>Copyright &copy; 2014, Matt Fellows</li>
+  <li>Copyright &copy; 2014, Max Roman</li>
+  <li>Copyright &copy; 2014, Michal Čihař</li>
+  <li>Copyright &copy; 2014, Na'Tosha Bard</li>
+  <li>Copyright &copy; 2014, Rasmus Selsmark</li>
+  <li>Copyright &copy; 2014, Tim Freund</li>
+  <li>Copyright &copy; 2014, Travis Burtrum</li>
+  <li>Copyright &copy; 2014, Zoltan Gyarmati</li>
+  <li>Copyright &copy; 2010&ndash;2013, Marcin Kuźmiński</li>
+  <li>Copyright &copy; 2010&ndash;2013, RhodeCode GmbH</li>
+  <li>Copyright &copy; 2011, 2013, Aparkar</li>
+  <li>Copyright &copy; 2012&ndash;2013, xpol</li>
+  <li>Copyright &copy; 2013, Dennis Brakhane</li>
   <li>Copyright &copy; 2013, Grzegorz Rożniecki</li>
-  <li>Copyright &copy; 2011, Les Peabody</li>
-  <li>Copyright &copy; 2011, Nicolas VINOT</li>
-  <li>Copyright &copy; 2012, Indra Talip</li>
+  <li>Copyright &copy; 2013, Jonathan Sternberg</li>
+  <li>Copyright &copy; 2013, Leonardo Carneiro</li>
+  <li>Copyright &copy; 2013, Magnus Ericmats</li>
+  <li>Copyright &copy; 2013, Martin Vium</li>
+  <li>Copyright &copy; 2013, Simon Lopez</li>
+  <li>Copyright &copy; 2011&ndash;2012, Augusto Herrmann</li>
+  <li>Copyright &copy; 2012, Dan Sheridan</li>
   <li>Copyright &copy; 2012, H Waldo G</li>
-  <li>Copyright &copy; 2011, Aparkar</li>
-  <li>Copyright &copy; 2013, Dennis Brakhane</li>
-  <li>Copyright &copy; 2011, Matt Zuba</li>
-  <li>Copyright &copy; 2014, Bradley M. Kuhn</li>
-  <li>Copyright &copy; 2012&ndash;2013, xpol</li>
   <li>Copyright &copy; 2012, hppj</li>
-  <li>Copyright &copy; 2013&ndash;2015, Takumi IINO</li>
-  <li>Copyright &copy; 2011, Shawn K. O'Shea</li>
-  <li>Copyright &copy; 2012, Tony Bussieres</li>
-  <li>Copyright &copy; 2011, Simon Lopez</li>
+  <li>Copyright &copy; 2012, Indra Talip</li>
   <li>Copyright &copy; 2012, mikespook</li>
   <li>Copyright &copy; 2012, nansenat16</li>
-  <li>Copyright &copy; 2012, Zachary Auclair</li>
+  <li>Copyright &copy; 2012, Philip Jameson</li>
   <li>Copyright &copy; 2012, Raoul Thill</li>
+  <li>Copyright &copy; 2012, Tony Bussieres</li>
+  <li>Copyright &copy; 2012, Vincent Duvert</li>
+  <li>Copyright &copy; 2012, Vladislav Poluhin</li>
+  <li>Copyright &copy; 2012, Zachary Auclair</li>
+  <li>Copyright &copy; 2011, Ankit Solanki</li>
+  <li>Copyright &copy; 2011, Dmitri Kuznetsov</li>
   <li>Copyright &copy; 2011, Jared Bunting</li>
-  <li>Copyright &copy; 2013, Magnus Ericmats</li>
+  <li>Copyright &copy; 2011, Jason Harris</li>
+  <li>Copyright &copy; 2011, Les Peabody</li>
+  <li>Copyright &copy; 2011, Liad Shani</li>
+  <li>Copyright &copy; 2011, Lorenzo M. Catucci</li>
+  <li>Copyright &copy; 2011, Matt Zuba</li>
+  <li>Copyright &copy; 2011, Nicolas VINOT</li>
+  <li>Copyright &copy; 2011, Shawn K. O'Shea</li>
   <li>Copyright &copy; 2010, Łukasz Balcerzak</li>
-  <li>Copyright &copy; 2014&ndash;2015, Sean Farley</li>
-  <li>Copyright &copy; 2014, Martin Vium</li>
-  <li>Copyright &copy; 2014, Daniel Anderson</li>
-  <li>Copyright &copy; 2014, Travis Burtrum</li>
 
 ## We did not list the following copyright holders, given that they appeared
 ## to use for-profit company affiliations in their contribution in the
--- a/kallithea/templates/admin/admin.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/admin.html	Sun Sep 06 23:36:05 2015 +0200
@@ -8,7 +8,7 @@
 <%def name="breadcrumbs_links()">
     <form id="filter_form">
     <input class="q_filter_box ${'' if c.search_term else 'initial'}" id="j_filter" size="15" type="text" name="filter" value="${c.search_term or _('journal filter...')}"/>
-    <span class="tooltip" title="${h.tooltip(h.journal_filter_help())}">?</span>
+    <span class="tooltip" title="${h.journal_filter_help()}">?</span>
     <input type='submit' value="${_('Filter')}" class="btn btn-mini" style="padding:0px 2px 0px 2px;margin:0px"/>
     ${_('Admin Journal')} - ${ungettext('%s Entry', '%s Entries', c.users_log.item_count) % (c.users_log.item_count)}
     </form>
--- a/kallithea/templates/admin/auth/auth_settings.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/auth/auth_settings.html	Sun Sep 06 23:36:05 2015 +0200
@@ -30,14 +30,14 @@
        <div class="field">
            <div class="label"><label for="auth_plugins">${_("Enabled Plugins")}</label></div>
            <div class="input">${h.text("auth_plugins", class_='large')}
-           <span class="help-block">${_('Comma separated list of plugins. Order of plugins is also order in which Kallithea will try to authenticate user')}</span>
+           <span class="help-block">${_('Comma-separated list of plugins; Kallithea will try user authentication in plugin order')}</span>
                <div style="padding:10px 0px 10px 0px;font-weight: bold">${_('Available built-in plugins')}</div>
                <ul>
                %for plugin_path in c.available_plugins:
                     <li>
                       <div style="padding:3px 0px 3px 0px">
                           <span style="margin: 0px 10px 0px 0px" plugin_id="${plugin_path}" class="toggle-plugin btn btn-mini ${'btn-success' if plugin_path in c.enabled_plugins else ''}">
-                          ${_('enabled') if plugin_path in c.enabled_plugins else _('disabled')}</span>${plugin_path}
+                          ${_('Enabled') if plugin_path in c.enabled_plugins else _('Disabled')}</span>${plugin_path}
                       </div>
                     </li>
                %endfor
@@ -46,8 +46,8 @@
        </div>
     </div>
 
-    %for cnt, module in enumerate(c.auth_plugins):
-        <% pluginName = c.auth_plugins_shortnames[module] %>
+    %for cnt, module in enumerate(c.enabled_plugins):
+        <% pluginName = c.plugin_shortnames[module] %>
         <h1>${_('Plugin')}: ${pluginName}</h1>
         <div class="fields">
         ## autoform generation, based on plugin definition from it's settings
@@ -58,7 +58,7 @@
             <div class="field">
                 <div class="label"><label for="${fullsetting}">${_(displayname)}</label></div>
                 <div class="input">
-                    ${h.password(fullsetting,class_='small',autocomplete="off")}
+                    ${h.password(fullsetting,class_='small')}
                     <span class="help-block">${setting["description"]}</span>
                 </div>
             </div>
@@ -122,7 +122,6 @@
             $cur_button.html(_TM['disabled']);
         }
         else{
-            console.log(elems);
             if(elems.indexOf(plugin_id) == -1){
                 elems.push(plugin_id);
             }
--- a/kallithea/templates/admin/defaults/defaults.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/defaults/defaults.html	Sun Sep 06 23:36:05 2015 +0200
@@ -8,7 +8,7 @@
 <%def name="breadcrumbs_links()">
     ${h.link_to(_('Admin'),h.url('admin_home'))}
     &raquo;
-    ${_('Defaults')}
+    ${_('Repository Defaults')}
 </%def>
 
 <%block name="header_menu">
--- a/kallithea/templates/admin/gists/edit.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/gists/edit.html	Sun Sep 06 23:36:05 2015 +0200
@@ -58,7 +58,7 @@
                     ${h.select('lifetime', '0', c.lifetime_options)}
                     <span class="" style="color: #AAA">
                      %if c.gist.gist_expires == -1:
-                      ${_('Expires')}: ${_('never')}
+                      ${_('Expires')}: ${_('Never')}
                      %else:
                       ${_('Expires')}: ${h.age(h.time_to_datetime(c.gist.gist_expires))}
                      %endif
@@ -94,7 +94,7 @@
                         $(opt).attr('mode', m.mode);
                         if (m.mime == 'text/plain') {
                             // default plain text
-                            $(opt).attr('selected', 'selected');
+                            $(opt).prop('selected', true);
                             modes_select.options[0] = opt;
                         } else {
                             modes_select.options[index++] = opt;
@@ -164,7 +164,7 @@
                         $('#eform').submit();
                       }
                     }
-                  })
+                  });
               });
           </script>
         </div>
--- a/kallithea/templates/admin/gists/index.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/gists/index.html	Sun Sep 06 23:36:05 2015 +0200
@@ -34,7 +34,7 @@
         %if c.authuser.username != 'default':
         <ul class="links">
           <li>
-             <a href="${h.url('new_gist')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_(u'Create New Gist')}</a>
+             <a href="${h.url('new_gist')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_('Create New Gist')}</a>
           </li>
         </ul>
         %endif
@@ -54,7 +54,7 @@
                 ${_('Created')} ${h.age(gist.created_on)} /
                 <span style="color: #AAA">
                   %if gist.gist_expires == -1:
-                   ${_('Expires')}: ${_('never')}
+                   ${_('Expires')}: ${_('Never')}
                   %else:
                    ${_('Expires')}: ${h.age(h.time_to_datetime(gist.gist_expires))}
                   %endif
--- a/kallithea/templates/admin/gists/new.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/gists/new.html	Sun Sep 06 23:36:05 2015 +0200
@@ -72,7 +72,7 @@
                     $(opt).attr('mode', m.mode);
                     if (m.mime == 'text/plain') {
                         // default plain text
-                        $(opt).attr('selected', 'selected');
+                        $(opt).prop('selected', true);
                         modes_select.options[0] = opt;
                     } else {
                         modes_select.options[index++] = opt;
--- a/kallithea/templates/admin/gists/show.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/gists/show.html	Sun Sep 06 23:36:05 2015 +0200
@@ -22,7 +22,7 @@
         %if c.authuser.username != 'default':
         <ul class="links">
           <li>
-              <a href="${h.url('new_gist')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_(u'Create New Gist')}</a>
+              <a href="${h.url('new_gist')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_('Create New Gist')}</a>
           </li>
         </ul>
         %endif
@@ -44,7 +44,7 @@
                         </div>
                         <div class="left item last" style="color: #AAA">
                          %if c.gist.gist_expires == -1:
-                          ${_('Expires')}: ${_('never')}
+                          ${_('Expires')}: ${_('Never')}
                          %else:
                           ${_('Expires')}: ${h.age(h.time_to_datetime(c.gist.gist_expires))}
                          %endif
--- a/kallithea/templates/admin/my_account/my_account.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/my_account/my_account.html	Sun Sep 06 23:36:05 2015 +0200
@@ -33,12 +33,12 @@
            </div>
           </li>
           <li class="${'active' if c.active=='profile' else ''}"><a href="${h.url('my_account')}">${_('Profile')}</a></li>
+          <li class="${'active' if c.active=='emails' else ''}"><a href="${h.url('my_account_emails')}">${_('Email Addresses')}</a></li>
           <li class="${'active' if c.active=='password' else ''}"><a href="${h.url('my_account_password')}">${_('Password')}</a></li>
           <li class="${'active' if c.active=='api_keys' else ''}"><a href="${h.url('my_account_api_keys')}">${_('API Keys')}</a></li>
-          <li class="${'active' if c.active=='emails' else ''}"><a href="${h.url('my_account_emails')}">${_('My Emails')}</a></li>
-          <li class="${'active' if c.active=='repos' else ''}"><a href="${h.url('my_account_repos')}">${_('My Repositories')}</a></li>
-          <li class="${'active' if c.active=='watched' else ''}"><a href="${h.url('my_account_watched')}">${_('Watched')}</a></li>
-          <li class="${'active' if c.active=='perms' else ''}"><a href="${h.url('my_account_perms')}">${_('My Permissions')}</a></li>
+          <li class="${'active' if c.active=='repos' else ''}"><a href="${h.url('my_account_repos')}">${_('Owned Repositories')}</a></li>
+          <li class="${'active' if c.active=='watched' else ''}"><a href="${h.url('my_account_watched')}">${_('Watched Repositories')}</a></li>
+          <li class="${'active' if c.active=='perms' else ''}"><a href="${h.url('my_account_perms')}">${_('Show Permissions')}</a></li>
         </ul>
     </div>
 
--- a/kallithea/templates/admin/my_account/my_account_api_keys.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/my_account/my_account_api_keys.html	Sun Sep 06 23:36:05 2015 +0200
@@ -5,14 +5,14 @@
         <td>
             <span class="btn btn-mini btn-success disabled">${_('Built-in')}</span>
         </td>
-        <td>${_('expires')}: ${_('never')}</td>
+        <td>${_('Expires')}: ${_('Never')}</td>
         <td>
             ${h.form(url('my_account_api_keys'),method='delete')}
                 ${h.hidden('del_api_key',c.user.api_key)}
                 ${h.hidden('del_api_key_builtin',1)}
                 <button class="btn btn-mini btn-danger" type="submit"
-                        onclick="return confirm('${_('Confirm to reset this api key: %s') % c.user.api_key}');">
-                    ${_('reset')}
+                        onclick="return confirm('${_('Confirm to reset this API key: %s') % c.user.api_key}');">
+                    ${_('Reset')}
                 </button>
             ${h.end_form()}
         </td>
@@ -24,12 +24,12 @@
             <td>${api_key.description}</td>
             <td style="min-width: 80px">
                  %if api_key.expires == -1:
-                  ${_('expires')}: ${_('never')}
+                  ${_('Expires')}: ${_('Never')}
                  %else:
                     %if api_key.expired:
-                        ${_('expired')}: ${h.age(h.time_to_datetime(api_key.expires))}
+                        ${_('Expired')}: ${h.age(h.time_to_datetime(api_key.expires))}
                     %else:
-                        ${_('expires')}: ${h.age(h.time_to_datetime(api_key.expires))}
+                        ${_('Expires')}: ${h.age(h.time_to_datetime(api_key.expires))}
                     %endif
                  %endif
             </td>
@@ -37,16 +37,16 @@
                 ${h.form(url('my_account_api_keys'),method='delete')}
                     ${h.hidden('del_api_key',api_key.api_key)}
                     <button class="btn btn-mini btn-danger" type="submit"
-                            onclick="return confirm('${_('Confirm to remove this api key: %s') % api_key.api_key}');">
+                            onclick="return confirm('${_('Confirm to remove this API key: %s') % api_key.api_key}');">
                         <i class="icon-minus-circled"></i>
-                        ${_('remove')}
+                        ${_('Remove')}
                     </button>
                 ${h.end_form()}
             </td>
           </tr>
         %endfor
     %else:
-    <tr><td><div class="ip">${_('No additional api keys specified')}</div></td></tr>
+    <tr><td><div class="ip">${_('No additional API keys specified')}</div></td></tr>
     %endif
   </table>
 </div>
@@ -58,7 +58,7 @@
         <div class="fields">
              <div class="field">
                 <div class="label">
-                    <label for="description">${_('New api key')}:</label>
+                    <label for="description">${_('New API key')}:</label>
                 </div>
                 <div class="input">
                     ${h.text('description', class_='medium', placeholder=_('Description'))}
@@ -79,5 +79,5 @@
         $("#lifetime").select2({
             'dropdownAutoWidth': true
         });
-    })
+    });
 </script>
--- a/kallithea/templates/admin/my_account/my_account_emails.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/my_account/my_account_emails.html	Sun Sep 06 23:36:05 2015 +0200
@@ -16,7 +16,7 @@
                 ${h.form(url('my_account_emails'),method='delete')}
                     ${h.hidden('del_email_id',em.email_id)}
                     <i class="icon-minus-circled" style="color:#FF4444"></i>
-                    ${h.submit('remove_',_('delete'),id="remove_email_%s" % em.email_id,
+                    ${h.submit('remove_',_('Delete'),id="remove_email_%s" % em.email_id,
                     class_="action_button", onclick="return  confirm('"+_('Confirm to delete this email: %s') % em.email+"');")}
                 ${h.end_form()}
             </td>
--- a/kallithea/templates/admin/my_account/my_account_password.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/my_account/my_account_password.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,7 @@
 <div style="font-size: 20px; color: #666666; padding: 0px 0px 10px 0px">${_('Change Your Account Password')}</div>
+
+%if c.can_change_password:
+
 ${h.form(url('my_account_password'), method='post')}
 <div class="form">
     <div class="fields">
@@ -7,7 +10,7 @@
             <label for="current_password">${_('Current password')}:</label>
         </div>
         <div class="input">
-            ${h.password('current_password',class_='medium',autocomplete="off")}
+            ${h.password('current_password',class_='medium')}
         </div>
      </div>
 
@@ -16,16 +19,16 @@
             <label for="new_password">${_('New password')}:</label>
         </div>
         <div class="input">
-            ${h.password('new_password',class_='medium', autocomplete="off")}
+            ${h.password('new_password',class_='medium')}
         </div>
      </div>
 
      <div class="field">
         <div class="label">
-            <label for="password_confirmation">${_('Confirm new password')}:</label>
+            <label for="new_password_confirmation">${_('Confirm new password')}:</label>
         </div>
         <div class="input">
-            ${h.password('new_password_confirmation',class_='medium', autocomplete="off")}
+            ${h.password('new_password_confirmation',class_='medium')}
         </div>
      </div>
 
@@ -36,3 +39,9 @@
     </div>
 </div>
 ${h.end_form()}
+
+%else:
+
+${_('This account is managed with %s and the password cannot be changed here') % c.user.extern_type}
+
+%endif
--- a/kallithea/templates/admin/my_account/my_account_profile.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/my_account/my_account_profile.html	Sun Sep 06 23:36:05 2015 +0200
@@ -13,28 +13,19 @@
                 %else:
                 <strong>${_('Avatars are disabled')}</strong>
                 <br/>${c.user.email or _('Missing email, please update your user email address.')}
-                    [${_('current IP')}: ${c.perm_user.ip_addr or "?"}]
+                    [${_('Current IP')}: ${c.ip_addr}]
                 %endif
                </p>
            </div>
          </div>
 
-        <% readonly = None %>
-        <% disabled = "" %>
         <div class="fields">
-           %if c.extern_type != c.EXTERN_TYPE_INTERNAL:
-                <% readonly = "readonly" %>
-                <% disabled = " disabled" %>
-                <strong>${_('Your user is in an external Source of Record; some details cannot be managed here')}.</strong>
-           %endif
              <div class="field">
                 <div class="label">
                     <label for="username">${_('Username')}:</label>
                 </div>
                 <div class="input">
-                  ${h.text('username',class_='medium%s' % disabled, readonly=readonly)}
-                  ${h.hidden('extern_name', c.extern_name)}
-                  ${h.hidden('extern_type', c.extern_type)}
+                  ${h.text('username',class_='medium', readonly=c.readonly('username'))}
                 </div>
              </div>
 
@@ -43,7 +34,7 @@
                     <label for="name">${_('First Name')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('firstname',class_="medium")}
+                    ${h.text('firstname',class_="medium", readonly=c.readonly('firstname'))}
                 </div>
              </div>
 
@@ -52,7 +43,7 @@
                     <label for="lastname">${_('Last Name')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('lastname',class_="medium")}
+                    ${h.text('lastname',class_="medium", readonly=c.readonly('lastname'))}
                 </div>
              </div>
 
@@ -61,8 +52,7 @@
                     <label for="email">${_('Email')}:</label>
                 </div>
                 <div class="input">
-                    ## we should be able to edit email !
-                    ${h.text('email',class_="medium")}
+                    ${h.text('email',class_="medium", readonly=c.readonly('email'))}
                 </div>
              </div>
 
--- a/kallithea/templates/admin/my_account/my_account_repos.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/my_account/my_account_repos.html	Sun Sep 06 23:36:05 2015 +0200
@@ -30,7 +30,7 @@
         if (req) {
             req = req.toLowerCase();
             for (i = 0; i<data.length; i++) {
-                var pos = data[i].raw_name.toLowerCase().indexOf(req)
+                var pos = data[i].raw_name.toLowerCase().indexOf(req);
                 if (pos != -1) {
                     filtered.push(data[i]);
                 }
--- a/kallithea/templates/admin/my_account/my_account_watched.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/my_account/my_account_watched.html	Sun Sep 06 23:36:05 2015 +0200
@@ -30,7 +30,7 @@
         if (req) {
             req = req.toLowerCase();
             for (i = 0; i<data.length; i++) {
-                var pos = data[i].raw_name.toLowerCase().indexOf(req)
+                var pos = data[i].raw_name.toLowerCase().indexOf(req);
                 if (pos != -1) {
                     filtered.push(data[i]);
                 }
--- a/kallithea/templates/admin/notifications/show_notification.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/notifications/show_notification.html	Sun Sep 06 23:36:05 2015 +0200
@@ -48,7 +48,7 @@
 var main = "${url('notifications')}";
    $('.delete-notification').click(function(e){
        var notification_id = e.currentTarget.id;
-       deleteNotification(url,notification_id,[function(){window.location=main}])
+       deleteNotification(url,notification_id,[function(){window.location=main}]);
    });
 </script>
 </%def>
--- a/kallithea/templates/admin/permissions/permissions.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/permissions/permissions.html	Sun Sep 06 23:36:05 2015 +0200
@@ -2,13 +2,13 @@
 <%inherit file="/base/base.html"/>
 
 <%block name="title">
-    ${_('Permissions Administration')}
+    ${_('Default Permissions')}
 </%block>
 
 <%def name="breadcrumbs_links()">
     ${h.link_to(_('Admin'),h.url('admin_home'))}
     &raquo;
-    ${_('Permissions')}
+    ${_('Default Permissions')}
 </%def>
 
 <%block name="header_menu">
@@ -27,7 +27,7 @@
       <ul class="nav nav-pills nav-stacked">
         <li class="${'active' if c.active=='globals' else ''}"><a href="${h.url('admin_permissions')}">${_('Global')}</a></li>
         <li class="${'active' if c.active=='ips' else ''}"><a href="${h.url('admin_permissions_ips')}">${_('IP Whitelist')}</a></li>
-        <li class="${'active' if c.active=='perms' else ''}"><a href="${h.url('admin_permissions_perms')}">${_('Overview')}</a></li>
+        <li class="${'active' if c.active=='perms' else ''}"><a href="${h.url('admin_permissions_perms')}">${_('Show Permissions')}</a></li>
       </ul>
     </div>
 
--- a/kallithea/templates/admin/permissions/permissions_globals.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/permissions/permissions_globals.html	Sun Sep 06 23:36:05 2015 +0200
@@ -22,7 +22,7 @@
                     ${h.checkbox('overwrite_default_repo','true')}
                     <label for="overwrite_default_repo">
                     <span class="tooltip"
-                    title="${h.tooltip(_('All default permissions on each repository will be reset to chosen permission, note that all custom default permission on repositories will be lost'))}">
+                    title="${_('All default permissions on each repository will be reset to chosen permission, note that all custom default permission on repositories will be lost')}">
                     ${_('Apply to all existing repositories')}</span> </label>
                     <span class="help-block">${_('Permissions for the Default user on new repositories.')}</span>
                 </div>
@@ -36,7 +36,7 @@
                     ${h.checkbox('overwrite_default_group','true')}
                     <label for="overwrite_default_group">
                     <span class="tooltip"
-                    title="${h.tooltip(_('All default permissions on each repository group will be reset to chosen permission, note that all custom default permission on repository groups will be lost'))}">
+                    title="${_('All default permissions on each repository group will be reset to chosen permission, note that all custom default permission on repository groups will be lost')}">
                     ${_('Apply to all existing repository groups')}</span> </label>
                     <span class="help-block">${_('Permissions for the Default user on new repository groups.')}</span>
                 </div>
@@ -50,7 +50,7 @@
                     ${h.checkbox('overwrite_default_user_group','true')}
                     <label for="overwrite_default_user_group">
                     <span class="tooltip"
-                    title="${h.tooltip(_('All default permissions on each user group will be reset to chosen permission, note that all custom default permission on repository groups will be lost'))}">
+                    title="${_('All default permissions on each user group will be reset to chosen permission, note that all custom default permission on user groups will be lost')}">
                     ${_('Apply to all existing user groups')}</span></label>
                     <span class="help-block">${_('Permissions for the Default user on new user groups.')}</span>
                 </div>
--- a/kallithea/templates/admin/permissions/permissions_ips.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/permissions/permissions_ips.html	Sun Sep 06 23:36:05 2015 +0200
@@ -9,8 +9,8 @@
                 ${h.form(url('edit_user_ips', id=c.user.user_id),method='delete')}
                     ${h.hidden('del_ip_id',ip.ip_id)}
                     ${h.hidden('default_user', 'True')}
-                    <i class="icon-minus-circled" style="color:#FF4444"></i> ${h.submit('remove_',_('delete'),id="remove_ip_%s" % ip.ip_id,
-                    class_="action_button", onclick="return confirm('"+_('Confirm to delete this ip: %s') % ip.ip_addr+"');")}
+                    <i class="icon-minus-circled" style="color:#FF4444"></i> ${h.submit('remove_',_('Delete'),id="remove_ip_%s" % ip.ip_id,
+                    class_="action_button", onclick="return confirm('"+_('Confirm to delete this IP address: %s') % ip.ip_addr+"');")}
                 ${h.end_form()}
               </td>
           </tr>
@@ -27,7 +27,7 @@
         <div class="fields">
              <div class="field">
                 <div class="label">
-                    <label for="new_ip">${_('New ip address')}:</label>
+                    <label for="new_ip">${_('New IP address')}:</label>
                 </div>
                 <div class="input">
                     ${h.hidden('default_user', 'True')}
--- a/kallithea/templates/admin/repo_groups/repo_group_add.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repo_groups/repo_group_add.html	Sun Sep 06 23:36:05 2015 +0200
@@ -76,7 +76,7 @@
     $(document).ready(function(){
         var setCopyPermsOption = function(group_val){
             if(group_val != "-1"){
-                $('#copy_perms').show()
+                $('#copy_perms').show();
             }
             else{
                 $('#copy_perms').hide();
@@ -85,11 +85,11 @@
         $("#group_parent_id").select2({
             'dropdownAutoWidth': true
         });
-        setCopyPermsOption($('#group_parent_id').val())
+        setCopyPermsOption($('#group_parent_id').val());
         $("#group_parent_id").on("change", function(e) {
-            setCopyPermsOption(e.val)
-        })
+            setCopyPermsOption(e.val);
+        });
         $('#group_name').focus();
-    })
+    });
 </script>
 </%def>
--- a/kallithea/templates/admin/repo_groups/repo_group_edit.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repo_groups/repo_group_edit.html	Sun Sep 06 23:36:05 2015 +0200
@@ -12,13 +12,13 @@
     %if c.repo_group.parent_group:
         &raquo; ${h.link_to(c.repo_group.parent_group.name,h.url('repos_group_home',group_name=c.repo_group.parent_group.group_name))}
     %endif
-    &raquo; ${c.repo_group.name}
+    &raquo; ${h.link_to(c.repo_group.name,h.url('repos_group_home',group_name=c.repo_group.group_name))}
 </%def>
 
 <%def name="breadcrumbs_side_links()">
     <ul class="links">
       <li>
-          <a href="${h.url('new_repos_group', parent_group=c.repo_group.group_id)}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_(u'Add Child Group')}</a>
+          <a href="${h.url('new_repos_group', parent_group=c.repo_group.group_id)}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_('Add Child Group')}</a>
       </li>
     </ul>
 </%def>
--- a/kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html	Sun Sep 06 23:36:05 2015 +0200
@@ -7,7 +7,7 @@
     (_('Total repositories'), c.repo_group.repositories_recursive_count, ''),
     (_('Children groups'), c.repo_group.children.count(), ''),
     (_('Created on'), h.fmt_date(c.repo_group.created_on), ''),
-    (_('Owner'), h.person(c.repo_group.user), '')
+    (_('Owner'), h.person(c.repo_group.user), ''),
  ]
 %>
 %for dt, dd, tt in elems:
--- a/kallithea/templates/admin/repo_groups/repo_group_edit_perms.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repo_groups/repo_group_edit_perms.html	Sun Sep 06 23:36:05 2015 +0200
@@ -4,18 +4,18 @@
         <div class="field">
             <table id="permissions_manage" class="noborder">
                 <tr>
-                    <td>${_('none')}</td>
-                    <td>${_('read')}</td>
-                    <td>${_('write')}</td>
-                    <td>${_('admin')}</td>
-                    <td>${_('user/user group')}</td>
+                    <td>${_('None')}</td>
+                    <td>${_('Read')}</td>
+                    <td>${_('Write')}</td>
+                    <td>${_('Admin')}</td>
+                    <td>${_('User/User Group')}</td>
                     <td></td>
                 </tr>
                 ## USERS
                 %for r2p in c.repo_group.repo_group_to_perm:
                     ##forbid revoking permission from yourself, except if you're an super admin
                     <tr id="id${id(r2p.user.username)}">
-                        %if c.authuser.user_id != r2p.user.user_id or c.authuser.is_admin:
+                      %if c.authuser.user_id != r2p.user.user_id or c.authuser.is_admin:
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'group.none')}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'group.read')}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write')}</td>
@@ -25,27 +25,27 @@
                             %if h.HasPermissionAny('hg.admin')() and r2p.user.username != 'default':
                              <a href="${h.url('edit_user',id=r2p.user.user_id)}">${r2p.user.username}</a>
                             %else:
-                             ${r2p.user.username if r2p.user.username != 'default' else _('default')}
+                             ${r2p.user.username if r2p.user.username != 'default' else _('Default')}
                             %endif
                         </td>
                         <td>
                           %if r2p.user.username !='default':
                             <span style="color:#da4f49" class="action_button" onclick="ajaxActionRevoke(${r2p.user.user_id}, 'user', '${'id%s'%id(r2p.user.username)}', '${r2p.user.username}')">
-                             <i class="icon-minus-circled"></i> ${_('revoke')}
+                             <i class="icon-minus-circled"></i> ${_('Revoke')}
                             </span>
                           %endif
                         </td>
-                        %else:
+                      %else:
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'group.none', disabled="disabled")}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'group.read', disabled="disabled")}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write', disabled="disabled")}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'group.admin', disabled="disabled")}</td>
                         <td style="white-space: nowrap;">
                             ${h.gravatar(r2p.user.email, cls="perm-gravatar", size=14)}
-                            ${r2p.user.username if r2p.user.username != 'default' else _('default')}
+                            ${r2p.user.username if r2p.user.username != 'default' else _('Default')}
                         </td>
-                        <td><i class="icon-user"></i> ${_('delegated admin')}</td>
-                        %endif
+                        <td><i class="icon-user"></i> ${_('Admin')}</td>
+                      %endif
                     </tr>
                 %endfor
 
@@ -68,7 +68,7 @@
                         </td>
                         <td>
                             <span style="color:#da4f49" class="action_button" onclick="ajaxActionRevoke(${g2p.users_group.users_group_id}, 'user_group', '${'id%s'%id(g2p.users_group.users_group_name)}', '${g2p.users_group.users_group_name}')">
-                            <i class="icon-minus-circled"></i> ${_('revoke')}
+                            <i class="icon-minus-circled"></i> ${_('Revoke')}
                             </span>
                         </td>
                     </tr>
@@ -100,7 +100,7 @@
                 </tr>
                 <tr>
                     <td colspan="6">
-                       ${_('apply to children')}:
+                       ${_('Apply to children')}:
                        ${h.radio('recursive', 'none', label=_('None'), checked="checked")}
                        ${h.radio('recursive', 'groups', label=_('Repository Groups'))}
                        ${h.radio('recursive', 'repos', label=_('Repositories'))}
--- a/kallithea/templates/admin/repo_groups/repo_group_edit_settings.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repo_groups/repo_group_edit_settings.html	Sun Sep 06 23:36:05 2015 +0200
@@ -61,5 +61,5 @@
         $("#group_parent_id").select2({
             'dropdownAutoWidth': true
         });
-    })
+    });
 </script>
--- a/kallithea/templates/admin/repo_groups/repo_group_show.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repo_groups/repo_group_show.html	Sun Sep 06 23:36:05 2015 +0200
@@ -6,7 +6,7 @@
 
 <%def name="breadcrumbs()">
     <span class="groups_breadcrumbs">
-    ${h.link_to(_(u'Home'),h.url('/'))}
+    ${h.link_to(_('Home'),h.url('/'))}
     %if c.group.parent_group:
         &raquo; ${h.link_to(c.group.parent_group.name,h.url('repos_group_home',group_name=c.group.parent_group.group_name))}
     %endif
--- a/kallithea/templates/admin/repo_groups/repo_groups.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repo_groups/repo_groups.html	Sun Sep 06 23:36:05 2015 +0200
@@ -23,7 +23,7 @@
         <ul class="links">
             %if h.HasPermissionAny('hg.admin')():
              <li>
-               <a href="${h.url('new_repos_group')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_(u'Add Repository Group')}</a>
+               <a href="${h.url('new_repos_group')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_('Add Repository Group')}</a>
              </li>
             %endif
         </ul>
--- a/kallithea/templates/admin/repos/repo_add_base.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_add_base.html	Sun Sep 06 23:36:05 2015 +0200
@@ -10,21 +10,17 @@
             </div>
             <div class="input">
                 ${h.text('repo_name',class_="small")}
-                <div style="margin: 6px 0px 0px 0px">
-                    <a id="remote_clone_toggle" href="#"><i class="icon-download-cloud"></i> ${_('Import existing repository ?')}</a>
-                </div>
-                %if not c.authuser.is_admin:
-                    ${h.hidden('user_created',True)}
-                %endif
             </div>
          </div>
-        <div id="remote_clone" class="field" style="display: none">
+        <div id="remote_clone" class="field">
             <div class="label">
-                <label for="clone_uri">${_('Clone from')}:</label>
+                <label for="clone_uri">${_('Clone remote repository')}:</label>
             </div>
             <div class="input">
                 ${h.text('clone_uri',class_="small")}
-                <span class="help-block">${_('Optional URL from which repository should be cloned.')}</span>
+                <span class="help-block">
+                    ${_('Optional: URL of a remote repository. If set, the repository will be created as a clone from this URL.')}
+                </span>
             </div>
         </div>
         <div class="field">
@@ -90,31 +86,21 @@
     $(document).ready(function(){
         var setCopyPermsOption = function(group_val){
             if(group_val != "-1"){
-                $('#copy_perms').show()
+                $('#copy_perms').show();
             }
             else{
                 $('#copy_perms').hide();
             }
         }
 
-        $('#remote_clone_toggle').on('click', function(e){
-            $('#remote_clone').show();
-            e.preventDefault();
-        })
-        if($('#remote_clone input').hasClass('error')){
-            $('#remote_clone').show();
-        }
-        if($('#remote_clone input').val()){
-            $('#remote_clone').show();
-        }
         $("#repo_group").select2({
             'dropdownAutoWidth': true
         });
 
-        setCopyPermsOption($('#repo_group').val())
+        setCopyPermsOption($('#repo_group').val());
         $("#repo_group").on("change", function(e) {
-            setCopyPermsOption(e.val)
-        })
+            setCopyPermsOption(e.val);
+        });
 
         $("#repo_type").select2({
             'minimumResultsForSearch': -1
@@ -123,6 +109,6 @@
             'minimumResultsForSearch': -1
         });
         $('#repo_name').focus();
-    })
+    });
 </script>
 ${h.end_form()}
--- a/kallithea/templates/admin/repos/repo_creating.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_creating.html	Sun Sep 06 23:36:05 2015 +0200
@@ -57,7 +57,7 @@
           setTimeout(worker, 1000);
       }
       else{
-          $("#progress").html($('#progress_error').html())
+          $("#progress").html($('#progress_error').html());
       }
     }
   });
--- a/kallithea/templates/admin/repos/repo_edit_advanced.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_edit_advanced.html	Sun Sep 06 23:36:05 2015 +0200
@@ -16,7 +16,7 @@
         $("#id_fork_of").select2({
             'dropdownAutoWidth': true
         });
-    })
+    });
 </script>
 
 <h3>${_('Public Journal Visibility')}</h3>
@@ -73,7 +73,7 @@
 ${h.end_form()}
 
 <h3>${_('Delete')}</h3>
-${h.form(url('repo', repo_name=c.repo_name),method='delete')}
+${h.form(url('delete_repo', repo_name=c.repo_name), method='delete')}
 <div class="form">
     <button class="btn btn-small btn-danger" type="submit"
             onclick="return confirm('${_('Confirm to delete this repository: %s') % c.repo_name}');">
--- a/kallithea/templates/admin/repos/repo_edit_fields.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_edit_fields.html	Sun Sep 06 23:36:05 2015 +0200
@@ -15,7 +15,7 @@
             <td>
               ${h.form(url('delete_repo_fields', repo_name=c.repo_info.repo_name, field_id=field.repo_field_id),method='delete')}
                   <i class="icon-minus-circled" style="color:#FF4444"></i>
-                  ${h.submit('remove_%s' % field.repo_field_id, _('delete'), id="remove_field_%s" % field.repo_field_id,
+                  ${h.submit('remove_%s' % field.repo_field_id, _('Delete'), id="remove_field_%s" % field.repo_field_id,
                   class_="action_button", onclick="return confirm('"+_('Confirm to delete this field: %s') % field.field_key+"');")}
               ${h.end_form()}
             </td>
--- a/kallithea/templates/admin/repos/repo_edit_fork.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_edit_fork.html	Sun Sep 06 23:36:05 2015 +0200
@@ -17,5 +17,5 @@
         $("#id_fork_of").select2({
             'dropdownAutoWidth': true
         });
-    })
+    });
 </script>
--- a/kallithea/templates/admin/repos/repo_edit_permissions.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_edit_permissions.html	Sun Sep 06 23:36:05 2015 +0200
@@ -5,11 +5,11 @@
             ${h.hidden('repo_private')}
             <table id="permissions_manage" class="noborder">
                 <tr>
-                    <td>${_('none')}</td>
-                    <td>${_('read')}</td>
-                    <td>${_('write')}</td>
-                    <td>${_('admin')}</td>
-                    <td>${_('user/user group')}</td>
+                    <td>${_('None')}</td>
+                    <td>${_('Read')}</td>
+                    <td>${_('Write')}</td>
+                    <td>${_('Admin')}</td>
+                    <td>${_('User/User Group')}</td>
                     <td></td>
                 </tr>
                 ## USERS
@@ -18,10 +18,10 @@
                         <tr>
                             <td colspan="4">
                                 <span class="private_repo_msg">
-                                ${_('private repository')}
+                                ${_('Private Repository')}
                                 </span>
                             </td>
-                            <td class="private_repo_msg"><i class="icon-user"></i> ${_('default')}</td>
+                            <td class="private_repo_msg"><i class="icon-user"></i> ${_('Default')}</td>
                         </tr>
                     %else:
                     <tr id="id${id(r2p.user.username)}">
@@ -34,13 +34,13 @@
                             %if h.HasPermissionAny('hg.admin')() and r2p.user.username != 'default':
                              <a href="${h.url('edit_user',id=r2p.user.user_id)}">${r2p.user.username}</a>
                             %else:
-                             ${r2p.user.username if r2p.user.username != 'default' else _('default')}
+                             ${r2p.user.username if r2p.user.username != 'default' else _('Default')}
                             %endif
                         </td>
                         <td>
                           %if r2p.user.username !='default':
                             <span style="color:#da4f49" class="action_button" onclick="ajaxActionRevoke(${r2p.user.user_id}, 'user', '${'id%s'%id(r2p.user.username)}', '${r2p.user.username}')">
-                            <i class="icon-minus-circled"></i> ${_('revoke')}
+                            <i class="icon-minus-circled"></i> ${_('Revoke')}
                             </span>
                           %endif
                         </td>
@@ -65,7 +65,7 @@
                         </td>
                         <td>
                             <span style="color:#da4f49" class="action_button" onclick="ajaxActionRevoke(${g2p.users_group.users_group_id}, 'user_group', '${'id%s'%id(g2p.users_group.users_group_name)}', '${g2p.users_group.users_group_name}')">
-                            <i class="icon-minus-circled"></i> ${_('revoke')}
+                            <i class="icon-minus-circled"></i> ${_('Revoke')}
                             </span>
                         </td>
                     </tr>
--- a/kallithea/templates/admin/repos/repo_edit_remote.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_edit_remote.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,16 +1,19 @@
 %if c.repo_info.clone_uri:
 <div style="font-size: 20px; padding: 0px 0px 10px 0px">
-   ${_('Remote URL')}: <a href="${c.repo_info.clone_uri}">${c.repo_info.clone_uri_hidden}</a></li>
+   ${_('Remote repository URL')}: <a href="${c.repo_info.clone_uri}">${c.repo_info.clone_uri_hidden}</a></li>
 </div>
 ${h.form(url('edit_repo_remote', repo_name=c.repo_name), method='put')}
 <div class="form">
-   <div class="fields">
-       ${h.submit('remote_pull_%s' % c.repo_info.repo_name,_('Pull Changes from Remote Location'),class_="btn btn-small",onclick="return confirm('"+_('Confirm to pull changes from remote side.')+"');")}
-   </div>
+    <div class="fields">
+        ${h.submit('remote_pull_%s' % c.repo_info.repo_name,
+            _('Pull Changes from Remote Repository'),
+            class_="btn btn-small",
+            onclick="return confirm('"+_('Confirm to pull changes from remote repository.')+"');")}
+    </div>
 </div>
 ${h.end_form()}
 %else:
   <div style="font-size: 20px">
-    ${_('This repository does not have a remote URL set.')}
+    ${_('This repository does not have a remote repository URL.')}
   </div>
 %endif
--- a/kallithea/templates/admin/repos/repo_edit_settings.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repo_edit_settings.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
-${h.form(url('repo', repo_name=c.repo_info.repo_name),method='put')}
+${h.form(url('put_repo', repo_name=c.repo_info.repo_name), method='put')}
     <div class="form">
         <!-- fields -->
         <div class="fields">
@@ -15,27 +15,20 @@
                                Using the above permanent URL guarantees that this repository always will be accessible on that URL.
                                This is useful for CI systems, or any other cases that you need to hardcode the URL into a 3rd party service.''')}</span>
                 </div>
-           </div>
-           <div class="field">
-               <div class="label">
-                   <label for="clone_uri">${_('Clone URL')}:</label>
-               </div>
-               <div class="input">
-                   %if c.repo_info.clone_uri:
-                    <div id="clone_uri_hidden" style="font-size: 14px">
-                        <span id="clone_uri_hidden_value">${c.repo_info.clone_uri_hidden}</span>
-                        <span style="cursor: pointer; padding: 0px 0px 5px 0px" id="edit_clone_uri"><i class="icon-edit"></i>${_('edit')}</span>
-                    </div>
-                    <div id="alter_clone_uri" style="display: none">
-                        ${h.text('clone_uri',class_="medium",  placeholder=_('new value'))}
-                    </div>
-                   %else:
-                    ## not set yet, display form to set it
-                    ${h.text('clone_uri',class_="medium")}
-                    ${h.hidden('clone_uri_change', 'NEW')}
-                   %endif
-                 <span id="alter_clone_uri_help_block" class="help-block">${_('URL used for doing remote pulls.')}</span>
-               </div>
+            </div>
+            <div class="field">
+                <div class="label">
+                    <label for="clone_uri">${_('Remote repository')}:</label>
+                </div>
+                <div class="input">
+                  <div id="alter_clone_uri">
+                        ${h.text('clone_uri',class_="medium", placeholder=_('Repository URL'))}
+                        ${h.hidden('clone_uri_hidden', c.repo_info.clone_uri_hidden)}
+                  </div>
+                  <span id="alter_clone_uri_help_block" class="help-block">
+                    ${_('Optional: URL of a remote repository. If set, the repository can be pulled from this URL.')}
+                  </span>
+                </div>
             </div>
             <div class="field">
                 <div class="label">
@@ -143,15 +136,7 @@
         $('#show_more_clone_id').on('click', function(e){
             $('#clone_id').show();
             e.preventDefault();
-        })
-        $('#edit_clone_uri').on('click', function(e){
-          $('#alter_clone_uri').show();
-          $('#edit_clone_uri').hide();
-          $('#clone_uri_hidden').hide();
-          ## store hash of old value for change detection
-          var uri_change =  '<input id="clone_uri_change" name="clone_uri_change" type="hidden" value="${h.md5(c.repo_info.clone_uri or "").hexdigest()}" />';
-          $('#alter_clone_uri_help_block').html($('#alter_clone_uri_help_block').html()+" ("+$('#clone_uri_hidden_value').html()+")")
-        })
+        });
 
         $('#repo_landing_rev').select2({
             'dropdownAutoWidth': true
@@ -160,5 +145,8 @@
             'dropdownAutoWidth': true
         });
 
-    })
+        // autocomplete
+        var _USERS_AC_DATA = ${c.users_array|n};
+        SimpleUserAutoComplete($('#user'), $('#owner_container'), _USERS_AC_DATA);
+    });
 </script>
--- a/kallithea/templates/admin/repos/repos.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/repos/repos.html	Sun Sep 06 23:36:05 2015 +0200
@@ -19,7 +19,7 @@
         <ul class="links">
          %if h.HasPermissionAny('hg.admin','hg.create.repository')():
           <li>
-            <a href="${h.url('new_repo')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_(u'Add Repository')}</a>
+            <a href="${h.url('new_repo')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_('Add Repository')}</a>
           </li>
          %endif
         </ul>
--- a/kallithea/templates/admin/settings/settings_email.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/settings/settings_email.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,27 +1,3 @@
-<dl class="dl-horizontal">
-<%
- elems = [
-    (_('Email prefix'), c.ini.get('email_prefix'), ''),
-    (_('Kallithea email from'), c.ini.get('app_email_from'), ''),
-    (_('Error email from'), c.ini.get('error_email_from'), ''),
-    (_('Error email recipients'), c.ini.get('email_to'), ''),
-
-    (_('SMTP server'), c.ini.get('smtp_server'), ''),
-    (_('SMTP username'), c.ini.get('smtp_username'), ''),
-    (_('SMTP password'), '%s chars' % len(c.ini.get('smtp_password', '')), ''),
-    (_('SMTP port'), c.ini.get('smtp_port'), ''),
-
-    (_('SMTP use TLS'), c.ini.get('smtp_use_tls'), ''),
-    (_('SMTP use SSL'), c.ini.get('smtp_use_ssl'), ''),
-    (_('SMTP auth'), c.ini.get('smtp_auth'), '')
- ]
-%>
-%for dt, dd, tt in elems:
-  <dt style="width:150px; text-align: left">${dt}:</dt>
-  <dd style="margin-left: 160px" title="${tt}">${dd}</dd>
-%endfor
-</dl>
-
 ${h.form(url('admin_settings_email'), method='post')}
     <div class="form">
 
--- a/kallithea/templates/admin/settings/settings_hooks.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/settings/settings_hooks.html	Sun Sep 06 23:36:05 2015 +0200
@@ -31,9 +31,9 @@
             ${h.hidden('hook_ui_value',hook.ui_value)}
             ${h.text('hook_ui_value_new',hook.ui_value,size=60)}
             <span class="action_button"
-            onclick="ajaxActionHook(${hook.ui_id},'${'id%s' % hook.ui_id }')">
+                onclick="delete_hook(${hook.ui_id},'${'id%s' % hook.ui_id }')">
             <i class="icon-minus-circled" style="color:#FF4444"></i>
-            ${_('delete')}
+            ${_('Delete')}
             </span>
         </div>
       </div>
@@ -58,11 +58,10 @@
 % endif
 
 <script type="text/javascript">
-function ajaxActionHook(hook_id,field_id) {
+function delete_hook(hook_id, field_id) {
     var sUrl = "${h.url('admin_settings_hooks')}";
     var success = function (o) {
-            var elem = YUD.get(""+field_id);
-            elem.parentNode.removeChild(elem);
+            $('#' + field_id).remove();
         };
     var failure = function (o) {
             alert("${_('Failed to remove hook')}");
--- a/kallithea/templates/admin/settings/settings_mapping.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/settings/settings_mapping.html	Sun Sep 06 23:36:05 2015 +0200
@@ -8,9 +8,9 @@
                 <div class="checkboxes">
                     <div class="checkbox">
                         ${h.checkbox('destroy',True)}
-                        <label for="destroy">${_('Destroy old data')}</label>
+                        <label for="destroy">${_('Delete records of missing repositories')}</label>
                     </div>
-                    <span class="help-block">${_('Check this option to remove references to repositories that no longer exist in on the filesystem.')}</span>
+                    <span class="help-block">${_('Check this option to remove all comments, pull requests and other records related to repositories that no longer exist in the filesystem.')}</span>
 
                     <div class="checkbox">
                         ${h.checkbox('invalidate',True)}
@@ -23,8 +23,11 @@
                         <label for="hooks"> ${_('Install Git hooks')} </label>
                     </div>
                     <span class="help-block">${_("Verify if Kallithea's Git hooks are installed for each repository. Current hooks will be updated to the latest version.")}</span>
-                </div>
-
+                    <div class="checkbox">
+                        ${h.checkbox('hooks_overwrite', True)}
+                        <label for="hooks_overwrite"> ${_('Overwrite existing Git hooks')}</label>
+                    </div>
+                    <span class="help-block">${_("If installing Git hooks, overwrite any existing hooks, even if they do not seem to come from Kallithea. WARNING: This operation will destroy any custom git hooks you may have deployed by hand!")}</span>
                 </div>
             </div>
 
--- a/kallithea/templates/admin/settings/settings_system.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/settings/settings_system.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,12 +1,13 @@
 <dl class="dl-horizontal">
 <%
  elems = [
-    (_('Kallithea version'), h.literal('%s <b><span style="color:#036185; text-decoration: underline;cursor: pointer" id="check_for_update" >%s</span></b>' % (c.kallithea_version, _('check for updates'))), ''),
+    (_('Kallithea version'), h.literal('%s <b><span style="color:#036185; text-decoration: underline;cursor: pointer" id="check_for_update" >%s</span></b>' % (c.kallithea_version, _('Check for updates'))), ''),
+    (_('Kallithea configuration file'), c.ini['__file__'], ''),
     (_('Python version'), c.py_version, ''),
     (_('Platform'), c.platform, ''),
     (_('Git version'), c.git_version, ''),
     (_('Git path'), c.ini.get('git_path'), ''),
-    (_('Upgrade info endpoint'), h.literal('%s <br/><span style="color:#999999">%s.</span>' % (c.update_url, _('Note: please make sure this server can access this URL'))), '')
+    (_('Upgrade info endpoint'), h.literal('%s <br/><span style="color:#999999">%s.</span>' % (c.update_url, _('Note: please make sure this server can access this URL'))), ''),
  ]
 %>
 
--- a/kallithea/templates/admin/settings/settings_vcs.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/settings/settings_vcs.html	Sun Sep 06 23:36:05 2015 +0200
@@ -64,9 +64,9 @@
                     <label for="paths_root_path">${_('Location of repositories')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('paths_root_path',size=60,readonly="readonly", class_="disabled")}
+                    ${h.text('paths_root_path',size=60,readonly="readonly")}
                     <span id="path_unlock" class="tooltip" style="cursor: pointer"
-                            title="${h.tooltip(_('Click to unlock. You must restart Kallithea in order to make this setting take effect.'))}">
+                            title="${_('Click to unlock. You must restart Kallithea in order to make this setting take effect.')}">
                         <div class="btn btn-small"><i id="path_unlock_icon" class="icon-lock"></i></div>
                     </span>
                     <span class="help-block">${_('Filesystem location where repositories are stored. After changing this value, a restart and rescan of the repository folder are both required.')}</span>
@@ -74,7 +74,7 @@
             </div>
             %else:
             ## form still requires this but we cannot internally change it anyway
-            ${h.hidden('paths_root_path',size=30,readonly="readonly", class_="disabled")}
+            ${h.hidden('paths_root_path',size=30,readonly="readonly")}
             %endif
             <div class="buttons">
                 ${h.submit('save',_('Save Settings'),class_="btn")}
@@ -90,7 +90,6 @@
                 $('#path_unlock_icon').removeClass('icon-lock');
                 $('#path_unlock_icon').addClass('icon-lock-open-alt');
                 $('#paths_root_path').removeAttr('readonly');
-                $('#paths_root_path').removeClass('disabled');
-            })
-        })
+            });
+        });
     </script>
--- a/kallithea/templates/admin/settings/settings_visual.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/settings/settings_visual.html	Sun Sep 06 23:36:05 2015 +0200
@@ -77,11 +77,11 @@
                 <div class="checkboxes">
                     <div class="checkbox">
                         ${h.checkbox('show_public_icon','True')}
-                        <label for="show_public_icon">${_('Show public repo icon on repositories')}</label>
+                        <label for="show_public_icon">${_('Show public repository icon on repositories')}</label>
                     </div>
                     <div class="checkbox">
                         ${h.checkbox('show_private_icon','True')}
-                        <label for="show_private_icon">${_('Show private repo icon on repositories')}</label>
+                        <label for="show_private_icon">${_('Show private repository icon on repositories')}</label>
                     </div>
                     <span class="help-block">${_('Show public/private icons next to repository names.')}</span>
                  </div>
@@ -89,7 +89,7 @@
 
              <div class="field">
                 <div class="label label-checkbox">
-                    <label>${_('Meta-Tagging')}:</label>
+                    <label>${_('Meta Tagging')}:</label>
                 </div>
                 <div class="checkboxes">
                     <div class="checkbox">
--- a/kallithea/templates/admin/user_groups/user_group_add.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/user_groups/user_group_add.html	Sun Sep 06 23:36:05 2015 +0200
@@ -64,6 +64,6 @@
 <script>
     $(document).ready(function(){
         $('#users_group_name').focus();
-    })
+    });
 </script>
 </%def>
--- a/kallithea/templates/admin/user_groups/user_group_edit.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/user_groups/user_group_edit.html	Sun Sep 06 23:36:05 2015 +0200
@@ -28,9 +28,9 @@
       <ul class="nav nav-pills nav-stacked">
         <li class="${'active' if c.active=='settings' else ''}"><a href="${h.url('edit_users_group', id=c.user_group.users_group_id)}">${_('Settings')}</a></li>
         <li class="${'active' if c.active=='advanced' else ''}"><a href="${h.url('edit_user_group_advanced', id=c.user_group.users_group_id)}">${_('Advanced')}</a></li>
-        <li class="${'active' if c.active=='default_perms' else ''}"><a href="${h.url('edit_user_group_default_perms', id=c.user_group.users_group_id)}">${_('Default permissions')}</a></li>
         <li class="${'active' if c.active=='perms' else ''}"><a href="${h.url('edit_user_group_perms', id=c.user_group.users_group_id)}">${_('Permissions')}</a></li>
-        <li class="${'active' if c.active=='members' else ''}"><a href="${h.url('edit_user_group_members', id=c.user_group.users_group_id)}">${_('Members')}</a></li>
+        <li class="${'active' if c.active=='default_perms' else ''}"><a href="${h.url('edit_user_group_default_perms', id=c.user_group.users_group_id)}">${_('Show Permissions')}</a></li>
+        <li class="${'active' if c.active=='members' else ''}"><a href="${h.url('edit_user_group_members', id=c.user_group.users_group_id)}">${_('Show Members')}</a></li>
       </ul>
     </div>
 
--- a/kallithea/templates/admin/user_groups/user_group_edit_advanced.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/user_groups/user_group_edit_advanced.html	Sun Sep 06 23:36:05 2015 +0200
@@ -5,7 +5,7 @@
  elems = [
     (_('Members'), len(c.group_members_obj), ''),
     (_('Created on'), h.fmt_date(c.user_group.created_on), ''),
-    (_('Owner'), h.person(c.user_group.user), '')
+    (_('Owner'), h.person(c.user_group.user), ''),
     ]
 %>
 %for dt, dd, tt in elems:
--- a/kallithea/templates/admin/user_groups/user_group_edit_perms.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/user_groups/user_group_edit_perms.html	Sun Sep 06 23:36:05 2015 +0200
@@ -4,18 +4,18 @@
         <div class="field">
             <table id="permissions_manage" class="noborder">
                 <tr>
-                    <td>${_('none')}</td>
-                    <td>${_('read')}</td>
-                    <td>${_('write')}</td>
-                    <td>${_('admin')}</td>
-                    <td>${_('user/user group')}</td>
+                    <td>${_('None')}</td>
+                    <td>${_('Read')}</td>
+                    <td>${_('Write')}</td>
+                    <td>${_('Admin')}</td>
+                    <td>${_('User/User Group')}</td>
                     <td></td>
                 </tr>
                 ## USERS
                 %for r2p in c.user_group.user_user_group_to_perm:
                     ##forbid revoking permission from yourself, except if you're an super admin
                     <tr id="id${id(r2p.user.username)}">
-                        %if c.authuser.user_id != r2p.user.user_id or c.authuser.is_admin:
+                      %if c.authuser.user_id != r2p.user.user_id or c.authuser.is_admin:
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.none')}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.read')}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.write')}</td>
@@ -25,27 +25,27 @@
                             %if h.HasPermissionAny('hg.admin')() and r2p.user.username != 'default':
                              <a href="${h.url('edit_user',id=r2p.user.user_id)}">${r2p.user.username}</a>
                             %else:
-                             ${r2p.user.username if r2p.user.username != 'default' else _('default')}
+                             ${r2p.user.username if r2p.user.username != 'default' else _('Default')}
                             %endif
                         </td>
                         <td>
                           %if r2p.user.username !='default':
                             <span style="color:#da4f49" class="action_button" onclick="ajaxActionRevoke(${r2p.user.user_id}, 'user', '${'id%s'%id(r2p.user.username)}', '${r2p.user.username}')">
-                             <i class="icon-minus-circled"></i> ${_('revoke')}
+                             <i class="icon-minus-circled"></i> ${_('Revoke')}
                             </span>
                           %endif
                         </td>
-                        %else:
+                      %else:
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.none', disabled="disabled")}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.read', disabled="disabled")}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.write', disabled="disabled")}</td>
                         <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.admin', disabled="disabled")}</td>
                         <td style="white-space: nowrap;">
                             ${h.gravatar(r2p.user.email, cls="perm-gravatar", size=14)}
-                            ${r2p.user.username if r2p.user.username != 'default' else _('default')}
+                            ${r2p.user.username if r2p.user.username != 'default' else _('Default')}
                         </td>
-                        <td><i class="icon-user"></i> ${_('delegated admin')}</td>
-                        %endif
+                        <td><i class="icon-user"></i> ${_('Admin')}</td>
+                      %endif
                     </tr>
                 %endfor
 
@@ -68,7 +68,7 @@
                         </td>
                         <td>
                             <span style="color:#da4f49" class="action_button" onclick="ajaxActionRevoke(${g2p.user_group.users_group_id}, 'user_group', '${'id%s'%id(g2p.user_group.users_group_name)}', '${g2p.user_group.users_group_name}')">
-                            <i class="icon-minus-circled"></i> ${_('revoke')}
+                            <i class="icon-minus-circled"></i> ${_('Revoke')}
                             </span>
                         </td>
                     </tr>
--- a/kallithea/templates/admin/user_groups/user_groups.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/user_groups/user_groups.html	Sun Sep 06 23:36:05 2015 +0200
@@ -7,7 +7,7 @@
 
 <%def name="breadcrumbs_links()">
     <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
-    ${h.link_to(_('Admin'),h.url('admin_home'))} &raquo; <span id="user_group_count">0</span> ${_('user groups')}
+    ${h.link_to(_('Admin'),h.url('admin_home'))} &raquo; <span id="user_group_count">0</span> ${_('User Groups')}
 </%def>
 
 <%block name="header_menu">
@@ -22,7 +22,7 @@
         <ul class="links">
         %if h.HasPermissionAny('hg.admin', 'hg.usergroup.create.true')():
           <li>
-            <a href="${h.url('new_users_group')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_(u'Add User Group')}</a>
+            <a href="${h.url('new_users_group')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_('Add User Group')}</a>
           </li>
         %endif
         </ul>
--- a/kallithea/templates/admin/users/user_add.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/user_add.html	Sun Sep 06 23:36:05 2015 +0200
@@ -41,7 +41,7 @@
                     <label for="password">${_('Password')}:</label>
                 </div>
                 <div class="input">
-                    ${h.password('password',class_='small',autocomplete="off")}
+                    ${h.password('password',class_='small')}
                 </div>
              </div>
 
@@ -50,7 +50,7 @@
                     <label for="password_confirmation">${_('Password confirmation')}:</label>
                 </div>
                 <div class="input">
-                    ${h.password('password_confirmation',class_="small",autocomplete="off")}
+                    ${h.password('password_confirmation',class_="small")}
                 </div>
              </div>
 
@@ -78,8 +78,6 @@
                 </div>
                 <div class="input">
                     ${h.text('email',class_='small')}
-                    ${h.hidden('extern_name', c.default_extern_type)}
-                    ${h.hidden('extern_type', c.default_extern_type)}
                 </div>
              </div>
 
@@ -92,6 +90,8 @@
                 </div>
              </div>
 
+            ${h.hidden('extern_type', c.default_extern_type)}
+            ${h.hidden('extern_name', c.default_extern_name)}
             <div class="buttons">
               ${h.submit('save',_('Save'),class_="btn")}
             </div>
@@ -103,6 +103,6 @@
 <script>
     $(document).ready(function(){
         $('#username').focus();
-    })
+    });
 </script>
 </%def>
--- a/kallithea/templates/admin/users/user_edit.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/user_edit.html	Sun Sep 06 23:36:05 2015 +0200
@@ -27,11 +27,11 @@
     <div style="width: 150px; float:left">
       <ul class="nav nav-pills nav-stacked">
         <li class="${'active' if c.active=='profile' else ''}"><a href="${h.url('edit_user', id=c.user.user_id)}">${_('Profile')}</a></li>
+        <li class="${'active' if c.active=='emails' else ''}"><a href="${h.url('edit_user_emails', id=c.user.user_id)}">${_('Emails')}</a></li>
         <li class="${'active' if c.active=='api_keys' else ''}"><a href="${h.url('edit_user_api_keys', id=c.user.user_id)}">${_('API Keys')}</a></li>
+        <li class="${'active' if c.active=='ips' else ''}"><a href="${h.url('edit_user_ips', id=c.user.user_id)}">${_('IP Whitelist')}</a></li>
         <li class="${'active' if c.active=='advanced' else ''}"><a href="${h.url('edit_user_advanced', id=c.user.user_id)}">${_('Advanced')}</a></li>
-        <li class="${'active' if c.active=='perms' else ''}"><a href="${h.url('edit_user_perms', id=c.user.user_id)}">${_('Default Permissions')}</a></li>
-        <li class="${'active' if c.active=='emails' else ''}"><a href="${h.url('edit_user_emails', id=c.user.user_id)}">${_('Emails')}</a></li>
-        <li class="${'active' if c.active=='ips' else ''}"><a href="${h.url('edit_user_ips', id=c.user.user_id)}">${_('IP Whitelist')}</a></li>
+        <li class="${'active' if c.active=='perms' else ''}"><a href="${h.url('edit_user_perms', id=c.user.user_id)}">${_('Show Permissions')}</a></li>
       </ul>
     </div>
 
--- a/kallithea/templates/admin/users/user_edit_advanced.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/user_edit_advanced.html	Sun Sep 06 23:36:05 2015 +0200
@@ -7,7 +7,7 @@
     (_('Source of Record'), c.user.extern_type, ''),
     (_('Created on'), h.fmt_date(c.user.created_on), ''),
     (_('Last Login'), c.user.last_login or '-', ''),
-    (_('Member of User groups'), len(c.user.group_member), ', '.join((x.users_group.users_group_name for x in c.user.group_member)))
+    (_('Member of User Groups'), len(c.user.group_member), ', '.join((x.users_group.users_group_name for x in c.user.group_member))),
  ]
 %>
 %for dt, dd, tt in elems:
--- a/kallithea/templates/admin/users/user_edit_api_keys.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/user_edit_api_keys.html	Sun Sep 06 23:36:05 2015 +0200
@@ -5,14 +5,14 @@
         <td>
             <span class="btn btn-mini btn-success disabled">${_('Built-in')}</span>
         </td>
-        <td>${_('expires')}: ${_('never')}</td>
+        <td>${_('Expires')}: ${_('Never')}</td>
         <td>
             ${h.form(url('edit_user_api_keys', id=c.user.user_id),method='delete')}
                 ${h.hidden('del_api_key',c.user.api_key)}
                 ${h.hidden('del_api_key_builtin',1)}
                 <button class="btn btn-mini btn-danger" type="submit"
-                        onclick="return confirm('${_('Confirm to reset this api key: %s') % c.user.api_key}');">
-                    ${_('reset')}
+                        onclick="return confirm('${_('Confirm to reset this API key: %s') % c.user.api_key}');">
+                    ${_('Reset')}
                 </button>
             ${h.end_form()}
         </td>
@@ -24,12 +24,12 @@
             <td>${api_key.description}</td>
             <td style="min-width: 80px">
                  %if api_key.expires == -1:
-                  ${_('expires')}: ${_('never')}
+                  ${_('Expires')}: ${_('Never')}
                  %else:
                     %if api_key.expired:
-                        ${_('expired')}: ${h.age(h.time_to_datetime(api_key.expires))}
+                        ${_('Expired')}: ${h.age(h.time_to_datetime(api_key.expires))}
                     %else:
-                        ${_('expires')}: ${h.age(h.time_to_datetime(api_key.expires))}
+                        ${_('Expires')}: ${h.age(h.time_to_datetime(api_key.expires))}
                     %endif
                  %endif
             </td>
@@ -37,28 +37,28 @@
                 ${h.form(url('edit_user_api_keys', id=c.user.user_id),method='delete')}
                     ${h.hidden('del_api_key',api_key.api_key)}
                     <button class="btn btn-mini btn-danger" type="submit"
-                            onclick="return confirm('${_('Confirm to remove this api key: %s') % api_key.api_key}');">
+                            onclick="return confirm('${_('Confirm to remove this API key: %s') % api_key.api_key}');">
                         <i class="icon-minus-circled"></i>
-                        ${_('remove')}
+                        ${_('Remove')}
                     </button>
                 ${h.end_form()}
             </td>
           </tr>
         %endfor
     %else:
-    <tr><td><div class="ip">${_('No additional api keys specified')}</div></td></tr>
+    <tr><td><div class="ip">${_('No additional API keys specified')}</div></td></tr>
     %endif
   </table>
 </div>
 
 <div>
-    ${h.form(url('edit_user_api_keys', id=c.user.user_id), method='put')}
+    ${h.form(url('edit_user_api_keys', id=c.user.user_id), method='post')}
     <div class="form">
         <!-- fields -->
         <div class="fields">
              <div class="field">
                 <div class="label">
-                    <label for="description">${_('New api key')}:</label>
+                    <label for="description">${_('New API key')}:</label>
                 </div>
                 <div class="input">
                     ${h.text('description', class_='medium', placeholder=_('Description'))}
@@ -79,5 +79,5 @@
         $("#lifetime").select2({
             'dropdownAutoWidth': true
         });
-    })
+    });
 </script>
--- a/kallithea/templates/admin/users/user_edit_emails.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/user_edit_emails.html	Sun Sep 06 23:36:05 2015 +0200
@@ -16,7 +16,7 @@
                 ${h.form(url('edit_user_emails', id=c.user.user_id),method='delete')}
                     ${h.hidden('del_email_id',em.email_id)}
                     <i class="icon-minus-circled" style="color:#FF4444"></i>
-                    ${h.submit('remove_',_('delete'),id="remove_email_%s" % em.email_id,
+                    ${h.submit('remove_',_('Delete'),id="remove_email_%s" % em.email_id,
                     class_="action_button", onclick="return  confirm('"+_('Confirm to delete this email: %s') % em.email+"');")}
                 ${h.end_form()}
             </td>
--- a/kallithea/templates/admin/users/user_edit_ips.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/user_edit_ips.html	Sun Sep 06 23:36:05 2015 +0200
@@ -19,8 +19,8 @@
                 ${h.form(url('edit_user_ips', id=c.user.user_id),method='delete')}
                     ${h.hidden('del_ip_id',ip.ip_id)}
                     <i class="icon-minus-circled" style="color:#FF4444"></i>
-                    ${h.submit('remove_',_('delete'),id="remove_ip_%s" % ip.ip_id,
-                    class_="action_button", onclick="return  confirm('"+_('Confirm to delete this ip: %s') % ip.ip_addr+"');")}
+                    ${h.submit('remove_',_('Delete'),id="remove_ip_%s" % ip.ip_id,
+                    class_="action_button", onclick="return  confirm('"+_('Confirm to delete this IP address: %s') % ip.ip_addr+"');")}
                 ${h.end_form()}
             </td>
           </tr>
@@ -39,7 +39,7 @@
         <div class="fields">
              <div class="field">
                 <div class="label">
-                    <label for="new_ip">${_('New ip address')}:</label>
+                    <label for="new_ip">${_('New IP address')}:</label>
                 </div>
                 <div class="input">
                     ${h.text('new_ip', class_='medium')}
--- a/kallithea/templates/admin/users/user_edit_profile.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/user_edit_profile.html	Sun Sep 06 23:36:05 2015 +0200
@@ -12,28 +12,19 @@
                 <br/>${c.user.email or _('Missing email, please update this user email address.')}
                         ##show current ip just if we show ourself
                         %if c.authuser.username == c.user.username:
-                            [${_('current IP')}: ${c.perm_user.ip_addr or "?"}]
+                            [${_('Current IP')}: ${c.ip_addr}]
                         %endif
                 %endif
            </div>
         </div>
-        <% readonly = None %>
-        <% disabled = "" %>
         <div class="fields">
-            %if c.extern_type != c.EXTERN_TYPE_INTERNAL:
-             <div class="field">
-               <% readonly = "readonly" %>
-               <% disabled = " disabled" %>
-               <strong>${_('This user is in an external Source of Record (%s); some details cannot be managed here.' % c.extern_type)}.</strong>
-             </div>
-            %endif
 
              <div class="field">
                 <div class="label">
                     <label for="username">${_('Username')}:</label>
                 </div>
                 <div class="input">
-                  ${h.text('username',class_='medium%s' % disabled, readonly=readonly)}
+                  ${h.text('username',class_='medium', readonly=c.readonly('username'))}
                 </div>
              </div>
 
@@ -42,7 +33,7 @@
                     <label for="email">${_('Email')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('email',class_='medium')}
+                    ${h.text('email',class_='medium', readonly=c.readonly('email'))}
                 </div>
              </div>
 
@@ -51,7 +42,7 @@
                     <label for="extern_type">${_('Source of Record')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('extern_type',class_='medium disabled',readonly="readonly")}
+                    ${h.text('extern_type',class_='medium',readonly="readonly")}
                 </div>
              </div>
 
@@ -60,7 +51,7 @@
                     <label for="extern_name">${_('Name in Source of Record')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('extern_name',class_='medium disabled',readonly="readonly")}
+                    ${h.text('extern_name',class_='medium',readonly="readonly")}
                 </div>
              </div>
 
@@ -69,7 +60,7 @@
                     <label for="new_password">${_('New password')}:</label>
                 </div>
                 <div class="input">
-                    ${h.password('new_password',class_='medium%s' % disabled,autocomplete="off",readonly=readonly)}
+                    ${h.password('new_password',class_='medium',readonly=c.readonly('password'))}
                 </div>
              </div>
 
@@ -78,7 +69,7 @@
                     <label for="password_confirmation">${_('New password confirmation')}:</label>
                 </div>
                 <div class="input">
-                    ${h.password('password_confirmation',class_="medium%s" % disabled,autocomplete="off",readonly=readonly)}
+                    ${h.password('password_confirmation',class_="medium",readonly=c.readonly('password'))}
                 </div>
              </div>
 
@@ -87,7 +78,7 @@
                     <label for="firstname">${_('First Name')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('firstname',class_='medium')}
+                    ${h.text('firstname',class_='medium', readonly=c.readonly('firstname'))}
                 </div>
              </div>
 
@@ -96,7 +87,7 @@
                     <label for="lastname">${_('Last Name')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('lastname',class_='medium')}
+                    ${h.text('lastname',class_='medium', readonly=c.readonly('lastname'))}
                 </div>
              </div>
 
@@ -105,7 +96,7 @@
                     <label for="active">${_('Active')}:</label>
                 </div>
                 <div class="checkboxes">
-                    ${h.checkbox('active',value=True)}
+                    ${h.checkbox('active',value=True, readonly=c.readonly('active'))}
                 </div>
              </div>
 
@@ -114,7 +105,7 @@
                     <label for="admin">${_('Admin')}:</label>
                 </div>
                 <div class="checkboxes">
-                    ${h.checkbox('admin',value=True)}
+                    ${h.checkbox('admin',value=True, readonly=c.readonly('admin'))}
                 </div>
              </div>
 
--- a/kallithea/templates/admin/users/users.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/admin/users/users.html	Sun Sep 06 23:36:05 2015 +0200
@@ -21,7 +21,7 @@
         ${self.breadcrumbs()}
         <ul class="links">
           <li>
-            <a href="${h.url('new_user')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_(u'Add User')}</a>
+            <a href="${h.url('new_user')}" class="btn btn-small btn-success"><i class="icon-plus"></i> ${_('Add User')}</a>
           </li>
         </ul>
     </div>
--- a/kallithea/templates/base/base.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/base/base.html	Sun Sep 06 23:36:05 2015 +0200
@@ -61,9 +61,9 @@
       <li><a href="${h.url('repos_groups')}"><i class="icon-folder"></i> ${_('Repository Groups')}</a></li>
       <li><a href="${h.url('users')}"><i class="icon-user"></i> ${_('Users')}</a></li>
       <li><a href="${h.url('users_groups')}"><i class="icon-users"></i> ${_('User Groups')}</a></li>
-      <li><a href="${h.url('admin_permissions')}"><i class="icon-block"></i> ${_('Permissions')}</a></li>
+      <li><a href="${h.url('admin_permissions')}"><i class="icon-block"></i> ${_('Default Permissions')}</a></li>
       <li><a href="${h.url('auth_home')}"><i class="icon-key"></i> ${_('Authentication')}</a></li>
-      <li><a href="${h.url('defaults')}"><i class="icon-wrench"></i> ${_('Defaults')}</a></li>
+      <li><a href="${h.url('defaults')}"><i class="icon-wrench"></i> ${_('Repository Defaults')}</a></li>
       <li class="last"><a href="${h.url('admin_settings')}"><i class="icon-gear"></i> ${_('Settings')}</a></li>
   </ul>
 
@@ -97,13 +97,6 @@
 <%def name="repo_context_bar(current=None, rev=None)">
   <% rev = None if rev == 'tip' else rev %>
   <%
-      def follow_class():
-          if c.repository_following:
-              return h.literal('following')
-          else:
-              return h.literal('follow')
-  %>
-  <%
     def is_current(selected):
         if selected == current:
             return h.literal('class="current"')
@@ -128,7 +121,7 @@
       </h2>
       <!--
       <div id="breadcrumbs">
-        ${h.link_to(_(u'Repositories'),h.url('home'))}
+        ${h.link_to(_('Repositories'),h.url('home'))}
         &raquo;
         ${h.repo_link(c.db_repo.groups_and_repo)}
       </div>
@@ -176,10 +169,10 @@
               ## also it feels like a job for the controller
               %if c.authuser.username != 'default':
                   <li>
-                   <a class="${follow_class()}" onclick="javascript:toggleFollowingRepo(this,${c.db_repo.repo_id});">
+                   <a class="${'following' if c.repository_following else 'follow'}" onclick="toggleFollowingRepo(this, ${c.db_repo.repo_id});">
                     <span class="show-follow"><i class="icon-heart-empty"></i> ${_('Follow')}</span>
                     <span class="show-following"><i class="icon-heart"></i> ${_('Unfollow')}</span>
-                  </a>
+                   </a>
                   </li>
                   <li><a href="${h.url('repo_fork_home',repo_name=c.repo_name)}"><i class="icon-git-pull-request"></i> ${_('Fork')}</a></li>
                   <li><a href="${h.url('pullrequest_home',repo_name=c.repo_name)}"><i class="icon-git-pull-request"></i> ${_('Create Pull Request')}</a></li>
@@ -347,8 +340,11 @@
             <div class="links_right">
             <ol class="links">
               <li><a href="${h.url('notifications')}">${_('Notifications')}: ${c.unread_notifications}</a></li>
-              <li>${h.link_to(_(u'My Account'),h.url('my_account'))}</li>
-              <li class="logout">${h.link_to(_(u'Log Out'),h.url('logout_home'))}</li>
+              <li>${h.link_to(_('My Account'),h.url('my_account'))}</li>
+              %if not c.authuser.is_external_auth:
+                ## Cannot log out if using external (container) authentication.
+                <li class="logout">${h.link_to(_('Log Out'), h.url('logout_home'))}</li>
+              %endif
             </ol>
             </div>
           %endif
@@ -419,11 +415,11 @@
                     var children = [];
                     $.each(this.children, function(){
                         if(query.term.length == 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0 ){
-                            children.push({'id': this.id, 'text': this.text, 'type': this.type, 'obj': this.obj})
+                            children.push({'id': this.id, 'text': this.text, 'type': this.type, 'obj': this.obj});
                         }
-                    })
+                    });
                     if(children.length !== 0){
-                        data.results.push({'text': section, 'children': children})
+                        data.results.push({'text': section, 'children': children});
                     }
 
                 });
@@ -438,21 +434,21 @@
                       cache[key] = data;
                       query.callback({results: data.results});
                     }
-                  })
+                  });
               }
             }
         });
 
         $("#repo_switcher").on('select2-selecting', function(e){
             e.preventDefault();
-            window.location = pyroutes.url('summary_home', {'repo_name': e.val})
-        })
+            window.location = pyroutes.url('summary_home', {'repo_name': e.val});
+        });
 
         ## Global mouse bindings ##
 
         // general help "?"
         Mousetrap.bind(['?'], function(e) {
-            $('#help_kb').modal({})
+            $('#help_kb').modal({});
         });
 
         // / open the quick filter
@@ -544,7 +540,7 @@
                          ('g g', 'Goto my private gists page'),
                          ('g G', 'Goto my public gists page'),
                          ('n r', 'New repository page'),
-                         ('n g', 'New gist page')
+                         ('n g', 'New gist page'),
                      ]
                   %>
                   %for key, desc in elems:
@@ -572,7 +568,7 @@
                          ('g f', 'Goto files page'),
                          ('g F', 'Goto files page with file search activated'),
                          ('g o', 'Goto repository settings'),
-                         ('g O', 'Goto repository permissions settings')
+                         ('g O', 'Goto repository permissions settings'),
                      ]
                   %>
                   %for key, desc in elems:
--- a/kallithea/templates/base/default_perms_box.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/base/default_perms_box.html	Sun Sep 06 23:36:05 2015 +0200
@@ -11,13 +11,13 @@
         <div class="fields">
              <div class="field">
                 <div class="label label-checkbox">
-                    <label for="inherit_default_permissions">${_('Inherit from defaults')}:</label>
+                    <label for="inherit_default_permissions">${_('Inherit defaults')}:</label>
                 </div>
                 <div class="checkboxes">
                     ${h.checkbox('inherit_default_permissions',value=True)}
                     <span class="help-block">
-                    ${h.literal(_('Select to inherit permissions from %s permissions settings, and default IP address whitelist.')
-                                % h.link_to('default global', url('admin_permissions')))}
+                    ${h.literal(_('Select to inherit global settings, IP whitelist and permissions from the %s.')
+                                % h.link_to('default permissions', url('admin_permissions')))}
                     </span>
                 </div>
              </div>
@@ -83,7 +83,7 @@
     $('#inherit_default_permissions').change(function(){
         show_custom_perms($('#inherit_default_permissions').prop('checked'));
     });
-})
+});
 </script>
 
 </%def>
--- a/kallithea/templates/base/perms_summary.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/base/perms_summary.html	Sun Sep 06 23:36:05 2015 +0200
@@ -10,11 +10,11 @@
             ${section.replace("_"," ").capitalize()}
             %if section != 'global':
                 <div style="float: right">
-                ${_('show')}:
-                ${h.checkbox('perms_filter_none_%s' % section, 'none', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='none')}   <label for="${'perms_filter_none_%s' % section}"><span class="perm_tag none">${_('none')}</span></label>
-                ${h.checkbox('perms_filter_read_%s' % section, 'read', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='read')}   <label for="${'perms_filter_read_%s' % section}"><span class="perm_tag read">${_('read')}</span></label>
-                ${h.checkbox('perms_filter_write_%s' % section, 'write', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='write')} <label for="${'perms_filter_write_%s' % section}"> <span class="perm_tag write">${_('write')}</span></label>
-                ${h.checkbox('perms_filter_admin_%s' % section, 'admin', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='admin')} <label for="${'perms_filter_admin_%s' % section}"><span class="perm_tag admin">${_('admin')}</span></label>
+                ${_('Show')}:
+                ${h.checkbox('perms_filter_none_%s' % section, 'none', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='none')} <label for="${'perms_filter_none_%s' % section}"><span class="perm_tag none">${_('None')}</span></label>
+                ${h.checkbox('perms_filter_read_%s' % section, 'read', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='read')} <label for="${'perms_filter_read_%s' % section}"><span class="perm_tag read">${_('Read')}</span></label>
+                ${h.checkbox('perms_filter_write_%s' % section, 'write', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='write')} <label for="${'perms_filter_write_%s' % section}"> <span class="perm_tag write">${_('Write')}</span></label>
+                ${h.checkbox('perms_filter_admin_%s' % section, 'admin', 'checked', class_='perm_filter filter_%s' % section, section=section, perm_type='admin')} <label for="${'perms_filter_admin_%s' % section}"><span class="perm_tag admin">${_('Admin')}</span></label>
                 </div>
             %endif
         </div>
@@ -40,7 +40,7 @@
                       </td>
                       %if actions:
                       <td>
-                           <a href="${h.url('admin_permissions')}">${_('edit')}</a>
+                           <a href="${h.url('admin_permissions')}">${_('Edit')}</a>
                       </td>
                       %endif
                   </tr>
@@ -76,11 +76,11 @@
                       %if actions:
                       <td>
                           %if section == 'repositories':
-                              <a href="${h.url('edit_repo_perms',repo_name=k,anchor='permissions_manage')}">${_('edit')}</a>
+                              <a href="${h.url('edit_repo_perms',repo_name=k,anchor='permissions_manage')}">${_('Edit')}</a>
                           %elif section == 'repositories_groups':
-                              <a href="${h.url('edit_repo_group_perms',group_name=k,anchor='permissions_manage')}">${_('edit')}</a>
+                              <a href="${h.url('edit_repo_group_perms',group_name=k,anchor='permissions_manage')}">${_('Edit')}</a>
                           %elif section == 'user_groups':
-                              ##<a href="${h.url('edit_users_group',id=k)}">${_('edit')}</a>
+                              ##<a href="${h.url('edit_users_group',id=k)}">${_('Edit')}</a>
                           %endif
                       </td>
                       %endif
@@ -99,8 +99,6 @@
     $(document).ready(function(){
         var show_empty = function(section){
             var visible = $('.section_{0} tr.perm_row:visible'.format(section)).length;
-            console.log(visible)
-            console.log($('.section_{0} tr.perm_row:visible'.format(section)))
             if(visible == 0){
                 $('#empty_{0}'.format(section)).show();
             }
@@ -108,15 +106,12 @@
                 $('#empty_{0}'.format(section)).hide();
             }
         }
-        $('.perm_filter').on('change', function(e){
-            var self = this;
-            var section = $(this).attr('section');
+        var update_show = function($checkbox){
+            var section = $checkbox.attr('section');
 
-            var opts = {}
             var elems = $('.filter_' + section).each(function(el){
-                var perm_type = $(this).attr('perm_type');
-                var checked = this.checked;
-                opts[perm_type] = checked;
+                var perm_type = $checkbox.attr('perm_type');
+                var checked = $checkbox.prop('checked');
                 if(checked){
                     $('.'+section+'_'+perm_type).show();
                 }
@@ -125,8 +120,9 @@
                 }
             });
             show_empty(section);
-        })
-
-    })
+        }
+        $('.perm_filter').on('change', function(){update_show($(this));});
+        $('.perm_filter[value=none]').each(function(){this.checked = false; update_show($(this));});
+    });
 </script>
 </%def>
--- a/kallithea/templates/base/root.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/base/root.html	Sun Sep 06 23:36:05 2015 +0200
@@ -28,10 +28,9 @@
                 'loading ...':"${_('loading ...')}",
                 'Search truncated': "${_('Search truncated')}",
                 'No matching files': "${_('No matching files')}",
-                'Open New Pull Request': "${_('Open New Pull Request')}",
-                'Open New Pull Request for Selected Changesets':  "${_('Open New Pull Request for Selected Changesets')}",
-                'Show Selected Changesets __S &rarr; __E': "${h.literal(_('Show Selected Changesets __S &rarr; __E'))}",
-                'Show Selected Changeset __S': "${_('Show Selected Changeset __S')}",
+                'Open New Pull Request from {0}': "${_('Open New Pull Request from {0}')}",
+                'Open New Pull Request for {0} &rarr; {1}': "${h.literal(_('Open New Pull Request for {0} &rarr; {1}'))}",
+                'Show Selected Changesets {0} &rarr; {1}': "${h.literal(_('Show Selected Changesets {0} &rarr; {1}'))}",
                 'Selection Link': "${_('Selection Link')}",
                 'Collapse Diff': "${_('Collapse Diff')}",
                 'Expand Diff': "${_('Expand Diff')}",
@@ -63,12 +62,8 @@
         <script type="text/javascript" src="${h.url('/js/bootstrap.js', ver=c.kallithea_version)}"></script>
         <script type="text/javascript" src="${h.url('/js/select2/select2.js', ver=c.kallithea_version)}"></script>
         <script type="text/javascript" src="${h.url('/js/mousetrap.js', ver=c.kallithea_version)}"></script>
-        <!--[if lt IE 9]>
-           <script language="javascript" type="text/javascript" src="${h.url('/js/excanvas.min.js')}"></script>
-        <![endif]-->
         <script type="text/javascript" src="${h.url('/js/yui.flot.js', ver=c.kallithea_version)}"></script>
         <script type="text/javascript" src="${h.url('/js/native.history.js', ver=c.kallithea_version)}"></script>
-        <script type="text/javascript" src="${h.url('/js/pyroutes_map.js', ver=c.kallithea_version)}"></script>
         <script type="text/javascript" src="${h.url('/js/base.js', ver=c.kallithea_version)}"></script>
         ## EXTRA FOR JS
         <%block name="js_extra"/>
@@ -110,17 +105,6 @@
         <%block name="head_extra"/>
     </head>
     <body id="body">
-      ## IE hacks
-      <!--[if IE 7]>
-      <script>$(document.body).addClass('ie7')</script>
-      <![endif]-->
-      <!--[if IE 8]>
-      <script>$(document.body).addClass('ie8')</script>
-      <![endif]-->
-      <!--[if IE 9]>
-      <script>$(document.body).addClass('ie9')</script>
-      <![endif]-->
-
       <div id="header">
         <div id="header-inner" class="title">
           <div id="logo">
--- a/kallithea/templates/bookmarks/bookmarks_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/bookmarks/bookmarks_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -23,7 +23,7 @@
                 </span>
             </td>
             <td>${book[1]._timestamp}</td>
-            <td><span class="tooltip" title="${h.tooltip(h.age(book[1].date))}">${h.fmt_date(book[1].date)}</span></td>
+            <td><span class="tooltip" title="${h.age(book[1].date)}">${h.fmt_date(book[1].date)}</span></td>
             <td title="${book[1].author}">${h.person(book[1].author)}</td>
             <td>${book[1].revision}</td>
             <td>
--- a/kallithea/templates/branches/branches_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/branches/branches_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -24,7 +24,7 @@
                 </span>
             </td>
             <td>${branch[1]._timestamp}</td>
-            <td><span class="tooltip" title="${h.tooltip(h.age(branch[1].date))}">${h.fmt_date(branch[1].date)}</span></td>
+            <td><span class="tooltip" title="${h.age(branch[1].date)}">${h.fmt_date(branch[1].date)}</span></td>
             <td title="${branch[1].author}">${h.person(branch[1].author)}</td>
             <td>${branch[1].revision}</td>
             <td>
@@ -51,7 +51,7 @@
                   </span>
               </td>
               <td>${branch[1]._timestamp}</td>
-              <td><span class="tooltip" title="${h.tooltip(h.age(branch[1].date))}">${h.fmt_date(branch[1].date)}</span></td>
+              <td><span class="tooltip" title="${h.age(branch[1].date)}">${h.fmt_date(branch[1].date)}</span></td>
               <td title="${branch[1].author}">${h.person(branch[1].author)}</td>
               <td>${branch[1].revision}</td>
               <td>
--- a/kallithea/templates/changelog/changelog.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changelog/changelog.html	Sun Sep 06 23:36:05 2015 +0200
@@ -35,21 +35,21 @@
     <div class="table">
         % if c.pagination:
             <div>
-                <div style="overflow:auto; display:${'none' if c.changelog_for_path else ''}">
+                <div style="overflow:auto; ${'display:none' if c.changelog_for_path else ''}">
                     <div class="container_header">
                         <div style="float:left; margin-left:20px;">
-                        ${h.form(h.url.current(),method='get')}
+                          ${h.form(h.url.current(),method='get',style="display:inline")}
                             ${h.submit('set',_('Show'),class_="btn btn-small")}
                             ${h.text('size',size=3,value=c.size)}
                             ${_('revisions')}
                             %if c.branch_name:
                             ${h.hidden('branch', c.branch_name)}
                             %endif
-                        ${h.end_form()}
+                          ${h.end_form()}
+                          <a href="#" class="btn btn-small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
                         </div>
                         <div style="float: right; margin: 0px 0px 0px 4px">
                             <a href="#" class="btn btn-small" id="rev_range_container" style="display:none"></a>
-                            <a href="#" class="btn btn-small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
                             %if c.revision:
                                 <a class="btn btn-small" href="${h.url('changelog_home', repo_name=c.repo_name)}">
                                     ${_('Go to tip of repository')}
@@ -59,7 +59,7 @@
                                 <a id="compare_fork"
                                    title="${_('Compare fork with %s' % c.db_repo.fork.repo_name)}"
                                    href="${h.url('compare_url',repo_name=c.db_repo.fork.repo_name,org_ref_type=c.db_repo.landing_rev[0],org_ref_name=c.db_repo.landing_rev[1],other_repo=c.repo_name,other_ref_type='branch' if request.GET.get('branch') else c.db_repo.landing_rev[0],other_ref_name=request.GET.get('branch') or c.db_repo.landing_rev[1], merge=1)}"
-                                   class="btn btn-small"><i class="icon-git-compare"></i> ${_('Compare fork with parent repo (%s)' % c.db_repo.fork.repo_name)}</a>
+                                   class="btn btn-small"><i class="icon-git-compare"></i> ${_('Compare fork with parent repository (%s)' % c.db_repo.fork.repo_name)}</a>
                             %endif
                             ## text and href of open_new_pr is controlled from javascript
                             <a id="open_new_pr" class="btn btn-small"></a>
@@ -71,14 +71,14 @@
                 <div id="changelog" style="clear:both">
 
                 <div id="graph_nodes">
-                    <canvas id="graph_canvas"></canvas>
+                    <canvas id="graph_canvas" style="width:0"></canvas>
                 </div>
                 <div id="graph_content" style="${'margin: 0px' if c.changelog_for_path else ''}">
 
                 <table id="changesets">
                 <tbody>
                 %for cnt,cs in enumerate(c.pagination):
-                    <tr id="chg_${cnt+1}" class="container ${'tablerow%s' % (cnt%2)}">
+                    <tr id="chg_${cnt+1}" class="container ${'mergerow' if len(cs.parents) > 1 else ''}">
                         <td class="checkbox">
                             %if c.changelog_for_path:
                                 ${h.checkbox(cs.raw_id,class_="changeset_range", disabled="disabled")}
@@ -89,11 +89,11 @@
                           %if c.statuses.get(cs.raw_id):
                             <div class="changeset-status-ico">
                             %if c.statuses.get(cs.raw_id)[2]:
-                              <a class="tooltip" title="${_('Changeset status: %s\nClick to open associated pull request #%s') % (h.changeset_status_lbl(c.statuses.get(cs.raw_id)[0]), c.statuses.get(cs.raw_id)[2])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}">
+                              <a class="tooltip" title="${_('Changeset status: %s\nClick to open associated pull request %s') % (c.statuses.get(cs.raw_id)[1], c.statuses.get(cs.raw_id)[4])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}">
                                 <i class="icon-circle changeset-status-${c.statuses.get(cs.raw_id)[0]}"></i>
                               </a>
                             %else:
-                              <a class="tooltip" title="${_('Changeset status: %s') % h.changeset_status_lbl(c.statuses.get(cs.raw_id)[0])}" href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
+                              <a class="tooltip" title="${_('Changeset status: %s') % c.statuses.get(cs.raw_id)[1]}" href="${c.comments[cs.raw_id][0].url()}">
                                   <i class="icon-circle changeset-status-${c.statuses.get(cs.raw_id)[0]}"></i>
                               </a>
                             %endif
@@ -122,7 +122,7 @@
                                     %if c.comments.get(cs.raw_id):
                                         <div class="comments-container">
                                             <div class="comments-cnt" title="${_('Changeset has comments')}">
-                                                <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
+                                                <a href="${c.comments[cs.raw_id][0].url()}">
                                                     ${len(c.comments[cs.raw_id])}
                                                     <i class="icon-comment-discussion"></i>
                                                 </a>
@@ -154,6 +154,8 @@
                 </tbody>
                 </table>
 
+                <input type="checkbox" id="singlerange" style="display:none"/>
+
                 </div>
 
                 <div class="pagination-wh pagination-left">
@@ -165,79 +167,96 @@
         <script type="text/javascript" src="${h.url('/js/graph.js', ver=c.kallithea_version)}"></script>
         <script type="text/javascript">
             $(document).ready(function(){
-                //Monitor range checkboxes and build a link to changesets ranges
-                var checkboxes = YUD.getElementsByClassName('changeset_range');
-                // register extra routes needed for this view
+                var $checkboxes = $('.changeset_range');
+
                 pyroutes.register('changeset_home', "${h.url('changeset_home', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);
 
-                var checkbox_checker = function(e){
-                    var checked_checkboxes = [];
-                    for (pos in checkboxes){
-                        if(checkboxes[pos].checked){
-                            checked_checkboxes.push(checkboxes[pos]);
-                        }
-                    }
-                    if(YUD.get('open_new_pr')){
-                        if(checked_checkboxes.length>1){
-                            YUD.setStyle('open_new_pr','display','none');
+                var checkbox_checker = function(e) {
+                    var $checked_checkboxes = $checkboxes.filter(':checked');
+                    var $singlerange = $('#singlerange');
+
+                    $('#rev_range_container').hide();
+                    $checkboxes.show();
+                    $singlerange.show();
+
+                    if ($checked_checkboxes.length > 0) {
+                        $checked_checkboxes.first().parent('td').append($singlerange);
+                        var singlerange = $singlerange.prop('checked');
+                        var rev_end = $checked_checkboxes.first().prop('name').substr(0, 12);
+                        if ($checked_checkboxes.length > 1 || singlerange) {
+                            var rev_start = $checked_checkboxes.last().prop('name').substr(0, 12);
+                            $('#rev_range_container').prop('href',
+                                pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}',
+                                                                'revision': rev_start + '...' + rev_end}));
+                            $('#rev_range_container').html(
+                                 _TM['Show Selected Changesets {0} &rarr; {1}'].format(rev_start, rev_end));
+                            $('#rev_range_container').show();
+                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
+                                                                        {'repo_name': '${c.repo_name}',
+                                                                         'rev_start': rev_start,
+                                                                         'rev_end': rev_end}));
+                            $('#open_new_pr').html(_TM['Open New Pull Request for {0} &rarr; {1}'].format(rev_start, rev_end));
                         } else {
-                            YUD.setStyle('open_new_pr','display','');
-                            if(checked_checkboxes.length>0){
-                                YUD.get('open_new_pr').innerHTML = _TM['Open New Pull Request for Selected Changesets'];
-                            }else{
-                                YUD.get('open_new_pr').innerHTML = _TM['Open New Pull Request'];
-                            }
+                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
+                                                                        {'repo_name': '${c.repo_name}',
+                                                                         'rev_end': rev_end}));
+                            $('#open_new_pr').html(_TM['Open New Pull Request from {0}'].format(rev_end));
                         }
-                    }
 
-                    if(checked_checkboxes.length>0){
-                        var rev_end = checked_checkboxes[0].name;
-                        var rev_start = checked_checkboxes[checked_checkboxes.length-1].name;
-                        var url = pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}',
-                                                                  'revision': rev_start+'...'+rev_end});
+                        $('#rev_range_clear').show();
+                        $('#compare_fork').hide();
 
-                        var link = (rev_start == rev_end)
-                            ? _TM['Show Selected Changeset __S']
-                            : _TM['Show Selected Changesets __S &rarr; __E'];
-
-                        link = link.replace('__S',rev_start.substr(0,6));
-                        link = link.replace('__E',rev_end.substr(0,6));
-                        YUD.get('rev_range_container').href = url;
-                        YUD.get('rev_range_container').innerHTML = link;
-                        YUD.setStyle('rev_range_container','display','');
-                        YUD.setStyle('rev_range_clear','display','');
+                        var disabled = true;
+                        $checkboxes.each(function(){
+                            var $this = $(this);
+                            if (disabled) {
+                                if ($this.prop('checked')) {
+                                    $this.closest('tr').removeClass('out-of-range');
+                                    disabled = singlerange;
+                                } else {
+                                    $this.closest('tr').addClass('out-of-range');
+                                }
+                            } else {
+                                $this.closest('tr').removeClass('out-of-range');
+                                disabled = $this.prop('checked');
+                            }
+                        });
 
-                        YUD.get('open_new_pr').href = pyroutes.url('pullrequest_home',
-                                                                   {'repo_name': '${c.repo_name}',
-                                                                    'rev_start': rev_start,
-                                                                    'rev_end': rev_end})
-
-                        YUD.setStyle('compare_fork','display','none');
-                    }else{
-                        YUD.setStyle('rev_range_container','display','none');
-                        YUD.setStyle('rev_range_clear','display','none');
+                        if ($checked_checkboxes.length + (singlerange ? 1 : 0) >= 2) {
+                            $checkboxes.hide();
+                            $checked_checkboxes.show();
+                            if (!singlerange)
+                                $singlerange.hide();
+                        }
+                    } else {
+                        $('#singlerange').hide().prop('checked', false);
+                        $('#rev_range_clear').hide();
                         %if c.revision:
-                            YUD.get('open_new_pr').href = pyroutes.url('pullrequest_home',
-                                                                       {'repo_name': '${c.repo_name}',
-                                                                        'rev_end':'${c.first_revision.raw_id}'});
+                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
+                                                                        {'repo_name': '${c.repo_name}',
+                                                                         'rev_end':'${c.first_revision.raw_id}'}));
+                            $('#open_new_pr').html(_TM['Open New Pull Request from {0}'].format('${c.revision}'));
                         %else:
-                            YUD.get('open_new_pr').href = pyroutes.url('pullrequest_home',
-                                                                       {'repo_name': '${c.repo_name}',
-                                                                        'branch':'${c.first_revision.branch}'});
+                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
+                                                                        {'repo_name': '${c.repo_name}',
+                                                                        'branch':'${c.first_revision.branch}'}));
+                            $('#open_new_pr').html(_TM['Open New Pull Request from {0}'].format('${c.first_revision.branch}'));
                         %endif
-                        YUD.setStyle('compare_fork','display','');
+                        $('#compare_fork').show();
+                        $checkboxes.closest('tr').removeClass('out-of-range');
                     }
                 };
                 checkbox_checker();
-                YUE.on(checkboxes,'click', checkbox_checker);
+                $checkboxes.click(function() {
+                    checkbox_checker();
+                    r.render(jsdata,100);
+                });
+                $('#singlerange').click(checkbox_checker);
 
-                YUE.on('rev_range_clear','click',function(e){
-                    for (var i=0; i<checkboxes.length; i++){
-                        var cb = checkboxes[i];
-                        cb.checked = false;
-                    }
+                $('#rev_range_clear').click(function(e){
+                    $checkboxes.prop('checked', false);
                     checkbox_checker();
-                    YUE.preventDefault(e);
+                    r.render(jsdata,100);
                 });
 
                 var $msgs = $('.message');
@@ -266,7 +285,8 @@
                 // change branch filter
                 $("#branch_filter").select2({
                     dropdownAutoWidth: true,
-                    minimumInputLength: 1
+                    minimumInputLength: 1,
+                    sortResults: branchSort
                     });
 
                 $("#branch_filter").change(function(e){
--- a/kallithea/templates/changelog/changelog_details.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changelog/changelog_details.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,11 +1,11 @@
 ## small box that displays changed/added/removed details fetched by AJAX
 
 % if len(c.cs.affected_files) <= c.affected_files_cut_off:
-<span class="removed tooltip" title="<b>${h.tooltip(_('Removed'))}</b>${h.changed_tooltip(c.cs.removed)}">${len(c.cs.removed)}</span>
-<span class="changed tooltip" title="<b>${h.tooltip(_('Changed'))}</b>${h.changed_tooltip(c.cs.changed)}">${len(c.cs.changed)}</span>
-<span class="added tooltip"   title="<b>${h.tooltip(_('Added'))}</b>${h.changed_tooltip(c.cs.added)}">${len(c.cs.added)}</span>
+<span class="removed tooltip" title="<b>${_('Removed')}</b>${h.changed_tooltip(c.cs.removed)}">${len(c.cs.removed)}</span>
+<span class="changed tooltip" title="<b>${_('Changed')}</b>${h.changed_tooltip(c.cs.changed)}">${len(c.cs.changed)}</span>
+<span class="added tooltip"   title="<b>${_('Added')}</b>${h.changed_tooltip(c.cs.added)}">${len(c.cs.added)}</span>
 % else:
- <span class="removed tooltip" title="${h.tooltip(_('Affected %s files') % len(c.cs.affected_files))}">!</span>
- <span class="changed tooltip" title="${h.tooltip(_('Affected %s files') % len(c.cs.affected_files))}">!</span>
- <span class="added tooltip"   title="${h.tooltip(_('Affected %s files') % len(c.cs.affected_files))}">!</span>
+ <span class="removed tooltip" title="${_('Affected %s files') % len(c.cs.affected_files)}">!</span>
+ <span class="changed tooltip" title="${_('Affected %s files') % len(c.cs.affected_files)}">!</span>
+ <span class="added tooltip"   title="${_('Affected %s files') % len(c.cs.affected_files)}">!</span>
 % endif
--- a/kallithea/templates/changelog/changelog_summary_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changelog/changelog_summary_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -15,15 +15,15 @@
         <td class="compact">
             <div class="changeset-status-container">
               %if c.statuses.get(cs.raw_id):
-                <div class="changeset-status-ico shortlog">
+                <span class="changeset-status-ico shortlog">
                 %if c.statuses.get(cs.raw_id)[2]:
-                  <a class="tooltip" title="${_('Changeset status: %s\nClick to open associated pull request #%s') % (c.statuses.get(cs.raw_id)[0], c.statuses.get(cs.raw_id)[2])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}">
+                  <a class="tooltip" title="${_('Changeset status: %s\nClick to open associated pull request %s') % (c.statuses.get(cs.raw_id)[1], c.statuses.get(cs.raw_id)[4])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}">
                     <i class="icon-circle changeset-status-${c.statuses.get(cs.raw_id)[0]}"></i>
                   </a>
                 %else:
                   <i class="icon-circle changeset-status-${c.statuses.get(cs.raw_id)[0]}"></i>
                 %endif
-                </div>
+                </span>
               %endif
             </div>
         </td>
@@ -31,7 +31,7 @@
               %if c.comments.get(cs.raw_id,[]):
                <div class="comments-container">
                    <div title="${('comments')}">
-                       <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
+                       <a href="${c.comments[cs.raw_id][0].url()}">
                           <i class="icon-comment"></i>${len(c.comments[cs.raw_id])}
                        </a>
                    </div>
@@ -44,7 +44,7 @@
         <td>
             ${h.urlify_commit(h.chop_at(cs.message,'\n'),c.repo_name, h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
         </td>
-        <td><span class="tooltip" title="${h.tooltip(h.fmt_date(cs.date))}">
+        <td><span class="tooltip" title="${h.fmt_date(cs.date)}">
                       ${h.age(cs.date)}</span>
         </td>
         <td title="${cs.author}">${h.person(cs.author)}</td>
@@ -87,7 +87,7 @@
 %endif
 
 
-<h4>${_('Push new repo')}</h4>
+<h4>${_('Push new repository')}</h4>
 <pre>
     ${c.db_repo_scm_instance.alias} clone ${c.clone_repo_url}
     ${c.db_repo_scm_instance.alias} add README # add first file
--- a/kallithea/templates/changeset/changeset.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changeset/changeset.html	Sun Sep 06 23:36:05 2015 +0200
@@ -33,31 +33,31 @@
         <div class="diffblock">
             <div class="parents">
                 <div id="parent_link" class="changeset_hash">
-                    <i style="color:#036185" class="icon-left-open"></i> <a href="#">${_('parent rev.')}</a>
+                    <i style="color:#036185" class="icon-left-open"></i> <a href="#">${_('Parent rev.')}</a>
                 </div>
             </div>
 
             <div class="children">
                 <div id="child_link" class="changeset_hash">
-                    <a href="#">${_('child rev.')}</a> <i style="color:#036185" class="icon-right-open"></i>
+                    <a href="#">${_('Child rev.')}</a> <i style="color:#036185" class="icon-right-open"></i>
                 </div>
             </div>
 
             <div class="code-header banner">
                 <div class="changeset-status-container">
                     %if c.statuses:
-                        <div class="changeset-status-ico"><i class="icon-circle changeset-status-${c.statuses[0]}"></i></div>
-                        <div title="${_('Changeset status')}" class="changeset-status-lbl">[${h.changeset_status_lbl(c.statuses[0])}]</div>
+                        <span class="changeset-status-ico"><i class="icon-circle changeset-status-${c.statuses[0]}"></i></span>
+                        <span title="${_('Changeset status')}" class="changeset-status-lbl">[${h.changeset_status_lbl(c.statuses[0])}]</span>
                     %endif
                 </div>
                 <div class="diff-actions">
-                  <a href="${h.url('changeset_raw_home',repo_name=c.repo_name,revision=c.changeset.raw_id)}"  class="tooltip" title="${h.tooltip(_('Raw diff'))}">
+                  <a href="${h.url('changeset_raw_home',repo_name=c.repo_name,revision=c.changeset.raw_id)}"  class="tooltip" title="${_('Raw diff')}">
                       <i class="icon-diff"></i>
                   </a>
-                  <a href="${h.url('changeset_patch_home',repo_name=c.repo_name,revision=c.changeset.raw_id)}"  class="tooltip" title="${h.tooltip(_('Patch diff'))}">
+                  <a href="${h.url('changeset_patch_home',repo_name=c.repo_name,revision=c.changeset.raw_id)}"  class="tooltip" title="${_('Patch diff')}">
                       <i class="icon-file-powerpoint"></i>
                   </a>
-                  <a href="${h.url('changeset_download_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download')}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
+                  <a href="${h.url('changeset_download_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download')}" class="tooltip" title="${_('Download diff')}">
                       <i class="icon-floppy"></i>
                   </a>
                   ${c.ignorews_url(request.GET)}
@@ -86,7 +86,7 @@
 
                     <span class="logtags">
                         %if len(c.changeset.parents)>1:
-                        <span class="merge">${_('merge')}</span>
+                        <span class="merge">${_('Merge')}</span>
                         %endif
 
                         %if h.is_hg(c.db_repo_scm_instance):
@@ -114,7 +114,7 @@
                          <div class="gravatar">
                            ${h.gravatar(h.email_or_none(c.changeset.author), size=20)}
                          </div>
-                         <span><b>${h.person(c.changeset.author,'username_and_name')}</b> - ${h.age(c.changeset.date,True)} ${h.fmt_date(c.changeset.date)}</span><br/>
+                         <span><b>${h.person(c.changeset.author,'full_name_and_username')}</b> - ${h.age(c.changeset.date,True)} ${h.fmt_date(c.changeset.date)}</span><br/>
                          <span>${h.email_or_none(c.changeset.author)}</span><br/>
                      </div>
                      <% rev = c.changeset.extra.get('source') %>
@@ -129,6 +129,35 @@
                        ${_('Transplanted from:')} ${h.link_to(h.short_id(rev),h.url('changeset_home',repo_name=c.repo_name,revision=rev))}
                      </div>
                      %endif
+
+                     % if hasattr(c.changeset, 'successors') and c.changeset.successors:
+                     <div class='successors'>
+                       <span class='successors_header'>${_('Replaced by:')} </span>
+                       % for i, s in enumerate(c.changeset.successors):
+                           <%
+                           comma = ""
+                           if i != len(c.changeset.successors)-1:
+                             comma = ", "
+                           %>
+                         <a class='successors_hash' href="${h.url('changeset_home',repo_name=c.repo_name, revision=s)}">${s}</a>${comma}
+                       % endfor
+                     </div>
+                     % endif
+
+                     % if hasattr(c.changeset, 'precursors') and c.changeset.precursors:
+                     <div class='precursors'>
+                       <span class='precursors_header'>${_('Preceded by:')} </span>
+                       % for i, s in enumerate(c.changeset.precursors):
+                           <%
+                           comma = ""
+                           if i != len(c.changeset.precursors)-1:
+                             comma = ", "
+                           %>
+                           <a class="precursors_hash" href="${h.url('changeset_home',repo_name=c.repo_name, revision=s)}">${s}</a>${comma}
+                       % endfor
+                     </div>
+                     % endif
+
                      <div class="message">${h.urlify_commit(c.changeset.message, c.repo_name)}</div>
                 </div>
             </div>
@@ -158,13 +187,14 @@
     </div>
 
     ## diff block
+    <div class="commentable-diff">
     <%namespace name="diff_block" file="/changeset/diff_block.html"/>
     ${diff_block.diff_block_js()}
     ${diff_block.diff_block(c.changes[c.changeset.raw_id])}
-
     % if c.limited_diff:
       <h4>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff anyway')}</a></h4>
     % endif
+    </div>
 
     ## template for inline comment form
     ${comment.comment_inline_form()}
@@ -193,19 +223,12 @@
                   $('#{0} .inline-comments-button'.format(boxid)).hide();
               }
           });
-          $('.add-bubble').click(function(e){
-              var tr = e.currentTarget;
-              if(tr == null){
-                  tr = this;
-              }
-              injectInlineForm(tr.parentNode.parentNode);
+
+          $('.code-difftable').on('click', '.add-bubble', function(e){
+              show_comment_form($(this));
           });
 
-          // inject comments into they proper positions
-          var file_comments = $('.inline-comment-placeholder').toArray();
-          renderInlineComments(file_comments);
-
-          linkInlineComments(document.getElementsByClassName('firstlink'), document.getElementsByClassName("comment"));
+          move_comments($(".comments .comments-list-chunk"));
 
           pyroutes.register('changeset_home',
                             "${h.url('changeset_home', repo_name='%(repo_name)s', revision='%(revision)s')}",
@@ -221,7 +244,7 @@
                     success: function(data) {
                       if(data.results.length === 0){
                           $('#child_link').addClass('disabled');
-                          $('#child_link').html('${_('no revisions')}');
+                          $('#child_link').html('${_('No revisions')}');
                       }
                       if(data.results.length === 1){
                           var commit = data.results[0];
@@ -246,7 +269,7 @@
                   });
               e.preventDefault();
               }
-          })
+          });
 
           //prev links
           $('#parent_link').on('click', function(e){
@@ -258,7 +281,7 @@
                     success: function(data) {
                       if(data.results.length === 0){
                           $('#parent_link').addClass('disabled');
-                          $('#parent_link').html('${_('no revisions')}');
+                          $('#parent_link').html('${_('No revisions')}');
                       }
                       if(data.results.length === 1){
                           var commit = data.results[0];
@@ -289,7 +312,7 @@
           if (window.location.hash != "") {
               window.location.href = window.location.href;
           }
-      })
+      });
 
     </script>
 
--- a/kallithea/templates/changeset/changeset_comment_block.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changeset/changeset_comment_block.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,4 @@
 ## this is a dummy html file for partial rendering on server and sending
 ## generated output via ajax after comment submit
 <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
-${comment.comment_block(c.co)}
+${comment.comment_block(c.comment)}
--- a/kallithea/templates/changeset/changeset_file_comment.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changeset/changeset_file_comment.html	Sun Sep 06 23:36:05 2015 +0200
@@ -5,62 +5,54 @@
 ##
 <%def name="comment_block(co)">
   <div class="comment" id="comment-${co.comment_id}" line="${co.line_no}">
+    <div class="comment-prev-next-links"></div>
     <div class="comment-wrapp">
       <div class="meta">
           <div style="float:left">
                ${h.gravatar(co.author.email, size=20)}
           </div>
           <div class="user">
-              ${co.author.username}
-          </div>
-          <div class="date">
-              ${h.age(co.modified_at)}
+              ${co.author.full_name_and_username}
           </div>
 
-       <div style="float:left;padding:4px 0px 0px 5px">
-        <span class="">
-         %if co.pull_request:
-            %if co.status_change:
-              ${_('Status change from pull request')}
-              <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>:
-            %else:
-              ${_('Comment from pull request')}
-              <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>
-            %endif
-         %else:
-            %if co.status_change:
-              ${_('Status change on changeset')}:
-            %else:
-              ${_('Comment on changeset')}
-            %endif
-         %endif
-        </span>
-       </div>
+          <span>
+              ${h.age(co.modified_at)}
+              %if co.pull_request:
+                ${_('on pull request')}
+                <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>
+              %else:
+                ${_('on this changeset')}
+              %endif
+              <a class="permalink" href="${co.url()}">&para;</a>
+          </span>
 
+          %if h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) or co.author.user_id == c.authuser.user_id:
+            <div onClick="confirm('${_("Delete comment?")}') && deleteComment(${co.comment_id})" class="buttons delete-comment btn btn-mini">${_('Delete')}</div>
+          %endif
+      </div>
+      <div class="text">
         %if co.status_change:
-           <div  style="float:left" class="changeset-status-container">
-             <div style="float:left;padding:10px 2px 0px 2px"></div>
-             <div title="${_('Changeset status')}" class="changeset-status-lbl"> ${co.status_change[0].status_lbl}</div>
-             <div class="changeset-status-ico"><i class="icon-circle changeset-status-${co.status_change[0].status}"></i></div>
+           <div class="rst-block automatic-comment">
+             <p>
+               <span title="${_('Changeset status')}" class="changeset-status-lbl">${_("Status change")}: ${co.status_change[0].status_lbl}</span>
+               <span class="changeset-status-ico"><i class="icon-circle changeset-status-${co.status_change[0].status}"></i></span>
+             </p>
            </div>
         %endif
-
-      <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
-      %if h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) or co.author.user_id == c.authuser.user_id:
-          <div onClick="confirm('${_("Delete comment?")}') && deleteComment(${co.comment_id})" class="buttons delete-comment btn btn-mini">${_('Delete')}</div>
-      %endif
-      </div>
-      <div class="text">
+        %if co.text:
           ${h.rst_w_mentions(co.text)|n}
+        %endif
       </div>
     </div>
   </div>
 </%def>
 
 
+## expanded with .format(f_path, line_no)
+## TODO: don't assume line_no is globally unique ...
 <%def name="comment_inline_form()">
 <div id='comment-inline-form-template' style="display:none">
-  <div class="comment-inline-form ac">
+  <div class="ac">
   %if c.authuser.username != 'default':
     ${h.form('#', class_='inline-form')}
       <div id="edit-container_{1}" class="clearfix">
@@ -118,36 +110,29 @@
     <span class="firstlink"></span>
 </%def>
 
-## generates inlines taken from c.comments var
-<%def name="inlines()">
-    <div class="comments-number">
-        ${comment_count(c.inline_cnt, len(c.comments))}
-    </div>
-    %for path, lines in c.inline_comments:
-        % for line,comments in lines.iteritems():
-            <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.safeid(h.safe_unicode(path))}">
-            %for co in comments:
-                ${comment_block(co)}
-            %endfor
-            </div>
-        %endfor
-    %endfor
-
-</%def>
 
 ## generate inline comments and the main ones
 <%def name="generate_comments()">
 <div class="comments">
-    <div id="inline-comments-container">
-    ## generate inlines for this changeset
-     ${inlines()}
-    </div>
+  %for f_path, lines in c.inline_comments:
+    %for line_no, comments in lines.iteritems():
+      <div class="comments-list-chunk" data-f_path="${f_path}" data-line_no="${line_no}" data-target-id="${h.safeid(h.safe_unicode(f_path))}_${line_no}">
+        %for co in comments:
+            ${comment_block(co)}
+        %endfor
+      </div>
+    %endfor
+  %endfor
 
-    %for co in c.comments:
-        <div id="comment-tr-${co.comment_id}">
-          ${comment_block(co)}
-        </div>
-    %endfor
+  <div class="comments-number">
+    ${comment_count(c.inline_cnt, len(c.comments))}
+  </div>
+
+      <div class="comments-list-general">
+        %for co in c.comments:
+            ${comment_block(co)}
+        %endfor
+      </div>
 </div>
 </%def>
 
@@ -178,7 +163,7 @@
                   ${_('No change')}
                 </label>
                 %for status,lbl in c.changeset_statuses:
-                    <span style="margin-left: 15px;">
+                    <span>
                         <input type="radio" class="status_change_radio" name="changeset_status" id="${status}" value="${status}">
                         <label for="${status}"><i class="icon-circle changeset-status-${status}" /></i>${lbl}</label>
                     </span>
@@ -186,7 +171,7 @@
 
                 %if is_pr and ( \
                     h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) \
-                    or c.pull_request.author.user_id == c.authuser.user_id):
+                    or c.pull_request.owner.user_id == c.authuser.user_id):
                   <input id="save_close" type="checkbox" name="save_close">
                   <label id="save_close_label" for="save_close">${_("Close")}</label>
                 %endif
@@ -214,10 +199,11 @@
 <script>
 
 $(document).ready(function () {
-   MentionsAutoComplete('text', 'mentions_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
+   MentionsAutoComplete($('#text'), $('#mentions_container'), _USERS_AC_DATA, _GROUPS_AC_DATA);
 
    $(window).on('beforeunload', function(){
-      if($('.form-open').size() || $('textarea#text').val()){
+      if($('.comment-inline-form textarea[name=text]').size() ||
+         $('textarea#text').val()) {
          // this message will not be displayed on all browsers
          // (e.g. some versions of Firefox), but the user will still be warned
          return 'There are uncommitted comments.';
--- a/kallithea/templates/changeset/changeset_range.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changeset/changeset_range.html	Sun Sep 06 23:36:05 2015 +0200
@@ -45,7 +45,7 @@
                 <td><span class="tooltip" title="${h.age(cs.date)}">${cs.date}</span></td>
                 <td>
                   %if c.statuses:
-                    <div title="${h.tooltip(_('Changeset status'))}" class="changeset-status-ico"><i class="icon-circle changeset-status-${c.statuses[cnt]}"></i></div>
+                    <div title="${_('Changeset status')}" class="changeset-status-ico"><i class="icon-circle changeset-status-${c.statuses[cnt]}"></i></div>
                   %endif
                 </td>
                 <td><div class="message">${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name)}</div></td>
@@ -78,14 +78,14 @@
           ##${comment.comment_inline_form(cs)}
           ## diff block
           <div class="h3">
-          <a class="tooltip" title="${h.tooltip(cs.message)}" href="${h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id)}">${h.show_id(cs)}</a>
+          <a class="tooltip" title="${cs.message}" href="${h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id)}">${h.show_id(cs)}</a>
              <div class="gravatar">
                ${h.gravatar(h.email_or_none(cs.author), size=20)}
              </div>
              <div class="right">
               <span class="logtags">
                 %if len(cs.parents)>1:
-                <span class="merge">${_('merge')}</span>
+                <span class="merge">${_('Merge')}</span>
                 %endif
                 %if h.is_hg(c.db_repo_scm_instance):
                   %for book in cs.bookmarks:
--- a/kallithea/templates/changeset/diff_block.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/changeset/diff_block.html	Sun Sep 06 23:36:05 2015 +0200
@@ -18,16 +18,16 @@
                     revision=cs2,f_path=h.safe_unicode(path)))}
                 </div>
                 <div class="diff-actions">
-                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='diff',fulldiff=1)}" class="tooltip" title="${h.tooltip(_('Show full diff for this file'))}">
+                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='diff',fulldiff=1)}" class="tooltip" title="${_('Show full diff for this file')}">
                       <i class="icon-file-code"></i>
                   </a>
-                  <a href="${h.url('files_diff_2way_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='diff',fulldiff=1)}" class="tooltip" title="${h.tooltip(_('Show full side-by-side diff for this file'))}">
+                  <a href="${h.url('files_diff_2way_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='diff',fulldiff=1)}" class="tooltip" title="${_('Show full side-by-side diff for this file')}">
                       <i class="icon-docs"></i>
                   </a>
-                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='raw')}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
+                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='raw')}" class="tooltip" title="${_('Raw diff')}">
                       <i class="icon-diff"></i>
                   </a>
-                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='download')}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
+                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(path),diff2=cs2,diff1=cs1,diff='download')}" class="tooltip" title="${_('Download diff')}">
                       <i class="icon-floppy"></i>
                   </a>
                   ${c.ignorews_url(request.GET, h.FID(cs2,path))}
@@ -41,8 +41,7 @@
                 </span>
             </div>
         </div>
-        <div class="code-body">
-            <div class="full_f_path" path="${h.safe_unicode(path)}"></div>
+        <div class="code-body full_f_path" data-f_path="${h.safe_unicode(path)}">
             ${diff|n}
             %if path.rsplit('.')[-1] in ['png', 'gif', 'jpg', 'bmp']:
               <div class="btn btn-image-diff-show">Show images</div>
@@ -96,7 +95,7 @@
                   %endif
               </div>
               <div class="diff-actions">
-                <a href="${h.url('files_diff_2way_home',repo_name=c.cs_repo.repo_name,f_path=h.safe_unicode(filenode_path),diff1=c.a_rev,diff2=c.cs_rev,diff='diff',fulldiff=1)}" class="tooltip" title="${h.tooltip(_('Show full side-by-side diff for this file'))}">
+                <a href="${h.url('files_diff_2way_home',repo_name=c.cs_repo.repo_name,f_path=h.safe_unicode(filenode_path),diff1=c.a_rev,diff2=c.cs_rev,diff='diff',fulldiff=1)}" class="tooltip" title="${_('Show full side-by-side diff for this file')}">
                   <i class="icon-docs"></i>
                 </a>
                 ${c.ignorews_url(request.GET)}
@@ -104,8 +103,7 @@
               </div>
           </div>
       </div>
-        <div class="code-body">
-            <div class="full_f_path" path="${h.safe_unicode(filenode_path)}"></div>
+        <div class="code-body full_f_path" data-f_path="${h.safe_unicode(filenode_path)}">
             ${diff|n}
             %if filenode_path.rsplit('.')[-1] in ['png', 'gif', 'jpg', 'bmp']:
               <div class="btn btn-image-diff-show">Show images</div>
@@ -136,7 +134,7 @@
         $('.btn-image-diff-swap').show();
         $('.img-diff-swapable')
             .each(function(i,e){
-                    $(e).attr('src', $(e).attr('realsrc'));
+                    $(e).prop('src', $(e).attr('realsrc'));
                 })
             .show();
         });
--- a/kallithea/templates/compare/compare_cs.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/compare/compare_cs.html	Sun Sep 06 23:36:05 2015 +0200
@@ -11,7 +11,7 @@
     %endif
 
     <div id="graph_nodes">
-        <canvas id="graph_canvas"></canvas>
+        <canvas id="graph_canvas" style="width:0"></canvas>
     </div>
 
     <div id="graph_content_pr" style="margin-left: 100px;">
@@ -28,7 +28,7 @@
           %if c.cs_comments.get(cs.raw_id):
               <div class="comments-container">
                   <div class="comments-cnt" title="${_('Changeset has comments')}">
-                      <a href="${h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.cs_comments[cs.raw_id][0].comment_id)}">
+                      <a href="${c.cs_comments[cs.raw_id][0].url()}">
                           ${len(c.cs_comments[cs.raw_id])}
                           <i class="icon-comment"></i>
                       </a>
@@ -36,7 +36,22 @@
               </div>
           %endif
         </td>
-        <td style="width: 140px"><span class="tooltip" title="${h.tooltip(h.age(cs.date))}">${cs.date}</span></td>
+        <td class="changeset-logical-index">
+          <%
+              num_cs = len(c.cs_ranges)
+              index = num_cs - cnt
+              if index == 1:
+                  title = _('First (oldest) changeset in this list')
+              elif index == num_cs:
+                  title = _('Last (most recent) changeset in this list')
+              else:
+                  title = _('Position in this list of changesets')
+          %>
+          <span class="tooltip" title="${title}">
+            ${index}
+          </span>
+        </td>
+        <td style="width: 140px"><span class="tooltip" title="${h.age(cs.date)}">${cs.date}</span></td>
         <td><div class="gravatar" commit_id="${cs.raw_id}">${h.gravatar(h.email_or_none(cs.author), size=14)}</div></td>
         <td><div class="author">${h.person(cs.author)}</div></td>
         <td>${h.link_to(h.show_id(cs),h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id))}</td>
--- a/kallithea/templates/compare/compare_diff.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/compare/compare_diff.html	Sun Sep 06 23:36:05 2015 +0200
@@ -95,15 +95,17 @@
     <script type="text/javascript">
 
    $(document).ready(function(){
-    var cache = {}
-    $("#compare_org").select2({
-        placeholder: "${'%s@%s' % (c.a_repo.repo_name, c.a_ref_name)}",
+    var cache = {};
+
+    function make_revision_dropdown(css_selector, placeholder, repo_name, cache_key) {
+      $(css_selector).select2({
+        placeholder: placeholder,
         formatSelection: function(obj){
-            return '{0}@{1}'.format("${c.a_repo.repo_name}", obj.text)
+            return '{0}@{1}'.format(repo_name, obj.text);
         },
         dropdownAutoWidth: true,
         query: function(query){
-          var key = 'cache';
+          var key = cache_key;
           var cached = cache[key] ;
           if(cached) {
             var data = {results: []};
@@ -113,18 +115,18 @@
                 var children = [];
                 $.each(this.children, function(){
                     if(query.term.length == 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0 ){
-                        children.push({'id': this.id, 'text': this.text})
+                        children.push(this);
                     }
-                })
-                data.results.push({'text': section, 'children': children})
+                });
+                data.results.push({'text': section, 'children': children});
             });
             //push the typed in changeset
             data.results.push({'text':_TM['Specify changeset'],
-                               'children': [{'id': query.term, 'text': query.term, 'type': 'rev'}]})
+                               'children': [{'id': query.term, 'text': query.term, 'type': 'rev'}]});
             query.callback(data);
           }else{
               $.ajax({
-                url: pyroutes.url('repo_refs_data', {'repo_name': '${c.a_repo.repo_name}'}),
+                url: pyroutes.url('repo_refs_data', {'repo_name': repo_name}),
                 data: {},
                 dataType: 'json',
                 type: 'GET',
@@ -132,50 +134,14 @@
                   cache[key] = data;
                   query.callback(data);
                 }
-              })
+              });
           }
         }
     });
-    $("#compare_other").select2({
-        placeholder: "${'%s@%s' % (c.cs_repo.repo_name, c.cs_ref_name)}",
-        dropdownAutoWidth: true,
-        formatSelection: function(obj){
-            return '{0}@{1}'.format("${c.cs_repo.repo_name}", obj.text)
-        },
-        query: function(query){
-          var key = 'cache2';
-          var cached = cache[key] ;
-          if(cached) {
-            var data = {results: []};
-            //filter results
-            $.each(cached.results, function(){
-                var section = this.text;
-                var children = [];
-                $.each(this.children, function(){
-                    if(query.term.length == 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0 ){
-                        children.push({'id': this.id, 'text': this.text})
-                    }
-                })
-                data.results.push({'text': section, 'children': children})
-            });
-            //push the typed in changeset
-            data.results.push({'text':_TM['Specify changeset'],
-                               'children': [{'id': query.term, 'text': query.term, 'type': 'rev'}]})
-            query.callback(data);
-          }else{
-              $.ajax({
-                url: pyroutes.url('repo_refs_data', {'repo_name': '${c.cs_repo.repo_name}'}),
-                data: {},
-                dataType: 'json',
-                type: 'GET',
-                success: function(data) {
-                  cache[key] = data;
-                  query.callback({results: data.results});
-                }
-              })
-          }
-        }
-    });
+    }
+
+    make_revision_dropdown("#compare_org",   "${'%s@%s' % (c.a_repo.repo_name, c.a_ref_name)}",   "${c.a_repo.repo_name}",  'cache');
+    make_revision_dropdown("#compare_other", "${'%s@%s' % (c.cs_repo.repo_name, c.cs_ref_name)}", "${c.cs_repo.repo_name}", 'cache2');
 
     var values_changed = function() {
         var values = $('#compare_org').select2('data') && $('#compare_other').select2('data');
--- a/kallithea/templates/data_table/_dt_elements.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/data_table/_dt_elements.html	Sun Sep 06 23:36:05 2015 +0200
@@ -87,13 +87,13 @@
 </%def>
 
 <%def name="last_change(last_change)">
-  <span class="tooltip" date="${last_change}" title="${h.tooltip(h.fmt_date(last_change))}">${h.age(last_change)}</span>
+  <span class="tooltip" date="${last_change}" title="${h.fmt_date(last_change)}">${h.age(last_change)}</span>
 </%def>
 
 <%def name="revision(name,rev,tip,author,last_msg)">
   <div>
   %if rev >= 0:
-      <a title="${h.tooltip('%s:\n\n%s' % (author,last_msg))}" class="tooltip revision-link safe-html-title" href="${h.url('changeset_home',repo_name=name,revision=tip)}">${'r%s:%s' % (rev,h.short_id(tip))}</a>
+      <a title="${'%s:\n\n%s' % (h.escape(author), h.escape(last_msg))}" class="tooltip revision-link safe-html-title" href="${h.url('changeset_home',repo_name=name,revision=tip)}">${'r%s:%s' % (rev,h.short_id(tip))}</a>
   %else:
       ${_('No changesets yet')}
   %endif
@@ -119,14 +119,14 @@
 <%def name="repo_actions(repo_name, super_user=True)">
   <div>
     <div style="float:left; margin-right:5px;" class="grid_edit">
-      <a href="${h.url('edit_repo',repo_name=repo_name)}" title="${_('edit')}">
-        <i class="icon-pencil"></i> ${h.submit('edit_%s' % repo_name,_('edit'),class_="action_button")}
+      <a href="${h.url('edit_repo',repo_name=repo_name)}" title="${_('Edit')}">
+        <i class="icon-pencil"></i> ${h.submit('edit_%s' % repo_name,_('Edit'),class_="action_button")}
       </a>
     </div>
     <div style="float:left" class="grid_delete">
-      ${h.form(h.url('repo', repo_name=repo_name),method='delete')}
+      ${h.form(h.url('delete_repo', repo_name=repo_name), method='delete')}
         <i class="icon-minus-circled" style="color:#FF4444"></i>
-        ${h.submit('remove_%s' % repo_name,_('delete'),class_="action_button",
+        ${h.submit('remove_%s' % repo_name,_('Delete'),class_="action_button",
         onclick="return confirm('"+_('Confirm to delete this repository: %s') % repo_name+"');")}
       ${h.end_form()}
     </div>
@@ -147,14 +147,14 @@
 
 <%def name="user_actions(user_id, username)">
  <div style="float:left" class="grid_edit">
-   <a href="${h.url('edit_user',id=user_id)}" title="${_('edit')}">
-     <i class="icon-pencil"></i> ${h.submit('edit_%s' % username,_('edit'),class_="action_button")}
+   <a href="${h.url('edit_user',id=user_id)}" title="${_('Edit')}">
+     <i class="icon-pencil"></i> ${h.submit('edit_%s' % username,_('Edit'),class_="action_button")}
    </a>
  </div>
  <div style="float:left" class="grid_delete">
   ${h.form(h.url('delete_user', id=user_id),method='delete')}
     <i class="icon-minus-circled" style="color:#FF4444"></i>
-    ${h.submit('remove_',_('delete'),id="remove_user_%s" % user_id, class_="action_button",
+    ${h.submit('remove_',_('Delete'),id="remove_user_%s" % user_id, class_="action_button",
     onclick="return confirm('"+_('Confirm to delete this user: %s') % username+"');")}
   ${h.end_form()}
  </div>
@@ -164,13 +164,13 @@
  <div style="float:left" class="grid_edit">
     <a href="${h.url('edit_users_group', id=user_group_id)}" title="${_('Edit')}">
     <i class="icon-pencil"></i>
-     ${h.submit('edit_%s' % user_group_name,_('edit'),class_="action_button", id_="submit_user_group_edit")}
+     ${h.submit('edit_%s' % user_group_name,_('Edit'),class_="action_button", id_="submit_user_group_edit")}
     </a>
  </div>
  <div style="float:left" class="grid_delete">
     ${h.form(h.url('users_group', id=user_group_id),method='delete')}
       <i class="icon-minus-circled" style="color:#FF4444"></i>
-      ${h.submit('remove_',_('delete'),id="remove_group_%s" % user_group_id, class_="action_button",
+      ${h.submit('remove_',_('Delete'),id="remove_group_%s" % user_group_id, class_="action_button",
       onclick="return confirm('"+_('Confirm to delete this user group: %s') % user_group_name+"');")}
     ${h.end_form()}
  </div>
@@ -180,13 +180,13 @@
  <div style="float:left" class="grid_edit">
     <a href="${h.url('edit_repo_group',group_name=repo_group_name)}" title="${_('Edit')}">
     <i class="icon-pencil"></i>
-     ${h.submit('edit_%s' % repo_group_name, _('edit'),class_="action_button")}
+     ${h.submit('edit_%s' % repo_group_name, _('Edit'),class_="action_button")}
     </a>
  </div>
  <div style="float:left" class="grid_delete">
     ${h.form(h.url('repos_group', group_name=repo_group_name),method='delete')}
         <i class="icon-minus-circled" style="color:#FF4444"></i>
-        ${h.submit('remove_%s' % repo_group_name,_('delete'),class_="action_button",
+        ${h.submit('remove_%s' % repo_group_name,_('Delete'),class_="action_button",
         onclick="return confirm('"+ungettext('Confirm to delete this group: %s with %s repository','Confirm to delete this group: %s with %s repositories',gr_count) % (repo_group_name, gr_count)+"');")}
     ${h.end_form()}
  </div>
@@ -212,6 +212,6 @@
 
 <%def name="toggle_follow(repo_id)">
   <span id="follow_toggle_${repo_id}" class="following" title="${_('Stop following this repository')}"
-        onclick="javascript:toggleFollowingRepo(this, ${repo_id})">
+        onclick="toggleFollowingRepo(this, ${repo_id})">
   </span>
 </%def>
--- a/kallithea/templates/email_templates/password_reset.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/email_templates/password_reset.html	Sun Sep 06 23:36:05 2015 +0200
@@ -3,8 +3,10 @@
 
 <h4>${_('Hello %s') % user}</h4>
 
-<p>${_('We received a request to create a new password for your account.')}</p>
-<p>${_('You can generate it by clicking following URL')}:</p>
+<p>${_('We have received a request to reset the password for your account.')}</p>
+<p>${_('To set a new password, click the following link')}:</p>
 <p><a href="${reset_url}">${reset_url}</a></p>
 
-<p>${_("Please ignore this email if you did not request a new password .")}</p>
+<p>${_("Should you not be able to use the link above, please type the following code into the password reset form")}: <code>${reset_token}</code></p>
+
+<p>${_("If it weren't you who requested the password reset, just disregard this message.")}</p>
--- a/kallithea/templates/email_templates/password_reset.txt	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/email_templates/password_reset.txt	Sun Sep 06 23:36:05 2015 +0200
@@ -3,9 +3,11 @@
 
 ${_('Hello %s') % user|n,unicode}
 
-${_('We received a request to create a new password for your account.')|n,unicode}
-${_('You can generate it by clicking following URL')|n,unicode}:
+${_('We have received a request to reset the password for your account..')|n,unicode}
+${_('To set a new password, click the following link')|n,unicode}:
 
 ${reset_url|n,unicode}
 
-${_("Please ignore this email if you did not request a new password .")|n,unicode}
+${_("Should you not be able to use the link above, please type the following code into the password reset form")|n,unicode}: ${reset_token|n,unicode}
+
+${_("If it weren't you who requested the password reset, just disregard this message.")|n,unicode}
--- a/kallithea/templates/files/diff_2way.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/files/diff_2way.html	Sun Sep 06 23:36:05 2015 +0200
@@ -40,16 +40,16 @@
                         revision=c.cs2.raw_id,f_path=h.safe_unicode(c.node1.path)))}
                     </div>
                     <div class="diff-actions">
-                      <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='diff',fulldiff=1)}" class="tooltip" title="${h.tooltip(_('Show full diff for this file'))}">
+                      <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='diff',fulldiff=1)}" class="tooltip" title="${_('Show full diff for this file')}">
                           <i class="icon-file-code"></i>
                       </a>
-                      <a href="${h.url('files_diff_2way_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='diff',fulldiff=1)}" class="tooltip" title="${h.tooltip(_('Show full side-by-side diff for this file'))}">
+                      <a href="${h.url('files_diff_2way_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='diff',fulldiff=1)}" class="tooltip" title="${_('Show full side-by-side diff for this file')}">
                           <i class="icon-docs"></i>
                       </a>
-                      <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='raw')}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
+                      <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='raw')}" class="tooltip" title="${_('Raw diff')}">
                           <i class="icon-diff"></i>
                       </a>
-                      <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='download')}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
+                      <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(c.node1.path),diff2=c.cs2.raw_id,diff1=c.cs1.raw_id,diff='download')}" class="tooltip" title="${_('Download diff')}">
                           <i class="icon-floppy"></i>
                       </a>
                       ${h.checkbox('ignorews', label=_('Ignore whitespace'))}
@@ -75,7 +75,7 @@
         cmsettings: {mode: 'text/plain', readOnly: true, lineWrapping: false, lineNumbers: true},
         lhs: function(setValue) {
             if("${c.node1.is_binary}" == "True"){
-                setValue('Binary file')
+                setValue('Binary file');
             }
             else{
                 $.ajax(orig1_url, {dataType: 'text', success: setValue});
@@ -84,7 +84,7 @@
         },
         rhs: function(setValue) {
             if("${c.node2.is_binary}" == "True"){
-                setValue('Binary file')
+                setValue('Binary file');
             }
             else{
                 $.ajax(orig2_url, {dataType: 'text', success: setValue});
@@ -95,13 +95,13 @@
         var val = e.currentTarget.checked;
         $('#compare').mergely('options', {ignorews: val});
         $('#compare').mergely('update');
-    })
+    });
     $('#edit_mode').change(function(e){
         var val = !e.currentTarget.checked;
         $('#compare').mergely('cm', 'lhs').setOption('readOnly', val);
         $('#compare').mergely('cm', 'rhs').setOption('readOnly', val);
         $('#compare').mergely('update');
-    })
+    });
 });
 </script>
 
--- a/kallithea/templates/files/files.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/files/files.html	Sun Sep 06 23:36:05 2015 +0200
@@ -64,10 +64,10 @@
         var url = el.href;
 
         var _base_url = '${h.url("files_home",repo_name=c.repo_name,revision='',f_path='')}';
-        _base_url = _base_url.replace('//','/')
+        _base_url = _base_url.replace('//','/');
 
         //extract rev and the f_path from url.
-        parts = url.split(_base_url)
+        parts = url.split(_base_url);
         if(parts.length != 2){
             return false;
         }
@@ -145,7 +145,7 @@
     $('#hlcode').mouseup(getSelectionLink);
 
     // history select field
-    var cache = {}
+    var cache = {};
     $("#diff1").select2({
         placeholder: _TM['Select changeset'],
         dropdownAutoWidth: true,
@@ -160,10 +160,10 @@
                 var children = [];
                 $.each(this.children, function(){
                     if(query.term.length == 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0 ){
-                        children.push({'id': this.id, 'text': this.text})
+                        children.push({'id': this.id, 'text': this.text});
                     }
-                })
-                data.results.push({'text': section, 'children': children})
+                });
+                data.results.push({'text': section, 'children': children});
             });
             query.callback(data);
           }else{
@@ -176,7 +176,7 @@
                   cache[key] = data;
                   query.callback({results: data.results});
                 }
-              })
+              });
           }
         }
     });
@@ -186,10 +186,10 @@
             success: function(data) {
                 $('#file_authors').html(data);
                 $('#file_authors').show();
-                tooltip_activate()
+                tooltip_activate();
             }
-        })
-    })
+        });
+    });
 }
 
 $(document).ready(function(){
@@ -233,7 +233,8 @@
     // change branch filter
     $("#branch_selector").select2({
         dropdownAutoWidth: true,
-        minimumInputLength: 1
+        minimumInputLength: 1,
+        sortResults: branchSort
         });
 
     $("#branch_selector").change(function(e){
--- a/kallithea/templates/files/files_add.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/files/files_add.html	Sun Sep 06 23:36:05 2015 +0200
@@ -79,7 +79,7 @@
                     $(opt).attr('mode', m.mode);
                     if (m.mime == 'text/plain') {
                         // default plain text
-                        $(opt).attr('selected', 'selected');
+                        $(opt).prop('selected', true);
                         modes_select.options[0] = opt;
                     } else {
                         modes_select.options[index++] = opt;
--- a/kallithea/templates/files/files_browser.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/files/files_browser.html	Sun Sep 06 23:36:05 2015 +0200
@@ -29,7 +29,7 @@
         <div class="browser-nav">
             ${h.form(h.url.current())}
             <div class="info_box">
-              <div class="info_box_elem rev">${_('revision')}</div>
+              <div class="info_box_elem rev">${_('Revision')}</div>
               <div class="info_box_elem"><a class="btn btn-mini ypjax-link" href="${c.url_prev}" title="${_('Previous revision')}"><i class="icon-left-open"></i></a></div>
               <div class="info_box_elem">${h.text('at_rev',value=c.changeset.revision,size=5)}</div>
               <div class="info_box_elem"><a class="btn btn-mini ypjax-link" href="${c.url_next}" title="${_('Next revision')}"><i class="icon-right-open"></i></a></div>
@@ -47,7 +47,7 @@
             <div>
                 <div id="node_filter_box_loading" style="display:none">${_('Loading file list...')}</div>
                 <div id="node_filter_box" style="display:none">
-                ${h.files_breadcrumbs(c.repo_name,c.changeset.raw_id,c.file.path)}/<input class="init" type="text" value="type to search..." name="filter" size="25" id="node_filter" autocomplete="off">
+                ${h.files_breadcrumbs(c.repo_name,c.changeset.raw_id,c.file.path)}/<input class="init" type="text" value="type to search..." name="filter" size="25" id="node_filter">
                 </div>
             </div>
         </div>
@@ -59,7 +59,6 @@
                 <tr>
                     <th>${_('Name')}</th>
                     <th>${_('Size')}</th>
-                    <th>${_('Mimetype')}</th>
                     <th>${_('Last Revision')}</th>
                     <th>${_('Last Modified')}</th>
                     <th>${_('Last Committer')}</th>
@@ -76,7 +75,6 @@
                     <td></td>
                     <td></td>
                     <td></td>
-                    <td></td>
                 </tr>
                 %endif
 
@@ -91,18 +89,13 @@
                      %endif
                      </td>
                      <td>
-                      %if node.is_file():
-                          ${node.mimetype}
-                      %endif
-                     </td>
-                     <td>
                          %if node.is_file():
-                             <a title="${h.tooltip(node.last_changeset.message)}" href="${h.url('changeset_home',repo_name=c.repo_name,revision=node.last_changeset.raw_id)}" class="tooltip revision-link">${h.show_id(node.last_changeset)}</a>
+                             <a title="${node.last_changeset.message}" href="${h.url('changeset_home',repo_name=c.repo_name,revision=node.last_changeset.raw_id)}" class="tooltip revision-link">${h.show_id(node.last_changeset)}</a>
                          %endif
                      </td>
                      <td>
                          %if node.is_file():
-                             <span class="tooltip" title="${h.tooltip(h.fmt_date(node.last_changeset.date))}">
+                             <span class="tooltip" title="${h.fmt_date(node.last_changeset.date)}">
                             ${h.age(node.last_changeset.date)}</span>
                          %endif
                      </td>
@@ -129,5 +122,5 @@
         if(search_GET == "1"){
             $("#filter_activate").click();
         }
-    })
+    });
 </script>
--- a/kallithea/templates/files/files_edit.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/files/files_edit.html	Sun Sep 06 23:36:05 2015 +0200
@@ -87,7 +87,7 @@
             $(opt).attr('mode', m.mode);
             if (m.mime == 'text/plain') {
                 // default plain text
-                $(opt).attr('selected', 'selected');
+                $(opt).prop('selected', true);
                 modes_select.options[0] = opt;
             } else {
                 modes_select.options[index++] = opt;
@@ -98,7 +98,7 @@
     var detected_mode = CodeMirror.findModeByExtension("${c.file.extension}");
     if(detected_mode){
         setCodeMirrorMode(myCodeMirror, detected_mode);
-        $($('#set_mode option[value="'+detected_mode.mime+'"]')[0]).attr("selected", "selected")
+        $($('#set_mode option[value="'+detected_mode.mime+'"]')[0]).prop('selected', true);
     }
 
     $('#set_mode').on('change', function(e){
@@ -107,6 +107,6 @@
         var detected_mode = CodeMirror.findModeByMIME(node.value);
         setCodeMirrorMode(myCodeMirror, detected_mode);
     });
-})
+});
 </script>
 </%def>
--- a/kallithea/templates/files/files_history_box.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/files/files_history_box.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,7 +1,7 @@
 <div class="file_author" style="clear:both">
     <div class="item">${h.literal(ungettext(u'%s author',u'%s authors',len(c.authors)) % ('<b>%s</b>' % len(c.authors))) }</div>
     %for email, user in c.authors:
-      <div class="contributor tooltip" style="float:left" title="${h.tooltip(user)}">
+      <div class="contributor tooltip" style="float:left" title="${user}">
         <div class="gravatar" style="margin:1px">
           ${h.gravatar(email, size=20)}
         </div>
--- a/kallithea/templates/files/files_source.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/files/files_source.html	Sun Sep 06 23:36:05 2015 +0200
@@ -22,7 +22,7 @@
     <div class="code-header">
         <div class="stats">
             <div class="left img"><i class="icon-doc-inv"></i></div>
-            <div class="left item"><pre class="tooltip" title="${h.tooltip(h.fmt_date(c.file_changeset.date))}">${h.link_to(h.show_id(c.file_changeset),h.url('changeset_home',repo_name=c.repo_name,revision=c.file_changeset.raw_id))}</pre></div>
+            <div class="left item"><pre class="tooltip" title="${h.fmt_date(c.file_changeset.date)}">${h.link_to(h.show_id(c.file_changeset),h.url('changeset_home',repo_name=c.repo_name,revision=c.file_changeset.raw_id))}</pre></div>
             <div class="left item"><pre>${h.format_byte_size(c.file.size,binary=True)}</pre></div>
             <div class="left item last"><pre>${c.file.mimetype}</pre></div>
             <div class="buttons">
@@ -89,6 +89,6 @@
              f_path: "${h.safe_unicode(c.file.path)}"
            }
         }
-        callbacks(_State) // defined in files.html, main callbacks. Triggerd in pjax calls
-    })
+        callbacks(_State); // defined in files.html, main callbacks. Triggerd in pjax calls
+    });
 </script>
--- a/kallithea/templates/followers/followers_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/followers/followers_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -10,7 +10,7 @@
         </div>
         <div style="clear:both;padding-top: 10px"></div>
         <div class="follower_date">${_('Started following -')}
-        <span class="tooltip" title="${h.tooltip(f.follows_from)}"> ${h.age(f.follows_from)}</span></div>
+        <span class="tooltip" title="${f.follows_from}"> ${h.age(f.follows_from)}</span></div>
         <div style="border-bottom: 1px solid #DDD;margin:10px 0px 10px 0px"></div>
     </div>
 % endfor
--- a/kallithea/templates/forks/fork.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/forks/fork.html	Sun Sep 06 23:36:05 2015 +0200
@@ -108,6 +108,6 @@
             'minimumResultsForSearch': -1
         });
         $('#repo_name').focus();
-    })
+    });
 </script>
 </%def>
--- a/kallithea/templates/forks/forks_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/forks/forks_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -15,7 +15,7 @@
             </div>
             <div style="clear:both;padding-top: 10px"></div>
             <div class="follower_date">${_('Forked')} -
-                <span class="tooltip" title="${h.tooltip(h.fmt_date(f.created_on))}"> ${h.age(f.created_on)}</span>
+                <span class="tooltip" title="${h.fmt_date(f.created_on)}"> ${h.age(f.created_on)}</span>
                 <a title="${_('Compare fork with %s' % c.repo_name)}"
                    href="${h.url('compare_url',repo_name=c.repo_name, org_ref_type=c.db_repo.landing_rev[0],org_ref_name=c.db_repo.landing_rev[1],other_repo=f.repo_name,other_ref_type=c.db_repo.landing_rev[0],other_ref_name=c.db_repo.landing_rev[1], merge=1)}"
                    class="btn btn-small"><i class="icon-git-compare"></i> ${_('Compare Fork')}</a>
--- a/kallithea/templates/index_base.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/index_base.html	Sun Sep 06 23:36:05 2015 +0200
@@ -19,12 +19,12 @@
                   %if c.group:
                         <a href="${h.url('new_repo',parent_group=c.group.group_id)}" class="btn btn-small"><i class="icon-plus"></i> ${_('Add Repository')}</a>
                         %if h.HasPermissionAny('hg.admin')() or h.HasRepoGroupPermissionAny('group.admin')(c.group.group_name):
-                            <a href="${h.url('new_repos_group', parent_group=c.group.group_id)}" class="btn btn-small"><i class="icon-plus"></i> ${_(u'Add Repository Group')}</a>
+                            <a href="${h.url('new_repos_group', parent_group=c.group.group_id)}" class="btn btn-small"><i class="icon-plus"></i> ${_('Add Repository Group')}</a>
                         %endif
                   %else:
                     <a href="${h.url('new_repo')}" class="btn btn-small"><i class="icon-plus"></i> ${_('Add Repository')}</a>
                     %if h.HasPermissionAny('hg.admin')():
-                        <a href="${h.url('new_repos_group')}" class="btn btn-small"><i class="icon-plus"></i> ${_(u'Add Repository Group')}</a>
+                        <a href="${h.url('new_repos_group')}" class="btn btn-small"><i class="icon-plus"></i> ${_('Add Repository Group')}</a>
                     %endif
                   %endif
                 %endif
@@ -59,11 +59,7 @@
                               </a>
                             </div>
                         </td>
-                        %if c.visual.stylify_metatags:
-                            <td>${h.urlify_text(h.desc_stylize(gr.group_description))}</td>
-                        %else:
-                            <td>${gr.group_description}</td>
-                        %endif
+                        <td>${h.urlify_text(gr.group_description, stylize=c.visual.stylify_metatags)}</td>
                         ## this is commented out since for multi nested repos can be HEAVY!
                         ## in number of executed queries during traversing uncomment at will
                         ##<td><b>${gr.repositories_recursive_count}</b></td>
@@ -112,7 +108,7 @@
             if (req) {
                 req = req.toLowerCase();
                 for (i = 0; i<data.length; i++) {
-                    var pos = data[i].raw_name.toLowerCase().indexOf(req, ${len(group_name)})
+                    var pos = data[i].raw_name.toLowerCase().indexOf(req, ${len(group_name)});
                     if (pos != -1) {
                         filtered.push(data[i]);
                     }
--- a/kallithea/templates/journal/journal.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/journal/journal.html	Sun Sep 06 23:36:05 2015 +0200
@@ -7,7 +7,7 @@
     <h5>
     <form id="filter_form">
     <input class="q_filter_box ${'' if c.search_term else 'initial'}" id="j_filter" size="15" type="text" name="filter" value="${c.search_term or _('quick filter...')}"/>
-    <span class="tooltip" title="${h.tooltip(h.journal_filter_help())}">?</span>
+    <span class="tooltip" title="${h.journal_filter_help()}">?</span>
     <input type='submit' value="${_('Filter')}" class="btn btn-small" style="padding:0px 2px 0px 2px;margin:0px"/>
     ${_('Journal')} - ${ungettext('%s Entry', '%s Entries', c.journal_pager.item_count) % (c.journal_pager.item_count)}
     </form>
@@ -50,10 +50,10 @@
             </h5>
             <ul class="links nav nav-tabs">
                 <li class="active" id="show_watched_li">
-                    <a id="show_watched" href="#watched"><i class="icon-eye"></i> ${_('Watched')}</a>
+                    <a id="show_watched" href="#watched"><i class="icon-eye"></i> ${_('Watched Repositories')}</a>
                 </li>
                 <li id="show_my_li">
-                    <a id="show_my" href="#my"><i class="icon-database"></i> ${_('My Repos')}</a>
+                    <a id="show_my" href="#my"><i class="icon-database"></i> ${_('My Repositories')}</a>
                </li>
             </ul>
         </div>
@@ -172,7 +172,7 @@
             if (req) {
                 req = req.toLowerCase();
                 for (i = 0; i<data.length; i++) {
-                    var pos = data[i].raw_name.toLowerCase().indexOf(req)
+                    var pos = data[i].raw_name.toLowerCase().indexOf(req);
                     if (pos != -1) {
                         filtered.push(data[i]);
                     }
@@ -263,7 +263,7 @@
             if (req) {
                 req = req.toLowerCase();
                 for (i = 0; i<data.length; i++) {
-                    var pos = data[i].raw_name.toLowerCase().indexOf(req)
+                    var pos = data[i].raw_name.toLowerCase().indexOf(req);
                     if (pos != -1) {
                         filtered.push(data[i]);
                     }
--- a/kallithea/templates/journal/journal_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/journal/journal_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -28,7 +28,7 @@
                         </span>
                     </div>
                     <div class="journal_action_params">${h.literal(h.action_parser(entry)[1]())}</div>
-                    <div class="date"><span class="tooltip" title="${h.tooltip(h.fmt_date(entry.action_date))}">${h.age(entry.action_date)}</span></div>
+                    <div class="date"><span class="tooltip" title="${h.fmt_date(entry.action_date)}">${h.age(entry.action_date)}</span></div>
                 %endfor
                 </div>
             </div>
--- a/kallithea/templates/login.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/login.html	Sun Sep 06 23:36:05 2015 +0200
@@ -5,50 +5,47 @@
     ${_('Log In')}
 </%block>
 
-<div id="login">
+<div id="login" class="panel panel-default">
     <%include file="/base/flash_msg.html"/>
     <!-- login -->
-    <div class="title withlogo">
+    <div class="panel-heading title withlogo">
         %if c.site_name:
             <h5>${_('Log In to %s') % c.site_name}</h5>
         %else:
             <h5>${_('Log In')}</h5>
         %endif
     </div>
-    <div class="inner">
-        ${h.form(h.url.current(came_from=c.came_from))}
+    <div class="panel-body inner">
+        ${h.form(h.url.current(**request.GET))}
         <div class="form">
             <i class="icon-lock"></i>
             <!-- fields -->
 
-            <div class="fields">
-                <div class="field">
-                    <div class="label">
-                        <label for="username">${_('Username')}:</label>
-                    </div>
-                    <div class="input">
-                        ${h.text('username',class_='focus large')}
+            <div class="form-horizontal">
+                <div class="form-group">
+                    <label class="control-label col-sm-5" for="username">${_('Username')}:</label>
+                    <div class="input col-sm-7">
+                        ${h.text('username',class_='form-control focus large')}
                     </div>
 
                 </div>
-                <div class="field">
-                    <div class="label">
-                        <label for="password">${_('Password')}:</label>
-                    </div>
-                    <div class="input">
-                        ${h.password('password',class_='focus large')}
+                <div class="form-group">
+                    <label class="control-label col-sm-5" for="password">${_('Password')}:</label>
+                    <div class="input col-sm-7">
+                        ${h.password('password',class_='form-control focus large')}
                     </div>
 
                 </div>
-                <div class="field">
-                    <div class="checkbox">
-                        <input type="checkbox" id="remember" name="remember" />
-                        <label for="remember">${_('Remember me')}</label>
+                <div class="form-group">
+                    <div class="col-sm-offset-5 col-sm-7">
+                        <div class="checkbox">
+                            <label for="remember">
+                                <input type="checkbox" id="remember" name="remember"/>
+                                ${_('Remember me')}
+                            </label>
+                        </div>
                     </div>
                 </div>
-                <div class="buttons">
-                    ${h.submit('sign_in',_('Sign In'),class_="btn")}
-                </div>
             </div>
             <!-- end fields -->
             <!-- links -->
@@ -58,6 +55,9 @@
                   /
                  ${h.link_to(_("Don't have an account ?"),h.url('register'))}
                 %endif
+                <span class="buttons">
+                    ${h.submit('sign_in',_('Sign In'),class_="btn btn-default")}
+                </span>
             </div>
 
             <!-- end links -->
--- a/kallithea/templates/password_reset.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/password_reset.html	Sun Sep 06 23:36:05 2015 +0200
@@ -44,7 +44,7 @@
                 <div class="buttons">
                     <div class="nohighlight">
                       ${h.submit('send',_('Send Password Reset Email'),class_="btn")}
-                          <div class="activation_msg">${_('Password reset link will be sent to the email address matching your username.')}</div>
+                          <div class="activation_msg">${_('A password reset link will be sent to the specified email address if it is registered in the system.')}</div>
                     </div>
                 </div>
             </div>
--- a/kallithea/templates/password_reset_confirmation.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/password_reset_confirmation.html	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,63 @@
+## -*- coding: utf-8 -*-
+<%inherit file="base/root.html"/>
+
+<%block name="title">
+    ${_('Reset Your Password')}
+</%block>
+
+<div id="register">
+    <%include file="/base/flash_msg.html"/>
+    <div class="title withlogo">
+        %if c.site_name:
+            <h5>${_('Reset Your Password to %s') % c.site_name}</h5>
+        %else:
+            <h5>${_('Reset Your Password')}</h5>
+        %endif
+    </div>
+    <div class="inner">
+        ${h.form(h.url('reset_password_confirmation'), method='post')}
+        <p>${_('You are about to set a new password for the email address %s.') % c.email}</p>
+        <p>${_('Note that you must use the same browser session for this as the one used to request the password reset.')}</p>
+        <div style="display: none;">
+            ${h.hidden('email')}
+            ${h.hidden('timestamp')}
+        </div>
+        <div class="form">
+            <!-- fields -->
+            <div class="fields">
+                 <div class="field">
+                    <div class="label">
+                        <label for="token">${_('Code you received in the email')}:</label>
+                    </div>
+                    <div class="input">
+                        ${h.text('token', class_='focus')}
+                    </div>
+                 </div>
+
+                 <div class="field">
+                    <div class="label">
+                        <label for="password">${_('New Password')}:</label>
+                    </div>
+                    <div class="input">
+                        ${h.password('password',class_='focus')}
+                    </div>
+                 </div>
+
+                 <div class="field">
+                    <div class="label">
+                        <label for="password_confirm">${_('Confirm New Password')}:</label>
+                    </div>
+                    <div class="input">
+                        ${h.password('password_confirm',class_='focus')}
+                    </div>
+                 </div>
+                <div class="buttons">
+                    <div class="nohighlight">
+                      ${h.submit('send',_('Confirm'),class_="btn")}
+                    </div>
+                </div>
+            </div>
+        </div>
+        ${h.end_form()}
+    </div>
+   </div>
--- a/kallithea/templates/pullrequests/pullrequest.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/pullrequests/pullrequest.html	Sun Sep 06 23:36:05 2015 +0200
@@ -92,25 +92,6 @@
 
         </div>
 
-        ## Reviewers
-        <div style="float:left; border-left:1px dashed #eee">
-            <div class="pr-details-title">${_('Pull Request Reviewers')}</div>
-            <div id="reviewers" style="padding:0px 0px 0px 15px">
-              ## members goes here !
-              <div>
-                <ul id="review_members" class="group_members">
-                </ul>
-              </div>
-
-              <div class='ac'>
-                <div class="reviewer_ac">
-                   ${h.text('user', class_='yui-ac-input',placeholder=_('Type name of reviewer to add'))}
-                   <div id="reviewers_container"></div>
-                </div>
-              </div>
-            </div>
-        </div>
-
         <div style="clear:both;padding: 0 0 30px 0;"></div>
 
         <h4>${_('Changesets')}</h4>
@@ -128,10 +109,6 @@
 
 <script type="text/javascript" src="${h.url('/js/graph.js', ver=c.kallithea_version)}"></script>
 <script type="text/javascript">
-  var _USERS_AC_DATA = ${c.users_array|n};
-  var _GROUPS_AC_DATA = ${c.user_groups_array|n};
-  PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
-
   pyroutes.register('pullrequest_repo_info', "${url('pullrequest_repo_info',repo_name='%(repo_name)s')}", ['repo_name']);
 
   var pendingajax = undefined;
@@ -152,7 +129,7 @@
               $other_ref.empty();
               for(var i = 0; i < data.refs.length; i++)
               {
-                var $optgroup = $('<optgroup/>').attr('label', data.refs[i][1]);
+                var $optgroup = $('<optgroup/>').prop('label', data.refs[i][1]);
                 var options = data.refs[i][0];
                 var length = options.length;
                 for(var j = 0; j < length; j++)
@@ -224,7 +201,8 @@
       ## (org_repo can't change)
 
       $("#org_ref").select2({
-          dropdownAutoWidth: true
+          dropdownAutoWidth: true,
+          sortResults: branchSort
       });
       $("#org_ref").on("change", function(e){
           loadPreview();
@@ -238,7 +216,8 @@
       });
 
       $("#other_ref").select2({
-          dropdownAutoWidth: true
+          dropdownAutoWidth: true,
+          sortResults: branchSort
       });
       $("#other_ref").on("change", function(e){
           loadPreview();
--- a/kallithea/templates/pullrequests/pullrequest_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/pullrequests/pullrequest_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -11,43 +11,24 @@
   <table>
     <thead>
       <tr>
-        <th></th>
+        <th class="left">${_('Vote')}</th>
         <th class="left">${_('Title')}</th>
-        <th class="left">${_('Author')}</th>
+        <th class="left">${_('Owner')}</th>
         <th class="left">${_('Age')}</th>
         <th class="left">${_('From')}</th>
         <th class="left">${_('To')}</th>
+        <th class="right" style="padding-right:5px">${_('Delete')}</th>
       </tr>
     </thead>
 % for pr in pullrequests:
     <tr class="${'pr-closed' if pr.is_closed() else ''}">
       <td width="80px">
-        ## review status
-        %if pr.last_review_status:
-          <i class="icon-circle changeset-status-${pr.last_review_status}" title="${_("Latest vote: %s") % pr.last_review_status}"></i>
-        %else:
-          <i class="icon-circle changeset-status-not_reviewed" title="${_("Nobody voted")}"></i>
-        %endif
-
         <% status = pr.user_review_status(c.authuser.user_id) %>
         %if status:
           <i class="icon-circle changeset-status-${status}" title="${_("You voted: %s") % status}"></i>
         %else:
           <i class="icon-circle changeset-status-not_reviewed" title="${_("You didn't vote")}"></i>
         %endif
-
-        ## delete button
-        %if pr.author.user_id == c.authuser.user_id:
-          ${h.form(url('pullrequest_delete', repo_name=pr.other_repo.repo_name, pull_request_id=pr.pull_request_id),method='delete', style="display:inline-block")}
-          <button class="action_button"
-                  id="remove_${pr.pull_request_id}"
-                  name="remove_${pr.pull_request_id}"
-                  title="${_('Delete Pull Request')}"
-                  onclick="return confirm('${_('Confirm to delete this pull request')}');">
-            <i class="icon-minus-circled"></i>
-          </button>
-          ${h.end_form()}
-        %endif
       </td>
       <td>
         <a href="${pr.url()}">
@@ -58,10 +39,10 @@
         </a>
       </td>
       <td>
-        ${pr.author.username_and_name}
+        ${pr.owner.full_name_and_username}
       </td>
       <td>
-        <span class="tooltip" title="${h.tooltip(h.fmt_date(pr.created_on))}">
+        <span class="tooltip" title="${h.fmt_date(pr.created_on)}">
           ${h.age(pr.created_on)}
         </span>
       </td>
@@ -77,6 +58,22 @@
           ${pr.other_repo.repo_name}#${other_ref_name}
         </a>
       </td>
+      <td style="text-align:right">
+        %if pr.owner.user_id == c.authuser.user_id:
+          ${h.form(url('pullrequest_delete', repo_name=pr.other_repo.repo_name, pull_request_id=pr.pull_request_id),method='delete', style="display:inline-block")}
+          <button class="action_button"
+                  id="remove_${pr.pull_request_id}"
+                  name="remove_${pr.pull_request_id}"
+                  title="${_('Delete Pull Request')}"
+                  onclick="return confirm('${_('Confirm to delete this pull request')}')
+                      && ((${len(pr.comments)} == 0) ||
+                          confirm('${_('Confirm again to delete this pull request with %s comments') % len(pr.comments)}'))
+                      ">
+            <i class="icon-minus-circled"></i>
+          </button>
+          ${h.end_form()}
+        %endif
+      </td>
     </tr>
 % endfor
   </table>
@@ -91,5 +88,3 @@
 %endif
 
 </%def>
-
-${pullrequest_overview(c.pullrequests_pager)}
--- a/kallithea/templates/pullrequests/pullrequest_show.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/pullrequests/pullrequest_show.html	Sun Sep 06 23:36:05 2015 +0200
@@ -3,11 +3,11 @@
 <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
 
 <%block name="title">
-    ${_('%s Pull Request #%s') % (c.repo_name, c.pull_request.pull_request_id)}
+    ${_('%s Pull Request %s') % (c.repo_name, c.pull_request.nice_id())}
 </%block>
 
 <%def name="breadcrumbs_links()">
-    ${_('Pull request #%s from %s#%s') % (c.pull_request.pull_request_id, c.pull_request.org_repo.repo_name, c.cs_branch_name)}
+    ${_('Pull request %s from %s#%s') % (c.pull_request.nice_id(), c.pull_request.org_repo.repo_name, c.cs_branch_name)}
 </%def>
 
 <%block name="header_menu">
@@ -15,7 +15,7 @@
 </%block>
 
 <%def name="main()">
-<% editable = not c.pull_request.is_closed() and (h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) or c.pull_request.author.user_id == c.authuser.user_id) %>
+<% editable = not c.pull_request.is_closed() and (h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) or c.pull_request.owner.user_id == c.authuser.user_id) %>
 ${self.repo_context_bar('showpullrequest')}
 <div class="box">
   <!-- box / title -->
@@ -38,7 +38,7 @@
             <label>${_('Description')}:</label>
             %if editable:
             <div style="margin: 5px">
-              <a class="btn btn-small" onclick="YUD.setStyle('pr-edit-form','display','');YUD.setStyle(YUD.getElementsByClassName('pr-not-edit'),'display','none')">${_("Edit")}</a>
+              <a class="btn btn-small" onclick="$('.pr-do-edit').show();$('.pr-not-edit').hide()">${_("Edit")}</a>
             </div>
             %endif
           </div>
@@ -48,7 +48,7 @@
         </div>
 
         %if editable:
-        <div id="pr-edit-form" style="display:none">
+        <div class="pr-do-edit" style="display:none">
           <div class="field">
               <div class="label-summary">
                   <label for="pullrequest_title">${_('Title')}:</label>
@@ -76,15 +76,14 @@
           <div class="input">
             <div class="changeset-status-container" style="float:none;clear:both">
             %if c.current_voting_result:
-              <div class="changeset-status-ico" style="padding:0px 4px 0px 0px">
-                  <i class="icon-circle changeset-status-${c.current_voting_result}" title="${_('Pull request status calculated from votes')}"></i></div>
-              <div class="changeset-status-lbl tooltip" title="${_('Pull request status calculated from votes')}">
+              <span class="changeset-status-ico" style="padding:0px 4px 0px 0px">
+                  <i class="icon-circle changeset-status-${c.current_voting_result}" title="${_('Pull request status calculated from votes')}"></i></span>
+              <span class="changeset-status-lbl tooltip" title="${_('Pull request status calculated from votes')}">
                 %if c.pull_request.is_closed():
                     ${_('Closed')},
                 %endif
                 ${h.changeset_status_lbl(c.current_voting_result)}
-              </div>
-
+              </span>
             %endif
             </div>
           </div>
@@ -95,7 +94,7 @@
           </div>
           <div class="input">
             % if len(c.pull_request_pending_reviewers) > 0:
-                <div class="tooltip" title="${h.tooltip(', '.join([x.username for x in c.pull_request_pending_reviewers]))}">${ungettext('%d reviewer', '%d reviewers',len(c.pull_request_pending_reviewers)) % len(c.pull_request_pending_reviewers)}</div>
+                <div class="tooltip" title="${', '.join([x.username for x in c.pull_request_pending_reviewers])}">${ungettext('%d reviewer', '%d reviewers',len(c.pull_request_pending_reviewers)) % len(c.pull_request_pending_reviewers)}</div>
             % elif len(c.pull_request_reviewers) > 0:
                 <div>${_('Pull request was reviewed by all reviewers')}</div>
             %else:
@@ -121,10 +120,12 @@
               <label>${_('Target')}:</label>
           </div>
           <div class="input">
-              <div>
+            %if c.is_range:
+              ${_("This is just a range of changesets and doesn't have a target or a real merge ancestor.")}
+            %else:
               ${h.link_to_ref(c.pull_request.other_repo.repo_name, c.a_ref_type, c.a_ref_name)}
               ## we don't know other rev - c.a_rev is ancestor and not necessarily on other_name_branch branch
-              </div>
+            %endif
           </div>
         </div>
         <div class="field">
@@ -152,16 +153,18 @@
         </div>
         <div class="field">
           <div class="label-summary">
-              <label>${_('Created by')}:</label>
+              <label>${_('Owner')}:</label>
           </div>
-          <div class="input">
-              <div class="author">
+          <div class="input pr-not-edit">
                   <div class="gravatar">
-                    ${h.gravatar(c.pull_request.author.email, size=20)}
+                    ${h.gravatar(c.pull_request.owner.email, size=20)}
                   </div>
-                  <span>${c.pull_request.author.username_and_name}</span><br/>
-                  <span><a href="mailto:${c.pull_request.author.email}">${c.pull_request.author.email}</a></span><br/>
-              </div>
+                  <span>${c.pull_request.owner.full_name_and_username}</span><br/>
+                  <span><a href="mailto:${c.pull_request.owner.email}">${c.pull_request.owner.email}</a></span><br/>
+          </div>
+          <div class="input pr-do-edit ac" style="display:none">
+               ${h.text('owner', class_="large", value=c.pull_request.owner.username, placeholder=_('Username'))}
+               <div id="owner_completion_container"></div>
           </div>
         </div>
 
@@ -172,9 +175,9 @@
             <div class="input">
               <div class="msg-div">${c.update_msg}</div>
               %if c.avail_revs:
-              <div id="updaterevs" style="max-height:200px; overflow-y:auto; overflow-x:hidden; margin-bottom: 10px">
+              <div id="updaterevs" style="max-height:200px; overflow-y:auto; overflow-x:hidden; margin-bottom: 10px; padding: 1px 0">
                 <div style="height:0">
-                  <canvas id="avail_graph_canvas"></canvas>
+                  <canvas id="avail_graph_canvas" style="width:0"></canvas>
                 </div>
                 <table id="updaterevs-table" class="noborder" style="padding-left:50px">
                   %for cnt, cs in enumerate(c.avail_cs):
@@ -213,15 +216,23 @@
           <div>
             <ul id="review_members" class="group_members">
             %for member,status in c.pull_request_reviewers:
+              ## WARNING: the HTML below is duplicate with
+              ## kallithea/public/js/base.js
+              ## If you change something here it should be reflected in the template too.
               <li id="reviewer_${member.user_id}">
                 <div class="reviewers_member">
-                    <div class="reviewer_status tooltip" title="${h.tooltip(h.changeset_status_lbl(status.status if status else 'not_reviewed'))}">
+                    <div class="reviewer_status tooltip" title="${h.changeset_status_lbl(status.status if status else 'not_reviewed')}">
                       <i class="icon-circle changeset-status-${status.status if status else 'not_reviewed'}"></i>
                     </div>
                   <div class="reviewer_gravatar gravatar">
                     ${h.gravatar(member.email, size=14)}
                   </div>
-                  <div style="float:left;">${member.full_name} (${_('owner') if c.pull_request.user_id == member.user_id else _('reviewer')})</div>
+                  <div style="float:left;">
+                    ${member.full_name_and_username}
+                    %if c.pull_request.user_id == member.user_id:
+                      (${_('Owner')})
+                    %endif
+                  </div>
                   <input type="hidden" value="${member.user_id}" name="review_members" />
                   %if editable:
                   <div class="reviewer_member_remove action_button" onclick="removeReviewMember(${member.user_id})" title="${_('Remove reviewer')}">
@@ -342,6 +353,7 @@
     </script>
 
     ## diff block
+    <div class="commentable-diff">
     <%namespace name="diff_block" file="/changeset/diff_block.html"/>
     ${diff_block.diff_block_js()}
     %for fid, change, f, stat in c.files:
@@ -350,7 +362,7 @@
     % if c.limited_diff:
       <h4>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff anyway')}</a></h4>
     % endif
-
+    </div>
 
     ## template for inline comment form
     ${comment.comment_inline_form()}
@@ -366,22 +378,18 @@
 
     <script type="text/javascript">
       $(document).ready(function(){
-          PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
+          PullRequestAutoComplete($('#user'), $('#reviewers_container'), _USERS_AC_DATA);
+          SimpleUserAutoComplete($('#owner'), $('#owner_completion_container'), _USERS_AC_DATA);
 
-          $('.add-bubble').click(function(e){
-              var tr = e.currentTarget;
-              injectInlineForm(tr.parentNode.parentNode);
+          $('.code-difftable').on('click', '.add-bubble', function(e){
+              show_comment_form($(this));
           });
 
           var avail_jsdata = ${c.avail_jsdata|n};
           var avail_r = new BranchRenderer('avail_graph_canvas', 'updaterevs-table', 'chg_available_');
           avail_r.render(avail_jsdata,40);
 
-          // inject comments into they proper positions
-          var file_comments = $('.inline-comment-placeholder').toArray();
-          renderInlineComments(file_comments);
-
-          linkInlineComments(document.getElementsByClassName('firstlink'), document.getElementsByClassName("comment"));
+          move_comments($(".comments .comments-list-chunk"));
 
           $('#updaterevs input').change(function(e){
               var update = !!e.target.value;
@@ -390,7 +398,7 @@
           });
           var $org_review_members = $('#review_members').clone();
           $('#pr-form-reset').click(function(e){
-              $('#pr-edit-form').hide();
+              $('.pr-do-edit').hide();
               $('.pr-not-edit').show();
               $('#pr-form-save').prop('disabled',false);
               $('#pr-form-clone').prop('disabled',true);
--- a/kallithea/templates/pullrequests/pullrequest_show_all.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/pullrequests/pullrequest_show_all.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,5 +1,7 @@
 <%inherit file="/base/base.html"/>
 
+<%namespace name="pullrequest_data" file="pullrequest_data.html"/>
+
 <%block name="title">
     ${_('%s Pull Requests') % c.repo_name}
 </%block>
@@ -51,7 +53,7 @@
         </div>
     </div>
 
-    <%include file='pullrequest_data.html'/>
+    ${pullrequest_data.pullrequest_overview(c.pullrequests_pager)}
 
 </div>
 </%def>
--- a/kallithea/templates/pullrequests/pullrequest_show_my.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/pullrequests/pullrequest_show_my.html	Sun Sep 06 23:36:05 2015 +0200
@@ -1,5 +1,7 @@
 <%inherit file="/base/base.html"/>
 
+<%namespace name="pullrequest_data" file="pullrequest_data.html"/>
+
 <%block name="title">
     ${_('My Pull Requests')}
 </%block>
@@ -30,7 +32,11 @@
         </div>
     </div>
 
-    <%include file='pullrequest_show_my_data.html'/>
+    <div class="pullrequests_section_head">${_('Pull Requests Created by Me')}</div>
+    ${pullrequest_data.pullrequest_overview(c.my_pull_requests)}
+
+    <div class="pullrequests_section_head" style="clear:both">${_('Pull Requests I Participate In')}</div>
+    ${pullrequest_data.pullrequest_overview(c.participate_in_pull_requests)}
 
 </div>
 </%def>
--- a/kallithea/templates/pullrequests/pullrequest_show_my_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<%namespace name="pullrequests" file="/pullrequests/pullrequest_data.html"/>
-
-<div class="pullrequests_section_head">${_('Pull Requests Created by Me')}</div>
-${pullrequests.pullrequest_overview(c.my_pull_requests)}
-
-<div class="pullrequests_section_head" style="clear:both">${_('Pull Requests I Participate In')}</div>
-${pullrequests.pullrequest_overview(c.participate_in_pull_requests)}
--- a/kallithea/templates/register.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/register.html	Sun Sep 06 23:36:05 2015 +0200
@@ -33,16 +33,16 @@
                         <label for="password">${_('Password')}:</label>
                     </div>
                     <div class="input">
-                        ${h.password('password',class_="medium",autocomplete="off")}
+                        ${h.password('password',class_="medium")}
                     </div>
                 </div>
 
                 <div class="field">
                     <div class="label">
-                        <label for="password">${_('Re-enter password')}:</label>
+                        <label for="password_confirmation">${_('Re-enter password')}:</label>
                     </div>
                     <div class="input">
-                        ${h.password('password_confirmation',class_="medium",autocomplete="off")}
+                        ${h.password('password_confirmation',class_="medium")}
                     </div>
                 </div>
 
--- a/kallithea/templates/search/search.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/search/search.html	Sun Sep 06 23:36:05 2015 +0200
@@ -64,8 +64,8 @@
                 <div class="select">
                     ${h.select('type',c.cur_type,[('content',_('File contents')),
                         ('commit',_('Commit messages')),
-                        ('path',_('File names'))
-                        ##('repository',_('Repository names'))
+                        ('path',_('File names')),
+                        ##('repository',_('Repository names')),
                         ])}
                 </div>
              </div>
--- a/kallithea/templates/summary/statistics.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/summary/statistics.html	Sun Sep 06 23:36:05 2015 +0200
@@ -379,7 +379,7 @@
                     item.series.label = 'commits';
                 }
                 var d = new Date(x*1000);
-                var fd = d.toDateString()
+                var fd = d.toDateString();
                 var nr_commits = parseInt(y);
 
                 var cur_data = dataset[item.series.label].data[item.dataIndex];
@@ -433,7 +433,7 @@
     overview.setSelection(initial_ranges);
 
     plot.subscribe("plotselected", plotselected);
-    plot.subscribe("plothover", plothover)
+    plot.subscribe("plothover", plothover);
 
     overview.subscribe("plotselected", function (ranges) {
         plot.setSelection(ranges);
--- a/kallithea/templates/summary/summary.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/summary/summary.html	Sun Sep 06 23:36:05 2015 +0200
@@ -84,11 +84,7 @@
               <div class="label-summary">
                   <label>${_('Description')}:</label>
               </div>
-                 %if c.visual.stylify_metatags:
-                   <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(h.desc_stylize(h.html_escape(c.db_repo.description)))}</div>
-                 %else:
-                   <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(h.html_escape(c.db_repo.description))}</div>
-                 %endif
+              <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(c.db_repo.description, stylize=c.visual.stylify_metatags)}</div>
             </div>
 
             <div class="field">
@@ -126,7 +122,7 @@
                     ${h.hidden('download_options')}
                     <span style="vertical-align: bottom">
                       <input id="archive_subrepos" type="checkbox" name="subrepos" />
-                      <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label>
+                      <label for="archive_subrepos" class="tooltip" title="${_('Check this to download archive with subrepos')}" >${_('With subrepos')}</label>
                     </span>
                 %endif
               </div>
@@ -267,10 +263,10 @@
                 var children = [];
                 $.each(this.children, function(){
                     if(query.term.length == 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0 ){
-                        children.push({'id': this.id, 'text': this.text})
+                        children.push({'id': this.id, 'text': this.text});
                     }
-                })
-                data.results.push({'text': section, 'children': children})
+                });
+                data.results.push({'text': section, 'children': children});
             });
             query.callback(data);
           }else{
@@ -283,7 +279,7 @@
                   cache[key] = data;
                   query.callback({results: data.results});
                 }
-              })
+              });
           }
         }
     });
@@ -303,7 +299,7 @@
              url = url.replace('__SUB__',subrepos);
              url = url.replace('__NAME__',title_tmpl);
 
-             s.html(url)
+             s.html(url);
            }
        }
     });
@@ -312,7 +308,7 @@
     %for cnt,archive in enumerate(c.db_repo_scm_instance._get_archives()):
       tmpl_links["${archive['type']}"] = '${h.link_to('__NAME__', h.url('files_archive_home',repo_name=c.db_repo.repo_name, fname='__CS__'+archive['extension'],subrepos='__SUB__'),class_='btn btn-small')}';
     %endfor
-})
+});
 </script>
 
 %if c.show_stats:
--- a/kallithea/templates/tags/tags_data.html	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/templates/tags/tags_data.html	Sun Sep 06 23:36:05 2015 +0200
@@ -24,7 +24,7 @@
                 </span>
             </td>
             <td>${tag[1]._timestamp}</td>
-            <td><span class="tooltip" title="${h.tooltip(h.age(tag[1].date))}">${h.fmt_date(tag[1].date)}</span></td>
+            <td><span class="tooltip" title="${h.age(tag[1].date)}">${h.fmt_date(tag[1].date)}</span></td>
             <td title="${tag[1].author}">${h.person(tag[1].author)}</td>
             <td>${tag[1].revision}</td>
             <td>
--- a/kallithea/tests/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -33,6 +33,7 @@
 
 """
 import os
+import re
 import time
 import logging
 import datetime
@@ -54,8 +55,9 @@
 
 from kallithea.lib.compat import unittest
 from kallithea import is_windows
-from kallithea.model.db import User
-from kallithea.tests.nose_parametrized import parameterized
+from kallithea.model.db import Notification, User, UserNotification
+from kallithea.model.meta import Session
+from kallithea.tests.parameterized import parameterized
 from kallithea.lib.utils2 import safe_str
 
 
@@ -66,11 +68,11 @@
 log = logging.getLogger(__name__)
 
 __all__ = [
-    'parameterized', 'environ', 'url', 'get_new_dir', 'TestController',
-    'SkipTest', 'ldap_lib_installed', 'BaseTestCase', 'init_stack',
+    'parameterized', 'environ', 'url', 'TestController',
+    'SkipTest', 'ldap_lib_installed', 'pam_lib_installed', 'BaseTestCase', 'init_stack',
     'TESTS_TMP_PATH', 'HG_REPO', 'GIT_REPO', 'NEW_HG_REPO', 'NEW_GIT_REPO',
     'HG_FORK', 'GIT_FORK', 'TEST_USER_ADMIN_LOGIN', 'TEST_USER_ADMIN_PASS',
-    'TEST_USER_REGULAR_LOGIN', 'TEST_USER_REGULAR_PASS',
+    'TEST_USER_ADMIN_EMAIL', 'TEST_USER_REGULAR_LOGIN', 'TEST_USER_REGULAR_PASS',
     'TEST_USER_REGULAR_EMAIL', 'TEST_USER_REGULAR2_LOGIN',
     'TEST_USER_REGULAR2_PASS', 'TEST_USER_REGULAR2_EMAIL', 'TEST_HG_REPO',
     'TEST_HG_REPO_CLONE', 'TEST_HG_REPO_PULL', 'TEST_GIT_REPO',
@@ -142,20 +144,12 @@
     # means that python-ldap is not installed
     pass
 
-
-def get_new_dir(title):
-    """
-    Returns always new directory path.
-    """
-    from kallithea.tests.vcs.utils import get_normalized_path
-    name = TEST_REPO_PREFIX
-    if title:
-        name = '-'.join((name, title))
-    hex = hashlib.sha1(str(time.time())).hexdigest()
-    name = '-'.join((name, hex))
-    path = os.path.join(TEST_DIR, name)
-    return get_normalized_path(path)
-
+try:
+    import pam
+    pam.PAM_TEXT_INFO
+    pam_lib_installed = True
+except ImportError:
+    pam_lib_installed = False
 
 import logging
 
@@ -183,6 +177,15 @@
         init_stack(self.wsgiapp.config)
         unittest.TestCase.__init__(self, *args, **kwargs)
 
+    def remove_all_notifications(self):
+        Notification.query().delete()
+
+        # Because query().delete() does not (by default) trigger cascades.
+        # http://docs.sqlalchemy.org/en/rel_0_7/orm/collections.html#passive-deletes
+        UserNotification.query().delete()
+
+        Session().commit()
+
 
 class TestController(BaseTestCase):
 
@@ -199,32 +202,41 @@
                                  {'username': username,
                                   'password': password})
 
-        if 'invalid user name' in response.body:
+        if 'Invalid username or password' in response.body:
             self.fail('could not login using %s %s' % (username, password))
 
         self.assertEqual(response.status, '302 Found')
-        ses = response.session['authuser']
-        self.assertEqual(ses.get('username'), username)
+        self.assert_authenticated_user(response, username)
+
         response = response.follow()
-        self.assertEqual(ses.get('is_authenticated'), True)
-
         return response.session['authuser']
 
     def _get_logged_user(self):
         return User.get_by_username(self._logged_username)
 
+    def assert_authenticated_user(self, response, expected_username):
+        cookie = response.session.get('authuser')
+        user = cookie and cookie.get('user_id')
+        user = user and User.get(user)
+        user = user and user.username
+        self.assertEqual(user, expected_username)
+        self.assertEqual(cookie.get('is_authenticated'), True)
+
     def authentication_token(self):
         return self.app.get(url('authentication_token')).body
 
-    def checkSessionFlash(self, response, msg, skip=0):
+    def checkSessionFlash(self, response, msg=None, skip=0, _matcher=lambda msg, m: msg in m):
         if 'flash' not in response.session:
-            self.fail(safe_str(u'msg `%s` not found - session has no flash ' % msg))
+            self.fail(safe_str(u'msg `%s` not found - session has no flash:\n%s' % (msg, response)))
         try:
             level, m = response.session['flash'][-1 - skip]
-            if msg in m:
+            if _matcher(msg, m):
                 return
         except IndexError:
             pass
         self.fail(safe_str(u'msg `%s` not found in session flash (skipping %s): %s' %
                            (msg, skip,
                             ', '.join('`%s`' % m for level, m in response.session['flash']))))
+
+    def checkSessionFlashRegex(self, response, regex, skip=0):
+        self.checkSessionFlash(response, regex, skip=skip, _matcher=re.search)
--- a/kallithea/tests/api/api_base.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/api/api_base.py	Sun Sep 06 23:36:05 2015 +0200
@@ -18,7 +18,6 @@
     KALLITHEA_WHOOSH_TEST_DISABLE=1 nosetests --with-coverage --cover-package=kallithea.controllers.api.api -x kallithea/tests/api
 """
 
-from __future__ import with_statement
 import os
 import random
 import mock
@@ -88,13 +87,13 @@
     return gr
 
 
-class BaseTestApi(object):
+class _BaseTestApi(object):
     REPO = None
     REPO_TYPE = None
 
     @classmethod
     def setup_class(cls):
-        cls.usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
+        cls.usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
         cls.apikey = cls.usr.api_key
         cls.test_user = UserModel().create_or_update(
             username='test-api',
@@ -166,7 +165,7 @@
         id_, params = _build_data('trololo', 'get_user')
         response = api_call(self, params)
 
-        expected = 'Invalid API KEY'
+        expected = 'Invalid API key'
         self._compare_error(id_, expected, given=response.body)
 
     def test_api_missing_non_optional_param(self):
@@ -233,9 +232,9 @@
                                   userid=TEST_USER_ADMIN_LOGIN)
         response = api_call(self, params)
 
-        usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
         ret = usr.get_api_data()
-        ret['permissions'] = AuthUser(usr.user_id).permissions
+        ret['permissions'] = AuthUser(dbuser=usr).permissions
 
         expected = ret
         self._compare_ok(id_, expected, given=response.body)
@@ -252,9 +251,9 @@
         id_, params = _build_data(self.apikey, 'get_user')
         response = api_call(self, params)
 
-        usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
         ret = usr.get_api_data()
-        ret['permissions'] = AuthUser(usr.user_id).permissions
+        ret['permissions'] = AuthUser(dbuser=usr).permissions
 
         expected = ret
         self._compare_ok(id_, expected, given=response.body)
@@ -263,9 +262,9 @@
         id_, params = _build_data(self.apikey_regular, 'get_user')
         response = api_call(self, params)
 
-        usr = UserModel().get_by_username(self.TEST_USER_LOGIN)
+        usr = User.get_by_username(self.TEST_USER_LOGIN)
         ret = usr.get_api_data()
-        ret['permissions'] = AuthUser(usr.user_id).permissions
+        ret['permissions'] = AuthUser(dbuser=usr).permissions
 
         expected = ret
         self._compare_ok(id_, expected, given=response.body)
@@ -580,7 +579,7 @@
                                   password='trololo')
         response = api_call(self, params)
 
-        usr = UserModel().get_by_username(username)
+        usr = User.get_by_username(username)
         ret = dict(
             msg='created new user `%s`' % username,
             user=jsonify(usr.get_api_data())
@@ -601,7 +600,7 @@
                                   email=email)
         response = api_call(self, params)
 
-        usr = UserModel().get_by_username(username)
+        usr = User.get_by_username(username)
         ret = dict(
             msg='created new user `%s`' % username,
             user=jsonify(usr.get_api_data())
@@ -621,7 +620,7 @@
                                   email=email, extern_name='internal')
         response = api_call(self, params)
 
-        usr = UserModel().get_by_username(username)
+        usr = User.get_by_username(username)
         ret = dict(
             msg='created new user `%s`' % username,
             user=jsonify(usr.get_api_data())
@@ -697,7 +696,7 @@
                            ('password', 'newpass')
     ])
     def test_api_update_user(self, name, expected):
-        usr = UserModel().get_by_username(self.TEST_USER_LOGIN)
+        usr = User.get_by_username(self.TEST_USER_LOGIN)
         kw = {name: expected,
               'userid': usr.user_id}
         id_, params = _build_data(self.apikey, 'update_user', **kw)
@@ -706,7 +705,7 @@
         ret = {
             'msg': 'updated user ID:%s %s' % (
                 usr.user_id, self.TEST_USER_LOGIN),
-            'user': jsonify(UserModel() \
+            'user': jsonify(User \
                 .get_by_username(self.TEST_USER_LOGIN) \
                 .get_api_data())
         }
@@ -715,7 +714,7 @@
         self._compare_ok(id_, expected, given=response.body)
 
     def test_api_update_user_no_changed_params(self):
-        usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
         ret = jsonify(usr.get_api_data())
         id_, params = _build_data(self.apikey, 'update_user',
                                   userid=TEST_USER_ADMIN_LOGIN)
@@ -730,7 +729,7 @@
         self._compare_ok(id_, expected, given=response.body)
 
     def test_api_update_user_by_user_id(self):
-        usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
         ret = jsonify(usr.get_api_data())
         id_, params = _build_data(self.apikey, 'update_user',
                                   userid=usr.user_id)
@@ -755,7 +754,7 @@
 
     @mock.patch.object(UserModel, 'update_user', crash)
     def test_api_update_user_when_exception_happens(self):
-        usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
+        usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
         ret = jsonify(usr.get_api_data())
         id_, params = _build_data(self.apikey, 'update_user',
                                   userid=usr.user_id)
@@ -995,7 +994,7 @@
         self._compare_ok(id_, expected, given=response.body)
         fixture.destroy_repo(repo_name)
 
-    def test_api_create_repo_in_group(self):
+    def test_api_create_repo_and_repo_group(self):
         repo_name = 'my_gr/api-repo'
         id_, params = _build_data(self.apikey, 'create_repo',
                                   repo_name=repo_name,
@@ -1015,6 +1014,39 @@
         fixture.destroy_repo(repo_name)
         fixture.destroy_repo_group('my_gr')
 
+    def test_api_create_repo_in_repo_group_without_permission(self):
+        repo_group_name = '%s/api-repo-repo' % TEST_REPO_GROUP
+        repo_name = '%s/api-repo' % repo_group_name
+
+        rg = fixture.create_repo_group(repo_group_name)
+        Session().commit()
+        RepoGroupModel().grant_user_permission(repo_group_name,
+                                               self.TEST_USER_LOGIN,
+                                               'group.none')
+        Session().commit()
+
+        id_, params = _build_data(self.apikey_regular, 'create_repo',
+                                  repo_name=repo_name,
+                                  repo_type=self.REPO_TYPE,
+        )
+        response = api_call(self, params)
+
+        # Current result when API access control is different from Web:
+        ret = {
+            'msg': 'Created new repository `%s`' % repo_name,
+            'success': True,
+            'task': None,
+        }
+        expected = ret
+        self._compare_ok(id_, expected, given=response.body)
+        fixture.destroy_repo(repo_name)
+
+        # Expected and arguably more correct result:
+        #expected = 'failed to create repository `%s`' % repo_name
+        #self._compare_error(id_, expected, given=response.body)
+
+        fixture.destroy_repo_group(repo_group_name)
+
     def test_api_create_repo_unknown_owner(self):
         repo_name = 'api-repo'
         owner = 'i-dont-exist'
@@ -2113,7 +2145,7 @@
         self._compare_error(id_, expected, given=response.body)
 
     @mock.patch.object(RepoGroupModel, 'grant_user_group_permission', crash)
-    def test_api_grant_user_group_permission_exception_when_adding(self):
+    def test_api_grant_user_group_permission_exception_when_adding_to_repo_group(self):
         perm = 'group.read'
         id_, params = _build_data(self.apikey,
                                   'grant_user_group_permission_to_repo_group',
--- a/kallithea/tests/api/test_api_git.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/api/test_api_git.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,10 +12,10 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from kallithea.tests import *
-from kallithea.tests.api.api_base import BaseTestApi
+from kallithea.tests import TestController, GIT_REPO
+from kallithea.tests.api.api_base import _BaseTestApi
 
 
-class TestGitApi(BaseTestApi, TestController):
+class TestGitApi(_BaseTestApi, TestController):
     REPO = GIT_REPO
     REPO_TYPE = 'git'
--- a/kallithea/tests/api/test_api_hg.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/api/test_api_hg.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,10 +12,10 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from kallithea.tests import *
-from kallithea.tests.api.api_base import BaseTestApi
+from kallithea.tests import TestController, HG_REPO
+from kallithea.tests.api.api_base import _BaseTestApi
 
 
-class TestHgApi(BaseTestApi, TestController):
+class TestHgApi(_BaseTestApi, TestController):
     REPO = HG_REPO
     REPO_TYPE = 'hg'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/conftest.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,34 @@
+import os
+import sys
+import logging
+
+import pkg_resources
+from paste.deploy import loadapp
+import pylons.test
+from pylons.i18n.translation import _get_translator
+
+
+def pytest_configure():
+    path = os.getcwd()
+    sys.path.insert(0, path)
+    pkg_resources.working_set.add_entry(path)
+
+    # Disable INFO logging of test database creation, restore with NOTSET
+    logging.disable(logging.INFO)
+    pylons.test.pylonsapp = loadapp('config:kallithea/tests/test.ini', relative_to=path)
+    logging.disable(logging.NOTSET)
+
+    # Setup the config and app_globals, only works if we can get
+    # to the config object
+    conf = getattr(pylons.test.pylonsapp, 'config')
+    if conf:
+        pylons.config._push_object(conf)
+
+        if 'pylons.app_globals' in conf:
+            pylons.app_globals._push_object(conf['pylons.app_globals'])
+
+    # Initialize a translator for tests that utilize i18n
+    translator = _get_translator(pylons.config.get('lang'))
+    pylons.translator._push_object(translator)
+
+    return pylons.test.pylonsapp
--- a/kallithea/tests/fixture.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/fixture.py	Sun Sep 06 23:36:05 2015 +0200
@@ -75,7 +75,7 @@
             repo_name=None,
             repo_type='hg',
             clone_uri='',
-            repo_group='-1',
+            repo_group=u'-1',
             repo_description='DESC',
             repo_private=False,
             repo_landing_rev='rev:tip',
@@ -295,4 +295,3 @@
                 f_path=filename
             )
         return cs
-
--- a/kallithea/tests/fixtures/journal_dump.csv	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/fixtures/journal_dump.csv	Sun Sep 06 23:36:05 2015 +0200
@@ -1782,9 +1782,9 @@
 1846,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-11-06 04:15:29.032768
 1847,3,demo,68,aaa-project,"",user_commented_revision:0c33fa58efc5a5541d8d3f1a3d3b77367e3d94f5,2012-11-06 04:17:16.091927
 1848,3,demo,249,abcdefg,"",user_commented_revision:5d80e28538141e322b317168e2367fb03178d58c,2012-11-06 06:10:53.372505
-1849,3,demo,362,Marcin,"",started_following_repo,2012-11-06 10:45:38.505485
-1850,3,demo,362,Marcin,"",user_created_repo,2012-11-06 10:45:38.518969
-1851,3,demo,362,hidden/Marcin,"",user_updated_repo,2012-11-06 10:45:46.281581
+1849,3,demo,362,Username,"",started_following_repo,2012-11-06 10:45:38.505485
+1850,3,demo,362,Username,"",user_created_repo,2012-11-06 10:45:38.518969
+1851,3,demo,362,hidden/Username,"",user_updated_repo,2012-11-06 10:45:46.281581
 1852,3,demo,177,blah,62.200.22.2,push:b369fb18c8d61fe0d3b14c417466680230cabe46,2012-11-06 10:47:55.655029
 1853,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-11-06 13:12:05.517155
 1854,3,demo,38,code-review-test,"",user_commented_revision:6d7db5794e8cad7da042b6ae6238116c6e59a4d2,2012-11-06 16:12:59.38977
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/fixtures/markuptest.diff	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,17 @@
+diff --git a/f b/f
+--- a/f	
++++ b/f	
+@@ -51,5 +51,12 @@
+ 	begin();
+ 	
++	int foo;
++	int bar; 
++	int baz;	
++	int space; 
++	int tab;	
++	
+  
+-	#define MAX_STEPS (48)
++	
++	#define MAX_STEPS (64)
+ 
--- a/kallithea/tests/functional/test_admin.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 import os
 import csv
 import datetime
--- a/kallithea/tests/functional/test_admin_auth_settings.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin_auth_settings.py	Sun Sep 06 23:36:05 2015 +0200
@@ -111,3 +111,119 @@
 
     def test_ldap_login_incorrect(self):
         pass
+
+    def _container_auth_setup(self, **settings):
+        self.log_user()
+
+        params = self._enable_plugins('kallithea.lib.auth_modules.auth_internal,kallithea.lib.auth_modules.auth_container')
+        params.update(settings)
+
+        test_url = url(controller='admin/auth_settings',
+                       action='auth_settings')
+
+        response = self.app.post(url=test_url, params=params)
+        response = response.follow()
+        response.click('Log Out') # end admin login session
+
+    def _container_auth_verify_login(self, resulting_username, **get_kwargs):
+        response = self.app.get(
+            url=url(controller='admin/my_account', action='my_account'),
+            **get_kwargs
+        )
+        response.mustcontain('My Account %s' % resulting_username)
+
+    def test_container_auth_login_header(self):
+        self._container_auth_setup(
+            auth_container_header='THE_USER_NAME',
+            auth_container_fallback_header='',
+            auth_container_clean_username='False',
+        )
+        self._container_auth_verify_login(
+            extra_environ={'THE_USER_NAME': 'john@example.org'},
+            resulting_username='john@example.org',
+        )
+
+    def test_container_auth_login_fallback_header(self):
+        self._container_auth_setup(
+            auth_container_header='THE_USER_NAME',
+            auth_container_fallback_header='HTTP_X_YZZY',
+            auth_container_clean_username='False',
+        )
+        self._container_auth_verify_login(
+            headers={'X-Yzzy': r'foo\bar'},
+            resulting_username=r'foo\bar',
+        )
+
+    def test_container_auth_clean_username_at(self):
+        self._container_auth_setup(
+            auth_container_header='REMOTE_USER',
+            auth_container_fallback_header='',
+            auth_container_clean_username='True',
+        )
+        self._container_auth_verify_login(
+            extra_environ={'REMOTE_USER': 'john@example.org'},
+            resulting_username='john',
+        )
+
+    def test_container_auth_clean_username_backslash(self):
+        self._container_auth_setup(
+            auth_container_header='REMOTE_USER',
+            auth_container_fallback_header='',
+            auth_container_clean_username='True',
+        )
+        self._container_auth_verify_login(
+            extra_environ={'REMOTE_USER': r'example\jane'},
+            resulting_username=r'jane',
+        )
+
+    def test_container_auth_no_logout(self):
+        self._container_auth_setup(
+            auth_container_header='REMOTE_USER',
+            auth_container_fallback_header='',
+            auth_container_clean_username='True',
+        )
+        response = self.app.get(
+            url=url(controller='admin/my_account', action='my_account'),
+            extra_environ={'REMOTE_USER': 'john'},
+        )
+        self.assertNotIn('Log Out', response.normal_body)
+
+    def test_crowd_save_settings(self):
+        self.log_user()
+
+        params = self._enable_plugins('kallithea.lib.auth_modules.auth_internal,kallithea.lib.auth_modules.auth_crowd')
+        params.update({'auth_crowd_host': ' hostname ',
+                       'auth_crowd_app_password': 'secret',
+                       'auth_crowd_admin_groups': 'mygroup',
+                       'auth_crowd_port': '123',
+                       'auth_crowd_app_name': 'xyzzy'})
+
+        test_url = url(controller='admin/auth_settings',
+                       action='auth_settings')
+
+        response = self.app.post(url=test_url, params=params)
+        self.checkSessionFlash(response, 'Auth settings updated successfully')
+
+        new_settings = Setting.get_auth_settings()
+        self.assertEqual(new_settings['auth_crowd_host'], u'hostname',
+                         'fail db write compare')
+
+    def test_pam_save_settings(self):
+        self.log_user()
+
+        if not pam_lib_installed:
+            raise SkipTest('skipping due to missing pam lib')
+
+        params = self._enable_plugins('kallithea.lib.auth_modules.auth_internal,kallithea.lib.auth_modules.auth_pam')
+        params.update({'auth_pam_service': 'kallithea',
+                       'auth_pam_gecos': '^foo-.*'})
+
+        test_url = url(controller='admin/auth_settings',
+                       action='auth_settings')
+
+        response = self.app.post(url=test_url, params=params)
+        self.checkSessionFlash(response, 'Auth settings updated successfully')
+
+        new_settings = Setting.get_auth_settings()
+        self.assertEqual(new_settings['auth_pam_service'], u'kallithea',
+                         'fail db write compare')
--- a/kallithea/tests/functional/test_admin_defaults.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin_defaults.py	Sun Sep 06 23:36:05 2015 +0200
@@ -16,7 +16,8 @@
         response = self.app.get(url('formatted_defaults', format='xml'))
 
     def test_create(self):
-        response = self.app.post(url('defaults'))
+        response = self.app.post(url('defaults'),
+            {'_authentication_token': self.authentication_token()})
 
     def test_new(self):
         response = self.app.get(url('new_default'))
@@ -62,7 +63,8 @@
         response = self.app.post(url('default', id=1), params=dict(_method='put', _authentication_token=self.authentication_token()))
 
     def test_delete(self):
-        response = self.app.delete(url('default', id=1))
+        # Not possible due to CSRF protection.
+        response = self.app.delete(url('default', id=1), status=405)
 
     def test_delete_browser_fakeout(self):
         response = self.app.post(url('default', id=1), params=dict(_method='delete', _authentication_token=self.authentication_token()))
--- a/kallithea/tests/functional/test_admin_gists.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin_gists.py	Sun Sep 06 23:36:05 2015 +0200
@@ -136,25 +136,26 @@
     def test_delete(self):
         self.log_user()
         gist = _create_gist('delete-me')
-        response = self.app.delete(url('gist', gist_id=gist.gist_id))
-        self.checkSessionFlash(response, 'Deleted gist %s' % gist.gist_id)
+        response = self.app.post(url('gist', gist_id=gist.gist_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
     def test_delete_normal_user_his_gist(self):
         self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
         gist = _create_gist('delete-me', owner=TEST_USER_REGULAR_LOGIN)
-        response = self.app.delete(url('gist', gist_id=gist.gist_id))
-        self.checkSessionFlash(response, 'Deleted gist %s' % gist.gist_id)
+        response = self.app.post(url('gist', gist_id=gist.gist_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
     def test_delete_normal_user_not_his_own_gist(self):
         self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
         gist = _create_gist('delete-me')
-        response = self.app.delete(url('gist', gist_id=gist.gist_id), status=403)
+        response = self.app.post(url('gist', gist_id=gist.gist_id), status=403,
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
     def test_show(self):
         gist = _create_gist('gist-show-me')
         response = self.app.get(url('gist', gist_id=gist.gist_access_id))
         response.mustcontain('added file: gist-show-me<')
-        response.mustcontain('test_admin - created')
+        response.mustcontain('%s - created' % TEST_USER_ADMIN_LOGIN)
         response.mustcontain('gist-desc')
         response.mustcontain('<div class="btn btn-mini btn-success disabled">Public Gist</div>')
 
--- a/kallithea/tests/functional/test_admin_notifications.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin_notifications.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,18 +1,15 @@
 from kallithea.tests import *
-from kallithea.model.db import Notification, User
+from kallithea.model.db import User
 
 from kallithea.model.user import UserModel
 from kallithea.model.notification import NotificationModel
 from kallithea.model.meta import Session
+from kallithea.lib import helpers as h
 
 
 class TestNotificationsController(TestController):
-
-    def tearDown(self):
-        for n in Notification.query().all():
-            inst = Notification.get(n.notification_id)
-            Session().delete(inst)
-        Session().commit()
+    def setUp(self):
+        self.remove_all_notifications()
 
     def test_index(self):
         self.log_user()
@@ -59,9 +56,9 @@
         self.assertEqual(get_notif(u2.notifications), [notification])
         cur_usr_id = cur_user.user_id
 
-        response = self.app.delete(url('notification',
-                                       notification_id=
-                                       notification.notification_id))
+        response = self.app.post(
+            url('notification', notification_id=notification.notification_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.assertEqual(response.body, 'ok')
 
         cur_user = User.get(cur_usr_id)
@@ -89,3 +86,39 @@
 
         response.mustcontain(subject)
         response.mustcontain(notif_body)
+
+    def test_description_with_age(self):
+        self.log_user()
+        cur_user = self._get_logged_user()
+        subject = u'test'
+        notify_body = u'hi there'
+        notification = NotificationModel().create(created_by = cur_user,
+                                                  subject    = subject,
+                                                  body       = notify_body)
+
+        description = NotificationModel().make_description(notification)
+        self.assertEqual(
+            description,
+            "{0} sent message {1}".format(
+                cur_user.username,
+                h.age(notification.created_on)
+                )
+            )
+
+    def test_description_with_datetime(self):
+        self.log_user()
+        cur_user = self._get_logged_user()
+        subject = u'test'
+        notify_body = u'hi there'
+        notification = NotificationModel().create(created_by = cur_user,
+                                                  subject    = subject,
+                                                  body       = notify_body)
+
+        description = NotificationModel().make_description(notification, False)
+        self.assertEqual(
+            description,
+            "{0} sent message at {1}".format(
+                cur_user.username,
+                h.fmt_date(notification.created_on)
+                )
+            )
--- a/kallithea/tests/functional/test_admin_repos.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin_repos.py	Sun Sep 06 23:36:05 2015 +0200
@@ -26,7 +26,7 @@
     return perm
 
 
-class _BaseTest(TestController):
+class _BaseTest(object):
     """
     Write all tests here
     """
@@ -348,7 +348,7 @@
                                                 repo_description=description,
                                                 clone_uri='http://127.0.0.1/repo',
                                                 _authentication_token=self.authentication_token()))
-        response.mustcontain('invalid clone URL')
+        response.mustcontain('Invalid repository URL')
 
 
     def test_create_remote_repo_wrong_clone_uri_hg_svn(self):
@@ -362,7 +362,7 @@
                                                 repo_description=description,
                                                 clone_uri='svn+http://127.0.0.1/repo',
                                                 _authentication_token=self.authentication_token()))
-        response.mustcontain('invalid clone URL')
+        response.mustcontain('Invalid repository URL')
 
 
     def test_delete(self):
@@ -398,7 +398,8 @@
         except vcs.exceptions.VCSError:
             self.fail('no repo %s in filesystem' % repo_name)
 
-        response = self.app.delete(url('repo', repo_name=repo_name))
+        response = self.app.post(url('delete_repo', repo_name=repo_name),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
         self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name))
 
@@ -450,7 +451,8 @@
         except vcs.exceptions.VCSError:
             self.fail('no repo %s in filesystem' % repo_name)
 
-        response = self.app.delete(url('repo', repo_name=repo_name))
+        response = self.app.post(url('delete_repo', repo_name=repo_name),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name_unicode))
         response.follow()
 
@@ -468,12 +470,12 @@
         pass
 
     def test_delete_browser_fakeout(self):
-        response = self.app.post(url('repo', repo_name=self.REPO),
+        response = self.app.post(url('delete_repo', repo_name=self.REPO),
                                  params=dict(_method='delete', _authentication_token=self.authentication_token()))
 
     def test_show(self):
         self.log_user()
-        response = self.app.get(url('repo', repo_name=self.REPO))
+        response = self.app.get(url('summary_home', repo_name=self.REPO))
 
     def test_edit(self):
         response = self.app.get(url('edit_repo', repo_name=self.REPO))
@@ -486,7 +488,7 @@
         self.assertEqual(perm[0].permission.permission_name, 'repository.read')
         self.assertEqual(Repository.get_by_repo_name(self.REPO).private, False)
 
-        response = self.app.put(url('repo', repo_name=self.REPO),
+        response = self.app.put(url('put_repo', repo_name=self.REPO),
                         fixture._get_repo_create_params(repo_private=1,
                                                 repo_name=self.REPO,
                                                 repo_type=self.REPO_TYPE,
@@ -501,7 +503,7 @@
         self.assertTrue(len(perm), 1)
         self.assertEqual(perm[0].permission.permission_name, 'repository.none')
 
-        response = self.app.put(url('repo', repo_name=self.REPO),
+        response = self.app.put(url('put_repo', repo_name=self.REPO),
                         fixture._get_repo_create_params(repo_private=False,
                                                 repo_name=self.REPO,
                                                 repo_type=self.REPO_TYPE,
@@ -525,7 +527,7 @@
         self.log_user()
         repo = Repository.get_by_repo_name(self.REPO)
         response = self.app.get(url('edit_repo_advanced', repo_name=self.REPO))
-        opt = """<option value="%s">vcs_test_git</option>""" % repo.repo_id
+        opt = """<option value="%s">%s</option>""" % (repo.repo_id, self.REPO)
         response.mustcontain(no=[opt])
 
     def test_set_fork_of_other_repo(self):
@@ -539,7 +541,7 @@
         repo = Repository.get_by_repo_name(self.REPO)
         repo2 = Repository.get_by_repo_name(other_repo)
         self.checkSessionFlash(response,
-            'Marked repo %s as fork of %s' % (repo.repo_name, repo2.repo_name))
+            'Marked repository %s as fork of %s' % (repo.repo_name, repo2.repo_name))
 
         assert repo.fork == repo2
         response = response.follow()
@@ -570,7 +572,7 @@
         repo = Repository.get_by_repo_name(self.REPO)
         repo2 = Repository.get_by_repo_name(self.OTHER_TYPE_REPO)
         self.checkSessionFlash(response,
-                               'Marked repo %s as fork of %s'
+                               'Marked repository %s as fork of %s'
                                % (repo.repo_name, "Nothing"))
         assert repo.fork is None
 
@@ -611,7 +613,7 @@
                                                 repo_description=description,
                                                 _authentication_token=self.authentication_token()))
 
-        response.mustcontain('no permission to create repository in root location')
+        response.mustcontain('<span class="error-message">Invalid value</span>')
 
         RepoModel().delete(repo_name)
         Session().commit()
@@ -638,7 +640,7 @@
         # repo must not be in filesystem !
         self.assertFalse(os.path.isdir(os.path.join(TESTS_TMP_PATH, repo_name)))
 
-class TestAdminReposControllerGIT(_BaseTest):
+class TestAdminReposControllerGIT(TestController, _BaseTest):
     REPO = GIT_REPO
     REPO_TYPE = 'git'
     NEW_REPO = NEW_GIT_REPO
@@ -646,7 +648,7 @@
     OTHER_TYPE = 'hg'
 
 
-class TestAdminReposControllerHG(_BaseTest):
+class TestAdminReposControllerHG(TestController, _BaseTest):
     REPO = HG_REPO
     REPO_TYPE = 'hg'
     NEW_REPO = NEW_HG_REPO
--- a/kallithea/tests/functional/test_admin_user_groups.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin_user_groups.py	Sun Sep 06 23:36:05 2015 +0200
@@ -32,7 +32,7 @@
         response = self.app.get(url('new_users_group'))
 
     def test_update(self):
-        response = self.app.put(url('users_group', id=1))
+        response = self.app.put(url('users_group', id=1), status=403)
 
     def test_update_browser_fakeout(self):
         response = self.app.post(url('users_group', id=1),
@@ -54,7 +54,8 @@
         gr = Session().query(UserGroup)\
             .filter(UserGroup.users_group_name == users_group_name).one()
 
-        response = self.app.delete(url('users_group', id=gr.users_group_id))
+        response = self.app.post(url('users_group', id=gr.users_group_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
         gr = Session().query(UserGroup)\
             .filter(UserGroup.users_group_name == users_group_name).scalar()
@@ -97,7 +98,8 @@
 
         ## DISABLE REPO CREATE ON A GROUP
         response = self.app.put(
-            url('edit_user_group_default_perms', id=ug.users_group_id), {})
+            url('edit_user_group_default_perms', id=ug.users_group_id),
+            params={'_authentication_token': self.authentication_token()})
 
         response.follow()
         ug = UserGroup.get_by_group_name(users_group_name)
@@ -119,7 +121,8 @@
         # DELETE !
         ug = UserGroup.get_by_group_name(users_group_name)
         ugid = ug.users_group_id
-        response = self.app.delete(url('users_group', id=ug.users_group_id))
+        response = self.app.post(url('users_group', id=ug.users_group_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         response = response.follow()
         gr = Session().query(UserGroup)\
             .filter(UserGroup.users_group_name == users_group_name).scalar()
@@ -167,8 +170,8 @@
                     [ug.users_group_id, p3.permission_id]]))
 
         ## DISABLE REPO CREATE ON A GROUP
-        response = self.app.put(
-            url('edit_user_group_default_perms', id=ug.users_group_id), {})
+        response = self.app.put(url('edit_user_group_default_perms', id=ug.users_group_id),
+            params={'_authentication_token': self.authentication_token()})
 
         response.follow()
         ug = UserGroup.get_by_group_name(users_group_name)
@@ -189,7 +192,8 @@
         # DELETE !
         ug = UserGroup.get_by_group_name(users_group_name)
         ugid = ug.users_group_id
-        response = self.app.delete(url('users_group', id=ug.users_group_id))
+        response = self.app.post(url('users_group', id=ug.users_group_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         response = response.follow()
         gr = Session().query(UserGroup)\
                            .filter(UserGroup.users_group_name ==
--- a/kallithea/tests/functional/test_admin_users.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_admin_users.py	Sun Sep 06 23:36:05 2015 +0200
@@ -167,7 +167,8 @@
 
         new_user = Session().query(User)\
             .filter(User.username == username).one()
-        response = self.app.delete(url('user', id=new_user.user_id))
+        response = self.app.post(url('user', id=new_user.user_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
         self.checkSessionFlash(response, 'Successfully deleted user')
 
@@ -181,16 +182,19 @@
 
         new_user = Session().query(User)\
             .filter(User.username == username).one()
-        response = self.app.delete(url('user', id=new_user.user_id))
+        response = self.app.post(url('user', id=new_user.user_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'User "%s" still '
                                'owns 1 repositories and cannot be removed. '
                                'Switch owners or remove those repositories: '
                                '%s' % (username, reponame))
 
-        response = self.app.delete(url('repo', repo_name=reponame))
+        response = self.app.post(url('delete_repo', repo_name=reponame),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'Deleted repository %s' % reponame)
 
-        response = self.app.delete(url('user', id=new_user.user_id))
+        response = self.app.post(url('user', id=new_user.user_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'Successfully deleted user')
 
     def test_delete_repo_group_err(self):
@@ -203,7 +207,8 @@
 
         new_user = Session().query(User)\
             .filter(User.username == username).one()
-        response = self.app.delete(url('user', id=new_user.user_id))
+        response = self.app.post(url('user', id=new_user.user_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'User "%s" still '
                                'owns 1 repository groups and cannot be removed. '
                                'Switch owners or remove those repository groups: '
@@ -213,10 +218,12 @@
         # rg = RepoGroup.get_by_group_name(group_name=groupname)
         # response = self.app.get(url('repos_groups', id=rg.group_id))
 
-        response = self.app.delete(url('delete_repo_group', group_name=groupname))
+        response = self.app.post(url('delete_repo_group', group_name=groupname),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'Removed repository group %s' % groupname)
 
-        response = self.app.delete(url('user', id=new_user.user_id))
+        response = self.app.post(url('user', id=new_user.user_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'Successfully deleted user')
 
     def test_delete_user_group_err(self):
@@ -229,7 +236,8 @@
 
         new_user = Session().query(User)\
             .filter(User.username == username).one()
-        response = self.app.delete(url('user', id=new_user.user_id))
+        response = self.app.post(url('user', id=new_user.user_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'User "%s" still '
                                'owns 1 user groups and cannot be removed. '
                                'Switch owners or remove those user groups: '
@@ -241,7 +249,8 @@
 
         fixture.destroy_user_group(ug.users_group_id)
 
-        response = self.app.delete(url('user', id=new_user.user_id))
+        response = self.app.post(url('user', id=new_user.user_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'Successfully deleted user')
 
     def test_show(self):
@@ -395,7 +404,7 @@
                                 params=dict(new_ip=ip, _authentication_token=self.authentication_token()))
 
         if failure:
-            self.checkSessionFlash(response, 'Please enter a valid IPv4 or IpV6 address')
+            self.checkSessionFlash(response, 'Please enter a valid IPv4 or IPv6 address')
             response = self.app.get(url('edit_user_ips', id=user_id))
             response.mustcontain(no=[ip])
             response.mustcontain(no=[ip_range])
@@ -438,7 +447,7 @@
         user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
         response = self.app.get(url('edit_user_api_keys', id=user.user_id))
         response.mustcontain(user.api_key)
-        response.mustcontain('expires: never')
+        response.mustcontain('Expires: Never')
 
     @parameterized.expand([
         ('forever', -1),
@@ -451,8 +460,8 @@
         user_id = user.user_id
 
         response = self.app.post(url('edit_user_api_keys', id=user_id),
-                 {'_method': 'put', 'description': desc, 'lifetime': lifetime, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully created')
+                 {'description': desc, 'lifetime': lifetime, '_authentication_token': self.authentication_token()})
+        self.checkSessionFlash(response, 'API key successfully created')
         try:
             response = response.follow()
             user = User.get(user_id)
@@ -469,8 +478,8 @@
         user_id = user.user_id
 
         response = self.app.post(url('edit_user_api_keys', id=user_id),
-                {'_method': 'put', 'description': 'desc', 'lifetime': -1, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully created')
+                {'description': 'desc', 'lifetime': -1, '_authentication_token': self.authentication_token()})
+        self.checkSessionFlash(response, 'API key successfully created')
         response = response.follow()
 
         #now delete our key
@@ -479,7 +488,7 @@
 
         response = self.app.post(url('edit_user_api_keys', id=user_id),
                  {'_method': 'delete', 'del_api_key': keys[0].api_key, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully deleted')
+        self.checkSessionFlash(response, 'API key successfully deleted')
         keys = UserApiKeys.query().filter(UserApiKeys.user_id == user_id).all()
         self.assertEqual(0, len(keys))
 
@@ -490,10 +499,106 @@
         api_key = user.api_key
         response = self.app.get(url('edit_user_api_keys', id=user_id))
         response.mustcontain(api_key)
-        response.mustcontain('expires: never')
+        response.mustcontain('Expires: Never')
 
         response = self.app.post(url('edit_user_api_keys', id=user_id),
                  {'_method': 'delete', 'del_api_key_builtin': api_key, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully reset')
+        self.checkSessionFlash(response, 'API key successfully reset')
         response = response.follow()
         response.mustcontain(no=[api_key])
+
+# TODO To be uncommented when pytest is the test runner
+#import pytest
+#from kallithea.controllers.admin.users import UsersController
+#class TestAdminUsersController_unittest(object):
+#    """
+#    Unit tests for the users controller
+#    These are in a separate class, not deriving from TestController (and thus
+#    unittest.TestCase), to be able to benefit from pytest features like
+#    monkeypatch.
+#    """
+#    def test_get_user_or_raise_if_default(self, monkeypatch):
+#        # flash complains about an unexisting session
+#        def flash_mock(*args, **kwargs):
+#            pass
+#        monkeypatch.setattr(h, 'flash', flash_mock)
+#
+#        u = UsersController()
+#        # a regular user should work correctly
+#        user = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+#        assert u._get_user_or_raise_if_default(user.user_id) == user
+#        # the default user should raise
+#        with pytest.raises(HTTPNotFound):
+#            u._get_user_or_raise_if_default(User.get_default_user().user_id)
+
+
+class TestAdminUsersControllerForDefaultUser(TestController):
+    """
+    Edit actions on the default user are not allowed.
+    Validate that they throw a 404 exception.
+    """
+    def test_edit_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.get(url('edit_user', id=user.user_id), status=404)
+
+    def test_edit_advanced_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.get(url('edit_user_advanced', id=user.user_id), status=404)
+
+    # API keys
+    def test_edit_api_keys_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.get(url('edit_user_api_keys', id=user.user_id), status=404)
+
+    def test_add_api_keys_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.post(url('edit_user_api_keys', id=user.user_id),
+                 {'_method': 'put', '_authentication_token': self.authentication_token()}, status=404)
+
+    def test_delete_api_keys_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.post(url('edit_user_api_keys', id=user.user_id),
+                 {'_method': 'delete', '_authentication_token': self.authentication_token()}, status=404)
+
+    # Permissions
+    def test_edit_perms_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.get(url('edit_user_perms', id=user.user_id), status=404)
+
+    def test_update_perms_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.post(url('edit_user_perms', id=user.user_id),
+                 {'_method': 'put', '_authentication_token': self.authentication_token()}, status=404)
+
+    # Emails
+    def test_edit_emails_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.get(url('edit_user_emails', id=user.user_id), status=404)
+
+    def test_add_emails_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.post(url('edit_user_emails', id=user.user_id),
+                 {'_method': 'put', '_authentication_token': self.authentication_token()}, status=404)
+
+    def test_delete_emails_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.post(url('edit_user_emails', id=user.user_id),
+                 {'_method': 'delete', '_authentication_token': self.authentication_token()}, status=404)
+
+    # IP addresses
+    # Add/delete of IP addresses for the default user is used to maintain
+    # the global IP whitelist and thus allowed. Only 'edit' is forbidden.
+    def test_edit_ip_default_user(self):
+        self.log_user()
+        user = User.get_default_user()
+        response = self.app.get(url('edit_user_ips', id=user.user_id), status=404)
--- a/kallithea/tests/functional/test_changelog.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_changelog.py	Sun Sep 06 23:36:05 2015 +0200
@@ -8,7 +8,7 @@
         response = self.app.get(url(controller='changelog', action='index',
                                     repo_name=HG_REPO))
 
-        response.mustcontain('''id="chg_20" class="container tablerow1"''')
+        response.mustcontain('''id="chg_20" class="container mergerow"''')
         response.mustcontain(
             """<input class="changeset_range" """
             """id="7b22a518347bb9bc19679f6af07cd0a61bfe16e7" """
@@ -54,7 +54,7 @@
         response = self.app.get(url(controller='changelog', action='index',
                                     repo_name=GIT_REPO))
 
-        response.mustcontain('''id="chg_20" class="container tablerow1"''')
+        response.mustcontain('''id="chg_20" class="container "''') # why no mergerow for git?
         response.mustcontain(
             """<input class="changeset_range" """
             """id="95f9a91d775b0084b2368ae7779e44931c849c0e" """
--- a/kallithea/tests/functional/test_changeset_comments.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_changeset_comments.py	Sun Sep 06 23:36:05 2015 +0200
@@ -11,18 +11,7 @@
             Session().delete(x)
         Session().commit()
 
-        for x in Notification.query().all():
-            Session().delete(x)
-        Session().commit()
-
-    def tearDown(self):
-        for x in ChangesetComment.query().all():
-            Session().delete(x)
-        Session().commit()
-
-        for x in Notification.query().all():
-            Session().delete(x)
-        Session().commit()
+        self.remove_all_notifications()
 
     def test_create(self):
         self.log_user()
@@ -54,8 +43,8 @@
         ID = ChangesetComment.query().first().comment_id
         self.assertEqual(notification.type_,
                          Notification.TYPE_CHANGESET_COMMENT)
-        sbj = (u'/vcs_test_hg/changeset/'
-               '27cd5cce30c96924232dffcd24178a07ffeb5dfc#comment-%s' % ID)
+        sbj = (u'/%s/changeset/'
+               '27cd5cce30c96924232dffcd24178a07ffeb5dfc#comment-%s' % (HG_REPO, ID))
         print "%s vs %s" % (sbj, notification.subject)
         self.assertTrue(sbj in notification.subject)
 
@@ -83,9 +72,9 @@
             ''' 1 comment (1 inline, 0 general)'''
         )
         response.mustcontain(
-            '''<div style="display:none" class="inline-comment-placeholder" '''
-            '''path="vcs/web/simplevcs/views/repository.py" '''
-            '''target_id="vcswebsimplevcsviewsrepositorypy">'''
+            '''<div class="comments-list-chunk" '''
+            '''data-f_path="vcs/web/simplevcs/views/repository.py" '''
+            '''data-line_no="n1" data-target-id="vcswebsimplevcsviewsrepositorypy_n1">'''
         )
 
         self.assertEqual(Notification.query().count(), 1)
@@ -95,8 +84,8 @@
         ID = ChangesetComment.query().first().comment_id
         self.assertEqual(notification.type_,
                          Notification.TYPE_CHANGESET_COMMENT)
-        sbj = (u'/vcs_test_hg/changeset/'
-               '27cd5cce30c96924232dffcd24178a07ffeb5dfc#comment-%s' % ID)
+        sbj = (u'/%s/changeset/'
+               '27cd5cce30c96924232dffcd24178a07ffeb5dfc#comment-%s' % (HG_REPO, ID))
         print "%s vs %s" % (sbj, notification.subject)
         self.assertTrue(sbj in notification.subject)
 
@@ -104,7 +93,7 @@
         self.log_user()
 
         rev = '27cd5cce30c96924232dffcd24178a07ffeb5dfc'
-        text = u'@test_regular check CommentOnRevision'
+        text = u'@%s check CommentOnRevision' % TEST_USER_REGULAR_LOGIN
 
         params = {'text': text, '_authentication_token': self.authentication_token()}
         response = self.app.post(url(controller='changeset', action='comment',
@@ -127,7 +116,7 @@
         users = [x.user.username for x in UserNotification.query().all()]
 
         # test_regular gets notification by @mention
-        self.assertEqual(sorted(users), [u'test_admin', u'test_regular'])
+        self.assertEqual(sorted(users), [TEST_USER_ADMIN_LOGIN, TEST_USER_REGULAR_LOGIN])
 
     def test_delete(self):
         self.log_user()
@@ -143,10 +132,11 @@
         self.assertEqual(len(comments), 1)
         comment_id = comments[0].comment_id
 
-        self.app.delete(url(controller='changeset',
+        self.app.post(url(controller='changeset',
                                     action='delete_comment',
                                     repo_name=HG_REPO,
-                                    comment_id=comment_id))
+                                    comment_id=comment_id),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
         comments = ChangesetComment.query().all()
         self.assertEqual(len(comments), 0)
--- a/kallithea/tests/functional/test_compare.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_compare.py	Sun Sep 06 23:36:05 2015 +0200
@@ -2,7 +2,6 @@
 from kallithea.tests import *
 from kallithea.model.repo import RepoModel
 from kallithea.model.meta import Session
-from kallithea.model.db import Repository
 from kallithea.tests.fixture import Fixture
 
 fixture = Fixture()
--- a/kallithea/tests/functional/test_files.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_files.py	Sun Sep 06 23:36:05 2015 +0200
@@ -33,19 +33,19 @@
                                     revision='tip',
                                     f_path='/'))
         # Test response...
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/docs"><i class="icon-folder-open"></i><span>docs</span></a>')
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/vcs"><i class="icon-folder-open"></i><span>vcs</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.gitignore"><i class="icon-doc"></i><span>.gitignore</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgignore"><i class="icon-doc"></i><span>.hgignore</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgtags"><i class="icon-doc"></i><span>.hgtags</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.travis.yml"><i class="icon-doc"></i><span>.travis.yml</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/MANIFEST.in"><i class="icon-doc"></i><span>MANIFEST.in</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/run_test_and_report.sh"><i class="icon-doc"></i><span>run_test_and_report.sh</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.cfg"><i class="icon-doc"></i><span>setup.cfg</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.py"><i class="icon-doc"></i><span>setup.py</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/test_and_report.sh"><i class="icon-doc"></i><span>test_and_report.sh</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/tox.ini"><i class="icon-doc"></i><span>tox.ini</span></a>')
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/docs"><i class="icon-folder-open"></i><span>docs</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/vcs"><i class="icon-folder-open"></i><span>vcs</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.gitignore"><i class="icon-doc"></i><span>.gitignore</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgignore"><i class="icon-doc"></i><span>.hgignore</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgtags"><i class="icon-doc"></i><span>.hgtags</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.travis.yml"><i class="icon-doc"></i><span>.travis.yml</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/MANIFEST.in"><i class="icon-doc"></i><span>MANIFEST.in</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/run_test_and_report.sh"><i class="icon-doc"></i><span>run_test_and_report.sh</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.cfg"><i class="icon-doc"></i><span>setup.cfg</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.py"><i class="icon-doc"></i><span>setup.py</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/test_and_report.sh"><i class="icon-doc"></i><span>test_and_report.sh</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/tox.ini"><i class="icon-doc"></i><span>tox.ini</span></a>' % HG_REPO)
 
     def test_index_revision(self):
         self.log_user()
@@ -59,11 +59,10 @@
 
         #Test response...
 
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/docs"><i class="icon-folder-open"></i><span>docs</span></a>')
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/tests"><i class="icon-folder-open"></i><span>tests</span></a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>')
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/docs"><i class="icon-folder-open"></i><span>docs</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/tests"><i class="icon-folder-open"></i><span>tests</span></a>' % HG_REPO)
+        response.mustcontain('<a class="browser-file ypjax-link" href="/%s/files/7ba66bec8d6dbba14a2155be32408c435c5f4492/README.rst"><i class="icon-doc"></i><span>README.rst</span></a>' % HG_REPO)
         response.mustcontain('1.1 KiB')
-        response.mustcontain('text/x-python')
 
     def test_index_different_branch(self):
         self.log_user()
--- a/kallithea/tests/functional/test_followers.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_followers.py	Sun Sep 06 23:36:05 2015 +0200
@@ -10,7 +10,7 @@
                                     action='followers',
                                     repo_name=repo_name))
 
-        response.mustcontain("""test_admin""")
+        response.mustcontain(TEST_USER_ADMIN_LOGIN)
         response.mustcontain("""Started following""")
 
     def test_index_git(self):
@@ -20,5 +20,5 @@
                                     action='followers',
                                     repo_name=repo_name))
 
-        response.mustcontain("""test_admin""")
+        response.mustcontain(TEST_USER_ADMIN_LOGIN)
         response.mustcontain("""Started following""")
--- a/kallithea/tests/functional/test_forks.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_forks.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,7 @@
 # -*- coding: utf-8 -*-
+
+import unittest
+
 from kallithea.tests import *
 from kallithea.tests.fixture import Fixture
 
@@ -12,15 +15,7 @@
 from kallithea.tests import *
 
 
-class _BaseTest(TestController):
-    """
-    Write all tests here
-    """
-    REPO = None
-    REPO_TYPE = None
-    NEW_REPO = None
-    REPO_FORK = None
-
+class _BaseFixture(unittest.TestCase):
     @classmethod
     def setup_class(cls):
         pass
@@ -40,6 +35,16 @@
         Session().delete(self.u1)
         Session().commit()
 
+
+class _BaseTestCase(object):
+    """
+    Write all tests here
+    """
+    REPO = None
+    REPO_TYPE = None
+    NEW_REPO = None
+    REPO_FORK = None
+
     def test_index(self):
         self.log_user()
         repo_name = self.REPO
@@ -72,7 +77,7 @@
         org_repo = Repository.get_by_repo_name(repo_name)
         creation_args = {
             'repo_name': fork_name,
-            'repo_group': '',
+            'repo_group': u'-1',
             'fork_parent_id': org_repo.repo_id,
             'repo_type': self.REPO_TYPE,
             'description': description,
@@ -91,7 +96,8 @@
         )
 
         # remove this fork
-        response = self.app.delete(url('repo', repo_name=fork_name))
+        response = self.app.post(url('delete_repo', repo_name=fork_name),
+            params={'_method': 'delete', '_authentication_token': self.authentication_token()})
 
     def test_fork_create_into_group(self):
         self.log_user()
@@ -147,7 +153,7 @@
         org_repo = Repository.get_by_repo_name(repo_name)
         creation_args = {
             'repo_name': fork_name,
-            'repo_group': '',
+            'repo_group': u'-1',
             'fork_parent_id': org_repo.repo_id,
             'repo_type': self.REPO_TYPE,
             'description': description,
@@ -218,14 +224,14 @@
         response.mustcontain('There are no forks yet')
 
 
-class TestGIT(_BaseTest):
+class TestGIT(TestController, _BaseTestCase, _BaseFixture):
     REPO = GIT_REPO
     NEW_REPO = NEW_GIT_REPO
     REPO_TYPE = 'git'
     REPO_FORK = GIT_FORK
 
 
-class TestHG(_BaseTest):
+class TestHG(TestController, _BaseTestCase, _BaseFixture):
     REPO = HG_REPO
     NEW_REPO = NEW_HG_REPO
     REPO_TYPE = 'hg'
--- a/kallithea/tests/functional/test_journal.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_journal.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,7 +12,7 @@
 
     def test_stop_following_repository(self):
         session = self.log_user()
-#        usr = Session().query(User).filter(User.username == 'test_admin').one()
+#        usr = Session().query(User).filter(User.username == TEST_USER_ADMIN_LOGIN).one()
 #        repo = Session().query(Repository).filter(Repository.repo_name == HG_REPO).one()
 #
 #        followings = Session().query(UserFollowing)\
--- a/kallithea/tests/functional/test_login.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_login.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,6 +1,9 @@
 # -*- coding: utf-8 -*-
-from __future__ import with_statement
+import re
+import time
+
 import mock
+
 from kallithea.tests import *
 from kallithea.tests.fixture import Fixture
 from kallithea.lib.utils2 import generate_api_key
@@ -10,17 +13,14 @@
 from kallithea.model import validators
 from kallithea.model.db import User, Notification
 from kallithea.model.meta import Session
+from kallithea.model.user import UserModel
 
 fixture = Fixture()
 
 
 class TestLoginController(TestController):
-
-    def tearDown(self):
-        for n in Notification.query().all():
-            Session().delete(n)
-
-        Session().commit()
+    def setUp(self):
+        self.remove_all_notifications()
         self.assertEqual(Notification.query().all(), [])
 
     def test_index(self):
@@ -30,22 +30,22 @@
 
     def test_login_admin_ok(self):
         response = self.app.post(url(controller='login', action='index'),
-                                 {'username': 'test_admin',
-                                  'password': 'test12'})
+                                 {'username': TEST_USER_ADMIN_LOGIN,
+                                  'password': TEST_USER_ADMIN_PASS})
         self.assertEqual(response.status, '302 Found')
-        self.assertEqual(response.session['authuser'].get('username'),
-                         'test_admin')
+        self.assert_authenticated_user(response, TEST_USER_ADMIN_LOGIN)
+
         response = response.follow()
         response.mustcontain('/%s' % HG_REPO)
 
     def test_login_regular_ok(self):
         response = self.app.post(url(controller='login', action='index'),
-                                 {'username': 'test_regular',
-                                  'password': 'test12'})
+                                 {'username': TEST_USER_REGULAR_LOGIN,
+                                  'password': TEST_USER_REGULAR_PASS})
 
         self.assertEqual(response.status, '302 Found')
-        self.assertEqual(response.session['authuser'].get('username'),
-                         'test_regular')
+        self.assert_authenticated_user(response, TEST_USER_REGULAR_LOGIN)
+
         response = response.follow()
         response.mustcontain('/%s' % HG_REPO)
 
@@ -53,26 +53,64 @@
         test_came_from = '/_admin/users'
         response = self.app.post(url(controller='login', action='index',
                                      came_from=test_came_from),
-                                 {'username': 'test_admin',
-                                  'password': 'test12'})
+                                 {'username': TEST_USER_ADMIN_LOGIN,
+                                  'password': TEST_USER_ADMIN_PASS})
         self.assertEqual(response.status, '302 Found')
         response = response.follow()
 
         self.assertEqual(response.status, '200 OK')
         response.mustcontain('Users Administration')
 
+    def test_login_do_not_remember(self):
+        response = self.app.post(url(controller='login', action='index'),
+                                 {'username': TEST_USER_REGULAR_LOGIN,
+                                  'password': TEST_USER_REGULAR_PASS,
+                                  'remember': False})
+
+        self.assertIn('Set-Cookie', response.headers)
+        for cookie in response.headers.getall('Set-Cookie'):
+            self.assertFalse(re.search(r';\s+(Max-Age|Expires)=', cookie, re.IGNORECASE),
+                'Cookie %r has expiration date, but should be a session cookie' % cookie)
+
+    def test_login_remember(self):
+        response = self.app.post(url(controller='login', action='index'),
+                                 {'username': TEST_USER_REGULAR_LOGIN,
+                                  'password': TEST_USER_REGULAR_PASS,
+                                  'remember': True})
+
+        self.assertIn('Set-Cookie', response.headers)
+        for cookie in response.headers.getall('Set-Cookie'):
+            self.assertTrue(re.search(r';\s+(Max-Age|Expires)=', cookie, re.IGNORECASE),
+                'Cookie %r should have expiration date, but is a session cookie' % cookie)
+
+    def test_logout(self):
+        response = self.app.post(url(controller='login', action='index'),
+                                 {'username': TEST_USER_REGULAR_LOGIN,
+                                  'password': TEST_USER_REGULAR_PASS})
+
+        # Verify that a login session has been established.
+        response = self.app.get(url(controller='login', action='index'))
+        response = response.follow()
+        self.assertIn('authuser', response.session)
+
+        response.click('Log Out')
+
+        # Verify that the login session has been terminated.
+        response = self.app.get(url(controller='login', action='index'))
+        self.assertNotIn('authuser', response.session)
+
     @parameterized.expand([
           ('data:text/html,<script>window.alert("xss")</script>',),
           ('mailto:test@example.com',),
           ('file:///etc/passwd',),
           ('ftp://some.ftp.server',),
-          ('http://other.domain',),
+          ('http://other.domain/bl%C3%A5b%C3%A6rgr%C3%B8d',),
     ])
     def test_login_bad_came_froms(self, url_came_from):
         response = self.app.post(url(controller='login', action='index',
                                      came_from=url_came_from),
-                                 {'username': 'test_admin',
-                                  'password': 'test12'})
+                                 {'username': TEST_USER_ADMIN_LOGIN,
+                                  'password': TEST_USER_ADMIN_PASS})
         self.assertEqual(response.status, '302 Found')
         self.assertEqual(response._environ['paste.testing_variables']
                          ['tmpl_context'].came_from, '/')
@@ -82,7 +120,7 @@
 
     def test_login_short_password(self):
         response = self.app.post(url(controller='login', action='index'),
-                                 {'username': 'test_admin',
+                                 {'username': TEST_USER_ADMIN_LOGIN,
                                   'password': 'as'})
         self.assertEqual(response.status, '200 OK')
 
@@ -93,8 +131,66 @@
                                  {'username': 'error',
                                   'password': 'test12'})
 
-        response.mustcontain('invalid user name')
-        response.mustcontain('invalid password')
+        response.mustcontain('Invalid username or password')
+
+    # verify that get arguments are correctly passed along login redirection
+
+    @parameterized.expand([
+        ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
+        ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
+             ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
+    ])
+    def test_redirection_to_login_form_preserves_get_args(self, args, args_encoded):
+        with fixture.anon_access(False):
+            response = self.app.get(url(controller='summary', action='index',
+                                        repo_name=HG_REPO,
+                                        **args))
+            self.assertEqual(response.status, '302 Found')
+            for encoded in args_encoded:
+                self.assertIn(encoded, response.location)
+
+    @parameterized.expand([
+        ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
+        ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
+             ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
+    ])
+    def test_login_form_preserves_get_args(self, args, args_encoded):
+        response = self.app.get(url(controller='login', action='index',
+                                    came_from = '/_admin/users',
+                                    **args))
+        for encoded in args_encoded:
+            self.assertIn(encoded, response.form.action)
+
+    @parameterized.expand([
+        ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
+        ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
+             ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
+    ])
+    def test_redirection_after_successful_login_preserves_get_args(self, args, args_encoded):
+        response = self.app.post(url(controller='login', action='index',
+                                     came_from = '/_admin/users',
+                                     **args),
+                                 {'username': TEST_USER_ADMIN_LOGIN,
+                                  'password': TEST_USER_ADMIN_PASS})
+        self.assertEqual(response.status, '302 Found')
+        for encoded in args_encoded:
+            self.assertIn(encoded, response.location)
+
+    @parameterized.expand([
+        ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
+        ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
+             ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
+    ])
+    def test_login_form_after_incorrect_login_preserves_get_args(self, args, args_encoded):
+        response = self.app.post(url(controller='login', action='index',
+                                     came_from = '/_admin/users',
+                                     **args),
+                                 {'username': 'error',
+                                  'password': 'test12'})
+
+        response.mustcontain('Invalid username or password')
+        for encoded in args_encoded:
+            self.assertIn(encoded, response.form.action)
 
     #==========================================================================
     # REGISTRATIONS
@@ -104,7 +200,7 @@
         response.mustcontain('Sign Up')
 
     def test_register_err_same_username(self):
-        uname = 'test_admin'
+        uname = TEST_USER_ADMIN_LOGIN
         response = self.app.post(url(controller='login', action='register'),
                                             {'username': uname,
                                              'password': 'test12',
@@ -122,7 +218,7 @@
                                             {'username': 'test_admin_0',
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
-                                             'email': 'test_admin@mail.com',
+                                             'email': TEST_USER_ADMIN_EMAIL,
                                              'firstname': 'test',
                                              'lastname': 'test'})
 
@@ -134,7 +230,7 @@
                                             {'username': 'test_admin_1',
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
-                                             'email': 'TesT_Admin@mail.COM',
+                                             'email': TEST_USER_ADMIN_EMAIL.title(),
                                              'firstname': 'test',
                                              'lastname': 'test'})
         msg = validators.UniqSystemEmail()()._messages['email_taken']
@@ -164,11 +260,11 @@
         response.mustcontain('An email address must contain a single @')
         response.mustcontain('Username may only contain '
                 'alphanumeric characters underscores, '
-                'periods or dashes and must begin with '
+                'periods or dashes and must begin with an '
                 'alphanumeric character')
 
     def test_register_err_case_sensitive(self):
-        usr = 'Test_Admin'
+        usr = TEST_USER_ADMIN_LOGIN.title()
         response = self.app.post(url(controller='login', action='register'),
                                             {'username': usr,
                                              'password': 'test12',
@@ -202,13 +298,13 @@
                                              'email': 'goodmailm@test.plxa',
                                              'firstname': 'test',
                                              'lastname': 'test'})
-        msg = validators.ValidPasswordsMatch()._messages['password_mismatch']
+        msg = validators.ValidPasswordsMatch('password', 'password_confirmation')._messages['password_mismatch']
         response.mustcontain(msg)
 
     def test_register_ok(self):
         username = 'test_regular4'
         password = 'qweqwe'
-        email = 'marcin@test.com'
+        email = 'username@test.com'
         name = 'testname'
         lastname = 'testlastname'
 
@@ -232,16 +328,18 @@
         self.assertNotEqual(ret.api_key, None)
         self.assertEqual(ret.admin, False)
 
+    #==========================================================================
+    # PASSWORD RESET
+    #==========================================================================
+
     def test_forgot_password_wrong_mail(self):
-        bad_email = 'marcin@wrongmail.org'
+        bad_email = 'username%wrongmail.org'
         response = self.app.post(
                         url(controller='login', action='password_reset'),
                             {'email': bad_email, }
         )
 
-        msg = validators.ValidSystemEmail()._messages['non_existing_email']
-        msg = h.html_escape(msg % {'email': bad_email})
-        response.mustcontain()
+        response.mustcontain('An email address must contain a single @')
 
     def test_forgot_password(self):
         response = self.app.get(url(controller='login',
@@ -250,9 +348,10 @@
 
         username = 'test_password_reset_1'
         password = 'qweqwe'
-        email = 'marcin@python-works.com'
+        email = 'username@python-works.com'
         name = 'passwd'
         lastname = 'reset'
+        timestamp = int(time.time())
 
         new = User()
         new.username = username
@@ -268,34 +367,58 @@
                                      action='password_reset'),
                                  {'email': email, })
 
-        self.checkSessionFlash(response, 'Your password reset link was sent')
+        self.checkSessionFlash(response, 'A password reset confirmation code has been sent')
 
         response = response.follow()
 
-        # BAD KEY
+        # BAD TOKEN
+
+        token = "bad"
 
-        key = "bad"
+        response = self.app.post(url(controller='login',
+                                     action='password_reset_confirmation'),
+                                 {'email': email,
+                                  'timestamp': timestamp,
+                                  'password': "p@ssw0rd",
+                                  'password_confirm': "p@ssw0rd",
+                                  'token': token,
+                                 })
+        self.assertEqual(response.status, '200 OK')
+        response.mustcontain('Invalid password reset token')
+
+        # GOOD TOKEN
+
+        # TODO: The token should ideally be taken from the mail sent
+        # above, instead of being recalculated.
+
+        token = UserModel().get_reset_password_token(
+            User.get_by_username(username), timestamp, self.authentication_token())
+
         response = self.app.get(url(controller='login',
                                     action='password_reset_confirmation',
-                                    key=key))
-        self.assertEqual(response.status, '302 Found')
-        self.assertTrue(response.location.endswith(url('reset_password')))
-
-        # GOOD KEY
+                                    email=email,
+                                    timestamp=timestamp,
+                                    token=token))
+        self.assertEqual(response.status, '200 OK')
+        response.mustcontain("You are about to set a new password for the email address %s" % email)
 
-        key = User.get_by_username(username).api_key
-        response = self.app.get(url(controller='login',
-                                    action='password_reset_confirmation',
-                                    key=key))
+        response = self.app.post(url(controller='login',
+                                     action='password_reset_confirmation'),
+                                 {'email': email,
+                                  'timestamp': timestamp,
+                                  'password': "p@ssw0rd",
+                                  'password_confirm': "p@ssw0rd",
+                                  'token': token,
+                                 })
         self.assertEqual(response.status, '302 Found')
-        self.assertTrue(response.location.endswith(url('login_home')))
-
-        self.checkSessionFlash(response,
-                               ('Your password reset was successful, '
-                                'new password has been sent to your email'))
+        self.checkSessionFlash(response, 'Successfully updated password')
 
         response = response.follow()
 
+    #==========================================================================
+    # API
+    #==========================================================================
+
     def _get_api_whitelist(self, values=None):
         config = {'api_access_controllers_whitelist': values or []}
         return config
@@ -319,7 +442,7 @@
                 self.app.get(url(controller='changeset',
                                  action='changeset_raw',
                                  repo_name=HG_REPO, revision='tip', api_key=api_key),
-                             status=302)
+                             status=403)
 
     @parameterized.expand([
         ('none', None, 302),
@@ -365,7 +488,7 @@
 
             new_api_key = ApiKeyModel().create(TEST_USER_ADMIN_LOGIN, u'test')
             Session().commit()
-            #patch the api key and make it expired
+            #patch the API key and make it expired
             new_api_key.expires = 0
             Session().add(new_api_key)
             Session().commit()
--- a/kallithea/tests/functional/test_my_account.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_my_account.py	Sun Sep 06 23:36:05 2015 +0200
@@ -23,7 +23,7 @@
         self.log_user()
         response = self.app.get(url('my_account'))
 
-        response.mustcontain('value="test_admin')
+        response.mustcontain('value="%s' % TEST_USER_ADMIN_LOGIN)
 
     def test_my_account_my_repos(self):
         self.log_user()
@@ -51,13 +51,14 @@
         response.mustcontain('No additional emails specified')
         response = self.app.post(url('my_account_emails'),
                                  {'new_email': TEST_USER_REGULAR_EMAIL, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'This e-mail address is already taken')
+        self.checkSessionFlash(response, 'This email address is already in use')
 
     def test_my_account_my_emails_add_mising_email_in_form(self):
         self.log_user()
         response = self.app.get(url('my_account_emails'))
         response.mustcontain('No additional emails specified')
-        response = self.app.post(url('my_account_emails'),)
+        response = self.app.post(url('my_account_emails'),
+            {'_authentication_token': self.authentication_token()})
         self.checkSessionFlash(response, 'Please enter an email address')
 
     def test_my_account_my_emails_add_remove(self):
@@ -149,11 +150,11 @@
     def test_my_account_update_err_email_exists(self):
         self.log_user()
 
-        new_email = 'test_regular@mail.com'  # already exisitn email
+        new_email = TEST_USER_REGULAR_EMAIL  # already existing email
         response = self.app.post(url('my_account'),
                                 params=dict(
-                                    username='test_admin',
-                                    new_password='test12',
+                                    username=TEST_USER_ADMIN_LOGIN,
+                                    new_password=TEST_USER_ADMIN_PASS,
                                     password_confirmation='test122',
                                     firstname='NewName',
                                     lastname='NewLastname',
@@ -161,16 +162,16 @@
                                     _authentication_token=self.authentication_token())
                                 )
 
-        response.mustcontain('This e-mail address is already taken')
+        response.mustcontain('This email address is already in use')
 
     def test_my_account_update_err(self):
-        self.log_user('test_regular2', 'test12')
+        self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
 
         new_email = 'newmail.pl'
         response = self.app.post(url('my_account'),
                                  params=dict(
-                                            username='test_admin',
-                                            new_password='test12',
+                                            username=TEST_USER_ADMIN_LOGIN,
+                                            new_password=TEST_USER_ADMIN_PASS,
                                             password_confirmation='test122',
                                             firstname='NewName',
                                             lastname='NewLastname',
@@ -181,15 +182,15 @@
         from kallithea.model import validators
         msg = validators.ValidUsername(edit=False, old_data={})\
                 ._messages['username_exists']
-        msg = h.html_escape(msg % {'username': 'test_admin'})
-        response.mustcontain(u"%s" % msg)
+        msg = h.html_escape(msg % {'username': TEST_USER_ADMIN_LOGIN})
+        response.mustcontain(msg)
 
     def test_my_account_api_keys(self):
-        usr = self.log_user('test_regular2', 'test12')
+        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
         response = self.app.get(url('my_account_api_keys'))
         response.mustcontain(user.api_key)
-        response.mustcontain('expires: never')
+        response.mustcontain('Expires: Never')
 
     @parameterized.expand([
         ('forever', -1),
@@ -197,11 +198,11 @@
         ('30days', 60*60*24*30),
     ])
     def test_my_account_add_api_keys(self, desc, lifetime):
-        usr = self.log_user('test_regular2', 'test12')
+        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
         response = self.app.post(url('my_account_api_keys'),
                                  {'description': desc, 'lifetime': lifetime, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully created')
+        self.checkSessionFlash(response, 'API key successfully created')
         try:
             response = response.follow()
             user = User.get(usr['user_id'])
@@ -213,11 +214,11 @@
                 Session().commit()
 
     def test_my_account_remove_api_key(self):
-        usr = self.log_user('test_regular2', 'test12')
+        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
         response = self.app.post(url('my_account_api_keys'),
                                  {'description': 'desc', 'lifetime': -1, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully created')
+        self.checkSessionFlash(response, 'API key successfully created')
         response = response.follow()
 
         #now delete our key
@@ -226,21 +227,21 @@
 
         response = self.app.post(url('my_account_api_keys'),
                  {'_method': 'delete', 'del_api_key': keys[0].api_key, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully deleted')
+        self.checkSessionFlash(response, 'API key successfully deleted')
         keys = UserApiKeys.query().all()
         self.assertEqual(0, len(keys))
 
 
     def test_my_account_reset_main_api_key(self):
-        usr = self.log_user('test_regular2', 'test12')
+        usr = self.log_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS)
         user = User.get(usr['user_id'])
         api_key = user.api_key
         response = self.app.get(url('my_account_api_keys'))
         response.mustcontain(api_key)
-        response.mustcontain('expires: never')
+        response.mustcontain('Expires: Never')
 
         response = self.app.post(url('my_account_api_keys'),
                  {'_method': 'delete', 'del_api_key_builtin': api_key, '_authentication_token': self.authentication_token()})
-        self.checkSessionFlash(response, 'Api key successfully reset')
+        self.checkSessionFlash(response, 'API key successfully reset')
         response = response.follow()
         response.mustcontain(no=[api_key])
--- a/kallithea/tests/functional/test_pullrequests.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_pullrequests.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,3 +1,5 @@
+import re
+
 from kallithea.tests import *
 from kallithea.tests.fixture import Fixture
 from kallithea.model.meta import Session
@@ -13,6 +15,134 @@
         response = self.app.get(url(controller='pullrequests', action='index',
                                     repo_name=HG_REPO))
 
+    def test_create_trivial(self):
+        self.log_user()
+        response = self.app.post(url(controller='pullrequests', action='create',
+                                     repo_name=HG_REPO),
+                                 {'org_repo': HG_REPO,
+                                  'org_ref': 'branch:default:default',
+                                  'other_repo': HG_REPO,
+                                  'other_ref': 'branch:default:default',
+                                  'pullrequest_title': 'title',
+                                  'pullrequest_desc': 'description',
+                                  '_authentication_token': self.authentication_token(),
+                                 }
+                                )
+        self.assertEqual(response.status, '302 Found')
+        response = response.follow()
+        self.assertEqual(response.status, '200 OK')
+        response.mustcontain('This pull request has already been merged to default.')
+
+    def test_create_with_existing_reviewer(self):
+        self.log_user()
+        response = self.app.post(url(controller='pullrequests', action='create',
+                                     repo_name=HG_REPO),
+                                 {'org_repo': HG_REPO,
+                                  'org_ref': 'branch:default:default',
+                                  'other_repo': HG_REPO,
+                                  'other_ref': 'branch:default:default',
+                                  'pullrequest_title': 'title',
+                                  'pullrequest_desc': 'description',
+                                  '_authentication_token': self.authentication_token(),
+                                  'review_members': TEST_USER_ADMIN_LOGIN,
+                                 }
+                                )
+        self.assertEqual(response.status, '302 Found')
+        response = response.follow()
+        self.assertEqual(response.status, '200 OK')
+        response.mustcontain('This pull request has already been merged to default.')
+
+    def test_create_with_invalid_reviewer(self):
+        invalid_user_name = 'invalid_user'
+        self.log_user()
+        response = self.app.post(url(controller='pullrequests', action='create',
+                                     repo_name=HG_REPO),
+                                 {
+                                  'org_repo': HG_REPO,
+                                  'org_ref': 'branch:default:default',
+                                  'other_repo': HG_REPO,
+                                  'other_ref': 'branch:default:default',
+                                  'pullrequest_title': 'title',
+                                  'pullrequest_desc': 'description',
+                                  '_authentication_token': self.authentication_token(),
+                                  'review_members': invalid_user_name,
+                                 },
+                                 status=400)
+        response.mustcontain('Invalid reviewer &#34;%s&#34; specified' % invalid_user_name)
+
+    def test_update_with_invalid_reviewer(self):
+        invalid_user_id = 99999
+        self.log_user()
+        # create a valid pull request
+        response = self.app.post(url(controller='pullrequests', action='create',
+                                     repo_name=HG_REPO),
+                                 {
+                                  'org_repo': HG_REPO,
+                                  'org_ref': 'branch:default:default',
+                                  'other_repo': HG_REPO,
+                                  'other_ref': 'branch:default:default',
+                                  'pullrequest_title': 'title',
+                                  'pullrequest_desc': 'description',
+                                  '_authentication_token': self.authentication_token(),
+                                 }
+                                )
+        self.assertEqual(response.status, '302 Found')
+        # location is of the form:
+        # http://localhost/vcs_test_hg/pull-request/54/_/title
+        m = re.search('/pull-request/(\d+)/', response.location)
+        self.assertNotEqual(m, None)
+        pull_request_id = m.group(1)
+
+        # update it
+        response = self.app.post(url(controller='pullrequests', action='post',
+                                     repo_name=HG_REPO, pull_request_id=pull_request_id),
+                                 {
+                                  'updaterev': 'default',
+                                  'pullrequest_title': 'title',
+                                  'pullrequest_desc': 'description',
+                                  'owner': TEST_USER_ADMIN_LOGIN,
+                                  '_authentication_token': self.authentication_token(),
+                                  'review_members': invalid_user_id,
+                                 },
+                                 status=400)
+        response.mustcontain('Invalid reviewer &#34;%s&#34; specified' % invalid_user_id)
+
+    def test_edit_with_invalid_reviewer(self):
+        invalid_user_id = 99999
+        self.log_user()
+        # create a valid pull request
+        response = self.app.post(url(controller='pullrequests', action='create',
+                                     repo_name=HG_REPO),
+                                 {
+                                  'org_repo': HG_REPO,
+                                  'org_ref': 'branch:default:default',
+                                  'other_repo': HG_REPO,
+                                  'other_ref': 'branch:default:default',
+                                  'pullrequest_title': 'title',
+                                  'pullrequest_desc': 'description',
+                                  '_authentication_token': self.authentication_token(),
+                                 }
+                                )
+        self.assertEqual(response.status, '302 Found')
+        # location is of the form:
+        # http://localhost/vcs_test_hg/pull-request/54/_/title
+        m = re.search('/pull-request/(\d+)/', response.location)
+        self.assertNotEqual(m, None)
+        pull_request_id = m.group(1)
+
+        # edit it
+        response = self.app.post(url(controller='pullrequests', action='post',
+                                     repo_name=HG_REPO, pull_request_id=pull_request_id),
+                                 {
+                                  'pullrequest_title': 'title',
+                                  'pullrequest_desc': 'description',
+                                  'owner': TEST_USER_ADMIN_LOGIN,
+                                  '_authentication_token': self.authentication_token(),
+                                  'review_members': invalid_user_id,
+                                 },
+                                 status=400)
+        response.mustcontain('Invalid reviewer &#34;%s&#34; specified' % invalid_user_id)
+
 class TestPullrequestsGetRepoRefs(TestController):
 
     def setUp(self):
--- a/kallithea/tests/functional/test_summary.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/functional/test_summary.py	Sun Sep 06 23:36:05 2015 +0200
@@ -41,8 +41,8 @@
         )
 
         # clone url...
-        response.mustcontain('''id="clone_url" readonly="readonly" value="http://test_admin@localhost:80/%s"''' % HG_REPO)
-        response.mustcontain('''id="clone_url_id" readonly="readonly" value="http://test_admin@localhost:80/_%s"''' % ID)
+        response.mustcontain('''id="clone_url" readonly="readonly" value="http://%s@localhost:80/%s"''' % (TEST_USER_ADMIN_LOGIN, HG_REPO))
+        response.mustcontain('''id="clone_url_id" readonly="readonly" value="http://%s@localhost:80/_%s"''' % (TEST_USER_ADMIN_LOGIN, ID))
 
     def test_index_git(self):
         self.log_user()
@@ -61,8 +61,8 @@
         )
 
         # clone url...
-        response.mustcontain('''id="clone_url" readonly="readonly" value="http://test_admin@localhost:80/%s"''' % GIT_REPO)
-        response.mustcontain('''id="clone_url_id" readonly="readonly" value="http://test_admin@localhost:80/_%s"''' % ID)
+        response.mustcontain('''id="clone_url" readonly="readonly" value="http://%s@localhost:80/%s"''' % (TEST_USER_ADMIN_LOGIN, GIT_REPO))
+        response.mustcontain('''id="clone_url_id" readonly="readonly" value="http://%s@localhost:80/_%s"''' % (TEST_USER_ADMIN_LOGIN, ID))
 
     def test_index_by_id_hg(self):
         self.log_user()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/models/test_changeset_status.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,40 @@
+from kallithea.tests import *
+from kallithea.model.changeset_status import ChangesetStatusModel
+from kallithea.model.db import ChangesetStatus as CS
+
+class CSM(object): # ChangesetStatusMock
+
+    def __init__(self, status):
+        self.status = status
+
+class TestChangesetStatusCalculation(BaseTestCase):
+
+    def setUp(self):
+        self.m = ChangesetStatusModel()
+
+    @parameterized.expand([
+        ('empty list', CS.STATUS_UNDER_REVIEW, []),
+        ('approve', CS.STATUS_APPROVED, [CSM(CS.STATUS_APPROVED)]),
+        ('approve2', CS.STATUS_APPROVED, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_APPROVED)]),
+        ('approve_reject', CS.STATUS_REJECTED, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_REJECTED)]),
+        ('approve_underreview', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_UNDER_REVIEW)]),
+        ('approve_notreviewed', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_NOT_REVIEWED)]),
+        ('underreview', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_UNDER_REVIEW), CSM(CS.STATUS_UNDER_REVIEW)]),
+        ('reject', CS.STATUS_REJECTED, [CSM(CS.STATUS_REJECTED)]),
+        ('reject_underreview', CS.STATUS_REJECTED, [CSM(CS.STATUS_REJECTED), CSM(CS.STATUS_UNDER_REVIEW)]),
+        ('reject_notreviewed', CS.STATUS_REJECTED, [CSM(CS.STATUS_REJECTED), CSM(CS.STATUS_NOT_REVIEWED)]),
+        ('notreviewed', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_NOT_REVIEWED)]),
+        ('approve_none', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_APPROVED), None]),
+        ('approve2_none', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_APPROVED), None]),
+        ('approve_reject_none', CS.STATUS_REJECTED, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_REJECTED), None]),
+        ('approve_underreview_none', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_UNDER_REVIEW), None]),
+        ('approve_notreviewed_none', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_APPROVED), CSM(CS.STATUS_NOT_REVIEWED), None]),
+        ('underreview_none', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_UNDER_REVIEW), CSM(CS.STATUS_UNDER_REVIEW), None]),
+        ('reject_none', CS.STATUS_REJECTED, [CSM(CS.STATUS_REJECTED), None]),
+        ('reject_underreview_none', CS.STATUS_REJECTED, [CSM(CS.STATUS_REJECTED), CSM(CS.STATUS_UNDER_REVIEW), None]),
+        ('reject_notreviewed_none', CS.STATUS_REJECTED, [CSM(CS.STATUS_REJECTED), CSM(CS.STATUS_NOT_REVIEWED), None]),
+        ('notreviewed_none', CS.STATUS_UNDER_REVIEW, [CSM(CS.STATUS_NOT_REVIEWED), None]),
+    ])
+    def test_result(self, name, expected_result, statuses):
+        result = self.m._calculate_status(statuses)
+        self.assertEqual(result, expected_result)
--- a/kallithea/tests/models/test_diff_parsers.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/models/test_diff_parsers.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 from kallithea.tests import *
 from kallithea.lib.diffs import DiffProcessor, NEW_FILENODE, DEL_FILENODE, \
     MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
@@ -275,3 +274,32 @@
         data = [(x['filename'], x['operation'], x['stats']) for x in diff_proc_d]
         expected_data = DIFF_FIXTURES[diff_fixture]
         self.assertListEqual(expected_data, data)
+
+    def test_diff_markup(self):
+        diff = fixture.load_resource('markuptest.diff', strip=False)
+        diff_proc = DiffProcessor(diff)
+        diff_proc_d = diff_proc.prepare()
+        chunks = diff_proc_d[0]['chunks']
+        self.assertFalse(chunks[0])
+        #from pprint import pprint; pprint(chunks[1])
+        l = ['\n']
+        for d in chunks[1]:
+            l.append('%(action)-7s %(new_lineno)3s %(old_lineno)3s %(line)r\n' % d)
+        s = ''.join(l)
+        print s
+        self.assertEqual(s, r'''
+context ... ... u'@@ -51,5 +51,12 @@\n'
+unmod    51  51 u'<u>\t</u>begin();\n'
+unmod    52  52 u'<u>\t</u>\n'
+add      53     u'<u>\t</u>int foo;<u class="cr"></u>\n'
+add      54     u'<u>\t</u>int bar; <u class="cr"></u>\n'
+add      55     u'<u>\t</u>int baz;<u>\t</u><u class="cr"></u>\n'
+add      56     u'<u>\t</u>int space; <i></i>'
+add      57     u'<u>\t</u>int tab;<u>\t</u>\n'
+add      58     u'<u>\t</u>\n'
+unmod    59  53 u' <i></i>'
+del          54 u'<u>\t</u><del>#define MAX_STEPS (48)</del>\n'
+add      60     u'<u>\t</u><ins><u class="cr"></u></ins>\n'
+add      61     u'<u>\t</u>#define MAX_STEPS (64)<u class="cr"></u>\n'
+unmod    62  55 u'\n'
+''')
--- a/kallithea/tests/models/test_notifications.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/models/test_notifications.py	Sun Sep 06 23:36:05 2015 +0200
@@ -34,20 +34,12 @@
 
         super(TestNotifications, self).__init__(methodName=methodName)
 
-    def _clean_notifications(self):
-        for n in Notification.query().all():
-            Session().delete(n)
-
-        Session().commit()
-        self.assertEqual(Notification.query().all(), [])
-
-    def tearDown(self):
-        self._clean_notifications()
-
-    def test_create_notification(self):
+    def setUp(self):
+        self.remove_all_notifications()
         self.assertEqual([], Notification.query().all())
         self.assertEqual([], UserNotification.query().all())
 
+    def test_create_notification(self):
         usrs = [self.u1, self.u2]
         notification = NotificationModel().create(created_by=self.u1,
                                            subject=u'subj', body=u'hi there',
@@ -71,9 +63,6 @@
                          set(usrs))
 
     def test_user_notifications(self):
-        self.assertEqual([], Notification.query().all())
-        self.assertEqual([], UserNotification.query().all())
-
         notification1 = NotificationModel().create(created_by=self.u1,
                                             subject=u'subj', body=u'hi there1',
                                             recipients=[self.u3])
@@ -88,9 +77,6 @@
                          sorted([notification2, notification1]))
 
     def test_delete_notifications(self):
-        self.assertEqual([], Notification.query().all())
-        self.assertEqual([], UserNotification.query().all())
-
         notification = NotificationModel().create(created_by=self.u1,
                                            subject=u'title', body=u'hi there3',
                                     recipients=[self.u3, self.u1, self.u2])
@@ -109,10 +95,6 @@
         self.assertEqual(un, [])
 
     def test_delete_association(self):
-
-        self.assertEqual([], Notification.query().all())
-        self.assertEqual([], UserNotification.query().all())
-
         notification = NotificationModel().create(created_by=self.u1,
                                            subject=u'title', body=u'hi there3',
                                     recipients=[self.u3, self.u1, self.u2])
@@ -156,10 +138,6 @@
         self.assertNotEqual(u2notification, None)
 
     def test_notification_counter(self):
-        self._clean_notifications()
-        self.assertEqual([], Notification.query().all())
-        self.assertEqual([], UserNotification.query().all())
-
         NotificationModel().create(created_by=self.u1,
                             subject=u'title', body=u'hi there_delete',
                             recipients=[self.u3, self.u1])
--- a/kallithea/tests/models/test_permissions.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/models/test_permissions.py	Sun Sep 06 23:36:05 2015 +0200
@@ -72,7 +72,7 @@
             'repositories_groups': {},
             'global': set([u'hg.create.repository', u'repository.read',
                            u'hg.register.manual_activate']),
-            'repositories': {u'vcs_test_hg': u'repository.read'}
+            'repositories': {HG_REPO: u'repository.read'}
         }
         self.assertEqual(u1_auth.permissions['repositories'][HG_REPO],
                          perms['repositories'][HG_REPO])
@@ -90,7 +90,7 @@
         perms = {
             'repositories_groups': {},
             'global': set([u'hg.admin', 'hg.create.write_on_repogroup.true']),
-            'repositories': {u'vcs_test_hg': u'repository.admin'}
+            'repositories': {HG_REPO: u'repository.admin'}
         }
         self.assertEqual(a1_auth.permissions['repositories'][HG_REPO],
                          perms['repositories'][HG_REPO])
@@ -111,7 +111,7 @@
         perms = {
             'repositories_groups': {u'test1': 'group.read', u'test2': 'group.read'},
             'global': set(Permission.DEFAULT_USER_PERMISSIONS),
-            'repositories': {u'vcs_test_hg': u'repository.read'}
+            'repositories': {HG_REPO: u'repository.read'}
         }
         self.assertEqual(u1_auth.permissions['repositories'][HG_REPO],
                          perms['repositories'][HG_REPO])
@@ -127,7 +127,7 @@
         perms = {
             'repositories_groups': {u'test1': 'group.admin', u'test2': 'group.admin'},
             'global': set(['hg.admin', 'hg.create.write_on_repogroup.true']),
-            'repositories': {u'vcs_test_hg': 'repository.admin'}
+            'repositories': {HG_REPO: 'repository.admin'}
         }
 
         self.assertEqual(a1_auth.permissions['repositories'][HG_REPO],
@@ -160,7 +160,7 @@
             'repositories_groups': {},
             'global': set([u'hg.create.repository', u'repository.read',
                            u'hg.register.manual_activate']),
-            'repositories': {u'vcs_test_hg': u'repository.read'}
+            'repositories': {HG_REPO: u'repository.read'}
         }
         self.assertEqual(u1_auth.permissions['repositories'][HG_REPO],
                          new_perm)
@@ -183,7 +183,7 @@
             'repositories_groups': {},
             'global': set([u'hg.create.repository', u'repository.read',
                            u'hg.register.manual_activate']),
-            'repositories': {u'vcs_test_hg': u'repository.read'}
+            'repositories': {HG_REPO: u'repository.read'}
         }
         self.assertEqual(u3_auth.permissions['repositories'][HG_REPO],
                          new_perm_gr)
@@ -217,7 +217,7 @@
             'repositories_groups': {},
             'global': set([u'hg.create.repository', u'repository.read',
                            u'hg.register.manual_activate']),
-            'repositories': {u'vcs_test_hg': u'repository.write'}
+            'repositories': {HG_REPO: u'repository.write'}
         }
         self.assertEqual(u1_auth.permissions['repositories'][HG_REPO],
                          new_perm_h)
--- a/kallithea/tests/models/test_user_group_permissions_on_repo_groups.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/models/test_user_group_permissions_on_repo_groups.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,11 +1,9 @@
 import functools
-from kallithea.tests import *
 
 from kallithea.model.repo_group import RepoGroupModel
 from kallithea.model.db import RepoGroup
 
 from kallithea.model.meta import Session
-from nose.tools import with_setup
 from kallithea.tests.models.common import _create_project_tree, check_tree_perms, \
     _get_perms, _check_expected_count, expected_count, _destroy_project_tree
 from kallithea.model.user_group import UserGroupModel
@@ -26,6 +24,13 @@
     repo_group = RepoGroup.get_by_group_name(group_name=group_name)
     if not repo_group:
         raise Exception('Cannot get group %s' % group_name)
+
+    # Start with a baseline that current group can read recursive
+    perms_updates = [[test_u2_gr_id, 'group.read', 'users_group']]
+    RepoGroupModel()._update_permissions(repo_group,
+                                         perms_updates=perms_updates,
+                                         recursive='all', check_perms=False)
+
     perms_updates = [[test_u2_gr_id, perm, 'users_group']]
     RepoGroupModel()._update_permissions(repo_group,
                                          perms_updates=perms_updates,
@@ -53,9 +58,9 @@
 
 def teardown_module():
     _destroy_project_tree(test_u2_id)
+    fixture.destroy_user_group('perms_group_1')
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_without_recursive_mode():
     # set permission to g0 non-recursive mode
     recursive = 'none'
@@ -75,7 +80,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_without_recursive_mode_subgroup():
     # set permission to g0 non-recursive mode
     recursive = 'none'
@@ -95,7 +99,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode():
 
     # set permission to g0 recursive mode, all children including
@@ -115,7 +118,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode_inner_group():
     ## set permission to g0_3 group to none
     recursive = 'all'
@@ -133,7 +135,6 @@
         yield check_tree_perms, name, perm, group, 'group.none'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode_deepest():
     ## set permission to g0_3 group to none
     recursive = 'all'
@@ -151,7 +152,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode_only_with_repos():
     ## set permission to g0_3 group to none
     recursive = 'all'
@@ -168,7 +168,7 @@
     for name, perm in items:
         yield check_tree_perms, name, perm, group, 'group.admin'
 
-@with_setup(permissions_setup_func)
+
 def test_user_permissions_on_group_with_recursive_mode_on_repos():
     # set permission to g0/g0_1 with recursive mode on just repositories
     recursive = 'repos'
@@ -192,7 +192,7 @@
             old_perm = perm
         yield check_tree_perms, name, perm, group, old_perm
 
-@with_setup(permissions_setup_func)
+
 def test_user_permissions_on_group_with_recursive_mode_on_repo_groups():
     # set permission to g0/g0_1 with recursive mode on just repository groups
     recursive = 'groups'
--- a/kallithea/tests/models/test_user_groups.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/models/test_user_groups.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,6 +1,6 @@
 from kallithea.model.db import User
 
-from kallithea.tests import *
+from kallithea.tests import BaseTestCase, parameterized, TEST_USER_REGULAR_LOGIN
 from kallithea.tests.fixture import Fixture
 
 from kallithea.model.user_group import UserGroupModel
@@ -18,7 +18,6 @@
             fixture.destroy_user_group(gr)
         Session().commit()
 
-
     @parameterized.expand([
         ([], [], [], [], []),
         ([], ['regular'], [], [], ['regular']),  # no changes of regular
--- a/kallithea/tests/models/test_user_permissions_on_repo_groups.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/models/test_user_permissions_on_repo_groups.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,11 +1,9 @@
 import functools
-from kallithea.tests import *
 
 from kallithea.model.repo_group import RepoGroupModel
 from kallithea.model.db import RepoGroup, User
 
 from kallithea.model.meta import Session
-from nose.tools import with_setup
 from kallithea.tests.models.common import _create_project_tree, check_tree_perms, \
     _get_perms, _check_expected_count, expected_count, _destroy_project_tree
 
@@ -22,7 +20,6 @@
     """
     if not user_id:
         user_id = test_u1_id
-        # called by the @with_setup decorator also reset the default user stuff
         permissions_setup_func(group_name, perm, recursive,
                                user_id=User.get_default_user().user_id)
 
@@ -30,12 +27,19 @@
     if not repo_group:
         raise Exception('Cannot get group %s' % group_name)
 
+    # Start with a baseline that current group can read recursive
+    perms_updates = [[user_id, 'group.read', 'user']]
+    RepoGroupModel()._update_permissions(repo_group,
+                                         perms_updates=perms_updates,
+                                         recursive='all', check_perms=False)
+
     perms_updates = [[user_id, perm, 'user']]
     RepoGroupModel()._update_permissions(repo_group,
                                          perms_updates=perms_updates,
                                          recursive=recursive, check_perms=False)
     Session().commit()
 
+
 def setup_module():
     global test_u1_id, _get_repo_perms, _get_group_perms
     test_u1 = _create_project_tree()
@@ -51,7 +55,6 @@
     _destroy_project_tree(test_u1_id)
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_without_recursive_mode():
     # set permission to g0 non-recursive mode
     recursive = 'none'
@@ -71,7 +74,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_without_recursive_mode_subgroup():
     # set permission to g0 non-recursive mode
     recursive = 'none'
@@ -91,7 +93,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode():
 
     # set permission to g0 recursive mode, all children including
@@ -111,7 +112,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode_for_default_user():
 
     # set permission to g0 recursive mode, all children including
@@ -139,7 +139,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode_inner_group():
     ## set permission to g0_3 group to none
     recursive = 'all'
@@ -157,7 +156,6 @@
         yield check_tree_perms, name, perm, group, 'group.none'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode_deepest():
     ## set permission to g0_3 group to none
     recursive = 'all'
@@ -175,7 +173,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_mode_only_with_repos():
     ## set permission to g0_3 group to none
     recursive = 'all'
@@ -193,7 +190,6 @@
         yield check_tree_perms, name, perm, group, 'group.admin'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_repo_mode_for_default_user():
     # set permission to g0/g0_1 recursive repos only mode, all children including
     # other repos should have this permission now set, inner groups are excluded!
@@ -228,7 +224,6 @@
         yield check_tree_perms, name, perm, group, old_perm
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_repo_mode_inner_group():
     ## set permission to g0_3 group to none, with recursive repos only
     recursive = 'repos'
@@ -253,7 +248,6 @@
         yield check_tree_perms, name, perm, group, old_perm
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_group_mode_for_default_user():
     # set permission to g0/g0_1 with recursive groups only mode, all children including
     # other groups should have this permission now set. repositories should
@@ -281,7 +275,6 @@
         yield check_tree_perms, name, perm, group, 'group.write'
 
 
-@with_setup(permissions_setup_func)
 def test_user_permissions_on_group_with_recursive_group_mode_inner_group():
     ## set permission to g0_3 group to none, with recursive mode for groups only
     recursive = 'groups'
--- a/kallithea/tests/nose_parametrized.py	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,238 +0,0 @@
-import re
-import new
-import inspect
-import logging
-import logging.handlers
-from functools import wraps
-
-from nose.tools import nottest
-from unittest import TestCase
-
-
-def _terrible_magic_get_defining_classes():
-    """ Returns the set of parent classes of the class currently being defined.
-        Will likely only work if called from the ``parameterized`` decorator.
-        This function is entirely @brandon_rhodes's fault, as he suggested
-        the implementation: http://stackoverflow.com/a/8793684/71522
-        """
-    stack = inspect.stack()
-    if len(stack) <= 4:
-        return []
-    frame = stack[3]
-    code_context = frame[4][0].strip()
-    if not code_context.startswith("class "):
-        return []
-    _, parents = code_context.split("(", 1)
-    parents, _ = parents.rsplit(")", 1)
-    return eval("[" + parents + "]", frame[0].f_globals, frame[0].f_locals)
-
-
-def parameterized(input):
-    """ Parameterize a test case:
-        >>> add1_tests = [(1, 2), (2, 3)]
-        >>> class TestFoo(object):
-        ...     @parameterized(add1_tests)
-        ...     def test_add1(self, input, expected):
-        ...         assert_equal(add1(input), expected)
-        >>> @parameterized(add1_tests)
-        ... def test_add1(input, expected):
-        ...     assert_equal(add1(input), expected)
-        >>>
-        """
-
-    if not hasattr(input, "__iter__"):
-        raise ValueError("expected iterable input; got %r" % (input,))
-
-    def parameterized_helper(f):
-        attached_instance_method = [False]
-
-        parent_classes = _terrible_magic_get_defining_classes()
-        if any(issubclass(cls, TestCase) for cls in parent_classes):
-            raise Exception("Warning: '@parameterized' tests won't work "
-                            "inside subclasses of 'TestCase' - use "
-                            "'@parameterized.expand' instead")
-
-        @wraps(f)
-        def parameterized_helper_method(self=None):
-            if self is not None and not attached_instance_method[0]:
-                # confusingly, we need to create a named instance method and
-                # attach that to the class...
-                cls = self.__class__
-                im_f = new.instancemethod(f, None, cls)
-                setattr(cls, f.__name__, im_f)
-                attached_instance_method[0] = True
-            for args in input:
-                if isinstance(args, basestring):
-                    args = [args]
-                # ... then pull that named instance method off, turning it into
-                # a bound method ...
-                if self is not None:
-                    args = [getattr(self, f.__name__)] + list(args)
-                else:
-                    args = [f] + list(args)
-                # ... then yield that as a tuple. If those steps aren't
-                # followed precicely, Nose gets upset and doesn't run the test
-                # or doesn't run setup methods.
-                yield tuple(args)
-
-        f.__name__ = "_helper_for_%s" % (f.__name__,)
-        parameterized_helper_method.parameterized_input = input
-        parameterized_helper_method.parameterized_func = f
-        return parameterized_helper_method
-
-    return parameterized_helper
-
-
-def to_safe_name(s):
-    return re.sub("[^a-zA-Z0-9_]", "", s)
-
-
-def parameterized_expand_helper(func_name, func, args):
-    def parameterized_expand_helper_helper(self=()):
-        if self != ():
-            self = (self,)
-        return func(*(self + args))
-    parameterized_expand_helper_helper.__name__ = str(func_name)
-    return parameterized_expand_helper_helper
-
-
-def parameterized_expand(input):
-    """ A "brute force" method of parameterizing test cases. Creates new test
-        cases and injects them into the namespace that the wrapped function
-        is being defined in. Useful for parameterizing tests in subclasses
-        of 'UnitTest', where Nose test generators don't work.
-
-        >>> @parameterized.expand([("foo", 1, 2)])
-        ... def test_add1(name, input, expected):
-        ...     actual = add1(input)
-        ...     assert_equal(actual, expected)
-        ...
-        >>> locals()
-        ... 'test_add1_foo_0': <function ...> ...
-        >>>
-        """
-
-    def parameterized_expand_wrapper(f):
-        stack = inspect.stack()
-        frame = stack[1]
-        frame_locals = frame[0].f_locals
-
-        base_name = f.__name__
-        for num, args in enumerate(input):
-            name_suffix = "_%s" % (num,)
-            if len(args) > 0 and isinstance(args[0], basestring):
-                name_suffix += "_" + to_safe_name(args[0])
-            name = base_name + name_suffix
-            new_func = parameterized_expand_helper(name, f, args)
-            frame_locals[name] = new_func
-        return nottest(f)
-    return parameterized_expand_wrapper
-
-parameterized.expand = parameterized_expand
-
-
-def assert_contains(haystack, needle):
-    if needle not in haystack:
-        raise AssertionError("%r not in %r" % (needle, haystack))
-
-
-def assert_not_contains(haystack, needle):
-    if needle in haystack:
-        raise AssertionError("%r in %r" % (needle, haystack))
-
-
-def imported_from_test():
-    """ Returns true if it looks like this module is being imported by unittest
-        or nose. """
-    import re
-    import inspect
-    nose_re = re.compile(r"\bnose\b")
-    unittest_re = re.compile(r"\bunittest2?\b")
-    for frame in inspect.stack():
-        file = frame[1]
-        if nose_re.search(file) or unittest_re.search(file):
-            return True
-    return False
-
-
-def assert_raises(func, exc_type, str_contains=None, repr_contains=None):
-    try:
-        func()
-    except exc_type, e:
-        if str_contains is not None and str_contains not in str(e):
-            raise AssertionError("%s raised, but %r does not contain %r"
-                                 % (exc_type, str(e), str_contains))
-        if repr_contains is not None and repr_contains not in repr(e):
-            raise AssertionError("%s raised, but %r does not contain %r"
-                                 % (exc_type, repr(e), repr_contains))
-        return e
-    else:
-        raise AssertionError("%s not raised" % (exc_type,))
-
-
-log_handler = None
-
-
-def setup_logging():
-    """ Configures a log handler which will capure log messages during a test.
-        The ``logged_messages`` and ``assert_no_errors_logged`` functions can be
-        used to make assertions about these logged messages.
-
-        For example::
-
-            from ensi_common.testing import (
-                setup_logging, teardown_logging, assert_no_errors_logged,
-                assert_logged,
-            )
-
-            class TestWidget(object):
-                def setup(self):
-                    setup_logging()
-
-                def teardown(self):
-                    assert_no_errors_logged()
-                    teardown_logging()
-
-                def test_that_will_fail(self):
-                    log.warning("this warning message will trigger a failure")
-
-                def test_that_will_pass(self):
-                    log.info("but info messages are ok")
-                    assert_logged("info messages are ok")
-        """
-
-    global log_handler
-    if log_handler is not None:
-        logging.getLogger().removeHandler(log_handler)
-    log_handler = logging.handlers.BufferingHandler(1000)
-    formatter = logging.Formatter("%(name)s: %(levelname)s: %(message)s")
-    log_handler.setFormatter(formatter)
-    logging.getLogger().addHandler(log_handler)
-
-
-def teardown_logging():
-    global log_handler
-    if log_handler is not None:
-        logging.getLogger().removeHandler(log_handler)
-        log_handler = None
-
-
-def logged_messages():
-    assert log_handler, "setup_logging not called"
-    return [(log_handler.format(record), record) for record in log_handler.buffer]
-
-
-def assert_no_errors_logged():
-    for _, record in logged_messages():
-        if record.levelno >= logging.WARNING:
-            # Assume that the nose log capture plugin is being used, so it will
-            # show the exception.
-            raise AssertionError("an unexpected error was logged")
-
-
-def assert_logged(expected_msg_contents):
-    for msg, _ in logged_messages():
-        if expected_msg_contents in msg:
-            return
-    raise AssertionError("no logged message contains %r"
-                         % (expected_msg_contents,))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/other/manual_test_vcs_operations.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,537 @@
+# -*- coding: utf-8 -*-
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+kallithea.tests.other.manual_test_vcs_operations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Test suite for making push/pull operations.
+
+Run it in two terminals::
+ paster serve kallithea/tests/test.ini
+ KALLITHEA_WHOOSH_TEST_DISABLE=1 KALLITHEA_NO_TMP_PATH=1 nosetests kallithea/tests/other/manual_test_vcs_operations.py
+
+You must have git > 1.8.1 for tests to work fine
+
+This file was forked by the Kallithea project in July 2014.
+Original author and date, and relevant copyright and licensing information is below:
+:created_on: Dec 30, 2010
+:author: marcink
+:copyright: (c) 2013 RhodeCode GmbH, and others.
+:license: GPLv3, see LICENSE.md for more details.
+
+"""
+
+import re
+import tempfile
+import time
+from os.path import join as jn
+
+from tempfile import _RandomNameSequence
+from subprocess import Popen, PIPE
+
+from kallithea.tests import *
+from kallithea.model.db import User, Repository, UserIpMap, CacheInvalidation
+from kallithea.model.meta import Session
+from kallithea.model.repo import RepoModel
+from kallithea.model.user import UserModel
+
+DEBUG = True
+HOST = '127.0.0.1:4999'  # test host
+
+
+class Command(object):
+
+    def __init__(self, cwd):
+        self.cwd = cwd
+
+    def execute(self, cmd, *args):
+        """
+        Runs command on the system with given ``args``.
+        """
+
+        command = cmd + ' ' + ' '.join(args)
+        if DEBUG:
+            print '*** CMD %s ***' % command
+        p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
+        stdout, stderr = p.communicate()
+        if DEBUG:
+            print 'stdout:', repr(stdout)
+            print 'stderr:', repr(stderr)
+        return stdout, stderr
+
+
+def _get_tmp_dir():
+    return tempfile.mkdtemp(prefix='rc_integration_test')
+
+
+def _construct_url(repo, dest=None, **kwargs):
+    if dest is None:
+        #make temp clone
+        dest = _get_tmp_dir()
+    params = {
+        'user': TEST_USER_ADMIN_LOGIN,
+        'passwd': TEST_USER_ADMIN_PASS,
+        'host': HOST,
+        'cloned_repo': repo,
+        'dest': dest
+    }
+    params.update(**kwargs)
+    if params['user'] and params['passwd']:
+        _url = 'http://%(user)s:%(passwd)s@%(host)s/%(cloned_repo)s %(dest)s' % params
+    else:
+        _url = 'http://(host)s/%(cloned_repo)s %(dest)s' % params
+    return _url
+
+
+def _add_files_and_push(vcs, DEST, **kwargs):
+    """
+    Generate some files, add it to DEST repo and push back
+    vcs is git or hg and defines what VCS we want to make those files for
+
+    :param vcs:
+    :param DEST:
+    """
+    # commit some stuff into this repo
+    cwd = path = jn(DEST)
+    #added_file = jn(path, '%ssetupążźć.py' % _RandomNameSequence().next())
+    added_file = jn(path, '%ssetup.py' % _RandomNameSequence().next())
+    Command(cwd).execute('touch %s' % added_file)
+    Command(cwd).execute('%s add %s' % (vcs, added_file))
+
+    for i in xrange(kwargs.get('files_no', 3)):
+        cmd = """echo 'added_line%s' >> %s""" % (i, added_file)
+        Command(cwd).execute(cmd)
+        author_str = 'User ǝɯɐᴎ <me@email.com>'
+        if vcs == 'hg':
+            cmd = """hg commit -m 'commited new %s' -u '%s' %s """ % (
+                i, author_str, added_file
+            )
+        elif vcs == 'git':
+            cmd = """EMAIL="me@email.com" git commit -m 'commited new %s' --author '%s' %s """ % (
+                i, author_str, added_file
+            )
+        Command(cwd).execute(cmd)
+
+    # PUSH it back
+    _REPO = None
+    if vcs == 'hg':
+        _REPO = HG_REPO
+    elif vcs == 'git':
+        _REPO = GIT_REPO
+
+    kwargs['dest'] = ''
+    clone_url = _construct_url(_REPO, **kwargs)
+    if 'clone_url' in kwargs:
+        clone_url = kwargs['clone_url']
+    stdout = stderr = None
+    if vcs == 'hg':
+        stdout, stderr = Command(cwd).execute('hg push --verbose', clone_url)
+    elif vcs == 'git':
+        stdout, stderr = Command(cwd).execute('git push --verbose', clone_url + " master")
+
+    return stdout, stderr
+
+
+def set_anonymous_access(enable=True):
+    user = User.get_by_username(User.DEFAULT_USER)
+    user.active = enable
+    Session().add(user)
+    Session().commit()
+    print '\tanonymous access is now:', enable
+    if enable != User.get_by_username(User.DEFAULT_USER).active:
+        raise Exception('Cannot set anonymous access')
+
+
+#==============================================================================
+# TESTS
+#==============================================================================
+
+
+def _check_proper_git_push(stdout, stderr):
+    #WTF Git stderr is output ?!
+    assert 'fatal' not in stderr
+    assert 'rejected' not in stderr
+    assert 'Pushing to' in stderr
+    assert 'master -> master' in stderr
+
+
+class TestVCSOperations(BaseTestCase):
+
+    @classmethod
+    def setup_class(cls):
+        #DISABLE ANONYMOUS ACCESS
+        set_anonymous_access(False)
+
+    def setUp(self):
+        r = Repository.get_by_repo_name(GIT_REPO)
+        Repository.unlock(r)
+        r.enable_locking = False
+        Session().add(r)
+        Session().commit()
+
+        r = Repository.get_by_repo_name(HG_REPO)
+        Repository.unlock(r)
+        r.enable_locking = False
+        Session().add(r)
+        Session().commit()
+
+    def test_clone_hg_repo_by_admin(self):
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        assert 'requesting all changes' in stdout
+        assert 'adding changesets' in stdout
+        assert 'adding manifests' in stdout
+        assert 'adding file changes' in stdout
+
+        assert stderr == ''
+
+    def test_clone_git_repo_by_admin(self):
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        assert 'Cloning into' in stdout + stderr
+        assert stderr == '' or stdout == ''
+
+    def test_clone_wrong_credentials_hg(self):
+        clone_url = _construct_url(HG_REPO, passwd='bad!')
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        assert 'abort: authorization failed' in stderr
+
+    def test_clone_wrong_credentials_git(self):
+        clone_url = _construct_url(GIT_REPO, passwd='bad!')
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        assert 'fatal: Authentication failed' in stderr
+
+    def test_clone_git_dir_as_hg(self):
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        assert 'HTTP Error 404: Not Found' in stderr
+
+    def test_clone_hg_repo_as_git(self):
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        assert 'not found' in stderr
+
+    def test_clone_non_existing_path_hg(self):
+        clone_url = _construct_url('trololo')
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        assert 'HTTP Error 404: Not Found' in stderr
+
+    def test_clone_non_existing_path_git(self):
+        clone_url = _construct_url('trololo')
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        assert 'not found' in stderr
+
+    def test_push_new_file_hg(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST)
+
+        assert 'pushing to' in stdout
+        assert 'Repository size' in stdout
+        assert 'Last revision is now' in stdout
+
+    def test_push_new_file_git(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        # commit some stuff into this repo
+        stdout, stderr = _add_files_and_push('git', DEST)
+
+        print [(x.repo_full_path,x.repo_path) for x in Repository.get_all()]
+        _check_proper_git_push(stdout, stderr)
+
+    def test_push_invalidates_cache_hg(self):
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==HG_REPO).scalar()
+        if not key:
+            key = CacheInvalidation(HG_REPO, HG_REPO)
+
+        key.cache_active = True
+        Session().add(key)
+        Session().commit()
+
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST, files_no=1)
+
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==HG_REPO).one()
+        self.assertEqual(key.cache_active, False)
+
+    def test_push_invalidates_cache_git(self):
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==GIT_REPO).scalar()
+        if not key:
+            key = CacheInvalidation(GIT_REPO, GIT_REPO)
+
+        key.cache_active = True
+        Session().add(key)
+        Session().commit()
+
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        # commit some stuff into this repo
+        stdout, stderr = _add_files_and_push('git', DEST, files_no=1)
+        _check_proper_git_push(stdout, stderr)
+
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==GIT_REPO).one()
+        print CacheInvalidation.get_all()
+        self.assertEqual(key.cache_active, False)
+
+    def test_push_wrong_credentials_hg(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST, user='bad',
+                                             passwd='name')
+
+        assert 'abort: authorization failed' in stderr
+
+    def test_push_wrong_credentials_git(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('git', DEST, user='bad',
+                                             passwd='name')
+
+        assert 'fatal: Authentication failed' in stderr
+
+    def test_push_back_to_wrong_url_hg(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST,
+                                    clone_url='http://%s/tmp' % HOST)
+
+        assert 'HTTP Error 404: Not Found' in stderr
+
+    def test_push_back_to_wrong_url_git(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('git', DEST,
+                                    clone_url='http://%s/tmp' % HOST)
+
+        assert 'not found' in stderr
+
+    def test_clone_and_create_lock_hg(self):
+        # enable locking
+        r = Repository.get_by_repo_name(HG_REPO)
+        r.enable_locking = True
+        Session().add(r)
+        Session().commit()
+        # clone
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        #check if lock was made
+        r = Repository.get_by_repo_name(HG_REPO)
+        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+
+    def test_clone_and_create_lock_git(self):
+        # enable locking
+        r = Repository.get_by_repo_name(GIT_REPO)
+        r.enable_locking = True
+        Session().add(r)
+        Session().commit()
+        # clone
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        #check if lock was made
+        r = Repository.get_by_repo_name(GIT_REPO)
+        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+
+    def test_clone_after_repo_was_locked_hg(self):
+        #lock repo
+        r = Repository.get_by_repo_name(HG_REPO)
+        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+        #pull fails since repo is locked
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
+                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
+        assert msg in stderr
+
+    def test_clone_after_repo_was_locked_git(self):
+        #lock repo
+        r = Repository.get_by_repo_name(GIT_REPO)
+        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+        #pull fails since repo is locked
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        msg = ("""The requested URL returned error: 423""")
+        assert msg in stderr
+
+    def test_push_on_locked_repo_by_other_user_hg(self):
+        #clone some temp
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        #lock repo
+        r = Repository.get_by_repo_name(HG_REPO)
+        # let this user actually push !
+        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
+                                          perm='repository.write')
+        Session().commit()
+        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+
+        #push fails repo is locked by other user !
+        stdout, stderr = _add_files_and_push('hg', DEST,
+                                             user=TEST_USER_REGULAR_LOGIN,
+                                             passwd=TEST_USER_REGULAR_PASS)
+        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
+                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
+        assert msg in stderr
+
+    def test_push_on_locked_repo_by_other_user_git(self):
+        #clone some temp
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        #lock repo
+        r = Repository.get_by_repo_name(GIT_REPO)
+        # let this user actually push !
+        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
+                                          perm='repository.write')
+        Session().commit()
+        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+
+        #push fails repo is locked by other user !
+        stdout, stderr = _add_files_and_push('git', DEST,
+                                             user=TEST_USER_REGULAR_LOGIN,
+                                             passwd=TEST_USER_REGULAR_PASS)
+        err = 'Repository `%s` locked by user `%s`' % (GIT_REPO, TEST_USER_ADMIN_LOGIN)
+        assert err in stderr
+
+        #TODO: fix this somehow later on Git, Git is stupid and even if we throw
+        #back 423 to it, it makes ANOTHER request and we fail there with 405 :/
+
+        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
+                % (GIT_REPO, TEST_USER_ADMIN_LOGIN))
+        #msg = "405 Method Not Allowed"
+        #assert msg in stderr
+
+    def test_push_unlocks_repository_hg(self):
+        # enable locking
+        r = Repository.get_by_repo_name(HG_REPO)
+        r.enable_locking = True
+        Session().add(r)
+        Session().commit()
+        #clone some temp
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        #check for lock repo after clone
+        r = Repository.get_by_repo_name(HG_REPO)
+        uid = User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+        assert r.locked[0] == uid
+
+        #push is ok and repo is now unlocked
+        stdout, stderr = _add_files_and_push('hg', DEST)
+        assert ('remote: Released lock on repo `%s`' % HG_REPO) in stdout
+        #we need to cleanup the Session Here !
+        Session.remove()
+        r = Repository.get_by_repo_name(HG_REPO)
+        assert r.locked == [None, None]
+
+    #TODO: fix me ! somehow during tests hooks don't get called on Git
+    def test_push_unlocks_repository_git(self):
+        # enable locking
+        r = Repository.get_by_repo_name(GIT_REPO)
+        r.enable_locking = True
+        Session().add(r)
+        Session().commit()
+        #clone some temp
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        #check for lock repo after clone
+        r = Repository.get_by_repo_name(GIT_REPO)
+        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+
+        #push is ok and repo is now unlocked
+        stdout, stderr = _add_files_and_push('git', DEST)
+        _check_proper_git_push(stdout, stderr)
+
+        #assert ('remote: Released lock on repo `%s`' % GIT_REPO) in stdout
+        #we need to cleanup the Session Here !
+        Session.remove()
+        r = Repository.get_by_repo_name(GIT_REPO)
+        assert r.locked == [None, None]
+
+    def test_ip_restriction_hg(self):
+        user_model = UserModel()
+        try:
+            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
+            Session().commit()
+            clone_url = _construct_url(HG_REPO)
+            stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+            assert 'abort: HTTP Error 403: Forbidden' in stderr
+        finally:
+            #release IP restrictions
+            for ip in UserIpMap.getAll():
+                UserIpMap.delete(ip.ip_id)
+            Session().commit()
+
+        time.sleep(2)
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        assert 'requesting all changes' in stdout
+        assert 'adding changesets' in stdout
+        assert 'adding manifests' in stdout
+        assert 'adding file changes' in stdout
+
+        assert stderr == ''
+
+    def test_ip_restriction_git(self):
+        user_model = UserModel()
+        try:
+            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
+            Session().commit()
+            clone_url = _construct_url(GIT_REPO)
+            stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+            # The message apparently changed in Git 1.8.3, so match it loosely.
+            assert re.search(r'\b403\b', stderr)
+        finally:
+            #release IP restrictions
+            for ip in UserIpMap.getAll():
+                UserIpMap.delete(ip.ip_id)
+            Session().commit()
+
+        time.sleep(2)
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        assert 'Cloning into' in stdout + stderr
+        assert stderr == '' or stdout == ''
--- a/kallithea/tests/other/test_libs.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/other/test_libs.py	Sun Sep 06 23:36:05 2015 +0200
@@ -12,8 +12,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
-kallithea.tests.test_libs
-~~~~~~~~~~~~~~~~~~~~~~~~~
+kallithea.tests.other.test_libs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Package for testing various lib/helper functions in kallithea
 
@@ -25,7 +25,6 @@
 :license: GPLv3, see LICENSE.md for more details.
 """
 
-from __future__ import with_statement
 import datetime
 import hashlib
 import mock
@@ -37,9 +36,9 @@
 TEST_URLS = [
     ('%s://127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
      '%s://127.0.0.1' % proto),
-    ('%s://marcink@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
+    ('%s://username@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
      '%s://127.0.0.1' % proto),
-    ('%s://marcink:pass@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
+    ('%s://username:pass@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
      '%s://127.0.0.1' % proto),
     ('%s://127.0.0.1:8080' % proto, ['%s://' % proto, '127.0.0.1', '8080'],
      '%s://127.0.0.1:8080' % proto),
@@ -54,9 +53,9 @@
 TEST_URLS += [
     ('%s://127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
      '%s://127.0.0.1' % proto),
-    ('%s://marcink@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
+    ('%s://username@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
      '%s://127.0.0.1' % proto),
-    ('%s://marcink:pass@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
+    ('%s://username:pass@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
      '%s://127.0.0.1' % proto),
     ('%s://127.0.0.1:8080' % proto, ['%s://' % proto, '127.0.0.1', '8080'],
      '%s://127.0.0.1:8080' % proto),
@@ -105,16 +104,16 @@
     def test_mention_extractor(self):
         from kallithea.lib.utils2 import extract_mentioned_users
         sample = (
-            "@first hi there @marcink here's my email marcin@email.com "
+            "@first hi there @world here's my email username@email.com "
             "@lukaszb check @one_more22 it pls @ ttwelve @D[] @one@two@three "
-            "@MARCIN    @maRCiN @2one_more22 @john please see this http://org.pl "
+            "@UPPER    @cAmEL @2one_more22 @john please see this http://org.pl "
             "@marian.user just do it @marco-polo and next extract @marco_polo "
             "user.dot  hej ! not-needed maril@domain.org"
         )
 
         s = sorted([
-            '2one_more22', 'first', 'marcink', 'lukaszb', 'one', 'one_more22', 'MARCIN', 'maRCiN', 'john',
-            'marian.user', 'marco-polo', 'marco_polo'], key=lambda k: k.lower())
+            '2one_more22', 'first', 'lukaszb', 'one', 'one_more22', 'UPPER', 'cAmEL', 'john',
+            'marian.user', 'marco-polo', 'marco_polo', 'world'], key=lambda k: k.lower())
         self.assertEqual(s, extract_mentioned_users(sample))
 
     @parameterized.expand([
@@ -189,14 +188,14 @@
             "[requires => url] [lang => python] [just a tag]"
             "[,d] [ => ULR ] [obsolete] [desc]]"
         )
-        from kallithea.lib.helpers import desc_stylize
-        res = desc_stylize(sample)
-        self.assertTrue('<div class="metatag" tag="tag">tag</div>' in res)
-        self.assertTrue('<div class="metatag" tag="obsolete">obsolete</div>' in res)
-        self.assertTrue('<div class="metatag" tag="stale">stale</div>' in res)
-        self.assertTrue('<div class="metatag" tag="lang">python</div>' in res)
-        self.assertTrue('<div class="metatag" tag="requires">requires =&gt; <a href="/url">url</a></div>' in res)
-        self.assertTrue('<div class="metatag" tag="tag">tag</div>' in res)
+        from kallithea.lib.helpers import urlify_text
+        res = urlify_text(sample, stylize=True)
+        self.assertIn('<div class="metatag" tag="tag">tag</div>', res)
+        self.assertIn('<div class="metatag" tag="obsolete">obsolete</div>', res)
+        self.assertIn('<div class="metatag" tag="stale">stale</div>', res)
+        self.assertIn('<div class="metatag" tag="lang">python</div>', res)
+        self.assertIn('<div class="metatag" tag="requires">requires =&gt; <a href="/url">url</a></div>', res)
+        self.assertIn('<div class="metatag" tag="tag">tag</div>', res)
 
     def test_alternative_gravatar(self):
         from kallithea.lib.helpers import gravatar_url
@@ -251,23 +250,23 @@
 
     @parameterized.expand([
         (Repository.DEFAULT_CLONE_URI, 'group/repo1', {}, '', 'http://vps1:8000/group/repo1'),
-        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'marcink'}, '', 'http://marcink@vps1:8000/group/repo1'),
-        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {}, '/rc', 'http://vps1:8000/rc/group/repo1'),
-        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'user'}, '/rc', 'http://user@vps1:8000/rc/group/repo1'),
-        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'marcink'}, '/rc', 'http://marcink@vps1:8000/rc/group/repo1'),
-        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'user'}, '/rc/', 'http://user@vps1:8000/rc/group/repo1'),
-        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'marcink'}, '/rc/', 'http://marcink@vps1:8000/rc/group/repo1'),
+        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'username'}, '', 'http://username@vps1:8000/group/repo1'),
+        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {}, '/prefix', 'http://vps1:8000/prefix/group/repo1'),
+        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'user'}, '/prefix', 'http://user@vps1:8000/prefix/group/repo1'),
+        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'username'}, '/prefix', 'http://username@vps1:8000/prefix/group/repo1'),
+        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'user'}, '/prefix/', 'http://user@vps1:8000/prefix/group/repo1'),
+        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'username'}, '/prefix/', 'http://username@vps1:8000/prefix/group/repo1'),
         ('{scheme}://{user}@{netloc}/_{repoid}', 'group/repo1', {}, '', 'http://vps1:8000/_23'),
-        ('{scheme}://{user}@{netloc}/_{repoid}', 'group/repo1', {'user': 'marcink'}, '', 'http://marcink@vps1:8000/_23'),
-        ('http://{user}@{netloc}/_{repoid}', 'group/repo1', {'user': 'marcink'}, '', 'http://marcink@vps1:8000/_23'),
-        ('http://{netloc}/_{repoid}', 'group/repo1', {'user': 'marcink'}, '', 'http://vps1:8000/_23'),
-        ('https://{user}@proxy1.server.com/{repo}', 'group/repo1', {'user': 'marcink'}, '', 'https://marcink@proxy1.server.com/group/repo1'),
+        ('{scheme}://{user}@{netloc}/_{repoid}', 'group/repo1', {'user': 'username'}, '', 'http://username@vps1:8000/_23'),
+        ('http://{user}@{netloc}/_{repoid}', 'group/repo1', {'user': 'username'}, '', 'http://username@vps1:8000/_23'),
+        ('http://{netloc}/_{repoid}', 'group/repo1', {'user': 'username'}, '', 'http://vps1:8000/_23'),
+        ('https://{user}@proxy1.server.com/{repo}', 'group/repo1', {'user': 'username'}, '', 'https://username@proxy1.server.com/group/repo1'),
         ('https://{user}@proxy1.server.com/{repo}', 'group/repo1', {}, '', 'https://proxy1.server.com/group/repo1'),
-        ('https://proxy1.server.com/{user}/{repo}', 'group/repo1', {'user': 'marcink'}, '', 'https://proxy1.server.com/marcink/group/repo1'),
+        ('https://proxy1.server.com/{user}/{repo}', 'group/repo1', {'user': 'username'}, '', 'https://proxy1.server.com/username/group/repo1'),
     ])
     def test_clone_url_generator(self, tmpl, repo_name, overrides, prefix, expected):
         from kallithea.lib.utils2 import get_clone_url
-        clone_url = get_clone_url(uri_tmpl=tmpl, qualifed_home_url='http://vps1:8000'+prefix,
+        clone_url = get_clone_url(uri_tmpl=tmpl, qualified_home_url='http://vps1:8000'+prefix,
                                   repo_name=repo_name, repo_id=23, **overrides)
         self.assertEqual(clone_url, expected)
 
@@ -366,7 +365,7 @@
       ("/_21/foobar", '21'),
       ("_21/121", '21'),
       ("/_21/_12", '21'),
-      ("_21/rc/foo", '21'),
+      ("_21/prefix/foo", '21'),
     ])
     def test_get_repo_by_id(self, test, expected):
         from kallithea.lib.utils import _extract_id_from_repo_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/other/test_mail.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,167 @@
+import mock
+
+import kallithea
+from kallithea.tests import *
+from kallithea.model.db import User
+
+class smtplib_mock(object):
+
+    @classmethod
+    def SMTP(cls, server, port, local_hostname):
+        return smtplib_mock()
+
+    def ehlo(self):
+        pass
+    def quit(self):
+        pass
+    def sendmail(self, sender, dest, msg):
+        smtplib_mock.lastsender = sender
+        smtplib_mock.lastdest = dest
+        smtplib_mock.lastmsg = msg
+        pass
+
+@mock.patch('kallithea.lib.rcmail.smtp_mailer.smtplib', smtplib_mock)
+class TestMail(BaseTestCase):
+
+    def test_send_mail_trivial(self):
+        mailserver = 'smtp.mailserver.org'
+        recipients = ['rcpt1', 'rcpt2']
+        envelope_from = 'noreply@mailserver.org'
+        subject = 'subject'
+        body = 'body'
+        html_body = 'html_body'
+
+        config_mock = {
+            'smtp_server': mailserver,
+            'app_email_from': envelope_from,
+        }
+        with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
+            kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body)
+
+        self.assertSetEqual(smtplib_mock.lastdest, set(recipients))
+        self.assertEqual(smtplib_mock.lastsender, envelope_from)
+        self.assertIn('From: %s' % envelope_from, smtplib_mock.lastmsg)
+        self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
+        self.assertIn(body, smtplib_mock.lastmsg)
+        self.assertIn(html_body, smtplib_mock.lastmsg)
+
+    def test_send_mail_no_recipients(self):
+        mailserver = 'smtp.mailserver.org'
+        recipients = []
+        envelope_from = 'noreply@mailserver.org'
+        email_to = 'admin@mailserver.org'
+        subject = 'subject'
+        body = 'body'
+        html_body = 'html_body'
+
+        config_mock = {
+            'smtp_server': mailserver,
+            'app_email_from': envelope_from,
+            'email_to': email_to,
+        }
+        with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
+            kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body)
+
+        self.assertSetEqual(smtplib_mock.lastdest, set([TEST_USER_ADMIN_EMAIL, email_to]))
+        self.assertEqual(smtplib_mock.lastsender, envelope_from)
+        self.assertIn('From: %s' % envelope_from, smtplib_mock.lastmsg)
+        self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
+        self.assertIn(body, smtplib_mock.lastmsg)
+        self.assertIn(html_body, smtplib_mock.lastmsg)
+
+    def test_send_mail_no_recipients_no_email_to(self):
+        mailserver = 'smtp.mailserver.org'
+        recipients = []
+        envelope_from = 'noreply@mailserver.org'
+        subject = 'subject'
+        body = 'body'
+        html_body = 'html_body'
+
+        config_mock = {
+            'smtp_server': mailserver,
+            'app_email_from': envelope_from,
+        }
+        with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
+            kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body)
+
+        self.assertSetEqual(smtplib_mock.lastdest, set([TEST_USER_ADMIN_EMAIL]))
+        self.assertEqual(smtplib_mock.lastsender, envelope_from)
+        self.assertIn('From: %s' % envelope_from, smtplib_mock.lastmsg)
+        self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
+        self.assertIn(body, smtplib_mock.lastmsg)
+        self.assertIn(html_body, smtplib_mock.lastmsg)
+
+    def test_send_mail_with_author(self):
+        mailserver = 'smtp.mailserver.org'
+        recipients = ['rcpt1', 'rcpt2']
+        envelope_from = 'noreply@mailserver.org'
+        subject = 'subject'
+        body = 'body'
+        html_body = 'html_body'
+        author = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+
+        config_mock = {
+            'smtp_server': mailserver,
+            'app_email_from': envelope_from,
+        }
+        with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
+            kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body, author=author)
+
+        self.assertSetEqual(smtplib_mock.lastdest, set(recipients))
+        self.assertEqual(smtplib_mock.lastsender, envelope_from)
+        self.assertIn('From: "Kallithea Admin (no-reply)" <%s>' % envelope_from, smtplib_mock.lastmsg)
+        self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
+        self.assertIn(body, smtplib_mock.lastmsg)
+        self.assertIn(html_body, smtplib_mock.lastmsg)
+
+    def test_send_mail_with_author_full_mail_from(self):
+        mailserver = 'smtp.mailserver.org'
+        recipients = ['rcpt1', 'rcpt2']
+        envelope_addr = 'noreply@mailserver.org'
+        envelope_from = 'Some Name <%s>' % envelope_addr
+        subject = 'subject'
+        body = 'body'
+        html_body = 'html_body'
+        author = User.get_by_username(TEST_USER_REGULAR_LOGIN)
+
+        config_mock = {
+            'smtp_server': mailserver,
+            'app_email_from': envelope_from,
+        }
+        with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
+            kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body, author=author)
+
+        self.assertSetEqual(smtplib_mock.lastdest, set(recipients))
+        self.assertEqual(smtplib_mock.lastsender, envelope_from)
+        self.assertIn('From: "Kallithea Admin (no-reply)" <%s>' % envelope_addr, smtplib_mock.lastmsg)
+        self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
+        self.assertIn(body, smtplib_mock.lastmsg)
+        self.assertIn(html_body, smtplib_mock.lastmsg)
+
+    def test_send_mail_extra_headers(self):
+        mailserver = 'smtp.mailserver.org'
+        recipients = ['rcpt1', 'rcpt2']
+        envelope_from = 'noreply@mailserver.org'
+        subject = 'subject'
+        body = 'body'
+        html_body = 'html_body'
+        author = User(name='foo', lastname='(fubar) "baz"')
+        headers = {'extra': 'yes'}
+
+        config_mock = {
+            'smtp_server': mailserver,
+            'app_email_from': envelope_from,
+        }
+        with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
+            kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body,
+                                                     author=author, headers=headers)
+
+        self.assertSetEqual(smtplib_mock.lastdest, set(recipients))
+        self.assertEqual(smtplib_mock.lastsender, envelope_from)
+        self.assertIn(r'From: "foo (fubar) \"baz\" (no-reply)" <%s>' % envelope_from, smtplib_mock.lastmsg)
+        self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
+        self.assertIn(body, smtplib_mock.lastmsg)
+        self.assertIn(html_body, smtplib_mock.lastmsg)
+        self.assertIn('Extra: yes', smtplib_mock.lastmsg)
+        # verify that headers dict hasn't mutated by send_email
+        self.assertDictEqual(headers, {'extra': 'yes'})
--- a/kallithea/tests/other/test_validators.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/other/test_validators.py	Sun Sep 06 23:36:05 2015 +0200
@@ -8,8 +8,6 @@
 
 from kallithea.model.meta import Session
 from kallithea.model.repo_group import RepoGroupModel
-from kallithea.model.db import ChangesetStatus, Repository
-from kallithea.model.changeset_status import ChangesetStatusModel
 from kallithea.tests.fixture import Fixture
 
 fixture = Fixture()
@@ -100,9 +98,9 @@
         self.assertRaises(formencode.Invalid, validator.to_python, 'ąćżź')
 
     def test_ValidPasswordsMatch(self):
-        validator = v.ValidPasswordsMatch()
+        validator = v.ValidPasswordsMatch('new_password', 'password_confirmation')
         self.assertRaises(formencode.Invalid,
-                    validator.to_python, {'password': 'pass',
+                    validator.to_python, {'new_password': 'pass',
                                           'password_confirmation': 'pass2'})
 
         self.assertRaises(formencode.Invalid,
@@ -114,9 +112,9 @@
                     validator.to_python({'new_password': 'pass',
                                          'password_confirmation': 'pass'}))
 
-        self.assertEqual({'password': 'pass',
+        self.assertEqual({'new_password': 'pass',
                           'password_confirmation': 'pass'},
-                    validator.to_python({'password': 'pass',
+                    validator.to_python({'new_password': 'pass',
                                          'password_confirmation': 'pass'}))
 
     def test_ValidAuth(self):
@@ -231,23 +229,3 @@
     def test_AttrLoginValidator(self):
         validator = v.AttrLoginValidator()
         self.assertEqual('DN_attr', validator.to_python('DN_attr'))
-
-    def test_NotReviewedRevisions(self):
-        repo_id = Repository.get_by_repo_name(HG_REPO).repo_id
-        validator = v.NotReviewedRevisions(repo_id)
-        rev = '0' * 40
-        # add status for a rev, that should throw an error because it is already
-        # reviewed
-        new_status = ChangesetStatus()
-        new_status.author = ChangesetStatusModel()._get_user(TEST_USER_ADMIN_LOGIN)
-        new_status.repo = ChangesetStatusModel()._get_repo(HG_REPO)
-        new_status.status = ChangesetStatus.STATUS_APPROVED
-        new_status.comment = None
-        new_status.revision = rev
-        Session().add(new_status)
-        Session().commit()
-        try:
-            self.assertRaises(formencode.Invalid, validator.to_python, [rev])
-        finally:
-            Session().delete(new_status)
-            Session().commit()
--- a/kallithea/tests/other/test_vcs_operations.py	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,533 +0,0 @@
-# -*- coding: utf-8 -*-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-kallithea.tests.test_scm_operations
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Test suite for making push/pull operations.
-Run using after doing paster serve test.ini::
- KALLITHEA_WHOOSH_TEST_DISABLE=1 KALLITHEA_NO_TMP_PATH=1 nosetests kallithea/tests/other/test_vcs_operations.py
-
-You must have git > 1.8.1 for tests to work fine
-
-This file was forked by the Kallithea project in July 2014.
-Original author and date, and relevant copyright and licensing information is below:
-:created_on: Dec 30, 2010
-:author: marcink
-:copyright: (c) 2013 RhodeCode GmbH, and others.
-:license: GPLv3, see LICENSE.md for more details.
-
-"""
-
-import tempfile
-import time
-from os.path import join as jn
-
-from tempfile import _RandomNameSequence
-from subprocess import Popen, PIPE
-
-from kallithea.tests import *
-from kallithea.model.db import User, Repository, UserIpMap, CacheInvalidation
-from kallithea.model.meta import Session
-from kallithea.model.repo import RepoModel
-from kallithea.model.user import UserModel
-
-DEBUG = True
-HOST = '127.0.0.1:5000'  # test host
-
-
-class Command(object):
-
-    def __init__(self, cwd):
-        self.cwd = cwd
-
-    def execute(self, cmd, *args):
-        """
-        Runs command on the system with given ``args``.
-        """
-
-        command = cmd + ' ' + ' '.join(args)
-        if DEBUG:
-            print '*** CMD %s ***' % command
-        p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
-        stdout, stderr = p.communicate()
-        if DEBUG:
-            print stdout, stderr
-        return stdout, stderr
-
-
-def _get_tmp_dir():
-    return tempfile.mkdtemp(prefix='rc_integration_test')
-
-
-def _construct_url(repo, dest=None, **kwargs):
-    if dest is None:
-        #make temp clone
-        dest = _get_tmp_dir()
-    params = {
-        'user': TEST_USER_ADMIN_LOGIN,
-        'passwd': TEST_USER_ADMIN_PASS,
-        'host': HOST,
-        'cloned_repo': repo,
-        'dest': dest
-    }
-    params.update(**kwargs)
-    if params['user'] and params['passwd']:
-        _url = 'http://%(user)s:%(passwd)s@%(host)s/%(cloned_repo)s %(dest)s' % params
-    else:
-        _url = 'http://(host)s/%(cloned_repo)s %(dest)s' % params
-    return _url
-
-
-def _add_files_and_push(vcs, DEST, **kwargs):
-    """
-    Generate some files, add it to DEST repo and push back
-    vcs is git or hg and defines what VCS we want to make those files for
-
-    :param vcs:
-    :param DEST:
-    """
-    # commit some stuff into this repo
-    cwd = path = jn(DEST)
-    #added_file = jn(path, '%ssetupążźć.py' % _RandomNameSequence().next())
-    added_file = jn(path, '%ssetup.py' % _RandomNameSequence().next())
-    Command(cwd).execute('touch %s' % added_file)
-    Command(cwd).execute('%s add %s' % (vcs, added_file))
-
-    for i in xrange(kwargs.get('files_no', 3)):
-        cmd = """echo 'added_line%s' >> %s""" % (i, added_file)
-        Command(cwd).execute(cmd)
-        author_str = 'Marcin Kuźminski <me@email.com>'
-        if vcs == 'hg':
-            cmd = """hg commit -m 'commited new %s' -u '%s' %s """ % (
-                i, author_str, added_file
-            )
-        elif vcs == 'git':
-            cmd = """EMAIL="me@email.com" git commit -m 'commited new %s' --author '%s' %s """ % (
-                i, author_str, added_file
-            )
-        Command(cwd).execute(cmd)
-
-    # PUSH it back
-    _REPO = None
-    if vcs == 'hg':
-        _REPO = HG_REPO
-    elif vcs == 'git':
-        _REPO = GIT_REPO
-
-    kwargs['dest'] = ''
-    clone_url = _construct_url(_REPO, **kwargs)
-    if 'clone_url' in kwargs:
-        clone_url = kwargs['clone_url']
-    stdout = stderr = None
-    if vcs == 'hg':
-        stdout, stderr = Command(cwd).execute('hg push --verbose', clone_url)
-    elif vcs == 'git':
-        stdout, stderr = Command(cwd).execute('git push --verbose', clone_url + " master")
-
-    return stdout, stderr
-
-
-def set_anonymous_access(enable=True):
-    user = User.get_by_username(User.DEFAULT_USER)
-    user.active = enable
-    Session().add(user)
-    Session().commit()
-    print '\tanonymous access is now:', enable
-    if enable != User.get_by_username(User.DEFAULT_USER).active:
-        raise Exception('Cannot set anonymous access')
-
-
-#==============================================================================
-# TESTS
-#==============================================================================
-
-
-def _check_proper_git_push(stdout, stderr):
-    #WTF Git stderr is output ?!
-    assert 'fatal' not in stderr
-    assert 'rejected' not in stderr
-    assert 'Pushing to' in stderr
-    assert 'master -> master' in stderr
-
-
-class TestVCSOperations(BaseTestCase):
-
-    @classmethod
-    def setup_class(cls):
-        #DISABLE ANONYMOUS ACCESS
-        set_anonymous_access(False)
-
-    def setUp(self):
-        r = Repository.get_by_repo_name(GIT_REPO)
-        Repository.unlock(r)
-        r.enable_locking = False
-        Session().add(r)
-        Session().commit()
-
-        r = Repository.get_by_repo_name(HG_REPO)
-        Repository.unlock(r)
-        r.enable_locking = False
-        Session().add(r)
-        Session().commit()
-
-    def test_clone_hg_repo_by_admin(self):
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        assert 'requesting all changes' in stdout
-        assert 'adding changesets' in stdout
-        assert 'adding manifests' in stdout
-        assert 'adding file changes' in stdout
-
-        assert stderr == ''
-
-    def test_clone_git_repo_by_admin(self):
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        assert 'Cloning into' in stdout
-        assert stderr == ''
-
-    def test_clone_wrong_credentials_hg(self):
-        clone_url = _construct_url(HG_REPO, passwd='bad!')
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        assert 'abort: authorization failed' in stderr
-
-    def test_clone_wrong_credentials_git(self):
-        clone_url = _construct_url(GIT_REPO, passwd='bad!')
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        assert 'fatal: Authentication failed' in stderr
-
-    def test_clone_git_dir_as_hg(self):
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        assert 'HTTP Error 404: Not Found' in stderr
-
-    def test_clone_hg_repo_as_git(self):
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        assert 'not found' in stderr
-
-    def test_clone_non_existing_path_hg(self):
-        clone_url = _construct_url('trololo')
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        assert 'HTTP Error 404: Not Found' in stderr
-
-    def test_clone_non_existing_path_git(self):
-        clone_url = _construct_url('trololo')
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        assert 'not found' in stderr
-
-    def test_push_new_file_hg(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST)
-
-        assert 'pushing to' in stdout
-        assert 'Repository size' in stdout
-        assert 'Last revision is now' in stdout
-
-    def test_push_new_file_git(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        # commit some stuff into this repo
-        stdout, stderr = _add_files_and_push('git', DEST)
-
-        print [(x.repo_full_path,x.repo_path) for x in Repository.get_all()]
-        _check_proper_git_push(stdout, stderr)
-
-    def test_push_invalidates_cache_hg(self):
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==HG_REPO).scalar()
-        if not key:
-            key = CacheInvalidation(HG_REPO, HG_REPO)
-
-        key.cache_active = True
-        Session().add(key)
-        Session().commit()
-
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST, files_no=1)
-
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==HG_REPO).one()
-        self.assertEqual(key.cache_active, False)
-
-    def test_push_invalidates_cache_git(self):
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==GIT_REPO).scalar()
-        if not key:
-            key = CacheInvalidation(GIT_REPO, GIT_REPO)
-
-        key.cache_active = True
-        Session().add(key)
-        Session().commit()
-
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        # commit some stuff into this repo
-        stdout, stderr = _add_files_and_push('git', DEST, files_no=1)
-        _check_proper_git_push(stdout, stderr)
-
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==GIT_REPO).one()
-        print CacheInvalidation.get_all()
-        self.assertEqual(key.cache_active, False)
-
-    def test_push_wrong_credentials_hg(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST, user='bad',
-                                             passwd='name')
-
-        assert 'abort: authorization failed' in stderr
-
-    def test_push_wrong_credentials_git(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('git', DEST, user='bad',
-                                             passwd='name')
-
-        assert 'fatal: Authentication failed' in stderr
-
-    def test_push_back_to_wrong_url_hg(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST,
-                                    clone_url='http://127.0.0.1:5000/tmp',)
-
-        assert 'HTTP Error 404: Not Found' in stderr
-
-    def test_push_back_to_wrong_url_git(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('git', DEST,
-                                    clone_url='http://127.0.0.1:5000/tmp',)
-
-        assert 'not found' in stderr
-
-    def test_clone_and_create_lock_hg(self):
-        # enable locking
-        r = Repository.get_by_repo_name(HG_REPO)
-        r.enable_locking = True
-        Session().add(r)
-        Session().commit()
-        # clone
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        #check if lock was made
-        r = Repository.get_by_repo_name(HG_REPO)
-        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-
-    def test_clone_and_create_lock_git(self):
-        # enable locking
-        r = Repository.get_by_repo_name(GIT_REPO)
-        r.enable_locking = True
-        Session().add(r)
-        Session().commit()
-        # clone
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        #check if lock was made
-        r = Repository.get_by_repo_name(GIT_REPO)
-        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-
-    def test_clone_after_repo_was_locked_hg(self):
-        #lock repo
-        r = Repository.get_by_repo_name(HG_REPO)
-        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-        #pull fails since repo is locked
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
-                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
-        assert msg in stderr
-
-    def test_clone_after_repo_was_locked_git(self):
-        #lock repo
-        r = Repository.get_by_repo_name(GIT_REPO)
-        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-        #pull fails since repo is locked
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        msg = ("""The requested URL returned error: 423""")
-        assert msg in stderr
-
-    def test_push_on_locked_repo_by_other_user_hg(self):
-        #clone some temp
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        #lock repo
-        r = Repository.get_by_repo_name(HG_REPO)
-        # let this user actually push !
-        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
-                                          perm='repository.write')
-        Session().commit()
-        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-
-        #push fails repo is locked by other user !
-        stdout, stderr = _add_files_and_push('hg', DEST,
-                                             user=TEST_USER_REGULAR_LOGIN,
-                                             passwd=TEST_USER_REGULAR_PASS)
-        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
-                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
-        assert msg in stderr
-
-    def test_push_on_locked_repo_by_other_user_git(self):
-        #clone some temp
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        #lock repo
-        r = Repository.get_by_repo_name(GIT_REPO)
-        # let this user actually push !
-        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
-                                          perm='repository.write')
-        Session().commit()
-        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-
-        #push fails repo is locked by other user !
-        stdout, stderr = _add_files_and_push('git', DEST,
-                                             user=TEST_USER_REGULAR_LOGIN,
-                                             passwd=TEST_USER_REGULAR_PASS)
-        err = 'Repository `%s` locked by user `%s`' % (GIT_REPO, TEST_USER_ADMIN_LOGIN)
-        assert err in stderr
-
-        #TODO: fix this somehow later on Git, Git is stupid and even if we throw
-        #back 423 to it, it makes ANOTHER request and we fail there with 405 :/
-
-        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
-                % (GIT_REPO, TEST_USER_ADMIN_LOGIN))
-        #msg = "405 Method Not Allowed"
-        #assert msg in stderr
-
-    def test_push_unlocks_repository_hg(self):
-        # enable locking
-        r = Repository.get_by_repo_name(HG_REPO)
-        r.enable_locking = True
-        Session().add(r)
-        Session().commit()
-        #clone some temp
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        #check for lock repo after clone
-        r = Repository.get_by_repo_name(HG_REPO)
-        uid = User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-        assert r.locked[0] == uid
-
-        #push is ok and repo is now unlocked
-        stdout, stderr = _add_files_and_push('hg', DEST)
-        assert ('remote: Released lock on repo `%s`' % HG_REPO) in stdout
-        #we need to cleanup the Session Here !
-        Session.remove()
-        r = Repository.get_by_repo_name(HG_REPO)
-        assert r.locked == [None, None]
-
-    #TODO: fix me ! somehow during tests hooks don't get called on Git
-    def test_push_unlocks_repository_git(self):
-        # enable locking
-        r = Repository.get_by_repo_name(GIT_REPO)
-        r.enable_locking = True
-        Session().add(r)
-        Session().commit()
-        #clone some temp
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        #check for lock repo after clone
-        r = Repository.get_by_repo_name(GIT_REPO)
-        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-
-        #push is ok and repo is now unlocked
-        stdout, stderr = _add_files_and_push('git', DEST)
-        _check_proper_git_push(stdout, stderr)
-
-        #assert ('remote: Released lock on repo `%s`' % GIT_REPO) in stdout
-        #we need to cleanup the Session Here !
-        Session.remove()
-        r = Repository.get_by_repo_name(GIT_REPO)
-        assert r.locked == [None, None]
-
-    def test_ip_restriction_hg(self):
-        user_model = UserModel()
-        try:
-            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
-            Session().commit()
-            clone_url = _construct_url(HG_REPO)
-            stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-            assert 'abort: HTTP Error 403: Forbidden' in stderr
-        finally:
-            #release IP restrictions
-            for ip in UserIpMap.getAll():
-                UserIpMap.delete(ip.ip_id)
-            Session().commit()
-
-        time.sleep(2)
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        assert 'requesting all changes' in stdout
-        assert 'adding changesets' in stdout
-        assert 'adding manifests' in stdout
-        assert 'adding file changes' in stdout
-
-        assert stderr == ''
-
-    def test_ip_restriction_git(self):
-        user_model = UserModel()
-        try:
-            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
-            Session().commit()
-            clone_url = _construct_url(GIT_REPO)
-            stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-            msg = ("""The requested URL returned error: 403""")
-            assert msg in stderr
-        finally:
-            #release IP restrictions
-            for ip in UserIpMap.getAll():
-                UserIpMap.delete(ip.ip_id)
-            Session().commit()
-
-        time.sleep(2)
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        assert 'Cloning into' in stdout
-        assert stderr == ''
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/parameterized.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,241 @@
+import re
+import new
+import inspect
+import logging
+import logging.handlers
+from functools import wraps
+
+from unittest import TestCase
+
+
+def skip_test(func):
+    try:
+        from nose.tools import nottest
+    except ImportError:
+        pass
+    else:
+        func = nottest(func)
+
+    try:
+        import pytest
+    except ImportError:
+        pass
+    else:
+        func = pytest.mark.skipIf(True, func)
+
+    return func
+
+
+def _terrible_magic_get_defining_classes():
+    """ Returns the set of parent classes of the class currently being defined.
+        Will likely only work if called from the ``parameterized`` decorator.
+        This function is entirely @brandon_rhodes's fault, as he suggested
+        the implementation: http://stackoverflow.com/a/8793684/71522
+        """
+    stack = inspect.stack()
+    if len(stack) <= 4:
+        return []
+    frame = stack[3]
+    code_context = frame[4][0].strip()
+    if not code_context.startswith("class "):
+        return []
+    _, parents = code_context.split("(", 1)
+    parents, _ = parents.rsplit(")", 1)
+    return eval("[" + parents + "]", frame[0].f_globals, frame[0].f_locals)
+
+
+def parameterized(input):
+    """ Parameterize a test case:
+        >>> add1_tests = [(1, 2), (2, 3)]
+        >>> class TestFoo(object):
+        ...     @parameterized(add1_tests)
+        ...     def test_add1(self, input, expected):
+        ...         assert_equal(add1(input), expected)
+        >>> @parameterized(add1_tests)
+        ... def test_add1(input, expected):
+        ...     assert_equal(add1(input), expected)
+        >>>
+        """
+
+    if not hasattr(input, "__iter__"):
+        raise ValueError("expected iterable input; got %r" % (input,))
+
+    def parameterized_helper(f):
+        attached_instance_method = [False]
+
+        parent_classes = _terrible_magic_get_defining_classes()
+        if any(issubclass(cls, TestCase) for cls in parent_classes):
+            raise Exception("Warning: '@parameterized' tests won't work "
+                            "inside subclasses of 'TestCase' - use "
+                            "'@parameterized.expand' instead")
+
+        @wraps(f)
+        def parameterized_helper_method(self=None):
+            if self is not None and not attached_instance_method[0]:
+                # confusingly, we need to create a named instance method and
+                # attach that to the class...
+                cls = self.__class__
+                im_f = new.instancemethod(f, None, cls)
+                setattr(cls, f.__name__, im_f)
+                attached_instance_method[0] = True
+            for args in input:
+                if isinstance(args, basestring):
+                    args = [args]
+                # ... then pull that named instance method off, turning it into
+                # a bound method ...
+                if self is not None:
+                    args = [getattr(self, f.__name__)] + list(args)
+                else:
+                    args = [f] + list(args)
+                # ... then yield that as a tuple. If those steps aren't
+                # followed precicely, Nose gets upset and doesn't run the test
+                # or doesn't run setup methods.
+                yield tuple(args)
+
+        f.__name__ = "_helper_for_%s" % (f.__name__,)
+        parameterized_helper_method.parameterized_input = input
+        parameterized_helper_method.parameterized_func = f
+        return parameterized_helper_method
+
+    return parameterized_helper
+
+
+def to_safe_name(s):
+    return re.sub("[^a-zA-Z0-9_]", "", s)
+
+
+def parameterized_expand_helper(func_name, func, args):
+    def parameterized_expand_helper_helper(self=()):
+        if self != ():
+            self = (self,)
+        return func(*(self + args))
+    parameterized_expand_helper_helper.__name__ = str(func_name)
+    return parameterized_expand_helper_helper
+
+
+def parameterized_expand(input):
+    """ A "brute force" method of parameterizing test cases. Creates new test
+        cases and injects them into the namespace that the wrapped function
+        is being defined in. Useful for parameterizing tests in subclasses
+        of 'UnitTest', where Nose test generators don't work.
+
+        >>> @parameterized.expand([("foo", 1, 2)])
+        ... def test_add1(name, input, expected):
+        ...     actual = add1(input)
+        ...     assert_equal(actual, expected)
+        ...
+        >>> locals()
+        ... 'test_add1_foo_0': <function ...> ...
+        >>>
+        """
+
+    def parameterized_expand_wrapper(f):
+        stack = inspect.stack()
+        frame = stack[1]
+        frame_locals = frame[0].f_locals
+
+        base_name = f.__name__
+        for num, args in enumerate(input):
+            name_suffix = "_%s" % (num,)
+            if len(args) > 0 and isinstance(args[0], basestring):
+                name_suffix += "_" + to_safe_name(args[0])
+            name = base_name + name_suffix
+            new_func = parameterized_expand_helper(name, f, args)
+            frame_locals[name] = new_func
+        return skip_test(f)
+    return parameterized_expand_wrapper
+
+parameterized.expand = parameterized_expand
+
+
+def assert_contains(haystack, needle):
+    if needle not in haystack:
+        raise AssertionError("%r not in %r" % (needle, haystack))
+
+
+def assert_not_contains(haystack, needle):
+    if needle in haystack:
+        raise AssertionError("%r in %r" % (needle, haystack))
+
+
+def assert_raises(func, exc_type, str_contains=None, repr_contains=None):
+    try:
+        func()
+    except exc_type as e:
+        if str_contains is not None and str_contains not in str(e):
+            raise AssertionError("%s raised, but %r does not contain %r"
+                                 % (exc_type, str(e), str_contains))
+        if repr_contains is not None and repr_contains not in repr(e):
+            raise AssertionError("%s raised, but %r does not contain %r"
+                                 % (exc_type, repr(e), repr_contains))
+        return e
+    else:
+        raise AssertionError("%s not raised" % (exc_type,))
+
+
+log_handler = None
+
+
+def setup_logging():
+    """ Configures a log handler which will capure log messages during a test.
+        The ``logged_messages`` and ``assert_no_errors_logged`` functions can be
+        used to make assertions about these logged messages.
+
+        For example::
+
+            from ensi_common.testing import (
+                setup_logging, teardown_logging, assert_no_errors_logged,
+                assert_logged,
+            )
+
+            class TestWidget(object):
+                def setup(self):
+                    setup_logging()
+
+                def teardown(self):
+                    assert_no_errors_logged()
+                    teardown_logging()
+
+                def test_that_will_fail(self):
+                    log.warning("this warning message will trigger a failure")
+
+                def test_that_will_pass(self):
+                    log.info("but info messages are ok")
+                    assert_logged("info messages are ok")
+        """
+
+    global log_handler
+    if log_handler is not None:
+        logging.getLogger().removeHandler(log_handler)
+    log_handler = logging.handlers.BufferingHandler(1000)
+    formatter = logging.Formatter("%(name)s: %(levelname)s: %(message)s")
+    log_handler.setFormatter(formatter)
+    logging.getLogger().addHandler(log_handler)
+
+
+def teardown_logging():
+    global log_handler
+    if log_handler is not None:
+        logging.getLogger().removeHandler(log_handler)
+        log_handler = None
+
+
+def logged_messages():
+    assert log_handler, "setup_logging not called"
+    return [(log_handler.format(record), record) for record in log_handler.buffer]
+
+
+def assert_no_errors_logged():
+    for _, record in logged_messages():
+        if record.levelno >= logging.WARNING:
+            # Assume that the nose log capture plugin is being used, so it will
+            # show the exception.
+            raise AssertionError("an unexpected error was logged")
+
+
+def assert_logged(expected_msg_contents):
+    for msg, _ in logged_messages():
+        if expected_msg_contents in msg:
+            return
+    raise AssertionError("no logged message contains %r"
+                         % (expected_msg_contents,))
--- a/kallithea/tests/scripts/create_rc.sh	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/scripts/create_rc.sh	Sun Sep 06 23:36:05 2015 +0200
@@ -1,10 +1,10 @@
 #!/bin/sh
 psql -U postgres -h localhost -c 'drop database if exists kallithea;'
 psql -U postgres -h localhost -c 'create database kallithea;'
-paster setup-db rc.ini --force-yes --user=username --password=qweqwe --email=username@example.com --repos=/home/username/repos --no-public-access
+paster setup-db server.ini --force-yes --user=username --password=qweqwe --email=username@example.com --repos=/home/username/repos --no-public-access
 API_KEY=`psql -R " " -A -U postgres -h localhost -c "select api_key from users where admin=TRUE" -d kallithea | awk '{print $2}'`
 echo "run those after running server"
-paster serve rc.ini --pid-file=rc.pid --daemon
+paster serve server.ini --pid-file=server.pid --daemon
 sleep 3
 kallithea-api --apikey=$API_KEY --apihost=http://127.0.0.1:5001 create_user username:demo1 password:qweqwe email:demo1@example.com
 kallithea-api --apikey=$API_KEY --apihost=http://127.0.0.1:5001 create_user username:demo2 password:qweqwe email:demo2@example.com
@@ -13,5 +13,5 @@
 kallithea-api --apikey=$API_KEY --apihost=http://127.0.0.1:5001 add_user_to_user_group usergroupid:demo12 userid:demo1
 kallithea-api --apikey=$API_KEY --apihost=http://127.0.0.1:5001 add_user_to_user_group usergroupid:demo12 userid:demo2
 echo "killing server"
-kill `cat rc.pid`
-rm rc.pid
+kill `cat server.pid`
+rm server.pid
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/scripts/manual_test_concurrency.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+kallithea.tests.scripts.manual_test_concurrency
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Test suite for making push/pull operations
+
+This file was forked by the Kallithea project in July 2014.
+Original author and date, and relevant copyright and licensing information is below:
+:created_on: Dec 30, 2010
+:author: marcink
+:copyright: (c) 2013 RhodeCode GmbH, and others.
+:license: GPLv3, see LICENSE.md for more details.
+
+"""
+
+import os
+import sys
+import shutil
+import logging
+from os.path import join as jn
+from os.path import dirname as dn
+
+from tempfile import _RandomNameSequence
+from subprocess import Popen, PIPE
+
+from paste.deploy import appconfig
+from sqlalchemy import engine_from_config
+
+from kallithea.lib.utils import add_cache
+from kallithea.model import init_model
+from kallithea.model import meta
+from kallithea.model.db import User, Repository
+from kallithea.lib.auth import get_crypt_password
+
+from kallithea.tests import TESTS_TMP_PATH, HG_REPO
+from kallithea.config.environment import load_environment
+
+rel_path = dn(dn(dn(dn(os.path.abspath(__file__)))))
+conf = appconfig('config:development.ini', relative_to=rel_path)
+load_environment(conf.global_conf, conf.local_conf)
+
+add_cache(conf)
+
+USER = TEST_USER_ADMIN_LOGIN
+PASS = TEST_USER_ADMIN_PASS
+HOST = 'server.local'
+METHOD = 'pull'
+DEBUG = True
+log = logging.getLogger(__name__)
+
+
+class Command(object):
+
+    def __init__(self, cwd):
+        self.cwd = cwd
+
+    def execute(self, cmd, *args):
+        """Runs command on the system with given ``args``.
+        """
+
+        command = cmd + ' ' + ' '.join(args)
+        log.debug('Executing %s', command)
+        if DEBUG:
+            print command
+        p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
+        stdout, stderr = p.communicate()
+        if DEBUG:
+            print stdout, stderr
+        return stdout, stderr
+
+
+def get_session():
+    engine = engine_from_config(conf, 'sqlalchemy.db1.')
+    init_model(engine)
+    sa = meta.Session
+    return sa
+
+
+def create_test_user(force=True):
+    print 'creating test user'
+    sa = get_session()
+
+    user = sa.query(User).filter(User.username == USER).scalar()
+
+    if force and user is not None:
+        print 'removing current user'
+        for repo in sa.query(Repository).filter(Repository.user == user).all():
+            sa.delete(repo)
+        sa.delete(user)
+        sa.commit()
+
+    if user is None or force:
+        print 'creating new one'
+        new_usr = User()
+        new_usr.username = USER
+        new_usr.password = get_crypt_password(PASS)
+        new_usr.email = 'mail@mail.com'
+        new_usr.name = 'test'
+        new_usr.lastname = 'lasttestname'
+        new_usr.active = True
+        new_usr.admin = True
+        sa.add(new_usr)
+        sa.commit()
+
+    print 'done'
+
+
+def create_test_repo(force=True):
+    print 'creating test repo'
+    from kallithea.model.repo import RepoModel
+    sa = get_session()
+
+    user = sa.query(User).filter(User.username == USER).scalar()
+    if user is None:
+        raise Exception('user not found')
+
+    repo = sa.query(Repository).filter(Repository.repo_name == HG_REPO).scalar()
+
+    if repo is None:
+        print 'repo not found creating'
+
+        form_data = {'repo_name': HG_REPO,
+                     'repo_type': 'hg',
+                     'private':False,
+                     'clone_uri': '' }
+        rm = RepoModel(sa)
+        rm.base_path = '/home/hg'
+        rm.create(form_data, user)
+
+    print 'done'
+
+
+def set_anonymous_access(enable=True):
+    sa = get_session()
+    user = sa.query(User).filter(User.username == 'default').one()
+    user.active = enable
+    sa.add(user)
+    sa.commit()
+
+
+def get_anonymous_access():
+    sa = get_session()
+    return sa.query(User).filter(User.username == 'default').one().active
+
+
+#==============================================================================
+# TESTS
+#==============================================================================
+def test_clone_with_credentials(no_errors=False, repo=HG_REPO, method=METHOD,
+                                seq=None, backend='hg'):
+    cwd = path = jn(TESTS_TMP_PATH, repo)
+
+    if seq is None:
+        seq = _RandomNameSequence().next()
+
+    try:
+        shutil.rmtree(path, ignore_errors=True)
+        os.makedirs(path)
+        #print 'made dirs %s' % jn(path)
+    except OSError:
+        raise
+
+    clone_url = 'http://%(user)s:%(pass)s@%(host)s/%(cloned_repo)s' % \
+                  {'user': USER,
+                   'pass': PASS,
+                   'host': HOST,
+                   'cloned_repo': repo, }
+
+    dest = path + seq
+    if method == 'pull':
+        stdout, stderr = Command(cwd).execute(backend, method, '--cwd', dest, clone_url)
+    else:
+        stdout, stderr = Command(cwd).execute(backend, method, clone_url, dest)
+        print stdout,'sdasdsadsa'
+        if not no_errors:
+            if backend == 'hg':
+                assert """adding file changes""" in stdout, 'no messages about cloning'
+                assert """abort""" not in stderr , 'got error from clone'
+            elif backend == 'git':
+                assert """Cloning into""" in stdout, 'no messages about cloning'
+
+if __name__ == '__main__':
+    try:
+        create_test_user(force=False)
+        seq = None
+        import time
+
+        try:
+            METHOD = sys.argv[3]
+        except IndexError:
+            pass
+
+        try:
+            backend = sys.argv[4]
+        except IndexError:
+            backend = 'hg'
+
+        if METHOD == 'pull':
+            seq = _RandomNameSequence().next()
+            test_clone_with_credentials(repo=sys.argv[1], method='clone',
+                                        seq=seq, backend=backend)
+        s = time.time()
+        for i in range(1, int(sys.argv[2]) + 1):
+            print 'take', i
+            test_clone_with_credentials(repo=sys.argv[1], method=METHOD,
+                                        seq=seq, backend=backend)
+        print 'time taken %.3f' % (time.time() - s)
+    except Exception as e:
+        sys.exit('stop on %s' % e)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/scripts/manual_test_crawler.py	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,190 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+kallithea.tests.scripts.manual_test_crawler
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Test for crawling a project for memory usage
+This should be runned just as regular script together
+with a watch script that will show memory usage.
+
+watch -n1 ./kallithea/tests/mem_watch
+
+This file was forked by the Kallithea project in July 2014.
+Original author and date, and relevant copyright and licensing information is below:
+:created_on: Apr 21, 2010
+:author: marcink
+:copyright: (c) 2013 RhodeCode GmbH, and others.
+:license: GPLv3, see LICENSE.md for more details.
+"""
+
+
+import cookielib
+import urllib
+import urllib2
+import time
+import os
+import sys
+from os.path import join as jn
+from os.path import dirname as dn
+
+__here__ = os.path.abspath(__file__)
+__root__ = dn(dn(dn(__here__)))
+sys.path.append(__root__)
+
+from kallithea.lib import vcs
+from kallithea.lib.compat import OrderedSet
+from kallithea.lib.vcs.exceptions import RepositoryError
+
+PASES = 3
+HOST = 'http://127.0.0.1'
+PORT = 5000
+BASE_URI = '%s:%s/' % (HOST, PORT)
+
+if len(sys.argv) == 2:
+    BASE_URI = sys.argv[1]
+
+if not BASE_URI.endswith('/'):
+    BASE_URI += '/'
+
+print 'Crawling @ %s' % BASE_URI
+BASE_URI += '%s'
+PROJECT_PATH = jn('/', 'home', 'username', 'repos')
+PROJECTS = [
+    #'linux-magx-pbranch',
+    'CPython',
+    'kallithea',
+]
+
+
+cj = cookielib.FileCookieJar('/tmp/rc_test_cookie.txt')
+o = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
+o.addheaders = [
+    ('User-agent', 'kallithea-crawler'),
+    ('Accept-Language', 'en - us, en;q = 0.5')
+]
+
+urllib2.install_opener(o)
+
+
+def _get_repo(proj):
+    if isinstance(proj, basestring):
+        repo = vcs.get_repo(jn(PROJECT_PATH, proj))
+        proj = proj
+    else:
+        repo = proj
+        proj = repo.name
+
+    return repo, proj
+
+
+def test_changelog_walk(proj, pages=100):
+    repo, proj = _get_repo(proj)
+
+    total_time = 0
+    for i in range(1, pages):
+
+        page = '/'.join((proj, 'changelog',))
+
+        full_uri = (BASE_URI % page) + '?' + urllib.urlencode({'page': i})
+        s = time.time()
+        f = o.open(full_uri)
+
+        assert f.url == full_uri, 'URL:%s does not match %s' % (f.url, full_uri)
+
+        size = len(f.read())
+        e = time.time() - s
+        total_time += e
+        print 'visited %s size:%s req:%s ms' % (full_uri, size, e)
+
+    print 'total_time', total_time
+    print 'average on req', total_time / float(pages)
+
+
+def test_changeset_walk(proj, limit=None):
+    repo, proj = _get_repo(proj)
+
+    print 'processing', jn(PROJECT_PATH, proj)
+    total_time = 0
+
+    cnt = 0
+    for i in repo:
+        cnt += 1
+        raw_cs = '/'.join((proj, 'changeset', i.raw_id))
+        if limit and limit == cnt:
+            break
+
+        full_uri = (BASE_URI % raw_cs)
+        print '%s visiting %s\%s' % (cnt, full_uri, i)
+        s = time.time()
+        f = o.open(full_uri)
+        size = len(f.read())
+        e = time.time() - s
+        total_time += e
+        print '%s visited %s\%s size:%s req:%s ms' % (cnt, full_uri, i, size, e)
+
+    print 'total_time', total_time
+    print 'average on req', total_time / float(cnt)
+
+
+def test_files_walk(proj, limit=100):
+    repo, proj = _get_repo(proj)
+
+    print 'processing', jn(PROJECT_PATH, proj)
+    total_time = 0
+
+    paths_ = OrderedSet([''])
+    try:
+        tip = repo.get_changeset('tip')
+        for topnode, dirs, files in tip.walk('/'):
+
+            for dir in dirs:
+                paths_.add(dir.path)
+                for f in dir:
+                    paths_.add(f.path)
+
+            for f in files:
+                paths_.add(f.path)
+
+    except RepositoryError as e:
+        pass
+
+    cnt = 0
+    for f in paths_:
+        cnt += 1
+        if limit and limit == cnt:
+            break
+
+        file_path = '/'.join((proj, 'files', 'tip', f))
+        full_uri = (BASE_URI % file_path)
+        print '%s visiting %s' % (cnt, full_uri)
+        s = time.time()
+        f = o.open(full_uri)
+        size = len(f.read())
+        e = time.time() - s
+        total_time += e
+        print '%s visited OK size:%s req:%s ms' % (cnt, size, e)
+
+    print 'total_time', total_time
+    print 'average on req', total_time / float(cnt)
+
+if __name__ == '__main__':
+    for path in PROJECTS:
+        repo = vcs.get_repo(jn(PROJECT_PATH, path))
+        for i in range(PASES):
+            print 'PASS %s/%s' % (i, PASES)
+            test_changelog_walk(repo, pages=80)
+            test_changeset_walk(repo, limit=100)
+            test_files_walk(repo, limit=100)
--- a/kallithea/tests/scripts/mem_watch	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/scripts/mem_watch	Sun Sep 06 23:36:05 2015 +0200
@@ -1,1 +1,2 @@
-ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }'|grep [p]aster
+#!/bin/sh
+ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | grep '[p]aster'
--- a/kallithea/tests/scripts/test_concurency.py	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-# -*- coding: utf-8 -*-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-kallithea.tests.test_hg_operations
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Test suite for making push/pull operations
-
-This file was forked by the Kallithea project in July 2014.
-Original author and date, and relevant copyright and licensing information is below:
-:created_on: Dec 30, 2010
-:author: marcink
-:copyright: (c) 2013 RhodeCode GmbH, and others.
-:license: GPLv3, see LICENSE.md for more details.
-
-"""
-
-import os
-import sys
-import shutil
-import logging
-from os.path import join as jn
-from os.path import dirname as dn
-
-from tempfile import _RandomNameSequence
-from subprocess import Popen, PIPE
-
-from paste.deploy import appconfig
-from sqlalchemy import engine_from_config
-
-from kallithea.lib.utils import add_cache
-from kallithea.model import init_model
-from kallithea.model import meta
-from kallithea.model.db import User, Repository
-from kallithea.lib.auth import get_crypt_password
-
-from kallithea.tests import TESTS_TMP_PATH, HG_REPO
-from kallithea.config.environment import load_environment
-
-rel_path = dn(dn(dn(dn(os.path.abspath(__file__)))))
-conf = appconfig('config:rc.ini', relative_to=rel_path)
-load_environment(conf.global_conf, conf.local_conf)
-
-add_cache(conf)
-
-USER = 'test_admin'
-PASS = 'test12'
-HOST = 'rc.local'
-METHOD = 'pull'
-DEBUG = True
-log = logging.getLogger(__name__)
-
-
-class Command(object):
-
-    def __init__(self, cwd):
-        self.cwd = cwd
-
-    def execute(self, cmd, *args):
-        """Runs command on the system with given ``args``.
-        """
-
-        command = cmd + ' ' + ' '.join(args)
-        log.debug('Executing %s' % command)
-        if DEBUG:
-            print command
-        p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
-        stdout, stderr = p.communicate()
-        if DEBUG:
-            print stdout, stderr
-        return stdout, stderr
-
-
-def get_session():
-    engine = engine_from_config(conf, 'sqlalchemy.db1.')
-    init_model(engine)
-    sa = meta.Session
-    return sa
-
-
-def create_test_user(force=True):
-    print 'creating test user'
-    sa = get_session()
-
-    user = sa.query(User).filter(User.username == USER).scalar()
-
-    if force and user is not None:
-        print 'removing current user'
-        for repo in sa.query(Repository).filter(Repository.user == user).all():
-            sa.delete(repo)
-        sa.delete(user)
-        sa.commit()
-
-    if user is None or force:
-        print 'creating new one'
-        new_usr = User()
-        new_usr.username = USER
-        new_usr.password = get_crypt_password(PASS)
-        new_usr.email = 'mail@mail.com'
-        new_usr.name = 'test'
-        new_usr.lastname = 'lasttestname'
-        new_usr.active = True
-        new_usr.admin = True
-        sa.add(new_usr)
-        sa.commit()
-
-    print 'done'
-
-
-def create_test_repo(force=True):
-    print 'creating test repo'
-    from kallithea.model.repo import RepoModel
-    sa = get_session()
-
-    user = sa.query(User).filter(User.username == USER).scalar()
-    if user is None:
-        raise Exception('user not found')
-
-    repo = sa.query(Repository).filter(Repository.repo_name == HG_REPO).scalar()
-
-    if repo is None:
-        print 'repo not found creating'
-
-        form_data = {'repo_name': HG_REPO,
-                     'repo_type': 'hg',
-                     'private':False,
-                     'clone_uri': '' }
-        rm = RepoModel(sa)
-        rm.base_path = '/home/hg'
-        rm.create(form_data, user)
-
-    print 'done'
-
-
-def set_anonymous_access(enable=True):
-    sa = get_session()
-    user = sa.query(User).filter(User.username == 'default').one()
-    user.active = enable
-    sa.add(user)
-    sa.commit()
-
-
-def get_anonymous_access():
-    sa = get_session()
-    return sa.query(User).filter(User.username == 'default').one().active
-
-
-#==============================================================================
-# TESTS
-#==============================================================================
-def test_clone_with_credentials(no_errors=False, repo=HG_REPO, method=METHOD,
-                                seq=None, backend='hg'):
-    cwd = path = jn(TESTS_TMP_PATH, repo)
-
-    if seq is None:
-        seq = _RandomNameSequence().next()
-
-    try:
-        shutil.rmtree(path, ignore_errors=True)
-        os.makedirs(path)
-        #print 'made dirs %s' % jn(path)
-    except OSError:
-        raise
-
-    clone_url = 'http://%(user)s:%(pass)s@%(host)s/%(cloned_repo)s' % \
-                  {'user': USER,
-                   'pass': PASS,
-                   'host': HOST,
-                   'cloned_repo': repo, }
-
-    dest = path + seq
-    if method == 'pull':
-        stdout, stderr = Command(cwd).execute(backend, method, '--cwd', dest, clone_url)
-    else:
-        stdout, stderr = Command(cwd).execute(backend, method, clone_url, dest)
-        print stdout,'sdasdsadsa'
-        if not no_errors:
-            if backend == 'hg':
-                assert """adding file changes""" in stdout, 'no messages about cloning'
-                assert """abort""" not in stderr , 'got error from clone'
-            elif backend == 'git':
-                assert """Cloning into""" in stdout, 'no messages about cloning'
-
-if __name__ == '__main__':
-    try:
-        create_test_user(force=False)
-        seq = None
-        import time
-
-        try:
-            METHOD = sys.argv[3]
-        except IndexError:
-            pass
-
-        try:
-            backend = sys.argv[4]
-        except IndexError:
-            backend = 'hg'
-
-        if METHOD == 'pull':
-            seq = _RandomNameSequence().next()
-            test_clone_with_credentials(repo=sys.argv[1], method='clone',
-                                        seq=seq, backend=backend)
-        s = time.time()
-        for i in range(1, int(sys.argv[2]) + 1):
-            print 'take', i
-            test_clone_with_credentials(repo=sys.argv[1], method=METHOD,
-                                        seq=seq, backend=backend)
-        print 'time taken %.3f' % (time.time() - s)
-    except Exception, e:
-        sys.exit('stop on %s' % e)
--- a/kallithea/tests/scripts/test_crawler.py	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,189 +0,0 @@
-# -*- coding: utf-8 -*-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-kallithea.tests.test_crawer
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Test for crawling a project for memory usage
-This should be runned just as regular script together
-with a watch script that will show memory usage.
-
-watch -n1 ./kallithea/tests/mem_watch
-
-This file was forked by the Kallithea project in July 2014.
-Original author and date, and relevant copyright and licensing information is below:
-:created_on: Apr 21, 2010
-:author: marcink
-:copyright: (c) 2013 RhodeCode GmbH, and others.
-:license: GPLv3, see LICENSE.md for more details.
-"""
-
-
-import cookielib
-import urllib
-import urllib2
-import time
-import os
-import sys
-from os.path import join as jn
-from os.path import dirname as dn
-
-__here__ = os.path.abspath(__file__)
-__root__ = dn(dn(dn(__here__)))
-sys.path.append(__root__)
-
-from kallithea.lib import vcs
-from kallithea.lib.compat import OrderedSet
-from kallithea.lib.vcs.exceptions import RepositoryError
-
-PASES = 3
-HOST = 'http://127.0.0.1'
-PORT = 5000
-BASE_URI = '%s:%s/' % (HOST, PORT)
-
-if len(sys.argv) == 2:
-    BASE_URI = sys.argv[1]
-
-if not BASE_URI.endswith('/'):
-    BASE_URI += '/'
-
-print 'Crawling @ %s' % BASE_URI
-BASE_URI += '%s'
-PROJECT_PATH = jn('/', 'home', 'marcink', 'repos')
-PROJECTS = [
-    #'linux-magx-pbranch',
-    'CPython',
-    'kallithea',
-]
-
-
-cj = cookielib.FileCookieJar('/tmp/rc_test_cookie.txt')
-o = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
-o.addheaders = [
-    ('User-agent', 'kallithea-crawler'),
-    ('Accept-Language', 'en - us, en;q = 0.5')
-]
-
-urllib2.install_opener(o)
-
-
-def _get_repo(proj):
-    if isinstance(proj, basestring):
-        repo = vcs.get_repo(jn(PROJECT_PATH, proj))
-        proj = proj
-    else:
-        repo = proj
-        proj = repo.name
-
-    return repo, proj
-
-
-def test_changelog_walk(proj, pages=100):
-    repo, proj = _get_repo(proj)
-
-    total_time = 0
-    for i in range(1, pages):
-
-        page = '/'.join((proj, 'changelog',))
-
-        full_uri = (BASE_URI % page) + '?' + urllib.urlencode({'page': i})
-        s = time.time()
-        f = o.open(full_uri)
-
-        assert f.url == full_uri, 'URL:%s does not match %s' % (f.url, full_uri)
-
-        size = len(f.read())
-        e = time.time() - s
-        total_time += e
-        print 'visited %s size:%s req:%s ms' % (full_uri, size, e)
-
-    print 'total_time', total_time
-    print 'average on req', total_time / float(pages)
-
-
-def test_changeset_walk(proj, limit=None):
-    repo, proj = _get_repo(proj)
-
-    print 'processing', jn(PROJECT_PATH, proj)
-    total_time = 0
-
-    cnt = 0
-    for i in repo:
-        cnt += 1
-        raw_cs = '/'.join((proj, 'changeset', i.raw_id))
-        if limit and limit == cnt:
-            break
-
-        full_uri = (BASE_URI % raw_cs)
-        print '%s visiting %s\%s' % (cnt, full_uri, i)
-        s = time.time()
-        f = o.open(full_uri)
-        size = len(f.read())
-        e = time.time() - s
-        total_time += e
-        print '%s visited %s\%s size:%s req:%s ms' % (cnt, full_uri, i, size, e)
-
-    print 'total_time', total_time
-    print 'average on req', total_time / float(cnt)
-
-
-def test_files_walk(proj, limit=100):
-    repo, proj = _get_repo(proj)
-
-    print 'processing', jn(PROJECT_PATH, proj)
-    total_time = 0
-
-    paths_ = OrderedSet([''])
-    try:
-        tip = repo.get_changeset('tip')
-        for topnode, dirs, files in tip.walk('/'):
-
-            for dir in dirs:
-                paths_.add(dir.path)
-                for f in dir:
-                    paths_.add(f.path)
-
-            for f in files:
-                paths_.add(f.path)
-
-    except RepositoryError, e:
-        pass
-
-    cnt = 0
-    for f in paths_:
-        cnt += 1
-        if limit and limit == cnt:
-            break
-
-        file_path = '/'.join((proj, 'files', 'tip', f))
-        full_uri = (BASE_URI % file_path)
-        print '%s visiting %s' % (cnt, full_uri)
-        s = time.time()
-        f = o.open(full_uri)
-        size = len(f.read())
-        e = time.time() - s
-        total_time += e
-        print '%s visited OK size:%s req:%s ms' % (cnt, size, e)
-
-    print 'total_time', total_time
-    print 'average on req', total_time / float(cnt)
-
-if __name__ == '__main__':
-    for path in PROJECTS:
-        repo = vcs.get_repo(jn(PROJECT_PATH, path))
-        for i in range(PASES):
-            print 'PASS %s/%s' % (i, PASES)
-            test_changelog_walk(repo, pages=80)
-            test_changeset_walk(repo, limit=100)
-            test_files_walk(repo, limit=100)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/tests/test.ini	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,591 @@
+################################################################################
+################################################################################
+# Kallithea - config for tests:                                                #
+# initial_repo_scan = true                                                     #
+# vcs_full_cache = false                                                       #
+# sqlalchemy and kallithea_test.sqlite                                         #
+# custom logging                                                               #
+#                                                                              #
+# The %(here)s variable will be replaced with the parent directory of this file#
+################################################################################
+################################################################################
+
+[DEFAULT]
+debug = true
+pdebug = false
+
+################################################################################
+## Email settings                                                             ##
+##                                                                            ##
+## Refer to the documentation ("Email settings") for more details.            ##
+##                                                                            ##
+## It is recommended to use a valid sender address that passes access         ##
+## validation and spam filtering in mail servers.                             ##
+################################################################################
+
+## 'From' header for application emails. You can optionally add a name.
+## Default:
+#app_email_from = Kallithea
+## Examples:
+#app_email_from = Kallithea <kallithea-noreply@example.com>
+#app_email_from = kallithea-noreply@example.com
+
+## Subject prefix for application emails.
+## A space between this prefix and the real subject is automatically added.
+## Default:
+#email_prefix =
+## Example:
+#email_prefix = [Kallithea]
+
+## Recipients for error emails and fallback recipients of application mails.
+## Multiple addresses can be specified, space-separated.
+## Only addresses are allowed, do not add any name part.
+## Default:
+#email_to =
+## Examples:
+#email_to = admin@example.com
+#email_to = admin@example.com another_admin@example.com
+
+## 'From' header for error emails. You can optionally add a name.
+## Default:
+#error_email_from = pylons@yourapp.com
+## Examples:
+#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
+#error_email_from = paste_error@example.com
+
+## SMTP server settings
+## Only smtp_server is mandatory. All other settings take the specified default
+## values.
+#smtp_server = mail.server.com
+#smtp_username =
+#smtp_password =
+#smtp_port = 25
+#smtp_use_tls = false
+#smtp_use_ssl = false
+## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).
+## If empty, use any of the authentication parameters supported by the server.
+#smtp_auth =
+
+[server:main]
+## PASTE ##
+#use = egg:Paste#http
+## nr of worker threads to spawn
+#threadpool_workers = 5
+## max request before thread respawn
+#threadpool_max_requests = 10
+## option to use threads of process
+#use_threadpool = true
+
+## WAITRESS ##
+use = egg:waitress#main
+## number of worker threads
+threads = 5
+## MAX BODY SIZE 100GB
+max_request_body_size = 107374182400
+## use poll instead of select, fixes fd limits, may not work on old
+## windows systems.
+#asyncore_use_poll = True
+
+## GUNICORN ##
+#use = egg:gunicorn#main
+## number of process workers. You must set `instance_id = *` when this option
+## is set to more than one worker
+#workers = 1
+## process name
+#proc_name = kallithea
+## type of worker class, one of sync, eventlet, gevent, tornado
+## recommended for bigger setup is using of of other than sync one
+#worker_class = sync
+#max_requests = 1000
+## ammount of time a worker can handle request before it gets killed and
+## restarted
+#timeout = 3600
+
+## UWSGI ##
+## run with uwsgi --ini-paste-logged <inifile.ini>
+#[uwsgi]
+#socket = /tmp/uwsgi.sock
+#master = true
+#http = 127.0.0.1:5000
+
+## set as deamon and redirect all output to file
+#daemonize = ./uwsgi_kallithea.log
+
+## master process PID
+#pidfile = ./uwsgi_kallithea.pid
+
+## stats server with workers statistics, use uwsgitop
+## for monitoring, `uwsgitop 127.0.0.1:1717`
+#stats = 127.0.0.1:1717
+#memory-report = true
+
+## log 5XX errors
+#log-5xx = true
+
+## Set the socket listen queue size.
+#listen = 256
+
+## Gracefully Reload workers after the specified amount of managed requests
+## (avoid memory leaks).
+#max-requests = 1000
+
+## enable large buffers
+#buffer-size = 65535
+
+## socket and http timeouts ##
+#http-timeout = 3600
+#socket-timeout = 3600
+
+## Log requests slower than the specified number of milliseconds.
+#log-slow = 10
+
+## Exit if no app can be loaded.
+#need-app = true
+
+## Set lazy mode (load apps in workers instead of master).
+#lazy = true
+
+## scaling ##
+## set cheaper algorithm to use, if not set default will be used
+#cheaper-algo = spare
+
+## minimum number of workers to keep at all times
+#cheaper = 1
+
+## number of workers to spawn at startup
+#cheaper-initial = 1
+
+## maximum number of workers that can be spawned
+#workers = 4
+
+## how many workers should be spawned at a time
+#cheaper-step = 1
+
+## COMMON ##
+host = 127.0.0.1
+port = 4999
+
+## middleware for hosting the WSGI application under a URL prefix
+#[filter:proxy-prefix]
+#use = egg:PasteDeploy#prefix
+#prefix = /<your-prefix>
+
+[app:main]
+use = egg:kallithea
+## enable proxy prefix middleware
+#filter-with = proxy-prefix
+
+full_stack = true
+static_files = true
+## Available Languages:
+## cs de fr hu ja nl_BE pl pt_BR ru sk zh_CN zh_TW
+lang =
+cache_dir = %(here)s/data
+index_dir = %(here)s/data/index
+
+## perform a full repository scan on each server start, this should be
+## set to false after first startup, to allow faster server restarts.
+#initial_repo_scan = false
+initial_repo_scan = true
+
+## uncomment and set this path to use archive download cache
+archive_cache_dir = %(here)s/tarballcache
+
+## change this to unique ID for security
+app_instance_uuid = test
+
+## cut off limit for large diffs (size in bytes)
+cut_off_limit = 256000
+
+## use cache version of scm repo everywhere
+#vcs_full_cache = true
+vcs_full_cache = false
+
+## force https in Kallithea, fixes https redirects, assumes it's always https
+force_https = false
+
+## use Strict-Transport-Security headers
+use_htsts = false
+
+## number of commits stats will parse on each iteration
+commit_parse_limit = 25
+
+## path to git executable
+git_path = git
+
+## git rev filter option, --all is the default filter, if you need to
+## hide all refs in changelog switch this to --branches --tags
+#git_rev_filter = --branches --tags
+
+## RSS feed options
+rss_cut_off_limit = 256000
+rss_items_per_page = 10
+rss_include_diff = false
+
+## options for showing and identifying changesets
+show_sha_length = 12
+show_revision_number = true
+
+## gist URL alias, used to create nicer urls for gist. This should be an
+## url that does rewrites to _admin/gists/<gistid>.
+## example: http://gist.kallithea.server/{gistid}. Empty means use the internal
+## Kallithea url, ie. http[s]://your.kallithea.server/_admin/gists/<gistid>
+gist_alias_url =
+
+## white list of API enabled controllers. This allows to add list of
+## controllers to which access will be enabled by api_key. eg: to enable
+## api access to raw_files put `FilesController:raw`, to enable access to patches
+## add `ChangesetController:changeset_patch`. This list should be "," separated
+## Syntax is <ControllerClass>:<function>. Check debug logs for generated names
+## Recommended settings below are commented out:
+api_access_controllers_whitelist =
+#    ChangesetController:changeset_patch,
+#    ChangesetController:changeset_raw,
+#    FilesController:raw,
+#    FilesController:archivefile
+
+## default encoding used to convert from and to unicode
+## can be also a comma seperated list of encoding in case of mixed encodings
+default_encoding = utf8
+
+## issue tracker for Kallithea (leave blank to disable, absent for default)
+#bugtracker = https://bitbucket.org/conservancy/kallithea/issues
+
+## issue tracking mapping for commits messages
+## comment out issue_pat, issue_server, issue_prefix to enable
+
+## pattern to get the issues from commit messages
+## default one used here is #<numbers> with a regex passive group for `#`
+## {id} will be all groups matched from this pattern
+
+issue_pat = (?:\s*#)(\d+)
+
+## server url to the issue, each {id} will be replaced with match
+## fetched from the regex and {repo} is replaced with full repository name
+## including groups {repo_name} is replaced with just name of repo
+
+issue_server_link = https://myissueserver.com/{repo}/issue/{id}
+
+## prefix to add to link to indicate it's an url
+## #314 will be replaced by <issue_prefix><id>
+
+issue_prefix = #
+
+## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
+## multiple patterns, to other issues server, wiki or others
+## below an example how to create a wiki pattern
+# wiki-some-id -> https://mywiki.com/some-id
+
+#issue_pat_wiki = (?:wiki-)(.+)
+#issue_server_link_wiki = https://mywiki.com/{id}
+#issue_prefix_wiki = WIKI-
+
+## instance-id prefix
+## a prefix key for this instance used for cache invalidation when running
+## multiple instances of kallithea, make sure it's globally unique for
+## all running kallithea instances. Leave empty if you don't use it
+instance_id =
+
+## alternative return HTTP header for failed authentication. Default HTTP
+## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with
+## handling that. Set this variable to 403 to return HTTPForbidden
+auth_ret_code =
+
+## locking return code. When repository is locked return this HTTP code. 2XX
+## codes don't break the transactions while 4XX codes do
+lock_ret_code = 423
+
+## allows to change the repository location in settings page
+allow_repo_location_change = True
+
+## allows to setup custom hooks in settings page
+allow_custom_hooks_settings = True
+
+####################################
+###        CELERY CONFIG        ####
+####################################
+
+use_celery = false
+broker.host = localhost
+broker.vhost = rabbitmqhost
+broker.port = 5672
+broker.user = rabbitmq
+broker.password = qweqwe
+
+celery.imports = kallithea.lib.celerylib.tasks
+
+celery.result.backend = amqp
+celery.result.dburi = amqp://
+celery.result.serialier = json
+
+#celery.send.task.error.emails = true
+#celery.amqp.task.result.expires = 18000
+
+celeryd.concurrency = 2
+#celeryd.log.file = celeryd.log
+celeryd.log.level = DEBUG
+celeryd.max.tasks.per.child = 1
+
+## tasks will never be sent to the queue, but executed locally instead.
+celery.always.eager = false
+
+####################################
+###         BEAKER CACHE        ####
+####################################
+
+beaker.cache.data_dir = %(here)s/data/cache/data
+beaker.cache.lock_dir = %(here)s/data/cache/lock
+
+beaker.cache.regions = short_term,long_term,sql_cache_short
+
+beaker.cache.short_term.type = memory
+beaker.cache.short_term.expire = 60
+beaker.cache.short_term.key_length = 256
+
+beaker.cache.long_term.type = memory
+beaker.cache.long_term.expire = 36000
+beaker.cache.long_term.key_length = 256
+
+beaker.cache.sql_cache_short.type = memory
+beaker.cache.sql_cache_short.expire = 1
+beaker.cache.sql_cache_short.key_length = 256
+
+####################################
+###       BEAKER SESSION        ####
+####################################
+
+## Name of session cookie. Should be unique for a given host and path, even when running
+## on different ports. Otherwise, cookie sessions will be shared and messed up.
+beaker.session.key = kallithea
+## Sessions should always only be accessible by the browser, not directly by JavaScript.
+beaker.session.httponly = true
+## Session lifetime. 2592000 seconds is 30 days.
+beaker.session.timeout = 2592000
+
+## Server secret used with HMAC to ensure integrity of cookies.
+beaker.session.secret = {74e0cd75-b339-478b-b129-07dd221def1f}
+## Further, encrypt the data with AES.
+#beaker.session.encrypt_key = <key_for_encryption>
+#beaker.session.validate_key = <validation_key>
+
+## Type of storage used for the session, current types are
+## dbm, file, memcached, database, and memory.
+
+## File system storage of session data. (default)
+#beaker.session.type = file
+
+## Cookie only, store all session data inside the cookie. Requires secure secrets.
+#beaker.session.type = cookie
+
+## Database storage of session data.
+#beaker.session.type = ext:database
+#beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
+#beaker.session.table_name = db_session
+
+############################
+## ERROR HANDLING SYSTEMS ##
+############################
+
+####################
+### [errormator] ###
+####################
+
+## Errormator is tailored to work with Kallithea, see
+## http://errormator.com for details how to obtain an account
+## you must install python package `errormator_client` to make it work
+
+## errormator enabled
+errormator = false
+
+errormator.server_url = https://api.errormator.com
+errormator.api_key = YOUR_API_KEY
+
+## TWEAK AMOUNT OF INFO SENT HERE
+
+## enables 404 error logging (default False)
+errormator.report_404 = false
+
+## time in seconds after request is considered being slow (default 1)
+errormator.slow_request_time = 1
+
+## record slow requests in application
+## (needs to be enabled for slow datastore recording and time tracking)
+errormator.slow_requests = true
+
+## enable hooking to application loggers
+#errormator.logging = true
+
+## minimum log level for log capture
+#errormator.logging.level = WARNING
+
+## send logs only from erroneous/slow requests
+## (saves API quota for intensive logging)
+errormator.logging_on_error = false
+
+## list of additonal keywords that should be grabbed from environ object
+## can be string with comma separated list of words in lowercase
+## (by default client will always send following info:
+## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
+## start with HTTP* this list be extended with additional keywords here
+errormator.environ_keys_whitelist =
+
+## list of keywords that should be blanked from request object
+## can be string with comma separated list of words in lowercase
+## (by default client will always blank keys that contain following words
+## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
+## this list be extended with additional keywords set here
+errormator.request_keys_blacklist =
+
+## list of namespaces that should be ignores when gathering log entries
+## can be string with comma separated list of namespaces
+## (by default the client ignores own entries: errormator_client.client)
+errormator.log_namespace_blacklist =
+
+################
+### [sentry] ###
+################
+
+## sentry is a alternative open source error aggregator
+## you must install python packages `sentry` and `raven` to enable
+
+sentry.dsn = YOUR_DNS
+sentry.servers =
+sentry.name =
+sentry.key =
+sentry.public_key =
+sentry.secret_key =
+sentry.project =
+sentry.site =
+sentry.include_paths =
+sentry.exclude_paths =
+
+################################################################################
+## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
+## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
+## execute malicious code after an exception is raised.                       ##
+################################################################################
+set debug = false
+
+##################################
+###       LOGVIEW CONFIG       ###
+##################################
+
+logview.sqlalchemy = #faa
+logview.pylons.templating = #bfb
+logview.pylons.util = #eee
+
+#########################################################
+### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
+#########################################################
+
+# SQLITE [default]
+#sqlalchemy.db1.url = sqlite:///%(here)s/kallithea.db?timeout=60
+sqlalchemy.db1.url = sqlite:///%(here)s/kallithea_test.sqlite
+
+# POSTGRESQL
+#sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
+
+# MySQL
+#sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
+
+# see sqlalchemy docs for others
+
+sqlalchemy.db1.echo = false
+sqlalchemy.db1.pool_recycle = 3600
+sqlalchemy.db1.convert_unicode = true
+
+################################
+### LOGGING CONFIGURATION   ####
+################################
+
+[loggers]
+keys = root, routes, kallithea, sqlalchemy, beaker, templates, whoosh_indexer
+
+[handlers]
+keys = console, console_sql
+
+[formatters]
+keys = generic, color_formatter, color_formatter_sql
+
+#############
+## LOGGERS ##
+#############
+
+[logger_root]
+#level = NOTSET
+level = DEBUG
+handlers = console
+
+[logger_routes]
+level = DEBUG
+handlers =
+qualname = routes.middleware
+## "level = DEBUG" logs the route matched and routing variables.
+propagate = 1
+
+[logger_beaker]
+level = DEBUG
+handlers =
+qualname = beaker.container
+propagate = 1
+
+[logger_templates]
+level = INFO
+handlers =
+qualname = pylons.templating
+propagate = 1
+
+[logger_kallithea]
+level = DEBUG
+handlers =
+qualname = kallithea
+propagate = 1
+
+[logger_sqlalchemy]
+#level = INFO
+#handlers = console_sql
+level = ERROR
+handlers = console
+qualname = sqlalchemy.engine
+propagate = 0
+
+[logger_whoosh_indexer]
+level = DEBUG
+handlers =
+qualname = whoosh_indexer
+propagate = 1
+
+##############
+## HANDLERS ##
+##############
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+#level = INFO
+level = NOTSET
+formatter = generic
+
+[handler_console_sql]
+class = StreamHandler
+args = (sys.stderr,)
+level = WARN
+formatter = generic
+
+################
+## FORMATTERS ##
+################
+
+[formatter_generic]
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %Y-%m-%d %H:%M:%S
+
+[formatter_color_formatter]
+class = kallithea.lib.colored_formatter.ColorFormatter
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %Y-%m-%d %H:%M:%S
+
+[formatter_color_formatter_sql]
+class = kallithea.lib.colored_formatter.ColorFormatterSql
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %Y-%m-%d %H:%M:%S
--- a/kallithea/tests/vcs/__init__.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/__init__.py	Sun Sep 06 23:36:05 2015 +0200
@@ -21,7 +21,7 @@
 """
 from kallithea.lib.vcs.utils.compat import unittest
 from kallithea.tests.vcs.conf import *
-from kallithea.tests.vcs.utils import VCSTestError, SCMFetcher
+from kallithea.tests.vcs.utils import SCMFetcher
 
 from kallithea.tests import *
 
@@ -45,12 +45,10 @@
             'clone_cmd': 'git clone --bare',
         },
     }
-    try:
-        for scm, fetcher_info in fetchers.items():
-            fetcher = SCMFetcher(**fetcher_info)
-            fetcher.setup()
-    except VCSTestError, err:
-        raise RuntimeError(str(err))
+
+    for scm, fetcher_info in fetchers.items():
+        fetcher = SCMFetcher(**fetcher_info)
+        fetcher.setup()
 
 
 def collector():
--- a/kallithea/tests/vcs/base.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/base.py	Sun Sep 06 23:36:05 2015 +0200
@@ -13,7 +13,7 @@
 from kallithea.lib.vcs.nodes import FileNode
 
 
-class BackendTestMixin(object):
+class _BackendTestMixin(object):
     """
     This is a backend independent test case class which should be created
     with ``type`` method.
@@ -103,7 +103,7 @@
         'backend_alias': alias,
     }
     cls_name = ''.join(('%s base backend test' % alias).title().split())
-    bases = (BackendTestMixin, unittest.TestCase)
+    bases = (_BackendTestMixin, unittest.TestCase)
     globals()[cls_name] = type(cls_name, bases, attrs)
 
 
--- a/kallithea/tests/vcs/conf.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/conf.py	Sun Sep 06 23:36:05 2015 +0200
@@ -7,7 +7,7 @@
 import tempfile
 import datetime
 import shutil
-from utils import get_normalized_path
+import uuid
 from os.path import join as jn
 
 __all__ = (
@@ -42,17 +42,40 @@
 TEST_REPO_PREFIX = 'vcs-test'
 
 
-def get_new_dir(title):
+def get_new_dir(title=None):
     """
-    Returns always new directory path.
+    Calculates a path for a new, non-existant, unique sub-directory in TEST_DIR.
+
+    Resulting directory name will have format:
+
+    prefix-[title-]hexuuid
+
+    Prefix is equal to value of variable TEST_REPO_PREFIX. The "hexuuid" is a
+    hexadecimal value of a randomly generated UUID. Title will be added if
+    specified.
+
+    Args:
+        title: Custom title to include as part of the resulting sub-directory
+            name. Can be useful for debugging to identify destination. Defaults
+            to None.
+
+    Returns:
+        Path to the new directory as a string.
     """
-    name = TEST_REPO_PREFIX
+
     if title:
-        name = '-'.join((name, title))
-    hex = hashlib.sha1(str(time.time())).hexdigest()
-    name = '-'.join((name, hex))
+        name = "%s-%s" % (TEST_REPO_PREFIX, title)
+    else:
+        name = TEST_REPO_PREFIX
+
     path = os.path.join(TEST_DIR, name)
-    return get_normalized_path(path)
+
+    # Generate new hexes until we get a unique name (just in case).
+    hex_uuid = uuid.uuid4().hex
+    while os.path.exists("%s-%s" % (path, hex_uuid)):
+        hex_uuid = uuid.uuid4().hex
+
+    return "%s-%s" % (path, hex_uuid)
 
 
 PACKAGE_DIR = os.path.abspath(os.path.join(
--- a/kallithea/tests/vcs/test_archives.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_archives.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 
 import os
 import tarfile
@@ -6,14 +5,14 @@
 import datetime
 import tempfile
 import StringIO
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 from kallithea.lib.vcs.exceptions import VCSError
 from kallithea.lib.vcs.nodes import FileNode
 from kallithea.lib.vcs.utils.compat import unittest
 
 
-class ArchivesTestCaseMixin(BackendTestMixin):
+class ArchivesTestCaseMixin(_BackendTestMixin):
 
     @classmethod
     def _get_commits(cls):
--- a/kallithea/tests/vcs/test_branches.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_branches.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,15 +1,14 @@
-from __future__ import with_statement
 
 import datetime
 from kallithea.lib import vcs
 from kallithea.lib.vcs.utils.compat import unittest
 from kallithea.lib.vcs.nodes import FileNode
 
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 
 
-class BranchesTestCaseMixin(BackendTestMixin):
+class BranchesTestCaseMixin(_BackendTestMixin):
 
     @classmethod
     def _get_commits(cls):
--- a/kallithea/tests/vcs/test_changesets.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_changesets.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,10 +1,9 @@
 # encoding: utf8
-from __future__ import with_statement
 
 import time
 import datetime
 from kallithea.lib import vcs
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 
 from kallithea.lib.vcs.backends.base import BaseChangeset
@@ -50,7 +49,7 @@
             'removed': [],
         })
 
-class ChangesetsWithCommitsTestCaseixin(BackendTestMixin):
+class _ChangesetsWithCommitsTestCaseixin(_BackendTestMixin):
     recreate_repo_per_test = True
 
     @classmethod
@@ -146,7 +145,7 @@
             self.assertEqual([sha], self.repo.get_changeset(test_rev).children)
 
 
-class ChangesetsTestCaseMixin(BackendTestMixin):
+class _ChangesetsTestCaseMixin(_BackendTestMixin):
     recreate_repo_per_test = False
 
     @classmethod
@@ -301,7 +300,7 @@
             list(self.repo.get_changesets(start=last-1, end=0))
 
 
-class ChangesetsChangesTestCaseMixin(BackendTestMixin):
+class _ChangesetsChangesTestCaseMixin(_BackendTestMixin):
     recreate_repo_per_test = False
 
     @classmethod
@@ -373,17 +372,17 @@
     }
     # tests with additional commits
     cls_name = ''.join(('%s changesets with commits test' % alias).title().split())
-    bases = (ChangesetsWithCommitsTestCaseixin, unittest.TestCase)
+    bases = (_ChangesetsWithCommitsTestCaseixin, unittest.TestCase)
     globals()[cls_name] = type(cls_name, bases, attrs)
 
     # tests without additional commits
     cls_name = ''.join(('%s changesets test' % alias).title().split())
-    bases = (ChangesetsTestCaseMixin, unittest.TestCase)
+    bases = (_ChangesetsTestCaseMixin, unittest.TestCase)
     globals()[cls_name] = type(cls_name, bases, attrs)
 
     # tests changes
     cls_name = ''.join(('%s changesets changes test' % alias).title().split())
-    bases = (ChangesetsChangesTestCaseMixin, unittest.TestCase)
+    bases = (_ChangesetsChangesTestCaseMixin, unittest.TestCase)
     globals()[cls_name] = type(cls_name, bases, attrs)
 
 
--- a/kallithea/tests/vcs/test_filenodes_unicode_path.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_filenodes_unicode_path.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,6 +1,5 @@
 # encoding: utf8
 
-from __future__ import with_statement
 
 import datetime
 from kallithea.lib.vcs.nodes import FileNode
--- a/kallithea/tests/vcs/test_getitem.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_getitem.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,13 +1,12 @@
-from __future__ import with_statement
 
 import datetime
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 from kallithea.lib.vcs.nodes import FileNode
 from kallithea.lib.vcs.utils.compat import unittest
 
 
-class GetitemTestCaseMixin(BackendTestMixin):
+class GetitemTestCaseMixin(_BackendTestMixin):
 
     @classmethod
     def _get_commits(cls):
--- a/kallithea/tests/vcs/test_getslice.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_getslice.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,13 +1,12 @@
-from __future__ import with_statement
 
 import datetime
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 from kallithea.lib.vcs.nodes import FileNode
 from kallithea.lib.vcs.utils.compat import unittest
 
 
-class GetsliceTestCaseMixin(BackendTestMixin):
+class GetsliceTestCaseMixin(_BackendTestMixin):
 
     @classmethod
     def _get_commits(cls):
--- a/kallithea/tests/vcs/test_git.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_git.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,6 +1,6 @@
-from __future__ import with_statement
 
 import os
+import sys
 import mock
 import datetime
 import urllib2
@@ -8,7 +8,8 @@
 from kallithea.lib.vcs.exceptions import RepositoryError, VCSError, NodeDoesNotExistError
 from kallithea.lib.vcs.nodes import NodeKind, FileNode, DirNode, NodeState
 from kallithea.lib.vcs.utils.compat import unittest
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.model.scm import ScmModel
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import TEST_GIT_REPO, TEST_GIT_REPO_CLONE, get_new_dir
 
 
@@ -39,12 +40,20 @@
             clone_fail_repo.clone(repo_inject_path, update_after_clone=True,)
 
         # Verify correct quoting of evil characters that should work on posix file systems
-        tricky_path = get_new_dir("tricky-path-repo-$'\"`")
+        if sys.platform == 'win32':
+            # windows does not allow '"' in dir names
+            tricky_path = get_new_dir("tricky-path-repo-$'`")
+        else:
+            tricky_path = get_new_dir("tricky-path-repo-$'\"`")
         successfully_cloned = GitRepository(tricky_path, src_url=TEST_GIT_REPO, update_after_clone=True, create=True)
         # Repo should have been created
         self.assertFalse(successfully_cloned._repo.bare)
 
-        tricky_path_2 = get_new_dir("tricky-path-2-repo-$'\"`")
+        if sys.platform == 'win32':
+            # windows does not allow '"' in dir names
+            tricky_path_2 = get_new_dir("tricky-path-2-repo-$'`")
+        else:
+            tricky_path_2 = get_new_dir("tricky-path-2-repo-$'\"`")
         successfully_cloned2 = GitRepository(tricky_path_2, src_url=tricky_path, bare=True, create=True)
         # Repo should have been created and thus used correct quoting for clone
         self.assertTrue(successfully_cloned2._repo.bare)
@@ -53,6 +62,12 @@
         successfully_cloned.pull(tricky_path_2)
         successfully_cloned2.fetch(tricky_path)
 
+    def test_repo_create_with_spaces_in_path(self):
+        repo_path = get_new_dir("path with spaces")
+        repo = GitRepository(repo_path, src_url=None, bare=True, create=True)
+        # Repo should have been created
+        self.assertTrue(repo._repo.bare)
+
     def test_repo_clone(self):
         self.__check_for_existing_repo()
         repo = GitRepository(TEST_GIT_REPO)
@@ -64,6 +79,15 @@
             raw_id = changeset.raw_id
             self.assertEqual(raw_id, repo_clone.get_changeset(raw_id).raw_id)
 
+    def test_repo_clone_with_spaces_in_path(self):
+        repo_path = get_new_dir("path with spaces")
+        successfully_cloned = GitRepository(repo_path, src_url=TEST_GIT_REPO, update_after_clone=True, create=True)
+        # Repo should have been created
+        self.assertFalse(successfully_cloned._repo.bare)
+
+        successfully_cloned.pull(TEST_GIT_REPO)
+        self.repo.fetch(repo_path)
+
     def test_repo_clone_without_create(self):
         self.assertRaises(RepositoryError, GitRepository,
             TEST_GIT_REPO_CLONE + '_wo_create', src_url=TEST_GIT_REPO)
@@ -620,7 +644,7 @@
             changeset.added
 
 
-class GitSpecificWithRepoTest(BackendTestMixin, unittest.TestCase):
+class GitSpecificWithRepoTest(_BackendTestMixin, unittest.TestCase):
     backend_alias = 'git'
 
     @classmethod
@@ -658,37 +682,37 @@
             'base')
 
     def test_workdir_get_branch(self):
-        self.repo.run_git_command('checkout -b production')
+        self.repo.run_git_command(['checkout', '-b', 'production'])
         # Regression test: one of following would fail if we don't check
         # .git/HEAD file
-        self.repo.run_git_command('checkout production')
+        self.repo.run_git_command(['checkout', 'production'])
         self.assertEqual(self.repo.workdir.get_branch(), 'production')
-        self.repo.run_git_command('checkout master')
+        self.repo.run_git_command(['checkout', 'master'])
         self.assertEqual(self.repo.workdir.get_branch(), 'master')
 
     def test_get_diff_runs_git_command_with_hashes(self):
         self.repo.run_git_command = mock.Mock(return_value=['', ''])
         self.repo.get_diff(0, 1)
         self.repo.run_git_command.assert_called_once_with(
-          'diff -U%s --full-index --binary -p -M --abbrev=40 %s %s' %
-            (3, self.repo._get_revision(0), self.repo._get_revision(1)))
+            ['diff', '-U3', '--full-index', '--binary', '-p', '-M', '--abbrev=40',
+             self.repo._get_revision(0), self.repo._get_revision(1)])
 
     def test_get_diff_runs_git_command_with_str_hashes(self):
         self.repo.run_git_command = mock.Mock(return_value=['', ''])
         self.repo.get_diff(self.repo.EMPTY_CHANGESET, 1)
         self.repo.run_git_command.assert_called_once_with(
-            'show -U%s --full-index --binary -p -M --abbrev=40 %s' %
-            (3, self.repo._get_revision(1)))
+            ['show', '-U3', '--full-index', '--binary', '-p', '-M', '--abbrev=40',
+             self.repo._get_revision(1)])
 
     def test_get_diff_runs_git_command_with_path_if_its_given(self):
         self.repo.run_git_command = mock.Mock(return_value=['', ''])
         self.repo.get_diff(0, 1, 'foo')
         self.repo.run_git_command.assert_called_once_with(
-          'diff -U%s --full-index --binary -p -M --abbrev=40 %s %s -- "foo"'
-            % (3, self.repo._get_revision(0), self.repo._get_revision(1)))
+            ['diff', '-U3', '--full-index', '--binary', '-p', '-M', '--abbrev=40',
+             self.repo._get_revision(0), self.repo._get_revision(1), '--', 'foo'])
 
 
-class GitRegressionTest(BackendTestMixin, unittest.TestCase):
+class GitRegressionTest(_BackendTestMixin, unittest.TestCase):
     backend_alias = 'git'
 
     @classmethod
@@ -730,5 +754,81 @@
         self.assertEqual(paths(*cs.get_nodes('bot/build/templates')), ['bot/build/templates/err.html', 'bot/build/templates/err2.html'])
         self.assertEqual(paths(*cs.get_nodes('bot/templates/')), ['bot/templates/404.html', 'bot/templates/500.html'])
 
+
+class GitHooksTest(unittest.TestCase):
+    """
+    Tests related to hook functionality of Git repositories.
+    """
+
+    def setUp(self):
+        # For each run we want a fresh repo.
+        self.repo_directory = get_new_dir("githookrepo")
+        self.repo = GitRepository(self.repo_directory, create=True)
+
+        # Create a dictionary where keys are hook names, and values are paths to
+        # them. Deduplicates code in tests a bit.
+        self.hook_directory = self.repo.get_hook_location()
+        self.kallithea_hooks = {h: os.path.join(self.hook_directory, h) for h in ("pre-receive", "post-receive")}
+
+    def test_hooks_created_if_missing(self):
+        """
+        Tests if hooks are installed in repository if they are missing.
+        """
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            if os.path.exists(hook_path):
+                os.remove(hook_path)
+
+        ScmModel().install_git_hooks(repo=self.repo)
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            self.assertTrue(os.path.exists(hook_path))
+
+    def test_kallithea_hooks_updated(self):
+        """
+        Tests if hooks are updated if they are Kallithea hooks already.
+        """
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            with open(hook_path, "w") as f:
+                f.write("KALLITHEA_HOOK_VER=0.0.0\nJUST_BOGUS")
+
+        ScmModel().install_git_hooks(repo=self.repo)
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            with open(hook_path) as f:
+                self.assertNotIn("JUST_BOGUS", f.read())
+
+    def test_custom_hooks_untouched(self):
+        """
+        Tests if hooks are left untouched if they are not Kallithea hooks.
+        """
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            with open(hook_path, "w") as f:
+                f.write("#!/bin/bash\n#CUSTOM_HOOK")
+
+        ScmModel().install_git_hooks(repo=self.repo)
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            with open(hook_path) as f:
+                self.assertIn("CUSTOM_HOOK", f.read())
+
+    def test_custom_hooks_forced_update(self):
+        """
+        Tests if hooks are forcefully updated even though they are custom hooks.
+        """
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            with open(hook_path, "w") as f:
+                f.write("#!/bin/bash\n#CUSTOM_HOOK")
+
+        ScmModel().install_git_hooks(repo=self.repo, force_create=True)
+
+        for hook, hook_path in self.kallithea_hooks.iteritems():
+            with open(hook_path) as f:
+                self.assertIn("KALLITHEA_HOOK_VER", f.read())
+
+
 if __name__ == '__main__':
     unittest.main()
--- a/kallithea/tests/vcs/test_hg.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_hg.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 
 import os
 from kallithea.lib.vcs.backends.hg import MercurialRepository, MercurialChangeset
--- a/kallithea/tests/vcs/test_inmemchangesets.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_inmemchangesets.py	Sun Sep 06 23:36:05 2015 +0200
@@ -2,7 +2,6 @@
 """
 Tests so called "in memory changesets" commit API of vcs.
 """
-from __future__ import with_statement
 
 import time
 import datetime
@@ -357,7 +356,7 @@
         Returns newly created repository's directory.
         """
         backend = self.get_backend()
-        key = '%s-%s' % (backend.alias, str(time.time()))
+        key = '%s-%s' % (self.backend_alias, str(time.time()))
         repo_path = get_new_dir(key)
         return repo_path
 
--- a/kallithea/tests/vcs/test_nodes.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_nodes.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 
 import stat
 from kallithea.lib.vcs.nodes import DirNode
--- a/kallithea/tests/vcs/test_repository.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_repository.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,6 +1,5 @@
-from __future__ import with_statement
 import datetime
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 from kallithea.tests.vcs.conf import TEST_USER_CONFIG_FILE
 from kallithea.lib.vcs.nodes import FileNode
@@ -8,7 +7,7 @@
 from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError
 
 
-class RepositoryBaseTest(BackendTestMixin):
+class RepositoryBaseTest(_BackendTestMixin):
     recreate_repo_per_test = False
 
     @classmethod
@@ -46,7 +45,7 @@
         self.assertTrue(self.repo != dummy())
 
 
-class RepositoryGetDiffTest(BackendTestMixin):
+class RepositoryGetDiffTest(_BackendTestMixin):
 
     @classmethod
     def _get_commits(cls):
--- a/kallithea/tests/vcs/test_tags.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_tags.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,13 +1,12 @@
-from __future__ import with_statement
 
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 from kallithea.lib.vcs.exceptions import TagAlreadyExistError
 from kallithea.lib.vcs.exceptions import TagDoesNotExistError
 from kallithea.lib.vcs.utils.compat import unittest
 
 
-class TagsTestCaseMixin(BackendTestMixin):
+class TagsTestCaseMixin(_BackendTestMixin):
 
     def test_new_tag(self):
         tip = self.repo.get_changeset()
--- a/kallithea/tests/vcs/test_utils.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_utils.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 
 import os
 import mock
@@ -185,14 +184,14 @@
 
 
 class TestAuthorExtractors(unittest.TestCase):
-    TEST_AUTHORS = [('Marcin Kuzminski <marcin@python-works.com>',
-                    ('Marcin Kuzminski', 'marcin@python-works.com')),
-                  ('Marcin Kuzminski Spaces < marcin@python-works.com >',
-                    ('Marcin Kuzminski Spaces', 'marcin@python-works.com')),
-                  ('Marcin Kuzminski <marcin.kuzminski@python-works.com>',
-                    ('Marcin Kuzminski', 'marcin.kuzminski@python-works.com')),
-                  ('mrf RFC_SPEC <marcin+kuzminski@python-works.com>',
-                    ('mrf RFC_SPEC', 'marcin+kuzminski@python-works.com')),
+    TEST_AUTHORS = [("Username Last'o'Name <username@python-works.com>",
+                    ("Username Last'o'Name", "username@python-works.com")),
+                  ("Username Last'o'Name Spaces < username@python-works.com >",
+                    ("Username Last'o'Name Spaces", "username@python-works.com")),
+                  ("Username Last'o'Name <username.lastname@python-works.com>",
+                    ("Username Last'o'Name", "username.lastname@python-works.com")),
+                  ('mrf RFC_SPEC <username+lastname@python-works.com>',
+                    ('mrf RFC_SPEC', 'username+lastname@python-works.com')),
                   ('username <user@email.com>',
                     ('username', 'user@email.com')),
                   ('username <user@email.com',
--- a/kallithea/tests/vcs/test_utils_filesize.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_utils_filesize.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 
 from kallithea.lib.vcs.utils.filesize import filesizeformat
 from kallithea.lib.vcs.utils.compat import unittest
--- a/kallithea/tests/vcs/test_vcs.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_vcs.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,4 +1,3 @@
-from __future__ import with_statement
 
 import os
 import shutil
--- a/kallithea/tests/vcs/test_workdirs.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/test_workdirs.py	Sun Sep 06 23:36:05 2015 +0200
@@ -1,13 +1,12 @@
-from __future__ import with_statement
 
 import datetime
 from kallithea.lib.vcs.nodes import FileNode
 from kallithea.lib.vcs.utils.compat import unittest
-from kallithea.tests.vcs.base import BackendTestMixin
+from kallithea.tests.vcs.base import _BackendTestMixin
 from kallithea.tests.vcs.conf import SCM_TESTS
 
 
-class WorkdirTestCaseMixin(BackendTestMixin):
+class WorkdirTestCaseMixin(_BackendTestMixin):
 
     @classmethod
     def _get_commits(cls):
--- a/kallithea/tests/vcs/utils.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/kallithea/tests/vcs/utils.py	Sun Sep 06 23:36:05 2015 +0200
@@ -3,16 +3,11 @@
 functions here are crafted as we don't want to use ``vcs`` to verify tests.
 """
 import os
-import re
 import sys
 
 from subprocess import Popen
 
 
-class VCSTestError(Exception):
-    pass
-
-
 def run_command(cmd, args):
     """
     Runs command on the system with given ``args``.
@@ -58,40 +53,3 @@
         remote = self.remote_repo
         eprint("Fetching repository %s into %s" % (remote, self.test_repo_path))
         run_command(self.clone_cmd,  '%s %s' % (remote, self.test_repo_path))
-
-
-def get_normalized_path(path):
-    """
-    If given path exists, new path would be generated and returned. Otherwise
-    same whats given is returned. Assumes that there would be no more than
-    10000 same named files.
-    """
-    if os.path.exists(path):
-        dir, basename = os.path.split(path)
-        splitted_name = basename.split('.')
-        if len(splitted_name) > 1:
-            ext = splitted_name[-1]
-        else:
-            ext = None
-        name = '.'.join(splitted_name[:-1])
-        matcher = re.compile(r'^.*-(\d{5})$')
-        start = 0
-        m = matcher.match(name)
-        if not m:
-            # Haven't append number yet so return first
-            newname = '%s-00000' % name
-            newpath = os.path.join(dir, newname)
-            if ext:
-                newpath = '.'.join((newpath, ext))
-            return get_normalized_path(newpath)
-        else:
-            start = int(m.group(1)[-5:]) + 1
-            for x in xrange(start, 10000):
-                newname = name[:-5] + str(x).rjust(5, '0')
-                newpath = os.path.join(dir, newname)
-                if ext:
-                    newpath = '.'.join((newpath, ext))
-                if not os.path.exists(newpath):
-                    return newpath
-        raise VCSTestError("Couldn't compute new path for %s" % path)
-    return path
--- a/production.ini	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,582 +0,0 @@
-################################################################################
-################################################################################
-# Kallithea - Example config                                                   #
-# Exactly as generated with "paster make-config Kallithea production.ini"      #
-# using sqlite and kallithea.db .
-# Note: you should generate your own config with your own UUIDs for security   #
-# and consider not using sqlite for production.                                #
-#                                                                              #
-# The %(here)s variable will be replaced with the parent directory of this file#
-################################################################################
-################################################################################
-
-[DEFAULT]
-debug = true
-pdebug = false
-
-################################################################################
-## Uncomment and replace with the address which should receive                ##
-## any error reports after application crash                                  ##
-## Additionally those settings will be used by Kallithea mailing system       ##
-################################################################################
-#email_to = admin@localhost
-#error_email_from = paste_error@localhost
-#app_email_from = kallithea-noreply@localhost
-#error_message =
-#email_prefix = [Kallithea]
-
-#smtp_server = mail.server.com
-#smtp_username =
-#smtp_password =
-#smtp_port =
-#smtp_use_tls = false
-#smtp_use_ssl = true
-## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
-#smtp_auth =
-
-[server:main]
-## PASTE ##
-#use = egg:Paste#http
-## nr of worker threads to spawn
-#threadpool_workers = 5
-## max request before thread respawn
-#threadpool_max_requests = 10
-## option to use threads of process
-#use_threadpool = true
-
-## WAITRESS ##
-use = egg:waitress#main
-## number of worker threads
-threads = 5
-## MAX BODY SIZE 100GB
-max_request_body_size = 107374182400
-## use poll instead of select, fixes fd limits, may not work on old
-## windows systems.
-#asyncore_use_poll = True
-
-## GUNICORN ##
-#use = egg:gunicorn#main
-## number of process workers. You must set `instance_id = *` when this option
-## is set to more than one worker
-#workers = 1
-## process name
-#proc_name = kallithea
-## type of worker class, one of sync, eventlet, gevent, tornado
-## recommended for bigger setup is using of of other than sync one
-#worker_class = sync
-#max_requests = 1000
-## ammount of time a worker can handle request before it gets killed and
-## restarted
-#timeout = 3600
-
-## UWSGI ##
-## run with uwsgi --ini-paste-logged <inifile.ini>
-#[uwsgi]
-#socket = /tmp/uwsgi.sock
-#master = true
-#http = 127.0.0.1:5000
-
-## set as deamon and redirect all output to file
-#daemonize = ./uwsgi_kallithea.log
-
-## master process PID
-#pidfile = ./uwsgi_kallithea.pid
-
-## stats server with workers statistics, use uwsgitop
-## for monitoring, `uwsgitop 127.0.0.1:1717`
-#stats = 127.0.0.1:1717
-#memory-report = true
-
-## log 5XX errors
-#log-5xx = true
-
-## Set the socket listen queue size.
-#listen = 256
-
-## Gracefully Reload workers after the specified amount of managed requests
-## (avoid memory leaks).
-#max-requests = 1000
-
-## enable large buffers
-#buffer-size=65535
-
-## socket and http timeouts ##
-#http-timeout=3600
-#socket-timeout=3600
-
-## Log requests slower than the specified number of milliseconds.
-#log-slow = 10
-
-## Exit if no app can be loaded.
-#need-app = true
-
-## Set lazy mode (load apps in workers instead of master).
-#lazy = true
-
-## scaling ##
-## set cheaper algorithm to use, if not set default will be used
-#cheaper-algo = spare
-
-## minimum number of workers to keep at all times
-#cheaper = 1
-
-## number of workers to spawn at startup
-#cheaper-initial = 1
-
-## maximum number of workers that can be spawned
-#workers = 4
-
-## how many workers should be spawned at a time
-#cheaper-step = 1
-
-## COMMON ##
-host = 127.0.0.1
-port = 5000
-
-## prefix middleware for rc
-#[filter:proxy-prefix]
-#use = egg:PasteDeploy#prefix
-#prefix = /<your-prefix>
-
-[app:main]
-use = egg:kallithea
-## enable proxy prefix middleware
-#filter-with = proxy-prefix
-
-full_stack = true
-static_files = true
-## Available Languages:
-## cs de fr hu ja nl_BE pl pt_BR ru sk zh_CN zh_TW
-lang =
-cache_dir = %(here)s/data
-index_dir = %(here)s/data/index
-
-## perform a full repository scan on each server start, this should be
-## set to false after first startup, to allow faster server restarts.
-initial_repo_scan = false
-
-## uncomment and set this path to use archive download cache
-archive_cache_dir = %(here)s/tarballcache
-
-## change this to unique ID for security
-app_instance_uuid = change-me
-
-## cut off limit for large diffs (size in bytes)
-cut_off_limit = 256000
-
-## use cache version of scm repo everywhere
-vcs_full_cache = true
-
-## force https in Kallithea, fixes https redirects, assumes it's always https
-force_https = false
-
-## use Strict-Transport-Security headers
-use_htsts = false
-
-## number of commits stats will parse on each iteration
-commit_parse_limit = 25
-
-## path to git executable
-git_path = git
-
-## git rev filter option, --all is the default filter, if you need to
-## hide all refs in changelog switch this to --branches --tags
-#git_rev_filter = --branches --tags
-
-## RSS feed options
-rss_cut_off_limit = 256000
-rss_items_per_page = 10
-rss_include_diff = false
-
-## options for showing and identifying changesets
-show_sha_length = 12
-show_revision_number = false
-
-## gist URL alias, used to create nicer urls for gist. This should be an
-## url that does rewrites to _admin/gists/<gistid>.
-## example: http://gist.kallithea.server/{gistid}. Empty means use the internal
-## Kallithea url, ie. http[s]://your.kallithea.server/_admin/gists/<gistid>
-gist_alias_url =
-
-## white list of API enabled controllers. This allows to add list of
-## controllers to which access will be enabled by api_key. eg: to enable
-## api access to raw_files put `FilesController:raw`, to enable access to patches
-## add `ChangesetController:changeset_patch`. This list should be "," separated
-## Syntax is <ControllerClass>:<function>. Check debug logs for generated names
-## Recommended settings below are commented out:
-api_access_controllers_whitelist =
-#    ChangesetController:changeset_patch,
-#    ChangesetController:changeset_raw,
-#    FilesController:raw,
-#    FilesController:archivefile
-
-## default encoding used to convert from and to unicode
-## can be also a comma seperated list of encoding in case of mixed encodings
-default_encoding = utf8
-
-## issue tracker for Kallithea (leave blank to disable, absent for default)
-#bugtracker = https://bitbucket.org/conservancy/kallithea/issues
-
-## issue tracking mapping for commits messages
-## comment out issue_pat, issue_server, issue_prefix to enable
-
-## pattern to get the issues from commit messages
-## default one used here is #<numbers> with a regex passive group for `#`
-## {id} will be all groups matched from this pattern
-
-issue_pat = (?:\s*#)(\d+)
-
-## server url to the issue, each {id} will be replaced with match
-## fetched from the regex and {repo} is replaced with full repository name
-## including groups {repo_name} is replaced with just name of repo
-
-issue_server_link = https://myissueserver.com/{repo}/issue/{id}
-
-## prefix to add to link to indicate it's an url
-## #314 will be replaced by <issue_prefix><id>
-
-issue_prefix = #
-
-## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
-## multiple patterns, to other issues server, wiki or others
-## below an example how to create a wiki pattern
-# wiki-some-id -> https://mywiki.com/some-id
-
-#issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://mywiki.com/{id}
-#issue_prefix_wiki = WIKI-
-
-
-## instance-id prefix
-## a prefix key for this instance used for cache invalidation when running
-## multiple instances of kallithea, make sure it's globally unique for
-## all running kallithea instances. Leave empty if you don't use it
-instance_id =
-
-## alternative return HTTP header for failed authentication. Default HTTP
-## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with
-## handling that. Set this variable to 403 to return HTTPForbidden
-auth_ret_code =
-
-## locking return code. When repository is locked return this HTTP code. 2XX
-## codes don't break the transactions while 4XX codes do
-lock_ret_code = 423
-
-## allows to change the repository location in settings page
-allow_repo_location_change = True
-
-## allows to setup custom hooks in settings page
-allow_custom_hooks_settings = True
-
-
-####################################
-###        CELERY CONFIG        ####
-####################################
-
-use_celery = false
-broker.host = localhost
-broker.vhost = rabbitmqhost
-broker.port = 5672
-broker.user = rabbitmq
-broker.password = qweqwe
-
-celery.imports = kallithea.lib.celerylib.tasks
-
-celery.result.backend = amqp
-celery.result.dburi = amqp://
-celery.result.serialier = json
-
-#celery.send.task.error.emails = true
-#celery.amqp.task.result.expires = 18000
-
-celeryd.concurrency = 2
-#celeryd.log.file = celeryd.log
-celeryd.log.level = DEBUG
-celeryd.max.tasks.per.child = 1
-
-## tasks will never be sent to the queue, but executed locally instead.
-celery.always.eager = false
-
-####################################
-###         BEAKER CACHE        ####
-####################################
-
-beaker.cache.data_dir=%(here)s/data/cache/data
-beaker.cache.lock_dir=%(here)s/data/cache/lock
-
-beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
-
-beaker.cache.super_short_term.type=memory
-beaker.cache.super_short_term.expire=10
-beaker.cache.super_short_term.key_length = 256
-
-beaker.cache.short_term.type=memory
-beaker.cache.short_term.expire=60
-beaker.cache.short_term.key_length = 256
-
-beaker.cache.long_term.type=memory
-beaker.cache.long_term.expire=36000
-beaker.cache.long_term.key_length = 256
-
-beaker.cache.sql_cache_short.type=memory
-beaker.cache.sql_cache_short.expire=10
-beaker.cache.sql_cache_short.key_length = 256
-
-beaker.cache.sql_cache_med.type=memory
-beaker.cache.sql_cache_med.expire=360
-beaker.cache.sql_cache_med.key_length = 256
-
-beaker.cache.sql_cache_long.type=file
-beaker.cache.sql_cache_long.expire=3600
-beaker.cache.sql_cache_long.key_length = 256
-
-####################################
-###       BEAKER SESSION        ####
-####################################
-## Type of storage used for the session, current types are
-## dbm, file, memcached, database, and memory.
-## The storage uses the Container API
-## that is also used by the cache system.
-
-## db session ##
-#beaker.session.type = ext:database
-#beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
-#beaker.session.table_name = db_session
-
-## encrypted cookie client side session, good for many instances ##
-#beaker.session.type = cookie
-
-## file based cookies (default) ##
-#beaker.session.type = file
-
-## beaker.session.key should be unique for a given host, even when running
-## on different ports. Otherwise, cookie sessions will be shared and messed up.
-beaker.session.key = kallithea
-beaker.session.secret = change-me
-
-## Secure encrypted cookie. Requires AES and AES python libraries
-## you must disable beaker.session.secret to use this
-#beaker.session.encrypt_key = <key_for_encryption>
-#beaker.session.validate_key = <validation_key>
-
-## sets session as invalid if it haven't been accessed for given amount of time
-beaker.session.timeout = 2592000
-beaker.session.httponly = true
-#beaker.session.cookie_path = /<your-prefix>
-
-## uncomment for https secure cookie
-beaker.session.secure = false
-
-## auto save the session to not to use .save()
-beaker.session.auto = False
-
-## default cookie expiration time in seconds `true` expire at browser close ##
-#beaker.session.cookie_expires = 3600
-
-
-############################
-## ERROR HANDLING SYSTEMS ##
-############################
-
-####################
-### [errormator] ###
-####################
-
-## Errormator is tailored to work with Kallithea, see
-## http://errormator.com for details how to obtain an account
-## you must install python package `errormator_client` to make it work
-
-## errormator enabled
-errormator = false
-
-errormator.server_url = https://api.errormator.com
-errormator.api_key = YOUR_API_KEY
-
-## TWEAK AMOUNT OF INFO SENT HERE
-
-## enables 404 error logging (default False)
-errormator.report_404 = false
-
-## time in seconds after request is considered being slow (default 1)
-errormator.slow_request_time = 1
-
-## record slow requests in application
-## (needs to be enabled for slow datastore recording and time tracking)
-errormator.slow_requests = true
-
-## enable hooking to application loggers
-# errormator.logging = true
-
-## minimum log level for log capture
-# errormator.logging.level = WARNING
-
-## send logs only from erroneous/slow requests
-## (saves API quota for intensive logging)
-errormator.logging_on_error = false
-
-## list of additonal keywords that should be grabbed from environ object
-## can be string with comma separated list of words in lowercase
-## (by default client will always send following info:
-## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
-## start with HTTP* this list be extended with additional keywords here
-errormator.environ_keys_whitelist =
-
-
-## list of keywords that should be blanked from request object
-## can be string with comma separated list of words in lowercase
-## (by default client will always blank keys that contain following words
-## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
-## this list be extended with additional keywords set here
-errormator.request_keys_blacklist =
-
-
-## list of namespaces that should be ignores when gathering log entries
-## can be string with comma separated list of namespaces
-## (by default the client ignores own entries: errormator_client.client)
-errormator.log_namespace_blacklist =
-
-
-################
-### [sentry] ###
-################
-
-## sentry is a alternative open source error aggregator
-## you must install python packages `sentry` and `raven` to enable
-
-sentry.dsn = YOUR_DNS
-sentry.servers =
-sentry.name =
-sentry.key =
-sentry.public_key =
-sentry.secret_key =
-sentry.project =
-sentry.site =
-sentry.include_paths =
-sentry.exclude_paths =
-
-
-################################################################################
-## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
-## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
-## execute malicious code after an exception is raised.                       ##
-################################################################################
-set debug = false
-
-##################################
-###       LOGVIEW CONFIG       ###
-##################################
-
-logview.sqlalchemy = #faa
-logview.pylons.templating = #bfb
-logview.pylons.util = #eee
-
-#########################################################
-### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
-#########################################################
-
-# SQLITE [default]
-sqlalchemy.db1.url = sqlite:///%(here)s/kallithea.db?timeout=60
-
-# POSTGRESQL
-# sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
-
-# MySQL
-# sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
-
-# see sqlalchemy docs for others
-
-sqlalchemy.db1.echo = false
-sqlalchemy.db1.pool_recycle = 3600
-sqlalchemy.db1.convert_unicode = true
-
-################################
-### LOGGING CONFIGURATION   ####
-################################
-
-[loggers]
-keys = root, routes, kallithea, sqlalchemy, beaker, templates, whoosh_indexer
-
-[handlers]
-keys = console, console_sql
-
-[formatters]
-keys = generic, color_formatter, color_formatter_sql
-
-#############
-## LOGGERS ##
-#############
-
-[logger_root]
-level = NOTSET
-handlers = console
-
-[logger_routes]
-level = DEBUG
-handlers =
-qualname = routes.middleware
-## "level = DEBUG" logs the route matched and routing variables.
-propagate = 1
-
-[logger_beaker]
-level = DEBUG
-handlers =
-qualname = beaker.container
-propagate = 1
-
-[logger_templates]
-level = INFO
-handlers =
-qualname = pylons.templating
-propagate = 1
-
-[logger_kallithea]
-level = DEBUG
-handlers =
-qualname = kallithea
-propagate = 1
-
-[logger_sqlalchemy]
-level = INFO
-handlers = console_sql
-qualname = sqlalchemy.engine
-propagate = 0
-
-[logger_whoosh_indexer]
-level = DEBUG
-handlers =
-qualname = whoosh_indexer
-propagate = 1
-
-##############
-## HANDLERS ##
-##############
-
-[handler_console]
-class = StreamHandler
-args = (sys.stderr,)
-level = INFO
-formatter = generic
-
-[handler_console_sql]
-class = StreamHandler
-args = (sys.stderr,)
-level = WARN
-formatter = generic
-
-################
-## FORMATTERS ##
-################
-
-[formatter_generic]
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter]
-class=kallithea.lib.colored_formatter.ColorFormatter
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter_sql]
-class=kallithea.lib.colored_formatter.ColorFormatterSql
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
--- a/setup.cfg	Mon Jul 20 15:07:23 2015 +0200
+++ b/setup.cfg	Sun Sep 06 23:36:05 2015 +0200
@@ -1,15 +1,25 @@
 [egg_info]
-tag_build = 
+tag_build =
 tag_svn_revision = 0
 tag_date = 0
 
 [nosetests]
 verbose = True
 verbosity = 2
-with-pylons = test.ini
+with-pylons = kallithea/tests/test.ini
 detailed-errors = 1
 nologcapture = 1
 
+[pytest]
+# only look for tests in kallithea/tests
+python_files = kallithea/tests/**/test_*.py
+addopts =
+    # --verbose
+    # show extra test summary info as specified by chars (f)ailed, (E)error, (s)skipped, (x)failed, (X)passed, (w)warnings.
+    -rfEsxXw
+    # Shorter scrollbacks; less stuff to scroll through
+    --tb=short
+
 [compile_catalog]
 domain = kallithea
 directory = kallithea/i18n
@@ -40,4 +50,3 @@
 
 [upload_sphinx]
 upload-dir = docs/_build/html
-
--- a/setup.py	Mon Jul 20 15:07:23 2015 +0200
+++ b/setup.py	Sun Sep 06 23:36:05 2015 +0200
@@ -36,9 +36,9 @@
 
 requirements = [
     "waitress==0.8.8",
-    "webob==1.0.8",
+    "webob>=1.0.8,<=1.1.1",
     "webtest==1.4.3",
-    "Pylons==1.0.0",
+    "Pylons>=1.0.0,<=1.0.2",
     "Beaker==1.6.4",
     "WebHelpers==1.3",
     "formencode>=1.2.4,<=1.2.6",
@@ -51,12 +51,11 @@
     "python-dateutil>=1.5.0,<2.0.0",
     "markdown==2.2.1",
     "docutils>=0.8.1,<=0.11",
-    "simplejson==2.5.2",
     "mock",
-    "pycrypto>=2.6.0,<=2.6.1",
     "URLObject==2.3.4",
     "Routes==1.13",
     "dulwich>=0.9.9,<=0.9.9",
+    "mercurial>=2.9,<3.6",
 ]
 
 if sys.version_info < (2, 7):
@@ -64,7 +63,6 @@
     requirements.append("unittest2")
     requirements.append("argparse")
 
-requirements.append("mercurial>=2.9,<3.4")
 if not is_windows:
     requirements.append("py-bcrypt>=0.3.0,<=0.4")
 
@@ -110,7 +108,7 @@
     long_description = open(README_FILE).read() + '\n\n' + \
         open(CHANGELOG_FILE).read()
 
-except IOError, err:
+except IOError as err:
     sys.stderr.write(
         "[WARNING] Cannot find file specified as long_description (%s)\n or "
         "changelog (%s) skipping that file" % (README_FILE, CHANGELOG_FILE)
@@ -176,5 +174,8 @@
     upgrade-db=kallithea.lib.dbmigrate:UpgradeDb
     celeryd=kallithea.lib.celerypylons.commands:CeleryDaemonCommand
     install-iis=kallithea.lib.paster_commands.install_iis:Command
+
+    [nose.plugins]
+    pylons = pylons.test:PylonsPlugin
     """,
 )
--- a/test.ini	Mon Jul 20 15:07:23 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,589 +0,0 @@
-################################################################################
-################################################################################
-# Kallithea - config for tests:                                                #
-# initial_repo_scan = true                                                     #
-# vcs_full_cache = false                                                       #
-# sqlalchemy and kallithea_test.sqlite                                         #
-# custom logging                                                               #
-#                                                                              #
-# The %(here)s variable will be replaced with the parent directory of this file#
-################################################################################
-################################################################################
-
-[DEFAULT]
-debug = true
-pdebug = false
-
-################################################################################
-## Uncomment and replace with the address which should receive                ##
-## any error reports after application crash                                  ##
-## Additionally those settings will be used by Kallithea mailing system       ##
-################################################################################
-#email_to = admin@localhost
-#error_email_from = paste_error@localhost
-#app_email_from = kallithea-noreply@localhost
-#error_message =
-#email_prefix = [Kallithea]
-
-#smtp_server = mail.server.com
-#smtp_username =
-#smtp_password =
-#smtp_port =
-#smtp_use_tls = false
-#smtp_use_ssl = true
-## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
-#smtp_auth =
-
-[server:main]
-## PASTE ##
-#use = egg:Paste#http
-## nr of worker threads to spawn
-#threadpool_workers = 5
-## max request before thread respawn
-#threadpool_max_requests = 10
-## option to use threads of process
-#use_threadpool = true
-
-## WAITRESS ##
-use = egg:waitress#main
-## number of worker threads
-threads = 5
-## MAX BODY SIZE 100GB
-max_request_body_size = 107374182400
-## use poll instead of select, fixes fd limits, may not work on old
-## windows systems.
-#asyncore_use_poll = True
-
-## GUNICORN ##
-#use = egg:gunicorn#main
-## number of process workers. You must set `instance_id = *` when this option
-## is set to more than one worker
-#workers = 1
-## process name
-#proc_name = kallithea
-## type of worker class, one of sync, eventlet, gevent, tornado
-## recommended for bigger setup is using of of other than sync one
-#worker_class = sync
-#max_requests = 1000
-## ammount of time a worker can handle request before it gets killed and
-## restarted
-#timeout = 3600
-
-## UWSGI ##
-## run with uwsgi --ini-paste-logged <inifile.ini>
-#[uwsgi]
-#socket = /tmp/uwsgi.sock
-#master = true
-#http = 127.0.0.1:5000
-
-## set as deamon and redirect all output to file
-#daemonize = ./uwsgi_kallithea.log
-
-## master process PID
-#pidfile = ./uwsgi_kallithea.pid
-
-## stats server with workers statistics, use uwsgitop
-## for monitoring, `uwsgitop 127.0.0.1:1717`
-#stats = 127.0.0.1:1717
-#memory-report = true
-
-## log 5XX errors
-#log-5xx = true
-
-## Set the socket listen queue size.
-#listen = 256
-
-## Gracefully Reload workers after the specified amount of managed requests
-## (avoid memory leaks).
-#max-requests = 1000
-
-## enable large buffers
-#buffer-size=65535
-
-## socket and http timeouts ##
-#http-timeout=3600
-#socket-timeout=3600
-
-## Log requests slower than the specified number of milliseconds.
-#log-slow = 10
-
-## Exit if no app can be loaded.
-#need-app = true
-
-## Set lazy mode (load apps in workers instead of master).
-#lazy = true
-
-## scaling ##
-## set cheaper algorithm to use, if not set default will be used
-#cheaper-algo = spare
-
-## minimum number of workers to keep at all times
-#cheaper = 1
-
-## number of workers to spawn at startup
-#cheaper-initial = 1
-
-## maximum number of workers that can be spawned
-#workers = 4
-
-## how many workers should be spawned at a time
-#cheaper-step = 1
-
-## COMMON ##
-host = 127.0.0.1
-port = 5000
-
-## prefix middleware for rc
-#[filter:proxy-prefix]
-#use = egg:PasteDeploy#prefix
-#prefix = /<your-prefix>
-
-[app:main]
-use = egg:kallithea
-## enable proxy prefix middleware
-#filter-with = proxy-prefix
-
-full_stack = true
-static_files = true
-## Available Languages:
-## cs de fr hu ja nl_BE pl pt_BR ru sk zh_CN zh_TW
-lang =
-cache_dir = %(here)s/data
-index_dir = %(here)s/data/index
-
-## perform a full repository scan on each server start, this should be
-## set to false after first startup, to allow faster server restarts.
-#initial_repo_scan = false
-initial_repo_scan = true
-
-## uncomment and set this path to use archive download cache
-archive_cache_dir = %(here)s/tarballcache
-
-## change this to unique ID for security
-app_instance_uuid = test
-
-## cut off limit for large diffs (size in bytes)
-cut_off_limit = 256000
-
-## use cache version of scm repo everywhere
-#vcs_full_cache = true
-vcs_full_cache = false
-
-## force https in Kallithea, fixes https redirects, assumes it's always https
-force_https = false
-
-## use Strict-Transport-Security headers
-use_htsts = false
-
-## number of commits stats will parse on each iteration
-commit_parse_limit = 25
-
-## path to git executable
-git_path = git
-
-## git rev filter option, --all is the default filter, if you need to
-## hide all refs in changelog switch this to --branches --tags
-#git_rev_filter = --branches --tags
-
-## RSS feed options
-rss_cut_off_limit = 256000
-rss_items_per_page = 10
-rss_include_diff = false
-
-## options for showing and identifying changesets
-show_sha_length = 12
-show_revision_number = true
-
-## gist URL alias, used to create nicer urls for gist. This should be an
-## url that does rewrites to _admin/gists/<gistid>.
-## example: http://gist.kallithea.server/{gistid}. Empty means use the internal
-## Kallithea url, ie. http[s]://your.kallithea.server/_admin/gists/<gistid>
-gist_alias_url =
-
-## white list of API enabled controllers. This allows to add list of
-## controllers to which access will be enabled by api_key. eg: to enable
-## api access to raw_files put `FilesController:raw`, to enable access to patches
-## add `ChangesetController:changeset_patch`. This list should be "," separated
-## Syntax is <ControllerClass>:<function>. Check debug logs for generated names
-## Recommended settings below are commented out:
-api_access_controllers_whitelist =
-#    ChangesetController:changeset_patch,
-#    ChangesetController:changeset_raw,
-#    FilesController:raw,
-#    FilesController:archivefile
-
-## default encoding used to convert from and to unicode
-## can be also a comma seperated list of encoding in case of mixed encodings
-default_encoding = utf8
-
-## issue tracker for Kallithea (leave blank to disable, absent for default)
-#bugtracker = https://bitbucket.org/conservancy/kallithea/issues
-
-## issue tracking mapping for commits messages
-## comment out issue_pat, issue_server, issue_prefix to enable
-
-## pattern to get the issues from commit messages
-## default one used here is #<numbers> with a regex passive group for `#`
-## {id} will be all groups matched from this pattern
-
-issue_pat = (?:\s*#)(\d+)
-
-## server url to the issue, each {id} will be replaced with match
-## fetched from the regex and {repo} is replaced with full repository name
-## including groups {repo_name} is replaced with just name of repo
-
-issue_server_link = https://myissueserver.com/{repo}/issue/{id}
-
-## prefix to add to link to indicate it's an url
-## #314 will be replaced by <issue_prefix><id>
-
-issue_prefix = #
-
-## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
-## multiple patterns, to other issues server, wiki or others
-## below an example how to create a wiki pattern
-# wiki-some-id -> https://mywiki.com/some-id
-
-#issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://mywiki.com/{id}
-#issue_prefix_wiki = WIKI-
-
-
-## instance-id prefix
-## a prefix key for this instance used for cache invalidation when running
-## multiple instances of kallithea, make sure it's globally unique for
-## all running kallithea instances. Leave empty if you don't use it
-instance_id =
-
-## alternative return HTTP header for failed authentication. Default HTTP
-## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with
-## handling that. Set this variable to 403 to return HTTPForbidden
-auth_ret_code =
-
-## locking return code. When repository is locked return this HTTP code. 2XX
-## codes don't break the transactions while 4XX codes do
-lock_ret_code = 423
-
-## allows to change the repository location in settings page
-allow_repo_location_change = True
-
-## allows to setup custom hooks in settings page
-allow_custom_hooks_settings = True
-
-
-####################################
-###        CELERY CONFIG        ####
-####################################
-
-use_celery = false
-broker.host = localhost
-broker.vhost = rabbitmqhost
-broker.port = 5672
-broker.user = rabbitmq
-broker.password = qweqwe
-
-celery.imports = kallithea.lib.celerylib.tasks
-
-celery.result.backend = amqp
-celery.result.dburi = amqp://
-celery.result.serialier = json
-
-#celery.send.task.error.emails = true
-#celery.amqp.task.result.expires = 18000
-
-celeryd.concurrency = 2
-#celeryd.log.file = celeryd.log
-celeryd.log.level = DEBUG
-celeryd.max.tasks.per.child = 1
-
-## tasks will never be sent to the queue, but executed locally instead.
-celery.always.eager = false
-
-####################################
-###         BEAKER CACHE        ####
-####################################
-
-beaker.cache.data_dir=%(here)s/data/cache/data
-beaker.cache.lock_dir=%(here)s/data/cache/lock
-
-beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
-
-beaker.cache.super_short_term.type=memory
-beaker.cache.super_short_term.expire=10
-beaker.cache.super_short_term.key_length = 256
-
-beaker.cache.short_term.type=memory
-beaker.cache.short_term.expire=60
-beaker.cache.short_term.key_length = 256
-
-beaker.cache.long_term.type=memory
-beaker.cache.long_term.expire=36000
-beaker.cache.long_term.key_length = 256
-
-beaker.cache.sql_cache_short.type=memory
-beaker.cache.sql_cache_short.expire=1
-beaker.cache.sql_cache_short.key_length = 256
-
-beaker.cache.sql_cache_med.type=memory
-beaker.cache.sql_cache_med.expire=360
-beaker.cache.sql_cache_med.key_length = 256
-
-beaker.cache.sql_cache_long.type=file
-beaker.cache.sql_cache_long.expire=3600
-beaker.cache.sql_cache_long.key_length = 256
-
-####################################
-###       BEAKER SESSION        ####
-####################################
-## Type of storage used for the session, current types are
-## dbm, file, memcached, database, and memory.
-## The storage uses the Container API
-## that is also used by the cache system.
-
-## db session ##
-#beaker.session.type = ext:database
-#beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
-#beaker.session.table_name = db_session
-
-## encrypted cookie client side session, good for many instances ##
-#beaker.session.type = cookie
-
-## file based cookies (default) ##
-#beaker.session.type = file
-
-## beaker.session.key should be unique for a given host, even when running
-## on different ports. Otherwise, cookie sessions will be shared and messed up.
-beaker.session.key = kallithea
-beaker.session.secret = {74e0cd75-b339-478b-b129-07dd221def1f}
-
-## Secure encrypted cookie. Requires AES and AES python libraries
-## you must disable beaker.session.secret to use this
-#beaker.session.encrypt_key = <key_for_encryption>
-#beaker.session.validate_key = <validation_key>
-
-## sets session as invalid if it haven't been accessed for given amount of time
-beaker.session.timeout = 2592000
-beaker.session.httponly = true
-#beaker.session.cookie_path = /<your-prefix>
-
-## uncomment for https secure cookie
-beaker.session.secure = false
-
-## auto save the session to not to use .save()
-beaker.session.auto = False
-
-## default cookie expiration time in seconds `true` expire at browser close ##
-#beaker.session.cookie_expires = 3600
-
-
-############################
-## ERROR HANDLING SYSTEMS ##
-############################
-
-####################
-### [errormator] ###
-####################
-
-## Errormator is tailored to work with Kallithea, see
-## http://errormator.com for details how to obtain an account
-## you must install python package `errormator_client` to make it work
-
-## errormator enabled
-errormator = false
-
-errormator.server_url = https://api.errormator.com
-errormator.api_key = YOUR_API_KEY
-
-## TWEAK AMOUNT OF INFO SENT HERE
-
-## enables 404 error logging (default False)
-errormator.report_404 = false
-
-## time in seconds after request is considered being slow (default 1)
-errormator.slow_request_time = 1
-
-## record slow requests in application
-## (needs to be enabled for slow datastore recording and time tracking)
-errormator.slow_requests = true
-
-## enable hooking to application loggers
-# errormator.logging = true
-
-## minimum log level for log capture
-# errormator.logging.level = WARNING
-
-## send logs only from erroneous/slow requests
-## (saves API quota for intensive logging)
-errormator.logging_on_error = false
-
-## list of additonal keywords that should be grabbed from environ object
-## can be string with comma separated list of words in lowercase
-## (by default client will always send following info:
-## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
-## start with HTTP* this list be extended with additional keywords here
-errormator.environ_keys_whitelist =
-
-
-## list of keywords that should be blanked from request object
-## can be string with comma separated list of words in lowercase
-## (by default client will always blank keys that contain following words
-## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
-## this list be extended with additional keywords set here
-errormator.request_keys_blacklist =
-
-
-## list of namespaces that should be ignores when gathering log entries
-## can be string with comma separated list of namespaces
-## (by default the client ignores own entries: errormator_client.client)
-errormator.log_namespace_blacklist =
-
-
-################
-### [sentry] ###
-################
-
-## sentry is a alternative open source error aggregator
-## you must install python packages `sentry` and `raven` to enable
-
-sentry.dsn = YOUR_DNS
-sentry.servers =
-sentry.name =
-sentry.key =
-sentry.public_key =
-sentry.secret_key =
-sentry.project =
-sentry.site =
-sentry.include_paths =
-sentry.exclude_paths =
-
-
-################################################################################
-## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
-## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
-## execute malicious code after an exception is raised.                       ##
-################################################################################
-set debug = false
-
-##################################
-###       LOGVIEW CONFIG       ###
-##################################
-
-logview.sqlalchemy = #faa
-logview.pylons.templating = #bfb
-logview.pylons.util = #eee
-
-#########################################################
-### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
-#########################################################
-
-# SQLITE [default]
-#sqlalchemy.db1.url = sqlite:///%(here)s/kallithea.db?timeout=60
-sqlalchemy.db1.url = sqlite:///%(here)s/kallithea_test.sqlite
-
-# POSTGRESQL
-# sqlalchemy.db1.url = postgresql://user:pass@localhost/kallithea
-
-# MySQL
-# sqlalchemy.db1.url = mysql://user:pass@localhost/kallithea
-
-# see sqlalchemy docs for others
-
-sqlalchemy.db1.echo = false
-sqlalchemy.db1.pool_recycle = 3600
-sqlalchemy.db1.convert_unicode = true
-
-################################
-### LOGGING CONFIGURATION   ####
-################################
-
-[loggers]
-keys = root, routes, kallithea, sqlalchemy, beaker, templates, whoosh_indexer
-
-[handlers]
-keys = console, console_sql
-
-[formatters]
-keys = generic, color_formatter, color_formatter_sql
-
-#############
-## LOGGERS ##
-#############
-
-[logger_root]
-#level = NOTSET
-level = DEBUG
-handlers = console
-
-[logger_routes]
-level = DEBUG
-handlers =
-qualname = routes.middleware
-## "level = DEBUG" logs the route matched and routing variables.
-propagate = 1
-
-[logger_beaker]
-level = DEBUG
-handlers =
-qualname = beaker.container
-propagate = 1
-
-[logger_templates]
-level = INFO
-handlers =
-qualname = pylons.templating
-propagate = 1
-
-[logger_kallithea]
-level = DEBUG
-handlers =
-qualname = kallithea
-propagate = 1
-
-[logger_sqlalchemy]
-#level = INFO
-#handlers = console_sql
-level = ERROR
-handlers = console
-qualname = sqlalchemy.engine
-propagate = 0
-
-[logger_whoosh_indexer]
-level = DEBUG
-handlers =
-qualname = whoosh_indexer
-propagate = 1
-
-##############
-## HANDLERS ##
-##############
-
-[handler_console]
-class = StreamHandler
-args = (sys.stderr,)
-#level = INFO
-level = NOTSET
-formatter = generic
-
-[handler_console_sql]
-class = StreamHandler
-args = (sys.stderr,)
-level = WARN
-formatter = generic
-
-################
-## FORMATTERS ##
-################
-
-[formatter_generic]
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter]
-class=kallithea.lib.colored_formatter.ColorFormatter
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter_sql]
-class=kallithea.lib.colored_formatter.ColorFormatterSql
-format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tox.ini	Sun Sep 06 23:36:05 2015 +0200
@@ -0,0 +1,13 @@
+[tox]
+minversion = 1.8
+envlist = py{26,27}-{pytest,nose}
+
+[testenv]
+setenv =
+    PYTHONHASHSEED = 0
+deps =
+    nose: nose
+    pytest: pytest
+commands =
+    nose: nosetests {posargs}
+    pytest: py.test {posargs}
--- a/whitespacecleanup.sh	Mon Jul 20 15:07:23 2015 +0200
+++ b/whitespacecleanup.sh	Sun Sep 06 23:36:05 2015 +0200
@@ -2,17 +2,23 @@
 
 # Enforce some consistency in whitespace - just to avoid spurious whitespaces changes
 
-files=`hg loc '*.py' '*.html' '*.css' '*.rst' '*.txt' '*.js' | egrep -v '/lockfiles.py|LICENSE-MERGELY.html|/codemirror/|/fontello/|(graph|mergely|native.history|select2/select2|yui.flot)\.js$'`
-sed -i "s,`printf '\t'`,    ,g" $files
-sed -i "s,  *$,,g" $files
+files=`hg loc '*.py' '*.html' '*.css' '*.rst' '*.txt' '*.js' '*.ini' '*.cfg' CONTRIBUTORS LICENSE.md| egrep -v '/lockfiles.py|LICENSE-MERGELY.html|/codemirror/|/fontello/|(graph|mergely|native.history|select2/select2|yui.flot|yui.2.9)\.js$'`
+
+sed -i -e "s,`printf '\t'`,    ,g" $files
+sed -i -e "s,  *$,,g" $files
+# ensure one trailing newline - remove empty last line and make last line include trailing newline:
+sed -i -e '$,${/^$/d}' -e '$a\' $files
 
-sed -i 's,\([^ /]\){,\1 {,g' `hg loc '*.css'`
-sed -i 's|^\([^ /].*,\)\([^ ]\)|\1 \2|g' `hg loc '*.css'`
+sed -i -e 's,\([^ /]\){,\1 {,g' `hg loc '*.css'`
+sed -i -e 's|^\([^ /].*,\)\([^ ]\)|\1 \2|g' `hg loc '*.css'`
 
-sed -i 's/^\(    [^: ]*\) *: *\([^/]\)/\1: \2/g' kallithea/public/css/{style,contextbar}.css
-sed -i '1s|, |,|g' kallithea/public/css/{style,contextbar}.css
-sed -i 's/^\([^ ,/]\+ [^,]*[^ ,]\) *, *\(.\)/\1,\n\2/g' kallithea/public/css/{style,contextbar}.css
-sed -i 's/^\([^ ,/].*\)   */\1 /g' kallithea/public/css/{style,contextbar}.css
-sed -i 's,^--$,-- ,g' kallithea/templates/email_templates/main.txt
+sed -i -e 's/^\(    [^: ]*\) *: *\([^/]\)/\1: \2/g' kallithea/public/css/{style,contextbar}.css
+sed -i -e '1s|, |,|g' kallithea/public/css/{style,contextbar}.css
+sed -i -e 's/^\([^ ,/]\+ [^,]*[^ ,]\) *, *\(.\)/\1,\n\2/g' kallithea/public/css/{style,contextbar}.css
+sed -i -e 's/^\([^ ,/].*\)   */\1 /g' kallithea/public/css/{style,contextbar}.css
+sed -i -e 's,^--$,-- ,g' kallithea/templates/email_templates/main.txt
+
+hg mani | xargs chmod -x
+hg loc 'set:!binary()&grep("^#!")&!(**_tmpl.py)&!(**/template**)' | xargs chmod +x
 
 hg diff