diff --git a/_test/core/DokuWikiTest.php b/_test/core/DokuWikiTest.php
index 4e40d510ae3f48b928318f34f20f4a3e7cb458b9..5f085a7c20e575ff3967e589c8bbed1b07a92631 100644
--- a/_test/core/DokuWikiTest.php
+++ b/_test/core/DokuWikiTest.php
@@ -73,7 +73,15 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
                 }
             }
         }
+        // reload some settings
+        $conf['gzip_output'] &= (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false);
 
+        if($conf['compression'] == 'bz2' && !DOKU_HAS_BZIP) {
+            $conf['compression'] = 'gz';
+        }
+        if($conf['compression'] == 'gz' && !DOKU_HAS_GZIP) {
+            $conf['compression'] = 0;
+        }
         // make real paths and check them
         init_paths();
         init_files();
diff --git a/_test/tests/inc/common_pageinfo.test.php b/_test/tests/inc/common_pageinfo.test.php
index 2b230d9ce037fb7279b75f5ad425db9af12f4978..adc9538d2c974569f56f30a797002641aac8c4a3 100644
--- a/_test/tests/inc/common_pageinfo.test.php
+++ b/_test/tests/inc/common_pageinfo.test.php
@@ -128,6 +128,10 @@ class common_pageinfo_test extends DokuWikiTest {
         $filename = $conf['datadir'].'/wiki/syntax.txt';
         $rev = filemtime($filename);
         $REV = $rev - 100;
+        $ext = '.txt';
+        if($conf['compression']) {  //compression in $info['filepath'] determined by wikiFN depends also on if the page exist
+            $ext .= "." . $conf['compression']; //.gz or .bz2
+        }
 
         $info = $this->_get_expected_pageinfo();
         $info['id'] = 'wiki:syntax';
@@ -135,7 +139,7 @@ class common_pageinfo_test extends DokuWikiTest {
         $info['meta'] = p_get_metadata($ID);
         $info['rev'] = $REV;
         $info['currentrev'] = $rev;
-        $info['filepath'] = str_replace('pages','attic',substr($filename,0,-3).$REV.'.txt.gz');
+        $info['filepath'] = str_replace('pages','attic',substr($filename,0,-3).$REV.$ext);
 
         $this->assertEquals($info, pageinfo());
         $this->assertEquals($rev-100, $REV);
diff --git a/_test/tests/inc/common_saveWikiText.test.php b/_test/tests/inc/common_saveWikiText.test.php
index 800e20952be1f760d6195fa62b6a0a796aedf72e..ede0fdf291e49c701a594bf7579fc4094103f382 100644
--- a/_test/tests/inc/common_saveWikiText.test.php
+++ b/_test/tests/inc/common_saveWikiText.test.php
@@ -23,6 +23,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('first save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
+        $this->assertEquals(10, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -36,7 +37,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $this->assertEquals(1, count($revisions));
 
         // update the page with new text
-        saveWikiText($page, 'teststring2', 'third save', false);
+        saveWikiText($page, 'teststring2long', 'third save', false);
         clearstatcache(false, $file);
         $newmod = filemtime($file);
         $this->assertNotEquals($lastmod, $newmod);
@@ -48,11 +49,12 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('third save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(5, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
         // add a minor edit (unauthenticated)
-        saveWikiText($page, 'teststring3', 'fourth save', true);
+        saveWikiText($page, 'teststring3long', 'fourth save', true);
         clearstatcache(false, $file);
         $newmod = filemtime($file);
         $this->assertNotEquals($lastmod, $newmod);
@@ -64,6 +66,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('fourth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -81,6 +84,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('fifth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']);
+        $this->assertEquals(-4, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -95,6 +99,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('sixth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']);
+        $this->assertEquals(-11, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -114,6 +119,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $this->assertEquals('seventh save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']);
         $this->assertEquals($REV, $revinfo['extra']);
+        $this->assertEquals(11, $revinfo['sizechange']);
         $REV = '';
 
         sleep(1); // wait for new revision ID
@@ -136,10 +142,262 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('eigth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
 
         $revinfo = $pagelog->getRevisionInfo($revisions[1]);
         $this->assertEquals('external edit', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
 
     }
+
+    /**
+     * Execute a whole bunch of saves on the same page and check the results
+     */
+    function test_savesequencedeleteexternalrevision() {
+        $page = 'page2';
+        $file = wikiFN($page);
+
+        // create the page
+        $this->assertFileNotExists($file);
+        saveWikiText($page, 'teststring', 'first save', false);
+        $this->assertFileExists($file);
+        $lastmod = filemtime($file);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(1, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('first save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
+        $this->assertEquals(10, $revinfo['sizechange']);
+
+        sleep(1); // wait for new revision ID
+
+        // delete
+        saveWikiText($page, '', 'second save', false);
+        clearstatcache(false, $file);
+        $this->assertFileNotExists($file);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(2, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('second save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']);
+        $this->assertEquals(-10, $revinfo['sizechange']);
+
+        sleep(1); // wait for new revision ID
+
+        // create external edit
+        file_put_contents($file, 'teststring5');
+
+        sleep(1); // wait for new revision ID
+
+        // save on top of external edit
+        saveWikiText($page, 'teststring6', 'third save', false);
+        clearstatcache(false, $file);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(4, count($revisions)); // two more revisions now!
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('third save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
+
+        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
+        $this->assertEquals('external edit', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(11, $revinfo['sizechange']);
+
+    }
+
+    /**
+     * Execute a whole bunch of saves on the same page and check the results
+     */
+    function test_saveexternalasfirst() {
+        $page = 'page3';
+        $file = wikiFN($page);
+
+        // create the page
+        $this->assertFileNotExists($file);
+
+        // create external edit
+        file_put_contents($file, 'teststring');
+
+        sleep(1); // wait for new revision ID
+
+        // save on top of external edit
+        saveWikiText($page, 'teststring6', 'first save', false);
+        clearstatcache(false, $file);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(2, count($revisions)); // two more revisions now!
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('first save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(1, $revinfo['sizechange']);
+
+        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
+        $this->assertEquals('external edit', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(10, $revinfo['sizechange']);
+
+    }
+
+    /**
+     * Execute a whole bunch of saves on the same page and check the results
+     */
+    function test_savesequenceexternaldeleteedit() {
+        $page = 'page4';
+        $file = wikiFN($page);
+
+        // create the page
+        $this->assertFileNotExists($file);
+        saveWikiText($page, 'teststring', 'first save', false);
+        $this->assertFileExists($file);
+        $lastmod = filemtime($file);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(1, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('first save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
+        $this->assertEquals(10, $revinfo['sizechange']);
+
+        sleep(1); // wait for new revision ID
+
+
+        // create external delete
+        unlink($file);
+        clearstatcache(false, $file);
+
+        sleep(1); // wait for new revision ID
+
+        // save on top of external delete. save is seen as creation
+        saveWikiText($page, 'teststring6', 'second save', false);
+        clearstatcache(false, $file);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(2, count($revisions)); // one more revisions now!
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('second save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
+        $this->assertEquals(11, $revinfo['sizechange']);
+
+        $revinfo = $pagelog->getRevisionInfo($revisions[1]);
+        $this->assertEquals('first save', $revinfo['sum']);
+
+    }
+
+    /**
+     * Execute a whole bunch of saves on the same page and check the results
+     */
+    function test_savesequencerevert() {
+        global $REV;
+
+        $page = 'page5';
+        $file = wikiFN($page);
+
+        // create the page
+        $this->assertFileNotExists($file);
+        saveWikiText($page, 'teststring', 'first save', false);
+        $this->assertFileExists($file);
+        $lastmod = filemtime($file);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(1, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('first save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
+        $this->assertEquals(10, $revinfo['sizechange']);
+
+        sleep(1); // wait for new revision ID
+
+        // save with same content should be ignored
+        saveWikiText($page, 'teststring', 'second save', false);
+        clearstatcache(false, $file);
+        $this->assertEquals($lastmod, filemtime($file));
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(1, count($revisions));
+
+        // update the page with new text
+        saveWikiText($page, 'teststring2long', 'third save', false);
+        clearstatcache(false, $file);
+        $newmod = filemtime($file);
+        $this->assertNotEquals($lastmod, $newmod);
+        $lastmod = $newmod;
+        $revertrev = $newmod;
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(2, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('third save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(5, $revinfo['sizechange']);
+
+        sleep(1); // wait for new revision ID
+
+        // add a minor edit (unauthenticated)
+        saveWikiText($page, 'teststring3long', 'fourth save', true);
+        clearstatcache(false, $file);
+        $newmod = filemtime($file);
+        $this->assertNotEquals($lastmod, $newmod);
+        $lastmod = $newmod;
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(3, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('fourth save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
+
+        sleep(1); // wait for new revision ID
+
+        // add a minor edit (authenticated)
+        $_SERVER['REMOTE_USER'] = 'user';
+        saveWikiText($page, 'teststring4', 'fifth save', true);
+        clearstatcache(false, $file);
+        $newmod = filemtime($file);
+        $this->assertNotEquals($lastmod, $newmod);
+        $lastmod = $newmod;
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(4, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('fifth save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']);
+        $this->assertEquals(-4, $revinfo['sizechange']);
+
+        sleep(1); // wait for new revision ID
+
+        // restore
+        $REV = $revertrev;
+        saveWikiText($page, 'teststring2long', 'sixth save', true);
+        clearstatcache(false, $file);
+        $this->assertFileExists($file);
+        $newmod = filemtime($file);
+        $this->assertNotEquals($lastmod, $newmod);
+
+        $pagelog = new PageChangeLog($page);
+        $revisions = $pagelog->getRevisions(-1, 200);
+        $this->assertEquals(5, count($revisions));
+        $revinfo = $pagelog->getRevisionInfo($revisions[0]);
+        $this->assertEquals('sixth save', $revinfo['sum']);
+        $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']);
+        $this->assertEquals($REV, $revinfo['extra']);
+        $this->assertEquals(4, $revinfo['sizechange']);
+        $REV = '';
+    }
+
 }
diff --git a/_test/tests/inc/io_getSizeFile.test.php b/_test/tests/inc/io_getSizeFile.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..3456342ba5d6b17a11e265479a6cbfcac022705d
--- /dev/null
+++ b/_test/tests/inc/io_getSizeFile.test.php
@@ -0,0 +1,62 @@
+<?php
+
+class io_getSizeFile_test extends DokuWikiTest {
+
+    /*
+     * dependency for tests needing zlib extension to pass
+     */
+    public function test_ext_zlib() {
+        if (!DOKU_HAS_GZIP) {
+            $this->markTestSkipped('skipping all zlib tests.  Need zlib extension');
+        }
+    }
+
+    /*
+     * dependency for tests needing zlib extension to pass
+     */
+    public function test_ext_bz2() {
+        if (!DOKU_HAS_BZIP) {
+            $this->markTestSkipped('skipping all bzip2 tests.  Need bz2 extension');
+        }
+    }
+
+    function test_plain(){
+        // since git converts line endings, we can't check in this test file but have to create it ourselves
+        $plain = TMP_DIR.'/test.txt';
+        file_put_contents($plain, "The\015\012Test\015\012");
+
+        $this->assertEquals(11, io_getSizeFile($plain));
+        $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/nope.txt'));
+        $plain_mb = TMP_DIR.'/test.txt';
+        io_saveFile($plain_mb, "string with utf-8 chars åèö - doo-bee doo-bee dooh\012");
+        $this->assertEquals(54, io_getSizeFile($plain_mb));
+    }
+
+    /**
+     * @depends test_ext_zlib
+     */
+    function test_gzfiles(){
+        $this->assertEquals(11, io_getSizeFile(__DIR__.'/io_readfile/test.txt.gz'));
+        $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/nope.txt.gz'));
+        $this->assertEquals(11, io_getSizeFile(__DIR__.'/io_readfile/corrupt.txt.gz'));
+        $gz_mb = TMP_DIR.'/test.txt.gz';
+        io_saveFile($gz_mb, "string with utf-8 chars åèö - doo-bee doo-bee dooh\012");
+        $this->assertEquals(54, io_getSizeFile($gz_mb));
+    }
+
+    /**
+     * @depends test_ext_bz2
+     */
+    function test_bzfiles(){
+
+        $this->assertEquals(11, io_getSizeFile(__DIR__.'/io_readfile/test.txt.bz2'));
+        $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/nope.txt.bz2'));
+        $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/corrupt.txt.bz2'));
+        $this->assertEquals(9720, io_getSizeFile(__DIR__.'/io_readfile/large.txt.bz2'));
+        $this->assertEquals(17780, io_getSizeFile(__DIR__.'/io_readfile/long.txt.bz2'));
+        $bz_mb = TMP_DIR.'/test.txt.bz2';
+        io_saveFile($bz_mb, "string with utf-8 chars åèö - doo-bee doo-bee dooh\012");
+        $this->assertEquals(54, io_getSizeFile($bz_mb));
+    }
+
+}
diff --git a/inc/changelog.php b/inc/changelog.php
index f4731021ca48c63e14eae6d414eb02132cf72866..3ab0cfd40304340a797a66589e6223b333a8f2dc 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -23,6 +23,7 @@ define('DOKU_CHANGE_TYPE_REVERT',       'R');
  * @return array|bool parsed line or false
  */
 function parseChangelogLine($line) {
+    $line = rtrim($line, "\n");
     $tmp = explode("\t", $line);
     if ($tmp!==false && count($tmp)>1) {
         $info = array();
@@ -32,9 +33,16 @@ function parseChangelogLine($line) {
         $info['id']    = $tmp[3]; // page id
         $info['user']  = $tmp[4]; // user name
         $info['sum']   = $tmp[5]; // edit summary (or action reason)
-        $info['extra'] = rtrim($tmp[6], "\n"); // extra data (varies by line type)
+        $info['extra'] = $tmp[6]; // extra data (varies by line type)
+        if(isset($tmp[7]) && $tmp[7] !== '') { //last item has line-end||
+            $info['sizechange'] = (int) $tmp[7];
+        } else {
+            $info['sizechange'] = null;
+        }
         return $info;
-    } else { return false; }
+    } else {
+        return false;
+    }
 }
 
 /**
@@ -48,12 +56,13 @@ function parseChangelogLine($line) {
  * @param array  $flags     Additional flags in a key value array.
  *                             Available flags:
  *                             - ExternalEdit - mark as an external edit.
+ * @param null|int $sizechange Change of filesize
  *
  * @author Andreas Gohr <andi@splitbrain.org>
  * @author Esther Brunner <wikidesign@gmail.com>
  * @author Ben Coburn <btcoburn@silicodon.net>
  */
-function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){
+function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = null){
     global $conf, $INFO;
     /** @var Input $INPUT */
     global $INPUT;
@@ -71,17 +80,23 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
     if(!$date) $date = time(); //use current time if none supplied
     $remote = (!$flagExternalEdit)?clientIP(true):'127.0.0.1';
     $user   = (!$flagExternalEdit)?$INPUT->server->str('REMOTE_USER'):'';
+    if($sizechange === null) {
+        $sizechange = '';
+    } else {
+        $sizechange = (int) $sizechange;
+    }
 
     $strip = array("\t", "\n");
     $logline = array(
-            'date'  => $date,
-            'ip'    => $remote,
-            'type'  => str_replace($strip, '', $type),
-            'id'    => $id,
-            'user'  => $user,
-            'sum'   => utf8_substr(str_replace($strip, '', $summary),0,255),
-            'extra' => str_replace($strip, '', $extra)
-            );
+        'date'       => $date,
+        'ip'         => $remote,
+        'type'       => str_replace($strip, '', $type),
+        'id'         => $id,
+        'user'       => $user,
+        'sum'        => utf8_substr(str_replace($strip, '', $summary), 0, 255),
+        'extra'      => str_replace($strip, '', $extra),
+        'sizechange' => $sizechange
+    );
 
     $wasCreated = ($type===DOKU_CHANGE_TYPE_CREATE);
     $wasReverted = ($type===DOKU_CHANGE_TYPE_REVERT);
@@ -130,8 +145,9 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
  * @param array  $flags     Additional flags in a key value array.
  *                             Available flags:
  *                             - (none, so far)
+ * @param null|int $sizechange Change of filesize
  */
-function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){
+function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = null){
     global $conf;
     /** @var Input $INPUT */
     global $INPUT;
@@ -141,17 +157,23 @@ function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='',
     if(!$date) $date = time(); //use current time if none supplied
     $remote = clientIP(true);
     $user   = $INPUT->server->str('REMOTE_USER');
+    if($sizechange === null) {
+        $sizechange = '';
+    } else {
+        $sizechange = (int) $sizechange;
+    }
 
     $strip = array("\t", "\n");
     $logline = array(
-            'date'  => $date,
-            'ip'    => $remote,
-            'type'  => str_replace($strip, '', $type),
-            'id'    => $id,
-            'user'  => $user,
-            'sum'   => utf8_substr(str_replace($strip, '', $summary),0,255),
-            'extra' => str_replace($strip, '', $extra)
-            );
+        'date'       => $date,
+        'ip'         => $remote,
+        'type'       => str_replace($strip, '', $type),
+        'id'         => $id,
+        'user'       => $user,
+        'sum'        => utf8_substr(str_replace($strip, '', $summary), 0, 255),
+        'extra'      => str_replace($strip, '', $extra),
+        'sizechange' => $sizechange
+    );
 
     // add changelog lines
     $logline = implode("\t", $logline)."\n";
diff --git a/inc/common.php b/inc/common.php
index 91004af5ddfbab38b10b41057e0097a82da02b44..539aed29098738566f8752352353e5e8a185e598 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -1203,20 +1203,30 @@ function con($pre, $text, $suf, $pretty = false) {
 function detectExternalEdit($id) {
     global $lang;
 
-    $file     = wikiFN($id);
-    $old      = @filemtime($file); // from page
-    $pagelog  = new PageChangeLog($id, 1024);
-    $oldRev   = $pagelog->getRevisions(-1, 1); // from changelog
-    $oldRev   = (int) (empty($oldRev) ? 0 : $oldRev[0]);
+    $fileLastMod = wikiFN($id);
+    $lastMod     = @filemtime($fileLastMod); // from page
+    $pagelog     = new PageChangeLog($id, 1024);
+    $lastRev     = $pagelog->getRevisions(-1, 1); // from changelog
+    $lastRev     = (int) (empty($lastRev) ? 0 : $lastRev[0]);
 
-    if(!file_exists(wikiFN($id, $old)) && file_exists($file) && $old >= $oldRev) {
+    if(!file_exists(wikiFN($id, $lastMod)) && file_exists($fileLastMod) && $lastMod >= $lastRev) {
         // add old revision to the attic if missing
         saveOldRevision($id);
         // add a changelog entry if this edit came from outside dokuwiki
-        if($old > $oldRev) {
-            addLogEntry($old, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true));
+        if($lastMod > $lastRev) {
+            $fileLastRev = wikiFN($id, $lastRev);
+            $revinfo = $pagelog->getRevisionInfo($lastRev);
+            if(empty($lastRev) || !file_exists($fileLastRev) || $revinfo['type'] == DOKU_CHANGE_TYPE_DELETE) {
+                $filesize_old = 0;
+            } else {
+                $filesize_old = io_getSizeFile($fileLastRev);
+            }
+            $filesize_new = filesize($fileLastMod);
+            $sizechange = $filesize_new - $filesize_old;
+
+            addLogEntry($lastMod, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true), $sizechange);
             // remove soon to be stale instructions
-            $cache = new cache_instructions($id, $file);
+            $cache = new cache_instructions($id, $fileLastMod);
             $cache->removeCache();
         }
     }
@@ -1260,6 +1270,7 @@ function saveWikiText($id, $text, $summary, $minor = false) {
     $svdta['contentChanged'] = ($svdta['newContent'] != $svdta['oldContent']);
     $svdta['changeInfo']     = '';
     $svdta['changeType']     = DOKU_CHANGE_TYPE_EDIT;
+    $svdta['sizechange']     = null;
 
     // select changelog line type
     if($REV) {
@@ -1271,7 +1282,9 @@ function saveWikiText($id, $text, $summary, $minor = false) {
         // empty or whitespace only content deletes
         $svdta['changeType'] = DOKU_CHANGE_TYPE_DELETE;
         // autoset summary on deletion
-        if(blank($svdta['summary'])) $svdta['summary'] = $lang['deleted'];
+        if(blank($svdta['summary'])) {
+            $svdta['summary'] = $lang['deleted'];
+        }
     } else if($minor && $conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
         //minor edits only for logged in users
         $svdta['changeType'] = DOKU_CHANGE_TYPE_MINOR_EDIT;
@@ -1284,6 +1297,15 @@ function saveWikiText($id, $text, $summary, $minor = false) {
     if(!$svdta['contentChanged']) return;
 
     detectExternalEdit($id);
+
+    if(
+        $svdta['changeType'] == DOKU_CHANGE_TYPE_CREATE ||
+        ($svdta['changeType'] == DOKU_CHANGE_TYPE_REVERT && !file_exists($svdta['file']))
+    ) {
+        $filesize_old = 0;
+    } else {
+        $filesize_old = filesize($svdta['file']);
+    }
     if($svdta['changeType'] == DOKU_CHANGE_TYPE_DELETE) {
         // Send "update" event with empty data, so plugins can react to page deletion
         $data = array(array($svdta['file'], '', false), getNS($id), noNS($id), false);
@@ -1294,6 +1316,7 @@ function saveWikiText($id, $text, $summary, $minor = false) {
         $data['newRevision'] = saveOldRevision($id);
         // remove empty file
         @unlink($svdta['file']);
+        $filesize_new = 0;
         // don't remove old meta info as it should be saved, plugins can use IO_WIKIPAGE_WRITE for removing their metadata...
         // purge non-persistant meta data
         p_purge_metadata($id);
@@ -1305,11 +1328,14 @@ function saveWikiText($id, $text, $summary, $minor = false) {
         io_writeWikiPage($svdta['file'], $text, $id);
         // pre-save the revision, to keep the attic in sync
         $svdta['newRevision'] = saveOldRevision($id);
+        $filesize_new = filesize($svdta['file']);
     }
+    $svdta['sizechange'] = $filesize_new - $filesize_old;
 
     $event->advise_after();
 
-    addLogEntry($svdta['newRevision'], $svdta['id'], $svdta['changeType'], $svdta['summary'], $svdta['changeInfo']);
+    addLogEntry($svdta['newRevision'], $svdta['id'], $svdta['changeType'], $svdta['summary'], $svdta['changeInfo'], null, $svdta['sizechange']);
+
     // send notify mails
     notify($svdta['id'], 'admin', $svdta['oldRevision'], $svdta['summary'], $minor);
     notify($svdta['id'], 'subscribers', $svdta['oldRevision'], $svdta['summary'], $minor);
diff --git a/inc/html.php b/inc/html.php
index c3cc66aa9d5fc3aad69251a17b2f38dc52e61d86..d578b867358f341477e2885bef43de227480a1e1 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -501,28 +501,61 @@ function html_revisions($first=0, $media_id = false){
         array_pop($revisions); // remove extra log entry
     }
 
-    if (!$media_id) $date = dformat($INFO['lastmod']);
-    else $date = dformat(@filemtime(mediaFN($id)));
-
     if (!$media_id) print p_locale_xhtml('revisions');
 
     $params = array('id' => 'page__revisions', 'class' => 'changes');
-    if ($media_id) $params['action'] = media_managerURL(array('image' => $media_id), '&');
+    if($media_id) {
+        $params['action'] = media_managerURL(array('image' => $media_id), '&');
+    }
+
+    if(!$media_id) {
+        $exists = $INFO['exists'];
+        $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id;
+        if(!$display_name) {
+            $display_name = $id;
+        }
+    } else {
+        $exists = file_exists(mediaFN($id));
+        $display_name = $id;
+    }
 
     $form = new Doku_Form($params);
     $form->addElement(form_makeOpenTag('ul'));
 
-    if (!$media_id) $exists = $INFO['exists'];
-    else $exists = file_exists(mediaFN($id));
+    if($exists && $first == 0) {
+        $minor = false;
+        if($media_id) {
+            $date = dformat(@filemtime(mediaFN($id)));
+            $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&');
+
+            $changelog->setChunkSize(1024);
+            $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id))));
 
-    $display_name = (!$media_id && useHeading('navigation')) ? hsc(p_get_first_heading($id)) : $id;
-    if (!$display_name) $display_name = $id;
+            $summary = $revinfo['sum'];
+            if($revinfo['user']) {
+                $editor = $revinfo['user'];
+            } else {
+                $editor = $revinfo['ip'];
+            }
+            $sizechange = $revinfo['sizechange'];
+        } else {
+            $date = dformat($INFO['lastmod']);
+            if(isset($INFO['meta']) && isset($INFO['meta']['last_change'])) {
+                if($INFO['meta']['last_change']['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
+                    $minor = true;
+                }
+                if(isset($INFO['meta']['last_change']['sizechange'])) {
+                    $sizechange = $INFO['meta']['last_change']['sizechange'];
+                } else {
+                    $sizechange = null;
+                }
+            }
+            $href = wl($id);
+            $summary = $INFO['sum'];
+            $editor = $INFO['editor'];
+        }
 
-    if($exists && $first==0){
-        if (!$media_id && isset($INFO['meta']) && isset($INFO['meta']['last_change']) && $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
-            $form->addElement(form_makeOpenTag('li', array('class' => 'minor')));
-        else
-            $form->addElement(form_makeOpenTag('li'));
+        $form->addElement(form_makeOpenTag('li', array('class' => ($minor ? 'minor' : ''))));
         $form->addElement(form_makeOpenTag('div', array('class' => 'li')));
         $form->addElement(form_makeTag('input', array(
                         'type' => 'checkbox',
@@ -535,8 +568,6 @@ function html_revisions($first=0, $media_id = false){
 
         $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
 
-        if (!$media_id) $href = wl($id);
-        else $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&');
         $form->addElement(form_makeOpenTag('a', array(
                         'class' => 'wikilink1',
                         'href'  => $href)));
@@ -545,28 +576,31 @@ function html_revisions($first=0, $media_id = false){
 
         if ($media_id) $form->addElement(form_makeOpenTag('div'));
 
-        if (!$media_id) {
+        if($summary) {
             $form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
-            $form->addElement(' – ');
-            $form->addElement(htmlspecialchars($INFO['sum']));
+            if(!$media_id) $form->addElement(' – ');
+            $form->addElement('<bdi>' . htmlspecialchars($summary) . '</bdi>');
             $form->addElement(form_makeCloseTag('span'));
         }
 
-        $changelog->setChunkSize(1024);
-
         $form->addElement(form_makeOpenTag('span', array('class' => 'user')));
-        if($media_id) {
-            $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id))));
-            if($revinfo['user']) {
-                $editor = $revinfo['user'];
-            } else {
-                $editor = $revinfo['ip'];
+        $form->addElement((empty($editor))?('('.$lang['external_edit'].')'):'<bdi>'.editorinfo($editor).'</bdi>');
+        $form->addElement(form_makeCloseTag('span'));
+
+        if(isset($sizechange)) {
+            $class = 'sizechange';
+            $value = filesize_h(abs($sizechange));
+            if($sizechange > 0) {
+                $class .= ' positive';
+                $value = '+' . $value;
+            } elseif($sizechange < 0) {
+                $class .= ' negative';
+                $value = '-' . $value;
             }
-        } else {
-            $editor = $INFO['editor'];
+            $form->addElement(form_makeOpenTag('span', array('class' => $class)));
+            $form->addElement($value);
+            $form->addElement(form_makeCloseTag('span'));
         }
-        $form->addElement((empty($editor))?('('.$lang['external_edit'].')'):editorinfo($editor));
-        $form->addElement(form_makeCloseTag('span'));
 
         $form->addElement('('.$lang['current'].')');
 
@@ -576,7 +610,7 @@ function html_revisions($first=0, $media_id = false){
         $form->addElement(form_makeCloseTag('li'));
     }
 
-    foreach($revisions as $rev){
+    foreach($revisions as $rev) {
         $date = dformat($rev);
         $info = $changelog->getRevisionInfo($rev);
         if($media_id) {
@@ -585,10 +619,11 @@ function html_revisions($first=0, $media_id = false){
             $exists = page_exists($id, $rev);
         }
 
-        if ($info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
-            $form->addElement(form_makeOpenTag('li', array('class' => 'minor')));
-        else
-            $form->addElement(form_makeOpenTag('li'));
+        $class = '';
+        if($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
+            $class = 'minor';
+        }
+        $form->addElement(form_makeOpenTag('li', array('class' => $class)));
         $form->addElement(form_makeOpenTag('div', array('class' => 'li')));
         if($exists){
             $form->addElement(form_makeTag('input', array(
@@ -604,9 +639,14 @@ function html_revisions($first=0, $media_id = false){
         $form->addElement(form_makeCloseTag('span'));
 
         if($exists){
-            if (!$media_id) $href = wl($id,"rev=$rev,do=diff", false, '&');
-            else $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&');
-            $form->addElement(form_makeOpenTag('a', array('href' => $href, 'class' => 'diff_link')));
+            if (!$media_id) {
+                $href = wl($id,"rev=$rev,do=diff", false, '&');
+            } else {
+                $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&');
+            }
+            $form->addElement(form_makeOpenTag('a', array(
+                            'class' => 'diff_link',
+                            'href' => $href)));
             $form->addElement(form_makeTag('img', array(
                             'src'    => DOKU_BASE.'lib/images/diff.png',
                             'width'  => 15,
@@ -614,9 +654,15 @@ function html_revisions($first=0, $media_id = false){
                             'title'  => $lang['diff'],
                             'alt'    => $lang['diff'])));
             $form->addElement(form_makeCloseTag('a'));
-            if (!$media_id) $href = wl($id,"rev=$rev",false,'&');
-            else $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&');
-            $form->addElement(form_makeOpenTag('a', array('href' => $href, 'class' => 'wikilink1')));
+
+            if (!$media_id) {
+                $href = wl($id,"rev=$rev",false,'&');
+            } else {
+                $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&');
+            }
+            $form->addElement(form_makeOpenTag('a', array(
+                            'class' => 'wikilink1',
+                            'href' => $href)));
             $form->addElement($display_name);
             $form->addElement(form_makeCloseTag('a'));
         }else{
@@ -628,7 +674,7 @@ function html_revisions($first=0, $media_id = false){
 
         if ($info['sum']) {
             $form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
-            if (!$media_id) $form->addElement(' – ');
+            if(!$media_id) $form->addElement(' – ');
             $form->addElement('<bdi>'.htmlspecialchars($info['sum']).'</bdi>');
             $form->addElement(form_makeCloseTag('span'));
         }
@@ -644,6 +690,21 @@ function html_revisions($first=0, $media_id = false){
         }
         $form->addElement(form_makeCloseTag('span'));
 
+        if(isset($info['sizechange'])) {
+            $class = 'sizechange';
+            $value = filesize_h(abs($info['sizechange']));
+            if($info['sizechange'] > 0) {
+                $class .= ' positive';
+                $value = '+' . $value;
+            } elseif($info['sizechange'] < 0) {
+                $class .= ' negative';
+                $value = '-' . $value;
+            }
+            $form->addElement(form_makeOpenTag('span', array('class' => $class)));
+            $form->addElement($value);
+            $form->addElement(form_makeCloseTag('span'));
+        }
+
         if ($media_id) $form->addElement(form_makeCloseTag('div'));
 
         $form->addElement(form_makeCloseTag('div'));
@@ -695,7 +756,7 @@ function html_revisions($first=0, $media_id = false){
  * @param int $first
  * @param string $show_changes
  */
-function html_recent($first=0, $show_changes='both'){
+function html_recent($first = 0, $show_changes = 'both') {
     global $conf;
     global $lang;
     global $ID;
@@ -704,48 +765,50 @@ function html_recent($first=0, $show_changes='both'){
      * This is the cheapest solution to get this information.
      */
     $flags = 0;
-    if ($show_changes == 'mediafiles' && $conf['mediarevisions']) {
+    if($show_changes == 'mediafiles' && $conf['mediarevisions']) {
         $flags = RECENTS_MEDIA_CHANGES;
-    } elseif ($show_changes == 'pages') {
+    } elseif($show_changes == 'pages') {
         $flags = 0;
-    } elseif ($conf['mediarevisions']) {
+    } elseif($conf['mediarevisions']) {
         $show_changes = 'both';
         $flags = RECENTS_MEDIA_PAGES_MIXED;
     }
 
-    $recents = getRecents($first,$conf['recent'] + 1,getNS($ID),$flags);
-    if(count($recents) == 0 && $first != 0){
-        $first=0;
-        $recents = getRecents($first,$conf['recent'] + 1,getNS($ID),$flags);
+    $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags);
+    if(count($recents) == 0 && $first != 0) {
+        $first = 0;
+        $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags);
     }
     $hasNext = false;
-    if (count($recents)>$conf['recent']) {
+    if(count($recents) > $conf['recent']) {
         $hasNext = true;
         array_pop($recents); // remove extra log entry
     }
 
     print p_locale_xhtml('recent');
 
-    if (getNS($ID) != '')
+    if(getNS($ID) != '') {
         print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>';
+    }
 
     $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET', 'class' => 'changes'));
     $form->addHidden('sectok', null);
     $form->addHidden('do', 'recent');
     $form->addHidden('id', $ID);
 
-    if ($conf['mediarevisions']) {
+    if($conf['mediarevisions']) {
         $form->addElement('<div class="changeType">');
         $form->addElement(form_makeListboxField(
                     'show_changes',
                     array(
                         'pages'      => $lang['pages_changes'],
                         'mediafiles' => $lang['media_changes'],
-                        'both'       => $lang['both_changes']),
+                        'both'       => $lang['both_changes']
+                    ),
                     $show_changes,
                     $lang['changes_type'],
-                    '','',
-                    array('class'=>'quickselect')));
+                    '', '',
+                    array('class' => 'quickselect')));
 
         $form->addElement(form_makeButton('submit', 'recent', $lang['btn_apply']));
         $form->addElement('</div>');
@@ -753,20 +816,21 @@ function html_recent($first=0, $show_changes='both'){
 
     $form->addElement(form_makeOpenTag('ul'));
 
-    foreach($recents as $recent){
+    foreach($recents as $recent) {
         $date = dformat($recent['date']);
-        if ($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
-            $form->addElement(form_makeOpenTag('li', array('class' => 'minor')));
-        else
-            $form->addElement(form_makeOpenTag('li'));
 
+        $class = '';
+        if($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
+            $class = 'minor';
+        }
+        $form->addElement(form_makeOpenTag('li', array('class' => $class)));
         $form->addElement(form_makeOpenTag('div', array('class' => 'li')));
 
-        if (!empty($recent['media'])) {
+        if(!empty($recent['media'])) {
             $form->addElement(media_printicon($recent['id']));
         } else {
-            $icon = DOKU_BASE.'lib/images/fileicons/file.png';
-            $form->addElement('<img src="'.$icon.'" alt="'.$recent['id'].'" class="icon" />');
+            $icon = DOKU_BASE . 'lib/images/fileicons/file.png';
+            $form->addElement('<img src="' . $icon . '" alt="' . $recent['id'] . '" class="icon" />');
         }
 
         $form->addElement(form_makeOpenTag('span', array('class' => 'date')));
@@ -776,76 +840,94 @@ function html_recent($first=0, $show_changes='both'){
         $diff = false;
         $href = '';
 
-        if (!empty($recent['media'])) {
+        if(!empty($recent['media'])) {
             $changelog = new MediaChangeLog($recent['id']);
             $revs = $changelog->getRevisions(0, 1);
             $diff = (count($revs) && file_exists(mediaFN($recent['id'])));
-            if ($diff) {
+            if($diff) {
                 $href = media_managerURL(array(
-                                             'tab_details' => 'history',
-                                             'mediado' => 'diff',
-                                             'image' => $recent['id'],
-                                             'ns' => getNS($recent['id'])
-                                         ), '&');
+                                            'tab_details' => 'history',
+                                            'mediado' => 'diff',
+                                            'image' => $recent['id'],
+                                            'ns' => getNS($recent['id'])
+                                        ), '&');
             }
         } else {
-            $href = wl($recent['id'],"do=diff", false, '&');
+            $href = wl($recent['id'], "do=diff", false, '&');
         }
 
-        if (!empty($recent['media']) && !$diff) {
-            $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
+        if(!empty($recent['media']) && !$diff) {
+            $form->addElement('<img src="' . DOKU_BASE . 'lib/images/blank.gif" width="15" height="11" alt="" />');
         } else {
             $form->addElement(form_makeOpenTag('a', array('class' => 'diff_link', 'href' => $href)));
             $form->addElement(form_makeTag('img', array(
-                            'src'   => DOKU_BASE.'lib/images/diff.png',
-                            'width' => 15,
-                            'height'=> 11,
-                            'title' => $lang['diff'],
-                            'alt'   => $lang['diff']
-                            )));
+                            'src'    => DOKU_BASE . 'lib/images/diff.png',
+                            'width'  => 15,
+                            'height' => 11,
+                            'title'  => $lang['diff'],
+                            'alt'    => $lang['diff']
+                        )));
             $form->addElement(form_makeCloseTag('a'));
         }
 
-        if (!empty($recent['media'])) {
-            $href = media_managerURL(array('tab_details' => 'history',
-                'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
+        if(!empty($recent['media'])) {
+            $href = media_managerURL(array('tab_details' => 'history', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
         } else {
-            $href = wl($recent['id'],"do=revisions",false,'&');
+            $href = wl($recent['id'], "do=revisions", false, '&');
         }
-        $form->addElement(form_makeOpenTag('a', array('class' => 'revisions_link', 'href' => $href)));
+        $form->addElement(form_makeOpenTag('a', array(
+                        'class' => 'revisions_link',
+                        'href'  => $href)));
         $form->addElement(form_makeTag('img', array(
-                        'src'   => DOKU_BASE.'lib/images/history.png',
-                        'width' => 12,
-                        'height'=> 14,
-                        'title' => $lang['btn_revs'],
-                        'alt'   => $lang['btn_revs']
-                        )));
+                        'src'    => DOKU_BASE . 'lib/images/history.png',
+                        'width'  => 12,
+                        'height' => 14,
+                        'title'  => $lang['btn_revs'],
+                        'alt'    => $lang['btn_revs']
+                    )));
         $form->addElement(form_makeCloseTag('a'));
 
-        if (!empty($recent['media'])) {
+        if(!empty($recent['media'])) {
             $href = media_managerURL(array('tab_details' => 'view', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
-            $class = (file_exists(mediaFN($recent['id']))) ? 'wikilink1' : $class = 'wikilink2';
-            $form->addElement(form_makeOpenTag('a', array('class' => $class, 'href' => $href)));
+            $class = file_exists(mediaFN($recent['id'])) ? 'wikilink1' : 'wikilink2';
+            $form->addElement(form_makeOpenTag('a', array(
+                        'class' => $class,
+                        'href'  => $href)));
             $form->addElement($recent['id']);
             $form->addElement(form_makeCloseTag('a'));
         } else {
-            $form->addElement(html_wikilink(':'.$recent['id'],useHeading('navigation')?null:$recent['id']));
+            $form->addElement(html_wikilink(':' . $recent['id'], useHeading('navigation') ? null : $recent['id']));
         }
         $form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
-        $form->addElement(' – '.htmlspecialchars($recent['sum']));
+        $form->addElement(' – ' . htmlspecialchars($recent['sum']));
         $form->addElement(form_makeCloseTag('span'));
 
         $form->addElement(form_makeOpenTag('span', array('class' => 'user')));
-        if($recent['user']){
-            $form->addElement('<bdi>'.editorinfo($recent['user']).'</bdi>');
-            if(auth_ismanager()){
-                $form->addElement(' <bdo dir="ltr">('.$recent['ip'].')</bdo>');
+        if($recent['user']) {
+            $form->addElement('<bdi>' . editorinfo($recent['user']) . '</bdi>');
+            if(auth_ismanager()) {
+                $form->addElement(' <bdo dir="ltr">(' . $recent['ip'] . ')</bdo>');
             }
-        }else{
-            $form->addElement('<bdo dir="ltr">'.$recent['ip'].'</bdo>');
+        } else {
+            $form->addElement('<bdo dir="ltr">' . $recent['ip'] . '</bdo>');
         }
         $form->addElement(form_makeCloseTag('span'));
 
+        if(isset($recent['sizechange'])) {
+            $class = 'sizechange';
+            $value = filesize_h(abs($recent['sizechange']));
+            if($recent['sizechange'] > 0) {
+                $class .= ' positive';
+                $value = '+' . $value;
+            } elseif($recent['sizechange'] < 0) {
+                $class .= ' negative';
+                $value = '-' . $value;
+            }
+            $form->addElement(form_makeOpenTag('span', array('class' => $class)));
+            $form->addElement($value);
+            $form->addElement(form_makeCloseTag('span'));
+        }
+
         $form->addElement(form_makeCloseTag('div'));
         $form->addElement(form_makeCloseTag('li'));
     }
@@ -853,30 +935,30 @@ function html_recent($first=0, $show_changes='both'){
 
     $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav')));
     $last = $first + $conf['recent'];
-    if ($first > 0) {
+    if($first > 0) {
         $first -= $conf['recent'];
-        if ($first < 0) $first = 0;
+        if($first < 0) $first = 0;
         $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-prev')));
         $form->addElement(form_makeOpenTag('button', array(
-                    'type'  => 'submit',
-                    'name'  => 'first['.$first.']',
-                    'accesskey' => 'n',
-                    'title' => $lang['btn_newer'].' [N]',
-                    'class' => 'button show'
+                        'type'      => 'submit',
+                        'name'      => 'first[' . $first . ']',
+                        'accesskey' => 'n',
+                        'title'     => $lang['btn_newer'] . ' [N]',
+                        'class'     => 'button show'
                     )));
         $form->addElement($lang['btn_newer']);
         $form->addElement(form_makeCloseTag('button'));
         $form->addElement(form_makeCloseTag('div'));
     }
-    if ($hasNext) {
+    if($hasNext) {
         $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-next')));
         $form->addElement(form_makeOpenTag('button', array(
-                        'type'  => 'submit',
-                        'name'  => 'first['.$last.']',
+                        'type'      => 'submit',
+                        'name'      => 'first[' . $last . ']',
                         'accesskey' => 'p',
-                        'title' => $lang['btn_older'].' [P]',
-                        'class' => 'button show'
-                        )));
+                        'title'     => $lang['btn_older'] . ' [P]',
+                        'class'     => 'button show'
+                    )));
         $form->addElement($lang['btn_older']);
         $form->addElement(form_makeCloseTag('button'));
         $form->addElement(form_makeCloseTag('div'));
diff --git a/inc/io.php b/inc/io.php
index 066030c89a5dc339bb62861df7f23cab17c7df5f..8d3407f8da72823ae05b51810fffb82356ddc784 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -776,3 +776,46 @@ function io_grep($file,$pattern,$max=0,$backref=false){
     return $matches;
 }
 
+
+/**
+ * Get size of contents of a file, for a compressed file the uncompressed size
+ * Warning: reading uncompressed size of content of bz-files requires uncompressing
+ *
+ * @author  Gerrit Uitslag <klapinklapin@gmail.com>
+ *
+ * @param string $file filename path to file
+ * @return int size of file
+ */
+function io_getSizeFile($file) {
+    if (!file_exists($file)) return 0;
+
+    if(substr($file,-3) == '.gz'){
+        $fp = @fopen($file, "rb");
+        if($fp === false) return 0;
+
+        fseek($fp, -4, SEEK_END);
+        $buffer = fread($fp, 4);
+        fclose($fp);
+        $array = unpack("V", $buffer);
+        $uncompressedsize = end($array);
+    }else if(substr($file,-4) == '.bz2'){
+        if(!DOKU_HAS_BZIP) return 0;
+
+        $bz = bzopen($file,"r");
+        if($bz === false) return 0;
+
+        $uncompressedsize = 0;
+        while (!feof($bz)) {
+            //8192 seems to be the maximum buffersize?
+            $buffer = bzread($bz,8192);
+            if(($buffer === false) || (bzerrno($bz) !== 0)) {
+                return 0;
+            }
+            $uncompressedsize += strlen($buffer);
+        }
+    }else{
+        $uncompressedsize = filesize($file);
+    }
+
+    return $uncompressedsize;
+ }
diff --git a/inc/media.php b/inc/media.php
index e9fff14895e09fd7de578461f021a44a4aad6e53..e103bdf04de9b66f162813d251fdd17afa40deac 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -74,13 +74,16 @@ function media_metasave($id,$auth,$data){
         // add old revision to the attic
         media_saveOldRevision($id);
     }
-
+    $filesize_old = filesize($src);
     if($meta->save()){
         if($conf['fperm']) chmod($src, $conf['fperm']);
-
+        @clearstatcache(true, $src);
         $new = @filemtime($src);
+        $filesize_new = filesize($src);
+        $sizechange = $filesize_new - $filesize_old;
+
         // add a log entry to the media changelog
-        addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, $lang['media_meta_edited']);
+        addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, $lang['media_meta_edited'], '', null, $sizechange);
 
         msg($lang['metasaveok'],1);
         return $id;
@@ -254,9 +257,11 @@ function media_delete($id,$auth){
         }
 
         $data['unl'] = @unlink($file);
-        if($data['unl']){
-            addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE, $lang['deleted']);
-            $data['del'] = io_sweepNS($id,'mediadir');
+        if($data['unl']) {
+            $sizechange = 0 - $data['size'];
+            addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE, $lang['deleted'], '', null, $sizechange);
+
+            $data['del'] = io_sweepNS($id, 'mediadir');
         }
     }
     $evt->advise_after();
@@ -505,6 +510,8 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov
     // prepare directory
     io_createNamespace($id, 'media');
 
+    $filesize_old = file_exists($fn) ? filesize($fn) : 0;
+
     if($move($fn_tmp, $fn)) {
         @clearstatcache(true,$fn);
         $new = @filemtime($fn);
@@ -515,12 +522,14 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov
         msg($lang['uploadsucc'],1);
         media_notify($id,$fn,$imime,$old);
         // add a log entry to the media changelog
-        if ($REV){
-            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV);
-        } elseif ($overwrite) {
-            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT);
+        $filesize_new = filesize($fn);
+        $sizechange = $filesize_new - $filesize_old;
+        if($REV) {
+            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV, null, $sizechange);
+        } elseif($overwrite) {
+            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange);
         } else {
-            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created']);
+            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created'], '', null, $sizechange);
         }
         return $id;
     }else{
@@ -549,10 +558,16 @@ function media_saveOldRevision($id){
     if (!$medialog->getRevisionInfo($date)) {
         // there was an external edit,
         // there is no log entry for current version of file
-        if (!file_exists(mediaMetaFN($id,'.changes'))) {
-            addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created']);
+        $sizechange = filesize($oldf);
+        if(!file_exists(mediaMetaFN($id, '.changes'))) {
+            addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created'], '', null, $sizechange);
         } else {
-            addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_EDIT);
+            $oldRev = $medialog->getRevisions(-1, 1); // from changelog
+            $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]);
+            $filesize_old = filesize(mediaFN($id, $oldRev));
+            $sizechange = $sizechange - $filesize_old;
+
+            addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange);
         }
     }
 
diff --git a/lib/tpl/dokuwiki/css/_recent.css b/lib/tpl/dokuwiki/css/_recent.css
index d73bb9463c432b7934a47c4dff412aaea35785b4..eaa565838ab6ecb90568a272ecc886306873b023 100644
--- a/lib/tpl/dokuwiki/css/_recent.css
+++ b/lib/tpl/dokuwiki/css/_recent.css
@@ -45,6 +45,22 @@
 .dokuwiki form.changes li span.user {
 }
 
+/*____________ size differences ____________*/
+
+.dokuwiki li .sizechange {
+    font-size: 80%;
+    border-radius: 0.2em;
+    padding: 0.1em 0.2em
+}
+
+.dokuwiki li .sizechange.positive {
+    background-color: #cfc;;
+}
+
+.dokuwiki li .sizechange.negative {
+    background-color: #fdd;
+}
+
 
 /*____________ page navigator ____________*/