diff --git a/admin/manage-pages.php b/admin/manage-pages.php
index 2821fe24..adfa1d8a 100644
--- a/admin/manage-pages.php
+++ b/admin/manage-pages.php
@@ -64,6 +64,8 @@ $stat = Typecho_Widget::widget('Widget_Stat');
                                 <?php 
                                 if ($pages->hasSaved || 'page_draft' == $pages->type) {
                                     echo '<em class="status">' . _t('草稿') . '</em>';
+                                } else if ('hidden' == $pages->status) {
+                                    echo '<em class="status">' . _t('隐藏') . '</em>';
                                 } else if ('waiting' == $pages->status) {
                                     echo '<em class="status">' . _t('待审核') . '</em>';
                                 } else if ('private' == $pages->status) {
diff --git a/admin/manage-posts.php b/admin/manage-posts.php
index f1f8e18f..ee95ba04 100644
--- a/admin/manage-posts.php
+++ b/admin/manage-posts.php
@@ -74,6 +74,8 @@ $stat = Typecho_Widget::widget('Widget_Stat');
                                 <?php 
                                 if ($posts->hasSaved || 'post_draft' == $posts->type) {
                                     echo '<em class="status">' . _t('草稿') . '</em>';
+                                } else if ('hidden' == $posts->status) {
+                                    echo '<em class="status">' . _t('隐藏') . '</em>';
                                 } else if ('waiting' == $posts->status) {
                                     echo '<em class="status">' . _t('待审核') . '</em>';
                                 } else if ('private' == $posts->status) {
diff --git a/admin/write-post.php b/admin/write-post.php
index 6427f2fd..6db21f34 100644
--- a/admin/write-post.php
+++ b/admin/write-post.php
@@ -96,10 +96,11 @@ Typecho_Widget::widget('Widget_Contents_Post_Edit')->to($post);
                             <ul>
                                 <?php if ($user->pass('editor', true)): ?>
                                 <li><input id="publish" value="publish" name="visibility" type="radio"<?php if (($post->status == 'publish' && !$post->password) || !$post->status) { ?> checked="true"<?php } ?> /> <label for="publish"><?php _e('公开'); ?></label></li>
-                                <li><input id="password" value="password" name="visibility" type="radio"<?php if ($post->password) { ?> checked="true"<?php } ?> /> <label for="password">密码保护 <input type="text" id="post-password" name="password" class="text-s" value="<?php $post->password(); ?>" size="16" /></label></li>
-                                <li><input id="private" value="private" name="visibility" type="radio"<?php if ($post->status == 'private') { ?> checked="true"<?php } ?> /> <label for="private">私密</label></li>
+                                <li><input id="hidden" value="hidden" name="visibility" type="radio"<?php if ($post->status == 'hidden') { ?> checked="true"<?php } ?> /> <label for="hidden"><?php _e('隐藏'); ?></label></li>
+                                <li><input id="password" value="password" name="visibility" type="radio"<?php if ($post->password) { ?> checked="true"<?php } ?> /> <label for="password"><?php _e('密码保护'); ?> <input type="text" id="post-password" name="password" class="text-s" value="<?php $post->password(); ?>" size="16" /></label></li>
+                                <li><input id="private" value="private" name="visibility" type="radio"<?php if ($post->status == 'private') { ?> checked="true"<?php } ?> /> <label for="private"><?php _e('私密'); ?></label></li>
                                 <?php endif; ?>
-                                <li><input id="waiting" value="waiting" name="visibility" type="radio"<?php if (!$user->pass('editor', true) || $post->status == 'waiting') { ?> checked="true"<?php } ?> /> <label for="waiting">待审核</label></li>
+                                <li><input id="waiting" value="waiting" name="visibility" type="radio"<?php if (!$user->pass('editor', true) || $post->status == 'waiting') { ?> checked="true"<?php } ?> /> <label for="waiting"><?php _e('待审核'); ?></label></li>
                             </ul>
                         </section>
                         <?php endif; ?>
diff --git a/var/Widget/Archive.php b/var/Widget/Archive.php
index 3a0c2390..5645ba4a 100644
--- a/var/Widget/Archive.php
+++ b/var/Widget/Archive.php
@@ -1202,11 +1202,22 @@ class Widget_Archive extends Widget_Abstract_Contents
 
         /** 定时发布功能 */
         if (!$selectPlugged) {
-            if ($this->user->hasLogin()) {
-                $select = $this->select()->where('table.contents.status = ? OR
-                    (table.contents.status = ? AND table.contents.authorId = ?)', 'publish', 'private', $this->user->uid);
+            if ('post' == $this->parameter->type) {
+                if ($this->user->hasLogin()) {
+                    $select = $this->select()->where('table.contents.status = ? OR table.contents.status = ? OR
+                            (table.contents.status = ? AND table.contents.authorId = ?)',
+                            'publish', 'hidden', 'private', $this->user->uid);
+                } else {
+                    $select = $this->select()->where('table.contents.status = ? OR table.contents.status',
+                            'publish', 'hidden');
+                }
             } else {
-                $select = $this->select()->where('table.contents.status = ?', 'publish');
+                if ($this->user->hasLogin()) {
+                    $select = $this->select()->where('table.contents.status = ? OR
+                            (table.contents.status = ? AND table.contents.authorId = ?)', 'publish', 'private', $this->user->uid);
+                } else {
+                    $select = $this->select()->where('table.contents.status = ?', 'publish');
+                }
             }
             $select->where('table.contents.created < ?', $this->options->gmtTime);
         }
diff --git a/var/Widget/Contents/Post/Edit.php b/var/Widget/Contents/Post/Edit.php
index ec7c96eb..71ac5103 100644
--- a/var/Widget/Contents/Post/Edit.php
+++ b/var/Widget/Contents/Post/Edit.php
@@ -180,7 +180,7 @@ class Widget_Contents_Post_Edit extends Widget_Abstract_Contents implements Widg
         if ($this->user->pass('editor', true)) {
             if (empty($contents['visibility'])) {
                 $contents['status'] = 'publish';
-            } else if ('password' == $contents['visibility'] || !in_array($contents['visibility'], array('private', 'waiting', 'publish'))) {
+            } else if ('password' == $contents['visibility'] || !in_array($contents['visibility'], array('private', 'waiting', 'publish', 'hidden'))) {
                 if (empty($contents['password']) || 'password' != $contents['visibility']) {
                     $contents['password'] = '';
                 }
@@ -253,7 +253,7 @@ class Widget_Contents_Post_Edit extends Widget_Abstract_Contents implements Widg
         if ($this->user->pass('editor', true)) {
             if (empty($contents['visibility'])) {
                 $contents['status'] = 'publish';
-            } else if ('password' == $contents['visibility'] || !in_array($contents['visibility'], array('private', 'waiting', 'publish'))) {
+            } else if ('password' == $contents['visibility'] || !in_array($contents['visibility'], array('private', 'waiting', 'publish', 'hidden'))) {
                 if (empty($contents['password']) || 'password' != $contents['visibility']) {
                     $contents['password'] = '';
                 }
@@ -558,7 +558,7 @@ class Widget_Contents_Post_Edit extends Widget_Abstract_Contents implements Widg
     public function writePost()
     {
         $contents = $this->request->from('password', 'allowComment',
-        'allowPing', 'allowFeed', 'slug', 'category', 'tags', 'text', 'do', 'visibility');
+        'allowPing', 'allowFeed', 'slug', 'category', 'tags', 'text', 'visibility');
 
         $contents['title'] = $this->request->get('title', _t('未命名文档'));
         $contents['created'] = $this->getCreated();
diff --git a/var/Widget/Options/Permalink.php b/var/Widget/Options/Permalink.php
index 31d1190d..70c611cc 100644
--- a/var/Widget/Options/Permalink.php
+++ b/var/Widget/Options/Permalink.php
@@ -29,8 +29,8 @@ class Widget_Options_Permalink extends Widget_Abstract_Options implements Widget
      */
     private function encodeRule($rule)
     {
-        return str_replace(array('{cid}', '{slug}', '{category}', '{year}', '{month}', '{day}'),
-            array('[cid:digital]', '[slug]', '[category]', '[year:digital:4]', '[month:digital:2]', '[day:digital:2]'), $rule);
+        return str_replace(array('{cid}', '{slug}', '{category}', '{year}', '{month}', '{day}', '{mid}'),
+            array('[cid:digital]', '[slug]', '[category]', '[year:digital:4]', '[month:digital:2]', '[day:digital:2]', '[mid:digital]'), $rule);
     }
 
     /**
@@ -93,6 +93,18 @@ class Widget_Options_Permalink extends Widget_Abstract_Options implements Widget
         return strpos($value, '{slug}') !== false || strpos($value, '{cid}') !== false;
     }
 
+    /**
+     * 检查categoryPattern里是否含有必要参数
+     * 
+     * @param mixed $value 
+     * @access public
+     * @return void
+     */
+    public function checkCategoryPattern($value)
+    {
+        return strpos($value, '{slug}') !== false || strpos($value, '{mid}') !== false;
+    }
+
     /**
      * 检测是否可以rewrite
      *
@@ -241,6 +253,11 @@ RewriteRule . {$basePath}index.php [L]
         $pagePattern->input->setAttribute('class', 'mono w-60');
         $form->addInput($pagePattern->addRule(array($this, 'checkPagePattern'), _t('独立页面路径中没有包含 {cid} 或者 {slug} ')));
 
+        /** 分类页面 */
+        $categoryPattern = new Typecho_Widget_Helper_Form_Element_Text('categoryPattern', NULL, $this->decodeRule($this->options->routingTable['category']['url']), _t('分类路径'), _t('可用参数: <code>{mid}</code> 分类 ID、<code>{slug}</code> 分类缩略名<br />请在路径中至少包含上述的一项参数.'));
+        $categoryPattern->input->setAttribute('class', 'mono w-60');
+        $form->addInput($categoryPattern->addRule(array($this, 'checkCategoryPattern'), _t('分类路径中没有包含 {mid} 或者 {slug} ')));
+
         /** 提交按钮 */
         $submit = new Typecho_Widget_Helper_Form_Element_Submit('submit', NULL, _t('保存设置'));
         $submit->input->setAttribute('class', 'primary');
@@ -275,6 +292,8 @@ RewriteRule . {$basePath}index.php [L]
             $routingTable = $this->options->routingTable;
             $routingTable['post']['url'] = $this->request->postPattern;
             $routingTable['page']['url'] = '/' . ltrim($this->encodeRule($this->request->pagePattern), '/');
+            $routingTable['category']['url'] = '/' . ltrim($this->encodeRule($this->request->categoryPattern), '/');
+            $routingTable['category_page']['url'] = rtrim($routingTable['category']['url'], '/') . '/[page:digital]';
 
             if (isset($routingTable[0])) {
                 unset($routingTable[0]);