diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php
index 7b14e446306b156583576f265c6899ac2e9dd736..a56fe9f6e7e0b6364663cdcdfdd680dbfdea08f4 100644
--- a/inc/DifferenceEngine.php
+++ b/inc/DifferenceEngine.php
@@ -30,7 +30,7 @@ class _DiffOp {
 class _DiffOp_Copy extends _DiffOp {
     var $type = 'copy';
 
-    function _DiffOp_Copy ($orig, $closing = false) {
+    function _DiffOp_Copy($orig, $closing = false) {
         if (!is_array($closing))
             $closing = $orig;
         $this->orig = $orig;
@@ -45,7 +45,7 @@ class _DiffOp_Copy extends _DiffOp {
 class _DiffOp_Delete extends _DiffOp {
     var $type = 'delete';
 
-    function _DiffOp_Delete ($lines) {
+    function _DiffOp_Delete($lines) {
         $this->orig = $lines;
         $this->closing = false;
     }
@@ -58,7 +58,7 @@ class _DiffOp_Delete extends _DiffOp {
 class _DiffOp_Add extends _DiffOp {
     var $type = 'add';
 
-    function _DiffOp_Add ($lines) {
+    function _DiffOp_Add($lines) {
         $this->closing = $lines;
         $this->orig = false;
     }
@@ -71,7 +71,7 @@ class _DiffOp_Add extends _DiffOp {
 class _DiffOp_Change extends _DiffOp {
     var $type = 'change';
 
-    function _DiffOp_Change ($orig, $closing) {
+    function _DiffOp_Change($orig, $closing) {
         $this->orig = $orig;
         $this->closing = $closing;
     }
@@ -104,7 +104,7 @@ class _DiffOp_Change extends _DiffOp {
  */
 class _DiffEngine {
 
-    function diff ($from_lines, $to_lines) {
+    function diff($from_lines, $to_lines) {
         $n_from = count($from_lines);
         $n_to = count($to_lines);
 
@@ -135,7 +135,7 @@ class _DiffEngine {
             $xhash[$from_lines[$xi]] = 1;
         for ($yi = $skip; $yi < $n_to - $endskip; $yi++) {
             $line = $to_lines[$yi];
-            if ( ($this->ychanged[$yi] = empty($xhash[$line])) )
+            if (($this->ychanged[$yi] = empty($xhash[$line])))
                 continue;
             $yhash[$line] = 1;
             $this->yv[] = $line;
@@ -143,7 +143,7 @@ class _DiffEngine {
         }
         for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
             $line = $from_lines[$xi];
-            if ( ($this->xchanged[$xi] = empty($yhash[$line])) )
+            if (($this->xchanged[$xi] = empty($yhash[$line])))
                 continue;
             $this->xv[] = $line;
             $this->xind[] = $xi;
@@ -165,8 +165,7 @@ class _DiffEngine {
 
             // Skip matching "snake".
             $copy = array();
-            while ( $xi < $n_from && $yi < $n_to
-                    && !$this->xchanged[$xi] && !$this->ychanged[$yi]) {
+            while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) {
                 $copy[] = $from_lines[$xi++];
                 ++$yi;
             }
@@ -210,15 +209,14 @@ class _DiffEngine {
      * match.  The caller must trim matching lines from the beginning and end
      * of the portions it is going to specify.
      */
-    function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) {
+    function _diag($xoff, $xlim, $yoff, $ylim, $nchunks) {
         $flip = false;
 
         if ($xlim - $xoff > $ylim - $yoff) {
             // Things seems faster (I'm not sure I understand why)
             // when the shortest sequence in X.
             $flip = true;
-            list ($xoff, $xlim, $yoff, $ylim)
-                = array( $yoff, $ylim, $xoff, $xlim);
+            list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim);
         }
 
         if ($flip)
@@ -284,7 +282,7 @@ class _DiffEngine {
         return array($this->lcs, $seps);
     }
 
-    function _lcs_pos ($ypos) {
+    function _lcs_pos($ypos) {
         $end = $this->lcs;
         if ($end == 0 || $ypos > $this->seq[$end]) {
             $this->seq[++$this->lcs] = $ypos;
@@ -295,7 +293,7 @@ class _DiffEngine {
         $beg = 1;
         while ($beg < $end) {
             $mid = (int)(($beg + $end) / 2);
-            if ( $ypos > $this->seq[$mid] )
+            if ($ypos > $this->seq[$mid])
                 $beg = $mid + 1;
             else
                 $end = $mid;
@@ -321,17 +319,15 @@ class _DiffEngine {
      * Note that XLIM, YLIM are exclusive bounds.
      * All line numbers are origin-0 and discarded lines are not counted.
      */
-    function _compareseq ($xoff, $xlim, $yoff, $ylim) {
+    function _compareseq($xoff, $xlim, $yoff, $ylim) {
         // Slide down the bottom initial diagonal.
-        while ($xoff < $xlim && $yoff < $ylim
-                && $this->xv[$xoff] == $this->yv[$yoff]) {
+        while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) {
             ++$xoff;
             ++$yoff;
         }
 
         // Slide up the top initial diagonal.
-        while ($xlim > $xoff && $ylim > $yoff
-                && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) {
+        while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) {
             --$xlim;
             --$ylim;
         }
@@ -379,7 +375,7 @@ class _DiffEngine {
      *
      * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
      */
-    function _shift_boundaries ($lines, &$changed, $other_changed) {
+    function _shift_boundaries($lines, &$changed, $other_changed) {
         $i = 0;
         $j = 0;
 
@@ -519,7 +515,7 @@ class Diff {
      * @return object A Diff object representing the inverse of the
      *          original diff.
      */
-    function reverse () {
+    function reverse() {
         $rev = $this;
         $rev->edits = array();
         foreach ($this->edits as $edit) {
@@ -533,7 +529,7 @@ class Diff {
      *
      * @return bool True iff two sequences were identical.
      */
-    function isEmpty () {
+    function isEmpty() {
         foreach ($this->edits as $edit) {
             if ($edit->type != 'copy')
                 return false;
@@ -548,7 +544,7 @@ class Diff {
      *
      * @return int The length of the LCS.
      */
-    function lcs () {
+    function lcs() {
         $lcs = 0;
         foreach ($this->edits as $edit) {
             if ($edit->type == 'copy')
@@ -598,7 +594,7 @@ class Diff {
      *
      * This is here only for debugging purposes.
      */
-    function _check ($from_lines, $to_lines) {
+    function _check($from_lines, $to_lines) {
         if (serialize($from_lines) != serialize($this->orig()))
             trigger_error("Reconstructed original doesn't match", E_USER_ERROR);
         if (serialize($to_lines) != serialize($this->closing()))
@@ -612,7 +608,7 @@ class Diff {
 
         $prevtype = 'none';
         foreach ($this->edits as $edit) {
-            if ( $prevtype == $edit->type )
+            if ($prevtype == $edit->type)
                 trigger_error("Edit sequence is non-optimal", E_USER_ERROR);
             $prevtype = $edit->type;
         }
@@ -649,8 +645,7 @@ class MappedDiff extends Diff {
      * @param $mapped_to_lines array This array should
      *  have the same number of elements as $to_lines.
      */
-    function MappedDiff($from_lines, $to_lines,
-            $mapped_from_lines, $mapped_to_lines) {
+    function MappedDiff($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) {
 
         assert(count($from_lines) == count($mapped_from_lines));
         assert(count($to_lines) == count($mapped_to_lines));
@@ -727,9 +722,7 @@ class DiffFormatter {
                             $context = array_slice($edit->orig, 0, $ntrail);
                             $block[] = new _DiffOp_Copy($context);
                         }
-                        $this->_block($x0, $ntrail + $xi - $x0,
-                                $y0, $ntrail + $yi - $y0,
-                                $block);
+                        $this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block);
                         $block = false;
                     }
                 }
@@ -754,9 +747,7 @@ class DiffFormatter {
         }
 
         if (is_array($block))
-            $this->_block($x0, $xi - $x0,
-                    $y0, $yi - $y0,
-                    $block);
+            $this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block);
 
         return $this->_end_diff();
     }
@@ -836,17 +827,21 @@ class DiffFormatter {
 define('NBSP', "\xC2\xA0");     // utf-8 non-breaking space.
 
 class _HWLDF_WordAccumulator {
-    function _HWLDF_WordAccumulator () {
+    function _HWLDF_WordAccumulator() {
         $this->_lines = array();
         $this->_line = '';
         $this->_group = '';
         $this->_tag = '';
     }
 
-    function _flushGroup ($new_tag) {
+    function _flushGroup($new_tag) {
         if ($this->_group !== '') {
             if ($this->_tag == 'mark')
                 $this->_line .= '<strong>'.$this->_group.'</strong>';
+            elseif ($this->_tag == 'add')
+                $this->_line .= '<span class="diff-addedline">'.$this->_group.'</span>';
+            elseif ($this->_tag == 'del')
+                $this->_line .= '<span class="diff-deletedline"><del>'.$this->_group.'</del></span>';
             else
                 $this->_line .= $this->_group;
         }
@@ -854,14 +849,14 @@ class _HWLDF_WordAccumulator {
         $this->_tag = $new_tag;
     }
 
-    function _flushLine ($new_tag) {
+    function _flushLine($new_tag) {
         $this->_flushGroup($new_tag);
         if ($this->_line != '')
             $this->_lines[] = $this->_line;
         $this->_line = '';
     }
 
-    function addWords ($words, $tag = '') {
+    function addWords($words, $tag = '') {
         if ($tag != $this->_tag)
             $this->_flushGroup($tag);
 
@@ -887,46 +882,80 @@ class _HWLDF_WordAccumulator {
 
 class WordLevelDiff extends MappedDiff {
 
-    function WordLevelDiff ($orig_lines, $closing_lines) {
+    function WordLevelDiff($orig_lines, $closing_lines) {
         list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
         list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
 
-        $this->MappedDiff($orig_words, $closing_words,
-                $orig_stripped, $closing_stripped);
+        $this->MappedDiff($orig_words, $closing_words, $orig_stripped, $closing_stripped);
     }
 
     function _split($lines) {
-            if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
-                    implode("\n", $lines),
-                    $m)) {
+        if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
+             implode("\n", $lines), $m)) {
             return array(array(''), array(''));
-            }
-            return array($m[0], $m[1]);
-            }
+        }
+        return array($m[0], $m[1]);
+    }
 
-            function orig () {
-            $orig = new _HWLDF_WordAccumulator;
+    function orig() {
+        $orig = new _HWLDF_WordAccumulator;
 
-            foreach ($this->edits as $edit) {
+        foreach ($this->edits as $edit) {
             if ($edit->type == 'copy')
-            $orig->addWords($edit->orig);
+                $orig->addWords($edit->orig);
             elseif ($edit->orig)
-            $orig->addWords($edit->orig, 'mark');
-            }
-            return $orig->getLines();
-            }
+                $orig->addWords($edit->orig, 'mark');
+        }
+        return $orig->getLines();
+    }
 
-            function closing () {
-                $closing = new _HWLDF_WordAccumulator;
+    function closing() {
+        $closing = new _HWLDF_WordAccumulator;
 
-                foreach ($this->edits as $edit) {
-                    if ($edit->type == 'copy')
-                        $closing->addWords($edit->closing);
-                    elseif ($edit->closing)
-                        $closing->addWords($edit->closing, 'mark');
-                }
-                return $closing->getLines();
-            }
+        foreach ($this->edits as $edit) {
+            if ($edit->type == 'copy')
+                $closing->addWords($edit->closing);
+            elseif ($edit->closing)
+                $closing->addWords($edit->closing, 'mark');
+        }
+        return $closing->getLines();
+    }
+}
+
+class InlineWordLevelDiff extends MappedDiff {
+
+    function InlineWordLevelDiff($orig_lines, $closing_lines) {
+        list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
+        list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
+
+        $this->MappedDiff($orig_words, $closing_words, $orig_stripped, $closing_stripped);
+    }
+
+    function _split($lines) {
+        if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
+             implode("\n", $lines), $m)) {
+            return array(array(''), array(''));
+        }
+        return array($m[0], $m[1]);
+    }
+
+    function inline() {
+        $orig = new _HWLDF_WordAccumulator;
+        foreach ($this->edits as $edit) {
+            if ($edit->type == 'copy')
+                $orig->addWords($edit->orig);
+            elseif ($edit->type == 'change'){
+                $orig->addWords($edit->orig, 'del');
+                $orig->addWords($edit->closing, 'add');
+            } elseif ($edit->type == 'delete')
+                $orig->addWords($edit->orig, 'del');
+            elseif ($edit->type == 'add')
+                $orig->addWords($edit->closing, 'add');
+            elseif ($edit->orig)
+                $orig->addWords($edit->orig, 'del');
+        }
+        return $orig->getLines();
+    }
 }
 
 /**
@@ -986,76 +1015,145 @@ class TableDiffFormatter extends DiffFormatter {
         return $text;
     }
 
-    function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
+    function _block_header($xbeg, $xlen, $ybeg, $ylen) {
         global $lang;
         $l1 = $lang['line'].' '.$xbeg;
         $l2 = $lang['line'].' '.$ybeg;
-        $r = '<tr><td class="diff-blockheader" colspan="2">'.$l1.":</td>\n" .
-            '<td class="diff-blockheader" colspan="2">'.$l2.":</td></tr>\n";
+        $r = '<tr><td class="diff-blockheader" colspan="2">'.$l1.':</td>\n'.
+             '    <td class="diff-blockheader" colspan="2">'.$l2.":</td>\n'.
+             '</tr>\n";
         return $r;
     }
 
-    function _start_block( $header ) {
-        print( $header );
+    function _start_block($header) {
+        print($header);
     }
 
     function _end_block() {
     }
 
-    function _lines( $lines, $prefix=' ', $color="white" ) {
+    function _lines($lines, $prefix=' ', $color="white") {
     }
 
-    function addedLine( $line ) {
-        return '<td>+</td><td class="diff-addedline">' .
-            $line.'</td>';
-
+    function addedLine($line) {
+        return '<td>+</td><td class="diff-addedline">' .  $line.'</td>';
     }
 
-    function deletedLine( $line ) {
-        return '<td>-</td><td class="diff-deletedline">' .
-            $line.'</td>';
+    function deletedLine($line) {
+        return '<td>-</td><td class="diff-deletedline">' .  $line.'</td>';
     }
 
     function emptyLine() {
         return '<td colspan="2">&nbsp;</td>';
     }
 
-    function contextLine( $line ) {
+    function contextLine($line) {
         return '<td> </td><td class="diff-context">'.$line.'</td>';
     }
 
     function _added($lines) {
         foreach ($lines as $line) {
-            print( '<tr>' . $this->emptyLine() .
-                    $this->addedLine( $line ) . "</tr>\n" );
+            print('<tr>' . $this->emptyLine() . $this->addedLine($line) . "</tr>\n");
         }
     }
 
     function _deleted($lines) {
         foreach ($lines as $line) {
-            print( '<tr>' . $this->deletedLine( $line ) .
-                    $this->emptyLine() . "</tr>\n" );
+            print('<tr>' . $this->deletedLine($line) . $this->emptyLine() . "</tr>\n");
         }
     }
 
-    function _context( $lines ) {
+    function _context($lines) {
         foreach ($lines as $line) {
-            print( '<tr>' . $this->contextLine( $line ) .
-                    $this->contextLine( $line ) . "</tr>\n" );
+            print('<tr>' . $this->contextLine($line) .  $this->contextLine($line) . "</tr>\n");
         }
     }
 
-    function _changed( $orig, $closing ) {
-        $diff = new WordLevelDiff( $orig, $closing );
+    function _changed($orig, $closing) {
+        $diff = new WordLevelDiff($orig, $closing);
         $del = $diff->orig();
         $add = $diff->closing();
 
-        while ( $line = array_shift( $del ) ) {
-            $aline = array_shift( $add );
-            print( '<tr>' . $this->deletedLine( $line ) .
-                    $this->addedLine( $aline ) . "</tr>\n" );
+        while ($line = array_shift($del)) {
+            $aline = array_shift($add);
+            print('<tr>' . $this->deletedLine($line) . $this->addedLine($aline) . "</tr>\n");
         }
-        $this->_added( $add ); # If any leftovers
+        $this->_added($add); # If any leftovers
+    }
+}
+
+/**
+ *  Inline style diff formatter.
+ *
+ */
+class InlineDiffFormatter extends DiffFormatter {
+
+    function InlineDiffFormatter() {
+        $this->leading_context_lines = 2;
+        $this->trailing_context_lines = 2;
+    }
+
+    function format($diff) {
+        // Preserve whitespaces by converting some to non-breaking spaces.
+        // Do not convert all of them to allow word-wrap.
+        $val = parent::format($diff);
+        $val = str_replace('  ','&nbsp; ', $val);
+        $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&nbsp;', $val);
+        return $val;
+    }
+
+    function _pre($text){
+        $text = htmlspecialchars($text);
+        return $text;
+    }
+
+    function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+        global $lang;
+        if ($xlen != 1)
+            $xbeg .= "," . $xlen;
+        if ($ylen != 1)
+            $ybeg .= "," . $ylen;
+        $r = '<tr><td class="diff-blockheader">@@ '.$lang['line']." -$xbeg +$ybeg @@";
+        $r .= ' <span class="diff-deletedline"><del>'.$lang['deleted'].'</del></span>';
+        $r .= ' <span class="diff-addedline">'.$lang['created'].'</span>';
+        $r .= "</td></tr>\n";
+        return $r;
+    }
+
+    function _start_block($header) {
+        print($header."\n");
+    }
+
+    function _end_block() {
+    }
+
+    function _lines($lines, $prefix=' ', $color="white") {
+    }
+
+    function _added($lines) {
+        foreach ($lines as $line) {
+            print('<tr><td class="diff-addedline">'. $line . "</td></tr>\n");
+        }
+    }
+
+    function _deleted($lines) {
+        foreach ($lines as $line) {
+            print('<tr><td class="diff-deletedline"><del>' . $line . "</del></td></tr>\n");
+        }
+    }
+
+    function _context($lines) {
+        foreach ($lines as $line) {
+            print('<tr><td class="diff-context">'.$line."</td></tr>\n");
+        }
+    }
+
+    function _changed($orig, $closing) {
+        $diff = new InlineWordLevelDiff($orig, $closing);
+        $add = $diff->inline();
+
+        foreach ($add as $line)
+            print('<tr><td>'.$line."</td></tr>\n");
     }
 }
 
diff --git a/inc/JSON.php b/inc/JSON.php
index 332827f4ca08ea63911298956b0a317234bc483a..2dea44003fc24c7dfe84df7fdc96592a908c4f2b 100644
--- a/inc/JSON.php
+++ b/inc/JSON.php
@@ -112,6 +112,16 @@ define('JSON_STRICT_TYPE', 11);
  * @deprecated
  */
 class JSON {
+
+    /**
+     * Disables the use of PHP5's native json_decode()
+     *
+     * You shouldn't change this usually because the native function is much
+     * faster. However, this non-native will also parse slightly broken JSON
+     * which might be handy when talking to a non-conform endpoint
+     */
+    public $skipnative = false;
+
     /**
      * constructs a new JSON instance
      *
@@ -130,6 +140,7 @@ class JSON {
 
     /**
      * encodes an arbitrary variable into JSON format
+     * If available the native PHP JSON implementation is used.
      *
      * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
      *                           see argument 1 to JSON() above for array-parsing behavior.
@@ -140,6 +151,7 @@ class JSON {
      * @access   public
      */
     function encode($var) {
+        if (function_exists('json_encode')) return json_encode($var);
         switch (gettype($var)) {
             case 'boolean':
                 return $var ? 'true' : 'false';
@@ -352,6 +364,7 @@ class JSON {
 
     /**
      * decodes a JSON string into appropriate variable
+     * If available the native PHP JSON implementation is used.
      *
      * @param    string  $str    JSON-formatted string
      *
@@ -363,6 +376,10 @@ class JSON {
      * @access   public
      */
     function decode($str) {
+        if (!$this->skipnative && function_exists('json_decode')){
+            return json_decode($str,($this->use == JSON_LOOSE_TYPE));
+        }
+
         $str = $this->reduce_string($str);
 
         switch (strtolower($str)) {
diff --git a/inc/actions.php b/inc/actions.php
index 9db7d5f24e18883b4c4dea893fe8a03411477455..fb2ae452fd93f4b035a51af359f38d5b02b07ac7 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -20,6 +20,7 @@ function act_dispatch(){
     global $ID;
     global $QUERY;
     global $lang;
+    global $conf;
 
     $preact = $ACT;
 
@@ -50,6 +51,12 @@ function act_dispatch(){
             }
         }
 
+        //display some infos
+        if($ACT == 'check'){
+            check();
+            $ACT = 'show';
+        }
+
         //check permissions
         $ACT = act_permcheck($ACT);
 
@@ -120,12 +127,6 @@ function act_dispatch(){
         if(substr($ACT,0,7) == 'export_')
             $ACT = act_export($ACT);
 
-        //display some infos
-        if($ACT == 'check'){
-            check();
-            $ACT = 'show';
-        }
-
         //handle admin tasks
         if($ACT == 'admin'){
             // retrieve admin plugin name from $_REQUEST['page']
@@ -143,6 +144,10 @@ function act_dispatch(){
         $ACT = act_permcheck($ACT);
     }  // end event ACTION_ACT_PREPROCESS default action
     $evt->advise_after();
+    // Make sure plugs can handle 'denied'
+    if($conf['send404'] && $ACT == 'denied') {
+        header('HTTP/1.0 403 Forbidden');
+    }
     unset($evt);
 
     // when action 'show', the intial not 'show' and POST, do a redirect
diff --git a/inc/changelog.php b/inc/changelog.php
index bb00df76c68f90eebc96c87b0ac1a229b6c9faae..cc7612bfd147d59866bedaf5e0c2a7030d84e434 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -37,6 +37,15 @@ function parseChangelogLine($line) {
 /**
  * Add's an entry to the changelog and saves the metadata for the page
  *
+ * @param int    $date      Timestamp of the change
+ * @param String $id        Name of the affected page
+ * @param String $type      Type of the change see DOKU_CHANGE_TYPE_*
+ * @param String $summary   Summary of the change
+ * @param mixed  $extra     In case of a revert the revision (timestmp) of the reverted page
+ * @param array  $flags     Additional flags in a key value array.
+ *                             Availible flags:
+ *                             - ExternalEdit - mark as an external edit.
+ *
  * @author Andreas Gohr <andi@splitbrain.org>
  * @author Esther Brunner <wikidesign@gmail.com>
  * @author Ben Coburn <btcoburn@silicodon.net>
diff --git a/inc/form.php b/inc/form.php
index 70190d2b49b0dc2dceeab3cc18db93281260ab01..e614d2f30df29fc4555eaf04d3fab6b2a0d95038 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -252,7 +252,7 @@ class Doku_Form {
         global $lang;
         $form = '';
         $this->params['accept-charset'] = $lang['encoding'];
-        $form .= '<form ' . html_attbuild($this->params) . '><div class="no">' . DOKU_LF;
+        $form .= '<form ' . buildAttributes($this->params,true) . '><div class="no">' . DOKU_LF;
         if (!empty($this->_hidden)) {
             foreach ($this->_hidden as $name=>$value)
                 $form .= form_hidden(array('name'=>$name, 'value'=>$value));
@@ -597,7 +597,7 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id=''
  * @author  Tom N Harris <tnharris@whoopdedo.org>
  */
 function form_tag($attrs) {
-    return '<'.$attrs['_tag'].' '.buildAttributes($attrs).'/>';
+    return '<'.$attrs['_tag'].' '.buildAttributes($attrs,true).'/>';
 }
 
 /**
diff --git a/inc/html.php b/inc/html.php
index 7f502afa528949553c5c40d9dc22a01ebea3d555..9d3c9270744b04f29c9b33c99ebac246228ed465 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -26,6 +26,7 @@ function html_wikilink($id,$name=null,$search=''){
 /**
  * Helps building long attribute lists
  *
+ * @deprecated Use buildAttributes instead
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function html_attbuild($attributes){
diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php
index 33c6db01a3cca8c63863abf8f78ba5b4511e2054..749a41a5bbc9910fbf07e7a6743b6e22411fcffc 100644
--- a/inc/lang/cs/lang.php
+++ b/inc/lang/cs/lang.php
@@ -242,7 +242,7 @@ $lang['i_wikiname']            = 'Název wiki';
 $lang['i_enableacl']           = 'Zapnout ACL (doporučeno)';
 $lang['i_superuser']           = 'Správce';
 $lang['i_problems']            = 'Instalátor narazil na níže popsané problémy. Nelze pokračovat v instalaci, dokud je neopravíte.';
-$lang['i_modified']            = 'Instalátor bude z bezpečnostních důvodů pracovat pouze s čistou a ještě neupravenou instalací DokuWiki. Buď znovu rozbalte souboru z instalačního balíčku nebo se zkuste poradit s <a href="http://dokuwiki.org/install">instrukcemi pro instalci DokuWiki</a>.';
+$lang['i_modified']            = 'Instalátor bude z bezpečnostních důvodů pracovat pouze s čistou a ještě neupravenou instalací DokuWiki. Buď znovu rozbalte souboru z instalačního balíčku nebo se zkuste poradit s <a href="http://dokuwiki.org/install">instrukcemi pro instalaci DokuWiki</a>.';
 $lang['i_funcna']              = 'PHP funkce <code>%s</code> není dostupná. Váš webhosting ji možná z nějakého důvodu vypnul.';
 $lang['i_phpver']              = 'Verze vaší instalace PHP <code>%s</code> je nižší než požadovaná <code>%s</code>. Budete muset aktualizovat svou instalaci PHP.';
 $lang['i_permfail']            = 'DokuWiki nemůže zapisovat do <code>%s</code>. Budete muset opravit práva k tomuto adresáři.';
@@ -268,7 +268,7 @@ $lang['mu_toobig']             = 'příliš velké';
 $lang['mu_ready']              = 'připraveno k načtení';
 $lang['mu_done']               = 'hotovo';
 $lang['mu_fail']               = 'selhalo';
-$lang['mu_authfail']           = 'vypršla session';
+$lang['mu_authfail']           = 'vypršela session';
 $lang['mu_progress']           = '@PCT@% načten';
 $lang['mu_filetypes']          = 'Povolené typy souborů';
 $lang['mu_info']               = 'soubory načteny.';
diff --git a/inc/lang/cs/subscr_form.txt b/inc/lang/cs/subscr_form.txt
index b786ac13792ad6d6fb8c933f35c6176d6cf1d42a..d051b646fcd96b1b32a396016a77eb6887f16f04 100644
--- a/inc/lang/cs/subscr_form.txt
+++ b/inc/lang/cs/subscr_form.txt
@@ -1,3 +1,3 @@
 ====== Správa odběratelů změn ======
 
-Tato stránka Vám umožnuje spravovat uživatele přihlášené k odběru změn aktuální stránky nebo jmenného prostoru.
\ No newline at end of file
+Tato stránka Vám umožňuje spravovat uživatele přihlášené k odběru změn aktuální stránky nebo jmenného prostoru.
\ No newline at end of file
diff --git a/inc/lang/ko/adminplugins.txt b/inc/lang/ko/adminplugins.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5312cf357eccc4e3e0a505268d2b4103b191a53f
--- /dev/null
+++ b/inc/lang/ko/adminplugins.txt
@@ -0,0 +1 @@
+===== 부가적인 플러그인 =====
\ No newline at end of file
diff --git a/inc/lang/ko/edit.txt b/inc/lang/ko/edit.txt
index d73f935fee0dda831afae481042e87ffe2aa34d4..9b59524f72c5719fea85e91a97211cdc33ef8e30 100644
--- a/inc/lang/ko/edit.txt
+++ b/inc/lang/ko/edit.txt
@@ -1,2 +1,2 @@
-페이지를 편집하고 **저장**을 누르십시오.  위키 구문은 [[wiki:syntax]] 혹은 [[syntax|(한글) 구문]]을 참고하십시오. 이 페이지를 **더 낫게 만들 자신이 있을** 때에만 편집하십시오. 실험을 하고 싶을 때에는, 먼저 [[playground:playground|연습장]] 에 가서 연습해 보십시오.
+페이지를 편집하고 **저장**을 누르십시오.  위키 구문은 [[wiki:syntax]] 혹은 [[wiki:ko_syntax|(한글) 구문]]을 참고하십시오. 이 페이지를 **더 낫게 만들 자신이 있을** 때에만 편집하십시오. 실험을 하고 싶을 때에는, 먼저 [[playground:playground|연습장]] 에 가서 연습해 보십시오.
 
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 83014c151b60357a453d144eff52771d342c64a9..3765dd0114b912faa9e010d61c428e9f068c3992 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -8,6 +8,7 @@
  * @author dongnak@gmail.com
  * @author Song Younghwan <purluno@gmail.com>
  * @author SONG Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo  <dryoo@live.com>
  */
 $lang['encoding']              = 'utf-8';
 $lang['direction']             = 'ltr';
@@ -41,15 +42,13 @@ $lang['btn_back']              = '뒤로';
 $lang['btn_backlink']          = '이전 링크';
 $lang['btn_backtomedia']       = '미디어 파일 선택으로 돌아가기';
 $lang['btn_subscribe']         = '구독 신청';
-$lang['btn_unsubscribe']       = '구독 신청 해지';
-$lang['btn_subscribens']       = '네임스페이스 구독 신청';
-$lang['btn_unsubscribens']     = '네임스페이스 구독 신청 해지';
 $lang['btn_profile']           = '개인정보 변경';
 $lang['btn_reset']             = '초기화';
 $lang['btn_resendpwd']         = '새 패스워드 보내기';
 $lang['btn_draft']             = '문서초안 편집';
 $lang['btn_recover']           = '문서초안 복구';
 $lang['btn_draftdel']          = '문서초안 삭제';
+$lang['btn_revert']            = '복원';
 $lang['loggedinas']            = '다음 사용자로 로그인';
 $lang['user']                  = '사용자';
 $lang['pass']                  = '패스워드';
@@ -88,13 +87,45 @@ $lang['resendpwdconfirm']      = '확인 링크를 이메일로 보냈습니다.
 $lang['resendpwdsuccess']      = '새로운 패스워드는 이메일로 보내드립니다.';
 $lang['license']               = '이 위키의 내용은 다음의 라이센스에 따릅니다 :';
 $lang['licenseok']             = '주의 : 이 페이지를 수정한다는 다음의 라이센스에 동의함을 의미합니다 :';
+$lang['searchmedia']           = '파일이름 찾기:';
+$lang['searchmedia_in']        = ' %에서 검색';
 $lang['txt_upload']            = '업로드 파일을 선택합니다.';
 $lang['txt_filename']          = '업로드 파일 이름을 입력합니다.(선택 사항)';
 $lang['txt_overwrt']           = '새로운 파일로 이전 파일을 교체합니다.';
 $lang['lockedby']              = '현재 잠금 사용자';
 $lang['lockexpire']            = '잠금 해제 시간';
 $lang['willexpire']            = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리보기를 눌러 잠금 시간을 다시 설정하기 바랍니다.';
-$lang['js']['notsavedyet']     = "저장하지 않은 변경은 지워집니다.\n계속하시겠습니까?";
+$lang['js']['notsavedyet']     = '저장하지 않은 변경은 지워집니다.
+계속하시겠습니까?';
+$lang['js']['searchmedia']     = '파일 찾기';
+$lang['js']['keepopen']        = '선택할 때 윈도우를 열어놓으시기 바랍니다.';
+$lang['js']['hidedetails']     = '자세한 정보 감추기';
+$lang['js']['mediatitle']      = '링크 설정';
+$lang['js']['mediadisplay']    = '링크 형태';
+$lang['js']['mediaalign']      = '배치';
+$lang['js']['mediasize']       = '그림 크기';
+$lang['js']['mediatarget']     = '링크 목표';
+$lang['js']['mediaclose']      = '닫기';
+$lang['js']['mediainsert']     = '삽입';
+$lang['js']['mediadisplayimg'] = '그림보기';
+$lang['js']['mediasmall']      = '작게';
+$lang['js']['mediamedium']     = '중간';
+$lang['js']['medialarge']      = '크게';
+$lang['js']['mediaoriginal']   = '원본';
+$lang['js']['medialnk']        = '세부정보페이지로 링크';
+$lang['js']['mediadirect']     = '원본으로 직접 링크';
+$lang['js']['medianolnk']      = '링크 없슴';
+$lang['js']['medianolink']     = '그림을 링크하지 않음';
+$lang['js']['medialeft']       = '왼쪽 배치';
+$lang['js']['mediaright']      = '오른쪽 배치';
+$lang['js']['mediacenter']     = '중앙 배치';
+$lang['js']['medianoalign']    = '배치 없슴';
+$lang['js']['nosmblinks']      = '윈도우 공유 파일과의 연결은 MS 인터넷 익스플로러에서만 동작합니다.
+그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.';
+$lang['js']['linkwiz']         = '링크 마법사';
+$lang['js']['linkto']          = '다음으로 연결:';
+$lang['js']['del_confirm']     = '정말로 선택된 항목(들)을 삭제하시겠습니까?';
+$lang['js']['mu_btn']          = '여러 파일들을 한번에 업로드합니다.';
 $lang['rssfailed']             = 'feed 가져오기 실패: ';
 $lang['nothingfound']          = '아무 것도 없습니다.';
 $lang['mediaselect']           = '미디어 파일 선택';
@@ -112,11 +143,7 @@ $lang['deletefail']            = '"%s" 파일을 삭제할 수 없습니다. - 
 $lang['mediainuse']            = '"%s" 파일을 삭제할 수 없습니다. - 아직 사용 중입니다.';
 $lang['namespaces']            = '네임스페이스';
 $lang['mediafiles']            = '사용 가능한 파일 목록';
-$lang['js']['keepopen']        = '선택할 때 윈도우를 열어놓으시기 바랍니다.';
-$lang['js']['hidedetails']     = '자세한 정보 감추기';
-$lang['js']['nosmblinks']      = '윈도우 공유 파일과의 연결은 MS 인터넷 익스플로러에서만 동작합니다.
-그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.';
-$lang['js']['mu_btn']          = '여러 파일들을 한번에 업로드합니다.';
+$lang['accessdenied']          = '이 페이지를 볼 권한이 없습니다.';
 $lang['mediausage']            = '이 파일을 참조하려면 다음 문법을 사용하기 바랍니다:';
 $lang['mediaview']             = '원본 파일 보기';
 $lang['mediaroot']             = '루트(root)';
@@ -143,8 +170,10 @@ $lang['restored']              = '옛 버전 복구';
 $lang['external_edit']         = '외부 편집기';
 $lang['summary']               = '편집 요약';
 $lang['noflash']               = '이 컨텐츠를 표시하기 위해서 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>이 필요합니다.';
+$lang['download']              = '조각 다운로드';
 $lang['mail_newpage']          = '페이지 추가:';
 $lang['mail_changed']          = '페이지 변경:';
+$lang['mail_subscribe_list']   = '네임스페이스에서 변경된 페이지:';
 $lang['mail_new_user']         = '새로운 사용자:';
 $lang['mail_upload']           = '파일 첨부:';
 $lang['qb_bold']               = '굵은 글';
@@ -157,6 +186,11 @@ $lang['qb_h2']                 = '2단계 헤드라인';
 $lang['qb_h3']                 = '3단계 헤드라인';
 $lang['qb_h4']                 = '4단계 헤드라인';
 $lang['qb_h5']                 = '5단계 헤드라인';
+$lang['qb_h']                  = '표제';
+$lang['qb_hs']                 = '표제 선택';
+$lang['qb_hplus']              = '상위 표제';
+$lang['qb_hminus']             = '하위 표제';
+$lang['qb_hequal']             = '동급 표제';
 $lang['qb_link']               = '내부 링크';
 $lang['qb_extlink']            = '외부 링크';
 $lang['qb_hr']                 = '수평선';
@@ -166,7 +200,7 @@ $lang['qb_media']              = '이미지와 기타 파일 추가';
 $lang['qb_sig']                = '서명 추가';
 $lang['qb_smileys']            = '이모티콘';
 $lang['qb_chars']              = '특수문자';
-$lang['js']['del_confirm']           = '정말로 선택된 항목(들)을 삭제하시겠습니까?';
+$lang['upperns']               = '상위 네임스페이스로 이동';
 $lang['admin_register']        = '새로운 사용자 추가';
 $lang['metaedit']              = '메타 데이타를 편집합니다.';
 $lang['metasaveerr']           = '메타 데이타 쓰기가 실패했습니다.';
@@ -182,11 +216,16 @@ $lang['img_copyr']             = '저작권';
 $lang['img_format']            = '포맷';
 $lang['img_camera']            = '카메라';
 $lang['img_keywords']          = '키워드';
-$lang['subscribe_success']     = '%s를 추가했습니다. (%s의 구독 목록)';
-$lang['subscribe_error']       = '%s를 추가하는데 실패했습니다.(%s의 구독 목록)';
-$lang['subscribe_noaddress']   = '로그인 정보에 이메일 주소가 없습니다, 구독 목록에 추가할 수 없습니다.';
-$lang['unsubscribe_success']   = '%s를 제외시켰습니다. (%s의 구독 목록)';
-$lang['unsubscribe_error']     = '%s를 제외시키는데 실패했습니다.(%s의 구독 목록)';
+$lang['subscr_subscribe_noaddress'] = '등록된 주소가 없기 때문에 구독목록에 등록되지 않았습니다.';
+$lang['subscr_m_not_subscribed'] = '현재의 페이지나 네임스페이스에 구독등록이 되어있지 않습니다.';
+$lang['subscr_m_new_header']   = '구독 추가';
+$lang['subscr_m_current_header'] = '현재 구독중인 것들';
+$lang['subscr_m_unsubscribe']  = '구독 취소';
+$lang['subscr_m_subscribe']    = '구독';
+$lang['subscr_m_receive']      = '받기';
+$lang['subscr_style_every']    = '모든 변화를 이메일로 받기';
+$lang['subscr_style_digest']   = '각 페이지의 변화를 요약 (매 %.2f 일 마다)';
+$lang['subscr_style_list']     = '마지막 이메일 이후 변화된 페이지의 목록 (매 %.2f 일 마다)';
 $lang['authmodfailed']         = '잘못된 사용자 인증 설정입니다. 관리자에게 문의하기 바랍니다.';
 $lang['authtempfail']          = '사용자 인증이 일시적으로 불가능합니다. 만일 계속해서 문제가 발생하면 관리자에게 문의하기 바랍니다.';
 $lang['i_chooselang']          = '사용하는 언어를 선택합니다.';
@@ -213,6 +252,7 @@ $lang['i_pol0']                = '개방형 위키 (누구나 읽기/쓰기/업
 $lang['i_pol1']                = '공개형 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기/업로드가 가능합니다.)';
 $lang['i_pol2']                = '폐쇄형 위키 (등록된 사용자만 읽기/쓰기/업로드가 가능합니다.)';
 $lang['i_retry']               = '다시 시도';
+$lang['i_license']             = '내용의 배포를 위한 라이센스를 선택하세요.';
 $lang['mu_intro']              = '여러 파일을 한번에 업로드할 수 있습니다. 파일 목록에 추가하려면 "찾기" 버튼을 클릭합니다. 파일 목록 추가 작업이 끝나면 "업로드" 버튼을 클릭하기 바랍니다. ';
 $lang['mu_gridname']           = '파일명';
 $lang['mu_gridsize']           = '크기';
@@ -226,4 +266,14 @@ $lang['mu_fail']               = '업로드가 실패했습니다.';
 $lang['mu_authfail']           = '세션 기간이 종료되었습니다.';
 $lang['mu_progress']           = '@PCT@% 업로드되었습니다.';
 $lang['mu_filetypes']          = '허용된 파일타입';
+$lang['mu_info']               = '업로드 되었습니다.';
+$lang['mu_lasterr']            = '마지막 에러:';
 $lang['recent_global']         = '<b>%s</b> 네임스페이스를 구독중입니다. <a href="%s">전체위키 변경사항 </a>도 보실수 있습니다.';
+$lang['years']                 = '%d ë…„ ì „';
+$lang['months']                = '%d 개월 전';
+$lang['weeks']                 = '%d 주 전';
+$lang['days']                  = '%d 일 전';
+$lang['hours']                 = '%d 시간 전';
+$lang['minutes']               = '%d 분 전';
+$lang['seconds']               = '%d ì´ˆ ì „';
+$lang['wordblock']             = '스팸 문구를 포함하고 있어서 저장되지 않았습니다.';
diff --git a/inc/lang/ko/register.txt b/inc/lang/ko/register.txt
index 999073a1d2de1cb97bfcefd914849e300dbe796d..24105efebc36cfe6967d7b9ba709060acb32063c 100644
--- a/inc/lang/ko/register.txt
+++ b/inc/lang/ko/register.txt
@@ -1,4 +1,4 @@
 ====== 새 사용자 등록 ======
 
-이 위키에 새 계정을 만들려면 아래의 모든 내용을 입력하십시오. **제대로 된 이메일 주소**를 사용하십시오. 그러나, 아래 내용을 입력했다고 해서 계정을 만들 수 있으리라고는 믿지 마십시오.  이곳은 내가 개인적으로 사용하는 곳이며, 계정을 만들어 주고 안주고는 내 마음입니다. 차라리, 내게 이메일을 보내서 신청하는 편이 더 나을 것입니다. 패스워드는 이 이메일로 보내집니다. 사용자명은 올바른 [[doku>pagename|pagename]] 이어야 합니다.
+이 위키에 새 계정을 만들려면 아래의 모든 내용을 입력하세요. **제대로 된 이메일 주소**를 사용하세요. 암호를 입력하는 곳이 없다면 암호는 이 이메일로 보내집니다. 사용자명은 올바른 [[doku>pagename|pagename]] 이어야 합니다.
 
diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2e9c87848de7c38770bca65358c8d046ad64ccc0
--- /dev/null
+++ b/inc/lang/ko/subscr_digest.txt
@@ -0,0 +1,18 @@
+안녕하세요!
+
+@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
+
+변경사항은 다음과 같습니다:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+옛날 것: @OLDPAGE@
+새 것: @NEWPAGE@
+
+이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 
+@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+
+--
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file
diff --git a/inc/lang/ko/subscr_form.txt b/inc/lang/ko/subscr_form.txt
new file mode 100644
index 0000000000000000000000000000000000000000..31470f3723f1192809b2cd809f8a68811b465606
--- /dev/null
+++ b/inc/lang/ko/subscr_form.txt
@@ -0,0 +1,3 @@
+====== 구독 관리 ======
+
+이 페이지는 현재의 페이지와 네임스페이스의 구독을 관리할 수있도록 해줍니다.
\ No newline at end of file
diff --git a/inc/lang/ko/subscr_list.txt b/inc/lang/ko/subscr_list.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2661a6a15ca8730cd3bd527f04b58562db9c7810
--- /dev/null
+++ b/inc/lang/ko/subscr_list.txt
@@ -0,0 +1,15 @@
+안녕하세요!
+
+@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
+
+변경사항은 다음과 같습니다:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 
+@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+
+--
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file
diff --git a/inc/lang/ko/subscr_single.txt b/inc/lang/ko/subscr_single.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1aa4d7efa6d80e704feae445953bb41faf1c4d34
--- /dev/null
+++ b/inc/lang/ko/subscr_single.txt
@@ -0,0 +1,21 @@
+안녕하세요!
+
+@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
+
+변경사항은 다음과 같습니다:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+날짜 : @DATE@
+사용자 : @USER@
+편집 요약 : @SUMMARY@
+구 버전 : @OLDPAGE@
+새 버전 : @NEWPAGE@
+
+이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 t
+@NEWPAGE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+
+--
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
\ No newline at end of file
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 27a5190bd661a2c66ecadb5c9169dfcee8e7fa72..a50e3f4f348ddf5664a4c98b33188e9cef3f42ed 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -223,7 +223,7 @@ function p_get_instructions($text){
  * @author Esther Brunner <esther@kaffeehaus.ch>
  */
 function p_get_metadata($id, $key='', $render=false){
-    global $ID, $INFO, $cache_metadata;
+    global $ID;
 
     // cache the current page
     // Benchmarking shows the current page's metadata is generally the only page metadata
@@ -234,11 +234,7 @@ function p_get_metadata($id, $key='', $render=false){
     // metadata has never been rendered before - do it! (but not for non-existent pages)
     if ($render && !isset($meta['current']['description']['abstract']) && page_exists($id)){
         $meta = p_render_metadata($id, $meta);
-        io_saveFile(metaFN($id, '.meta'), serialize($meta));
-
-        // sync cached copies, including $INFO metadata
-        if (!empty($cache_metadata[$id])) $cache_metadata[$id] = $meta;
-        if (!empty($INFO) && ($id == $INFO['id'])) { $INFO['meta'] = $meta['current']; }
+        p_save_metadata($id, $meta);
     }
 
     $val = $meta['current'];
@@ -256,6 +252,15 @@ function p_get_metadata($id, $key='', $render=false){
 /**
  * sets metadata elements of a page
  *
+ * @see http://www.dokuwiki.org/devel:metadata#functions_to_get_and_set_metadata
+ *
+ * @param String  $id         is the ID of a wiki page
+ * @param Array   $data       is an array with key ⇒ value pairs to be set in the metadata
+ * @param Boolean $render     whether or not the page metadata should be generated with the renderer
+ * @param Boolean $persistent indicates whether or not the particular metadata value will persist through
+ *                            the next metadata rendering.
+ * @return boolean true on success
+ *
  * @author Esther Brunner <esther@kaffeehaus.ch>
  */
 function p_set_metadata($id, $data, $render=false, $persistent=true){
@@ -305,13 +310,7 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){
     // save only if metadata changed
     if ($meta == $orig) return true;
 
-    // sync cached copies, including $INFO metadata
-    global $cache_metadata, $INFO;
-
-    if (!empty($cache_metadata[$id])) $cache_metadata[$id] = $meta;
-    if (!empty($INFO) && ($id == $INFO['id'])) { $INFO['meta'] = $meta['current']; }
-
-    return io_saveFile(metaFN($id, '.meta'), serialize($meta));
+    return p_save_metadata($id, $meta);
 }
 
 /**
@@ -321,25 +320,22 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){
  * @author Michael Klier <chi@chimeric.de>
  */
 function p_purge_metadata($id) {
-    $metafn = metaFN('id', '.meta');
-    $meta   = p_read_metadata($id);
+    $meta = p_read_metadata($id);
     foreach($meta['current'] as $key => $value) {
         if(is_array($meta[$key])) {
             $meta['current'][$key] = array();
         } else {
             $meta['current'][$key] = '';
         }
+
     }
-    return io_saveFile(metaFN($id, '.meta'), serialize($meta));
+    return p_save_metadata($id, $meta);
 }
 
 /**
  * read the metadata from source/cache for $id
  * (internal use only - called by p_get_metadata & p_set_metadata)
  *
- * this function also converts the metadata from the original format to
- * the current format ('current' & 'persistent' arrays)
- *
  * @author   Christopher Smith <chris@jalakai.co.uk>
  *
  * @param    string   $id      absolute wiki page id
@@ -356,26 +352,6 @@ function p_read_metadata($id,$cache=false) {
     $file = metaFN($id, '.meta');
     $meta = @file_exists($file) ? unserialize(io_readFile($file, false)) : array('current'=>array(),'persistent'=>array());
 
-    // convert $meta from old format to new (current+persistent) format
-    if (!isset($meta['current'])) {
-        $meta = array('current'=>$meta,'persistent'=>$meta);
-
-        // remove non-persistent keys
-        unset($meta['persistent']['title']);
-        unset($meta['persistent']['description']['abstract']);
-        unset($meta['persistent']['description']['tableofcontents']);
-        unset($meta['persistent']['relation']['haspart']);
-        unset($meta['persistent']['relation']['references']);
-        unset($meta['persistent']['date']['valid']);
-
-        if (empty($meta['persistent']['description'])) unset($meta['persistent']['description']);
-        if (empty($meta['persistent']['relation'])) unset($meta['persistent']['relation']);
-        if (empty($meta['persistent']['date'])) unset($meta['persistent']['date']);
-
-        // save converted metadata
-        io_saveFile($file, serialize($meta));
-    }
-
     if ($cache) {
         $cache_metadata[(string)$id] = $meta;
     }
@@ -383,6 +359,24 @@ function p_read_metadata($id,$cache=false) {
     return $meta;
 }
 
+/**
+ * This is the backend function to save a metadata array to a file
+ *
+ * @param    string   $id      absolute wiki page id
+ * @param    array    $meta    metadata
+ *
+ * @return   bool              success / fail
+ */
+function p_save_metadata($id, $meta) {
+    // sync cached copies, including $INFO metadata
+    global $cache_metadata, $INFO;
+
+    if (isset($cache_metadata[$id])) $cache_metadata[$id] = $meta;
+    if (!empty($INFO) && ($id == $INFO['id'])) { $INFO['meta'] = $meta['current']; }
+
+    return io_saveFile(metaFN($id, '.meta'), serialize($meta));
+}
+
 /**
  * renders the metadata of a page
  *
diff --git a/inc/search.php b/inc/search.php
index 03abec0c0bd200d09667788dbc2f27c53a660e3b..a6787c5d220bdce518866f0488cd4a8906fb0d65 100644
--- a/inc/search.php
+++ b/inc/search.php
@@ -511,8 +511,7 @@ function pathID($path,$keeptxt=false){
     $id = utf8_decodeFN($path);
     $id = str_replace('/',':',$id);
     if(!$keeptxt) $id = preg_replace('#\.txt$#','',$id);
-    $id = preg_replace('#^:+#','',$id);
-    $id = preg_replace('#:+$#','',$id);
+    $id = trim($id, ':');
     return $id;
 }
 
diff --git a/inc/template.php b/inc/template.php
index 00bfde723c065d08c9d5d0f7f22d9901cf686f50..e2ea6e386a9a79ca89bfa796ae14519cfdfd9acd 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -609,7 +609,7 @@ function tpl_get_action($type) {
             $type = 'subscribe';
             $params['do'] = 'subscribe';
         case 'subscribe':
-            if(!$conf['useacl'] || !$auth || $ACT !== 'show' || !$conf['subscribers'] || !$_SERVER['REMOTE_USER']){
+            if(!$conf['useacl'] || !$auth  || !$conf['subscribers'] || !$_SERVER['REMOTE_USER']){
                 return false;
             }
             break;
@@ -617,7 +617,7 @@ function tpl_get_action($type) {
             break;
         case 'profile':
             if(!$conf['useacl'] || !$auth || !isset($_SERVER['REMOTE_USER']) ||
-                    !$auth->canDo('Profile') || ($ACT=='profile')){
+                    !$auth->canDo('Profile')){
                 return false;
             }
             break;
diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php
index f35f9ed7294921b3a23ae6709f9e38b961b6e57d..3fa81715b9897e350987b859002a8738ac7ef32f 100644
--- a/lib/exe/indexer.php
+++ b/lib/exe/indexer.php
@@ -190,7 +190,7 @@ function metaUpdate(){
 
     // rendering needed?
     if (@file_exists($file)) return false;
-    if (!@file_exists(wikiFN($ID))) return false;
+    if (!page_exists($ID)) return false;
 
     global $conf;
 
@@ -213,7 +213,7 @@ function metaUpdate(){
     }
 
     $meta = p_render_metadata($ID, $meta);
-    io_saveFile($file, serialize($meta));
+    p_save_metadata($ID, $meta);
 
     echo "metaUpdate(): finished".NL;
     return true;
diff --git a/lib/plugins/acl/admin.php b/lib/plugins/acl/admin.php
index 84932f7ac1e28a8bed5f27ebc27f085f1b483575..3e7bd8121ffc1a4322087679141074815f0cd3fa 100644
--- a/lib/plugins/acl/admin.php
+++ b/lib/plugins/acl/admin.php
@@ -765,7 +765,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
 
             //build code
             $ret .= '<label for="pbox'.$label.'" title="'.$this->getLang('acl_perm'.$perm).'"'.$class.'>';
-            $ret .= '<input '.html_attbuild($atts).' />&nbsp;';
+            $ret .= '<input '.buildAttributes($atts).' />&nbsp;';
             $ret .= $this->getLang('acl_perm'.$perm);
             $ret .= '</label>'.NL;
         }
diff --git a/lib/plugins/acl/lang/ko/lang.php b/lib/plugins/acl/lang/ko/lang.php
index 43a5ceeeb0269b6474f2c9df1090fcc9f6cb1b97..6f4e991cbb505a7417c10ce15cc708c168e14064 100644
--- a/lib/plugins/acl/lang/ko/lang.php
+++ b/lib/plugins/acl/lang/ko/lang.php
@@ -10,6 +10,7 @@
  * @author dongnak@gmail.com
  * @author Song Younghwan <purluno@gmail.com>
  * @author SONG Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo  <dryoo@live.com>
  */
 $lang['admin_acl']             = '접근 제어 목록 관리';
 $lang['acl_group']             = '그룹';
diff --git a/lib/plugins/config/lang/cs/intro.txt b/lib/plugins/config/lang/cs/intro.txt
index bad92ac8e3887cd9faf8d8a83f04003b5d552786..63381b84e66fb258b56f4b2beb3e356d2a0882fd 100644
--- a/lib/plugins/config/lang/cs/intro.txt
+++ b/lib/plugins/config/lang/cs/intro.txt
@@ -2,7 +2,7 @@
 
 Tuto stránku můžete používat ke správě nastavení vaší instalace DokuWiki. Nápovědu pro konkrétní položky nastavení naleznete na [[doku>config]]. Pro další detaily o tomto pluginu viz [[doku>plugin:config]].
 
-Položky se světle červeným pozadím jsou chráněné a nelze je upravovat tímto pluginem.  Položky s modrým pozadím jsou výchozí hodnoty a položky s bílým pozadím byly nastaveny lokálně v této konktétní instalaci. Modré i bílé položky je možné upravovat.
+Položky se světle červeným pozadím jsou chráněné a nelze je upravovat tímto pluginem.  Položky s modrým pozadím jsou výchozí hodnoty a položky s bílým pozadím byly nastaveny lokálně v této konkrétní instalaci. Modré i bílé položky je možné upravovat.
 
 Než opustíte tuto stránku, nezapomeňte stisknout tlačítko **Uložit**, jinak budou změny ztraceny.
 
diff --git a/lib/plugins/config/lang/cs/lang.php b/lib/plugins/config/lang/cs/lang.php
index 3f8c05f262c5fb1db7c17ce250a5c8f80475ed60..06839c1d088e356cedfdd854e44e23f35a4be7c0 100644
--- a/lib/plugins/config/lang/cs/lang.php
+++ b/lib/plugins/config/lang/cs/lang.php
@@ -11,7 +11,7 @@
  */
 $lang['menu']                  = 'Správa nastavení';
 $lang['error']                 = 'Nastavení nebyla změněna kvůli alespoň jedné neplatné položce,
-zkotrolujte prosím své úpravy a odešlete je znovu.<br />
+zkontrolujte prosím své úpravy a odešlete je znovu.<br />
 Neplatné hodnoty se zobrazí v červeném rámečku.';
 $lang['updated']               = 'Nastavení byla úspěšně upravena.';
 $lang['nochoice']              = '(nejsou k dispozici žádné další volby)';
@@ -69,10 +69,10 @@ $lang['useheading']            = 'Používat první nadpis jako název stránky'
 $lang['refcheck']              = 'Kontrolovat odkazy na média (před vymazáním)';
 $lang['refshow']               = 'Počet zobrazených odkazů na média';
 $lang['allowdebug']            = 'Povolit debugování. <b>Vypněte, pokud to nepotřebujete!</b>';
-$lang['usewordblock']          = 'Blokovat spam za použítí seznamu známých spamových slov';
+$lang['usewordblock']          = 'Blokovat spam za použití seznamu známých spamových slov';
 $lang['indexdelay']            = 'Časová prodleva před indexací (v sekundách)';
 $lang['relnofollow']           = 'Používat rel="nofollow" na externí odkazy';
-$lang['mailguard']             = 'Metoda "zamaskování" emailových addres';
+$lang['mailguard']             = 'Metoda "zamaskování" emailových adres';
 $lang['iexssprotect']          = 'Zkontrolovat nahrané soubory vůči možnému škodlivému JavaScriptu či HTML';
 $lang['showuseras']            = 'Co se má přesně zobrazit, když se ukazuje uživatel, který naposledy editoval stránku';
 $lang['useacl']                = 'Používat přístupová práva (ACL)';
@@ -95,7 +95,7 @@ vnořené jmenné prostory, k nimž právo má, budou přesto skryty.
 To může mít za následek, že index bude při některých
 nastaveních ACL nepoužitelný.';
 $lang['auth_security_timeout'] = 'Časový limit pro autentikaci (v sekundách)';
-$lang['securecookie']          = 'Má prohlížeč posílat cookies nastavené přes HTTPS opět jen přes HTTPS? Vypňete tuto volbu, pokud chcete, aby bylo pomocí SSL zabezpečeno pouze přihlašování do wiki, ale obsah budete prohlížet nezabezpečeně.';
+$lang['securecookie']          = 'Má prohlížeč posílat cookies nastavené přes HTTPS opět jen přes HTTPS? Vypněte tuto volbu, pokud chcete, aby bylo pomocí SSL zabezpečeno pouze přihlašování do wiki, ale obsah budete prohlížet nezabezpečeně.';
 $lang['xmlrpc']                = 'Povolit/Zakázat rozhraní XML-RPC.';
 $lang['xmlrpcuser']            = 'Omezit přístup pomocí XML-RPC pouze na zde zadané skupiny či uživatele (oddělené čárkami). Necháte-li pole prázdné, dáte přístup komukoliv.';
 $lang['updatecheck']           = 'Kontrolovat aktualizace a bezpečnostní varování? DokuWiki potřebuje pro tuto funkci přístup k splitbrain.org';
@@ -112,7 +112,7 @@ $lang['locktime']              = 'Maximální životnost zámkových souborů (v
 $lang['fetchsize']             = 'Maximální velikost souboru (v bajtech), co ještě fetch.php bude stahovat z externích zdrojů';
 $lang['notify']                = 'Posílat oznámení o změnách na následující emailovou adresu';
 $lang['registernotify']        = 'Posílat informace o nově registrovaných uživatelích na tuto mailovou adresu';
-$lang['mailfrom']              = 'Emailová addresa, která se bude používat pro automatické maily';
+$lang['mailfrom']              = 'Emailová adresa, která se bude používat pro automatické maily';
 $lang['gzip_output']           = 'Používat pro xhtml Content-Encoding gzip';
 $lang['gdlib']                 = 'Verze GD knihovny';
 $lang['im_convert']            = 'Cesta k nástroji convert z balíku ImageMagick';
diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php
index efac643abbe17087575e7cef61fbcfbe7809f2c6..13f5efefec91cb3fb2fe3ab3873f856319d7bd49 100644
--- a/lib/plugins/config/lang/ko/lang.php
+++ b/lib/plugins/config/lang/ko/lang.php
@@ -7,6 +7,7 @@
  * @author dongnak@gmail.com
  * @author Song Younghwan <purluno@gmail.com>
  * @author SONG Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo  <dryoo@live.com>
  */
 $lang['menu']                  = '환경 설정';
 $lang['error']                 = '잘못된 값때문에 설정들을 변경할 수 없습니다. 수정한 값들을 검사하고 확인을 누르기 바랍니다.
@@ -89,12 +90,15 @@ $lang['sneaky_index']          = '기본적으로, DokuWiki는 색인 목록에
 특정 ACL 설정은 색인 사용이 불가능하게 할 수도 있습니다.';
 $lang['auth_security_timeout'] = '인증 보안 초과 시간(초)';
 $lang['securecookie']          = 'HTTPS로 보내진 쿠키는 HTTPS에만 적용 할까요? 위키의 로그인 페이지만 SSL로 암호화 하고 위키 페이지는 그렇지 않은경우 꺼야 합니다.';
+$lang['xmlrpc']                = 'XML-RPC 인터페이스 지원/무시';
+$lang['xmlrpcuser']            = '주어진 그룹이나 유저들에게만 XML-RPC접근을 허락하려면 컴마로 구분하여 적으세요. 비어두면 모두에게 허용됩니다.';
 $lang['updatecheck']           = '업데이트와 보안 문제를 검사(DokuWiki를 splitbrain.org에 연결해야 합니다.)';
 $lang['userewrite']            = 'URL rewriting기능 사용';
 $lang['useslash']              = 'URL에서 네임스페이스 구분자로 슬래쉬 문자 사용';
 $lang['usedraft']              = '편집하는 동안 자동으로 문서 초안 저장';
 $lang['sepchar']               = '페이지 이름 단어 구분자';
 $lang['canonical']             = '완전한 canonical URL 사용';
+$lang['fnencode']              = '아스키가 아닌 파일이르믈 인코딩 하는 방법.';
 $lang['autoplural']            = '링크 연결시 plural폼 검사';
 $lang['compression']           = 'attic파일 압축 방법 선택';
 $lang['cachetime']             = '최대 캐쉬 생존 시간(초)';
@@ -108,6 +112,7 @@ $lang['gdlib']                 = 'GD 라이브러리 버전';
 $lang['im_convert']            = 'ImageMagick 위치';
 $lang['jpg_quality']           = 'JPG 압축 품질 (0-100)';
 $lang['subscribers']           = '페이지 갱신 알람 기능';
+$lang['subscribe_time']        = ' 구독 목록과 요약이 보내질 경과 시간 (초); 이 것은 recent_days에서 설정된 시간보다 작아야 합니다.';
 $lang['compress']              = '최적화된 CSS, javascript 출력';
 $lang['hidepages']             = '매칭된 페이지 숨기기(정규표현식)';
 $lang['send404']               = '존재하지 않는 페이지에 대해 "HTTP 404/Page Not Found" 응답';
@@ -115,7 +120,6 @@ $lang['sitemap']               = '구글 사이트맵 생성(날짜)';
 $lang['broken_iua']            = '설치된 시스템에서 ignore_user_abort 기능에 문제가 있으면 색인이 정상적으로 동작하지 않습니다. 이 기능이 IIS+PHP/CGI에서 문제가 있는 것으로 알려졌습니다. 자세한 정보는 <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a>를 참고하기 바랍니다.';
 $lang['xsendfile']             = '웹 서버 static 파일 전송 지원을 위해 X-Sendfile 헤더를 사용한다면 이 옵션을 사용합니다.
 웹 서버가 이 기능을 지원해야 합니다.';
-$lang['xmlrpc']                = 'XML-RPC 인터페이스 지원/무시';
 $lang['renderer_xhtml']        = '주 (xhtml) 위키 출력 처리기';
 $lang['renderer__core']        = '%s (DokuWiki 내부 기능)';
 $lang['renderer__plugin']      = '%s (DokuWiki 플러그인)';
@@ -136,6 +140,7 @@ $lang['proxy____port']         = '프록시 서버 포트';
 $lang['proxy____user']         = '프록시 사용자 이름';
 $lang['proxy____pass']         = '프록시 패스워드';
 $lang['proxy____ssl']          = '프록시 연결시 ssl사용';
+$lang['proxy____except']       = '프록시설정이 무시될 URL주소들의 RegEx형식표현';
 $lang['safemodehack']          = 'safemode hack기능 사용';
 $lang['ftp____host']           = 'safemode hack의 FTP 서버';
 $lang['ftp____port']           = 'safemode hack의 FTP port';
@@ -183,3 +188,4 @@ $lang['useheading_o_0']        = '아니요';
 $lang['useheading_o_navigation'] = '네비게이션에만';
 $lang['useheading_o_content']  = '위키 내용에만';
 $lang['useheading_o_1']        = '항상';
+$lang['readdircache']          = 'readdir 캐쉬를 위한 최대 시간 (초)';
diff --git a/lib/plugins/plugin/lang/cs/lang.php b/lib/plugins/plugin/lang/cs/lang.php
index c15a5ca213a25a991cb1ffa8fadcaf78726e5c5d..54de0ff1898cdff807b9785d4de3546d6a2bfa43 100644
--- a/lib/plugins/plugin/lang/cs/lang.php
+++ b/lib/plugins/plugin/lang/cs/lang.php
@@ -26,7 +26,7 @@ $lang['source']                = 'Zdroj:';
 $lang['unknown']               = 'neznámý';
 $lang['updating']              = 'Aktualizuji ...';
 $lang['updated']               = 'Modul %s úspěšně aktualizován';
-$lang['updates']               = 'Následjící pluginy byly úspěšně aktualizovány';
+$lang['updates']               = 'Následující pluginy byly úspěšně aktualizovány';
 $lang['update_none']           = 'Žádné aktualizace nenalezeny.';
 $lang['deleting']              = 'Probíhá mazání ...';
 $lang['deleted']               = 'Plugin %s smazán.';
@@ -49,7 +49,7 @@ $lang['error_download']        = 'Nelze stáhnout soubor s pluginem: %s';
 $lang['error_badurl']          = 'URL je zřejmě chybná - nelze z ní určit název souboru';
 $lang['error_dircreate']       = 'Nelze vytvořit dočasný adresář ke stažení dat';
 $lang['error_decompress']      = 'Správce pluginů nemůže rozbalit stažený soubor. Toto může být způsobeno chybou při stahování. Můžete se pokusit stahování opakovat. Chyba může být také v kompresním formátu souboru. V tom případě bude nutné stáhnout a nainstalovat plugin ručně.';
-$lang['error_copy']            = 'Došlo k chybě při instalaci pluginu <em>%s</em>. Je možné, že na disku není volné místo, nebo mohou být špatně nastavena přístupová práva. Pozor, mohlo dojít k častečné a tudíž chybné instalaci pluginu a tím může být ohrožena stabilita wiki.';
+$lang['error_copy']            = 'Došlo k chybě při instalaci pluginu <em>%s</em>. Je možné, že na disku není volné místo, nebo mohou být špatně nastavena přístupová práva. Pozor, mohlo dojít k částečné a tudíž chybné instalaci pluginu a tím může být ohrožena stabilita wiki.';
 $lang['error_delete']          = 'Došlo k chybě při pokusu o smazání pluginu <em>%s</em>. Nejspíše je chyba v nastavení přístupových práv k některým souborům či adresářům.';
 $lang['enabled']               = 'Plugin %s aktivován.';
 $lang['notenabled']            = 'Plugin %s nelze aktivovat, zkontrolujte práva k souborům.';
diff --git a/lib/plugins/plugin/lang/ko/lang.php b/lib/plugins/plugin/lang/ko/lang.php
index af14a0cd2c291c04530cf867483c1be6326e8884..72c04ddab25c36f39fc287ef44ac6f7b513882f6 100644
--- a/lib/plugins/plugin/lang/ko/lang.php
+++ b/lib/plugins/plugin/lang/ko/lang.php
@@ -7,6 +7,7 @@
  * @author dongnak@gmail.com
  * @author Song Younghwan <purluno@gmail.com>
  * @author SONG Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo  <dryoo@live.com>
  */
 $lang['menu']                  = '플러그인 관리자';
 $lang['download']              = '새로운 플러그인 다운로드 및 설치';
diff --git a/lib/plugins/popularity/lang/cs/intro.txt b/lib/plugins/popularity/lang/cs/intro.txt
index 70cf1a42c82348e048c4979f3e89f74ced9a277f..4b386568ab2d36061215bcd3c61d88258a7ad90b 100644
--- a/lib/plugins/popularity/lang/cs/intro.txt
+++ b/lib/plugins/popularity/lang/cs/intro.txt
@@ -1,6 +1,6 @@
 ===== Průzkum používání =====
 
-Tento nástroj jednorázově shromáží anonymní data o vaší wiki a umožní vám odeslat je vývojářům DokuWiki. To jim pomůže lépe porozumět, jak uživatelé DokuWiki používají, a jejich rozhodnutí při dalším vývoji budou založena na statistikách z reálného používání DokuWiki.
+Tento nástroj jednorázově shromáždí anonymní data o vaší wiki a umožní vám odeslat je vývojářům DokuWiki. To jim pomůže lépe porozumět, jak uživatelé DokuWiki používají, a jejich rozhodnutí při dalším vývoji budou založena na statistikách z reálného používání DokuWiki.
 
 Chcete-li pomoci vývojářům, čas od času, jak vaše wiki poroste, použijte tento nástroj. Vaše data budou pokaždé označena stejným anonymním identifikátorem.
 
diff --git a/lib/plugins/popularity/lang/ko/lang.php b/lib/plugins/popularity/lang/ko/lang.php
index 3a28b1b0e6d36f22f3d965d8531b26b40b7cb4d2..91d798a5fcc833389171fad11df7527fd8298b36 100644
--- a/lib/plugins/popularity/lang/ko/lang.php
+++ b/lib/plugins/popularity/lang/ko/lang.php
@@ -6,6 +6,7 @@
  * @author dongnak@gmail.com
  * @author Song Younghwan <purluno@gmail.com>
  * @author SONG Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo  <dryoo@live.com>
  */
 $lang['name']                  = '인기도 조사 (불러오는데 시간이 걸릴 수 있습니다.)';
 $lang['submit']                = '자료 보내기';
diff --git a/lib/plugins/revert/lang/cs/intro.txt b/lib/plugins/revert/lang/cs/intro.txt
index bbc0df25a413e5bc2c2b490688e0e3ecaa089336..1e1cd0fd86868ca6b42904023b8564feff270bc7 100644
--- a/lib/plugins/revert/lang/cs/intro.txt
+++ b/lib/plugins/revert/lang/cs/intro.txt
@@ -1,3 +1,3 @@
 ====== Obnova zaspamovaných stránek ======
 
-Tato stránka pomůže při automatické obnově po spamovém útoku.  Pro nalezení seznamu zaspamovaných stránek nedřív zadejte hledaný výraz (např. spamové URL) a pak potvrďte, že nalezené stránky opravdu obsahují spam a mohou být obnoveny.
+Tato stránka pomůže při automatické obnově po spamovém útoku.  Pro nalezení seznamu zaspamovaných stránek nejdříve zadejte hledaný výraz (např. spamové URL) a pak potvrďte, že nalezené stránky opravdu obsahují spam a mohou být obnoveny.
diff --git a/lib/plugins/revert/lang/ko/lang.php b/lib/plugins/revert/lang/ko/lang.php
index 5e070de92157a2d0369fbf9ab3fe4e6760cbd845..0163d27545156c280f2b1e41573c73e529efb26a 100644
--- a/lib/plugins/revert/lang/ko/lang.php
+++ b/lib/plugins/revert/lang/ko/lang.php
@@ -6,6 +6,7 @@
  * @author dongnak@gmail.com
  * @author Song Younghwan <purluno@gmail.com>
  * @author SONG Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo  <dryoo@live.com>
  */
 $lang['menu']                  = '복구 관리자';
 $lang['filter']                = '스팸 페이지 검색 ';
diff --git a/lib/plugins/usermanager/lang/cs/lang.php b/lib/plugins/usermanager/lang/cs/lang.php
index 9c5a2abc9b7ce612c5b6117793c61a2e5c135877..7d8e4599d6f202eeee0ae952f9c4c46733981ec9 100644
--- a/lib/plugins/usermanager/lang/cs/lang.php
+++ b/lib/plugins/usermanager/lang/cs/lang.php
@@ -45,7 +45,7 @@ $lang['edit_usermissing']      = 'Vybraný uživatel nebyl nalezen, zadané uži
 $lang['user_notify']           = 'Upozornit uživatele';
 $lang['note_notify']           = 'Maily s upozorněním se budou posílat pouze, když uživatel dostává nové heslo.';
 $lang['note_group']            = 'Noví uživatelé budou přidáváni do této výchozí skupiny (%s), pokud pro ně není uvedena žádná skupina.';
-$lang['note_pass']             = 'Heslo bude automaticky vygenerováno pokud je pole ponacháno prázdné a je zapnutá notifikace uživatele.';
+$lang['note_pass']             = 'Heslo bude automaticky vygenerováno pokud je pole ponecháno prázdné a je zapnutá notifikace uživatele.';
 $lang['add_ok']                = 'Uživatel úspěšně vytvořen';
 $lang['add_fail']              = 'Vytvoření uživatele selhalo';
 $lang['notify_ok']             = 'Odeslán mail s upozorněním';
diff --git a/lib/plugins/usermanager/lang/ko/lang.php b/lib/plugins/usermanager/lang/ko/lang.php
index eeb8eb791701a26e65d09de0f7d588149e6a9223..f2322414a9a27a131cd310b970a88592f6ee7ee5 100644
--- a/lib/plugins/usermanager/lang/ko/lang.php
+++ b/lib/plugins/usermanager/lang/ko/lang.php
@@ -6,6 +6,7 @@
  * @author dongnak@gmail.com
  * @author Song Younghwan <purluno@gmail.com>
  * @author SONG Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo  <dryoo@live.com>
  */
 $lang['menu']                  = '사용자 관리자';
 $lang['noauth']                = '(사용자 인증이 불가능합니다.)';
diff --git a/lib/scripts/media.js b/lib/scripts/media.js
index 5b9372b68f50092dbd540c6ca5e6a1d45ab834b3..b90f7047baca9a1abe456346bda8695c574f4841 100644
--- a/lib/scripts/media.js
+++ b/lib/scripts/media.js
@@ -215,14 +215,6 @@ var media_manager = {
             return false;
         }
 
-        // FIXME these lines deactivate the media options dialog and restore
-        // the old behavior according to FS#2047
-        //opener.insertTags('wiki__text','{{'+id+'|','}}','');
-        //if(!media_manager.keepopen) window.close();
-        //opener.focus();
-        //return false;
-
-
         media_manager.ext = false;
         var dot = id.lastIndexOf(".");
         if (dot != -1) {
@@ -357,6 +349,7 @@ var media_manager = {
 
         media_manager.popup = document.createElement('div');
         media_manager.popup.setAttribute('id','media__popup');
+        media_manager.popup.style.display = 'none';
 
         var root = document.getElementById('media__manager');
         if (root === null) return;
diff --git a/lib/styles/style.css b/lib/styles/style.css
index 81419161561f70a8258602d63f8fdddadd8d0356..395f82b7810ac41d2b40bdd5d4ea93554b5b5a91 100644
--- a/lib/styles/style.css
+++ b/lib/styles/style.css
@@ -4,86 +4,98 @@
  */
 
 div.clearer {
-  clear: both;
-  line-height: 0;
-  height: 0;
-  overflow: hidden;
+    clear: both;
+    line-height: 0;
+    height: 0;
+    overflow: hidden;
 }
 
 div.no {
-  display: inline;
-  margin: 0;
-  padding: 0;
+    display: inline;
+    margin: 0;
+    padding: 0;
 }
 
 .hidden {
-  display: none;
+    display: none;
+}
+
+/* messages with msg() */
+div.error,
+div.info,
+div.success,
+div.notify {
+    color: #000;
+    background-repeat: no-repeat;
+    background-position: .5em 0;
+    border-bottom: 1px solid;
+    font-size: 90%;
+    margin: 0;
+    padding-left: 3em;
+    overflow: hidden;
 }
 
 div.error {
-  background: #fcc url(../images/error.png) 0.5em 0px no-repeat;
-  color: #000;
-  border-bottom: 1px solid #faa;
-  font-size: 90%;
-  margin: 0;
-  padding-left: 3em;
-  overflow: hidden;
+    background-color: #fcc;
+    background-image: url(../images/error.png);
+    border-bottom-color: #faa;
 }
 
 div.info {
-  background: #ccf url(../images/info.png) 0.5em 0px no-repeat;
-  color: #000;
-  border-bottom: 1px solid #aaf;
-  font-size: 90%;
-  margin: 0;
-  padding-left: 3em;
-  overflow: hidden;
+    background-color: #ccf;
+    background-image: url(../images/info.png);
+    border-bottom-color: #aaf;
 }
 
 div.success {
-  background: #cfc url(../images/success.png) 0.5em 0px no-repeat;
-  color: #000;
-  border-bottom: 1px solid #afa;
-  font-size: 90%;
-  margin: 0;
-  padding-left: 3em;
-  overflow: hidden;
+    background-color: #cfc;
+    background-image: url(../images/success.png);
+    border-bottom-color: #afa;
 }
 
 div.notify {
-  background: #ffc url(../images/notify.png) 0.5em 0px no-repeat;
-  color: #000;
-  border-bottom: 1px solid #ffa;
-  font-size: 90%;
-  margin: 0;
-  padding-left: 3em;
-  overflow: hidden;
+    background-color: #ffc;
+    background-image: url(../images/notify.png);
+    border-bottom-color: #ffa;
 }
 
 
 /* image alignment */
 .medialeft {
-  float: left;
+    float: left;
 }
 .mediaright {
-  float: right;
+    float: right;
 }
 .mediacenter {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
+    display: block;
+    margin-left: auto;
+    margin-right: auto;
 }
 
-.leftalign { text-align: left; }
+/* table cell alignment */
+.leftalign   { text-align: left;   }
 .centeralign { text-align: center; }
-.rightalign { text-align: right; }
+.rightalign  { text-align: right;  }
 
+/* underline */
 em.u {
-  font-style: normal;
-  text-decoration: underline;
+    font-style: normal;
+    text-decoration: underline;
 }
 em em.u {
-  font-style: italic;
+    font-style: italic;
+}
+
+/* modal windows */
+.JSpopup,
+#link__wiz,
+#media__popup {
+    position: absolute;
+    background-color: #fff;
+    color: #000;
+    z-index: 20;
+    overflow: hidden;
 }