Index: /branches/release-36/default_templates/monthly_archive_dropdown.mtml
===================================================================
--- /branches/release-36/default_templates/monthly_archive_dropdown.mtml (revision 2052)
+++ /branches/release-36/default_templates/monthly_archive_dropdown.mtml (revision 2052)
@@ -0,0 +1,27 @@
+<mt:IfArchiveTypeEnabled archive_type="Monthly">
+    <mt:ArchiveList archive_type="Monthly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-monthly-dropdown widget-archive widget">
+   <h3 class="widget-header"><a href="<$mt:BlogURL$>archives.html"><__trans phrase="Archives"></a></h3>
+   <div class="widget-content">
+      <select onchange="nav(this)">
+         <option><__trans phrase="Select a Month..."></option>
+         </mt:ArchiveListHeader>
+         <option value="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></option>
+         <mt:ArchiveListFooter>
+      </select>
+   </div>
+</div>
+<script type="text/javascript" charset="utf-8">
+/* <![CDATA[ */
+function nav(sel) {
+   if (sel.selectedIndex == -1) return;
+   var opt = sel.options[sel.selectedIndex];
+   if (opt && opt.value)
+      location.href = opt.value;
+}
+/* ]]> */
+</script>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/category_archive_list.mtml
===================================================================
--- /branches/release-36/default_templates/category_archive_list.mtml (revision 2052)
+++ /branches/release-36/default_templates/category_archive_list.mtml (revision 2052)
@@ -0,0 +1,22 @@
+<mt:IfArchiveTypeEnabled archive_type="Category">
+<div class="widget-archive widget-archive-category widget">
+    <h3 class="widget-header"><__trans phrase="Categories"></h3>
+    <div class="widget-content">
+    <mt:TopLevelCategories>
+        <mt:SubCatIsFirst>
+        <ul class="widget-list">
+        </mt:SubCatIsFirst>
+        <mt:IfNonZero tag="mt:CategoryCount">
+            <li class="widget-list-item"><a href="<$mt:CategoryArchiveLink$>"<mt:IfNonEmpty tag="mt:CategoryDescription"> title="<$mt:CategoryDescription$>"</mt:IfNonEmpty>><__trans phrase="[_1] ([_2])" params="<$mt:CategoryLabel$>%%<$mt:CategoryCount$>"></a>
+        <mt:Else>
+            <li class="widget-list-item"><$mt:CategoryLabel$>
+        </mt:IfNonZero>
+        <$mt:SubCatsRecurse$>
+            </li>
+        <mt:SubCatIsLast>
+        </ul>
+        </mt:SubCatIsLast>
+    </mt:TopLevelCategories>
+    </div>
+</div>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/current_author_monthly_archive_list.mtml
===================================================================
--- /branches/release-36/default_templates/current_author_monthly_archive_list.mtml (revision 2052)
+++ /branches/release-36/default_templates/current_author_monthly_archive_list.mtml (revision 2052)
@@ -0,0 +1,16 @@
+<mt:IfArchiveTypeEnabled archive_type="Author-Monthly">
+    <mt:ArchiveList archive_type="Author-Monthly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-current-author-monthly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="[_1]: Monthly Archives" params="<$mt:AuthorDisplayName$>"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><__trans phrase="[_1] ([_2])" params="<$mt:ArchiveTitle$>%%<$mt:ArchiveCount$>"></a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+    </div>
+</div>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/main_index_widgets_group.mtml
===================================================================
--- /branches/release-36/default_templates/main_index_widgets_group.mtml (revision 2052)
+++ /branches/release-36/default_templates/main_index_widgets_group.mtml (revision 2052)
@@ -0,0 +1,9 @@
+<mt:Ignore>
+    <__trans phrase='This is a custom set of widgets that are conditioned to only appear on the homepage (or "main_index"). More info: [_1]' params='http://www.movabletype.org/documentation/designer/widget-sets.html'>
+</mt:Ignore>
+<mt:If name="main_index">
+    <$mt:include widget="<__trans phrase="Recent Comments">"$>
+    <$mt:include widget="<__trans phrase="Recent Entries">"$>
+    <$mt:include widget="<__trans phrase="Recent Assets">"$>
+    <$mt:include widget="<__trans phrase="Tag Cloud">"$>
+</mt:If>
Index: /branches/release-36/default_templates/archive_widgets_group.mtml
===================================================================
--- /branches/release-36/default_templates/archive_widgets_group.mtml (revision 2052)
+++ /branches/release-36/default_templates/archive_widgets_group.mtml (revision 2052)
@@ -0,0 +1,14 @@
+<mt:Ignore>
+    <__trans phrase="This is a custom set of widgets that are conditioned to serve different content based upon what type of archive it is included. More info: [_1]" params="http://www.movabletype.org/documentation/designer/widget-sets.html">
+</mt:Ignore>
+<mt:if name="category_archive">
+    <mt:IfArchiveTypeEnabled archive_type="Category-Monthly">
+        <$mt:include widget="<__trans phrase="Current Category Monthly Archives">"$>
+    </mt:IfArchiveTypeEnabled>
+</mt:if>
+<mt:IfArchiveTypeEnabled archive_type="Category">
+    <$mt:include widget="<__trans phrase="Category Archives">"$>
+</mt:IfArchiveTypeEnabled>
+<mt:IfArchiveTypeEnabled archive_type="Monthly">
+    <$mt:include widget="<__trans phrase="Monthly Archives">"$>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/syndication.mtml
===================================================================
--- /branches/release-36/default_templates/syndication.mtml (revision 2052)
+++ /branches/release-36/default_templates/syndication.mtml (revision 2052)
@@ -0,0 +1,12 @@
+<div class="widget-syndication widget">
+    <div class="widget-content">
+        <ul class="blog-feeds">
+            <li class="blog feed"><img src="<$mt:StaticWebPath$>images/status_icons/feed.gif" alt="<__trans phrase="Subscribe to feed">" width="9" height="9" /> <a href="<$mt:Link template="feed_recent"$>"><__trans phrase="Subscribe to this blog's feed"></a></li>
+<mt:If name="search_results">
+    <mt:ifnonempty tag="mt:SearchString">
+            <li class="search-results-feed"><img src="<$mt:StaticWebPath$>images/status_icons/feed.gif" alt="<__trans phrase="Subscribe to feed">" width="9" height="9" /> <a href="<$mt:CGIPath$><$mt:SearchScript$>?<mt:IfTagSearch>tag<mt:Else>search</mt:IfTagSearch>=<$mt:SearchString encode_url="1"$>&amp;Template=feed&amp;IncludeBlogs=<$mt:SearchIncludeBlogs$>&amp;limit=<MTSearchMaxResults>" title="<__trans phrase="Subscribe to feed">"><__trans phrase="Search results matching &ldquo;<$mt:SearchString$>&rdquo;"></a></li>
+    </mt:ifnonempty>
+</mt:If>
+        </ul>
+    </div>
+</div>
Index: /branches/release-36/default_templates/technorati_search.mtml
===================================================================
--- /branches/release-36/default_templates/technorati_search.mtml (revision 2052)
+++ /branches/release-36/default_templates/technorati_search.mtml (revision 2052)
@@ -0,0 +1,19 @@
+<div class="widget-technorati widget">
+    <h3 class="widget-header"><__trans phrase="Technorati"></h3>
+    <div class="widget-content">
+        <div id="technorati">
+            <form id="ts_s" method="post" action="http://technorati.com/search.php">
+                <fieldset>
+                    <legend><__trans phrase="<a href='http://www.technorati.com/'>Technorati</a> search"></legend>
+                    <input type="hidden" name="sub" value="searchlet" />
+                    <input type="text" id="ts_search" name="s" size="12" maxlength="255" value="" /><br />
+                    <input type="radio" checked="checked" name="from" id="ts_yb" value="<$mt:BlogURL$>" />
+                    <label for="ts_yb" title="<$mt:BlogName$>"><__trans phrase="this blog"></label>
+                    <input type="radio" name="from" id="ts_www" value="" /> <label for="ts_www"><__trans phrase="all blogs"></label>
+                    <input type="submit" class="btn" value="<__trans phrase="Search">" />
+                </fieldset>
+            </form>
+            <p id="ts_l" class="ts_l"><a href="http://technorati.com/search/<$mt:BlogURL$>" id="ts_lh">&#187; <__trans phrase="Blogs that link here"></a></p>
+        </div>
+    </div>
+</div>
Index: /branches/release-36/default_templates/recent_comments.mtml
===================================================================
--- /branches/release-36/default_templates/recent_comments.mtml (revision 2052)
+++ /branches/release-36/default_templates/recent_comments.mtml (revision 2052)
@@ -0,0 +1,18 @@
+<mt:IfNonZero tag="mt:BlogCommentCount">
+    <mt:Comments lastn="10" sort_order="descend">
+        <mt:CommentsHeader>
+<div class="widget-recent-comments widget">
+    <h3 class="widget-header"><__trans phrase="Recent Comments"></h3>
+    <div class="widget-content">
+        <ul class="recent-comments-list">
+        </mt:CommentsHeader>
+            <li>
+                <__trans phrase="<a href="[_1]">[_2] commented on [_3]</a>: [_4]" params="<mt:CommentEntry><$mt:EntryPermalink$></mt:CommentEntry>#comment-<$mt:CommentID$>%%<$mt:CommentAuthor$>%%<mt:CommentEntry><$mt:EntryTitle$></mt:CommentEntry>%%<$mt:CommentBody remove_html="1" trim_to="10"$>">
+            </li>
+        <mt:CommentsFooter>
+        </ul>
+    </div>
+</div>
+        </mt:CommentsFooter>
+    </mt:Comments>
+</mt:IfNonZero>
Index: /branches/release-36/default_templates/current_category_monthly_archive_list.mtml
===================================================================
--- /branches/release-36/default_templates/current_category_monthly_archive_list.mtml (revision 2052)
+++ /branches/release-36/default_templates/current_category_monthly_archive_list.mtml (revision 2052)
@@ -0,0 +1,16 @@
+<mt:IfArchiveTypeEnabled archive_type="Category-Monthly">
+    <mt:ArchiveList archive_type="Category-Monthly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-current-category-monthly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="[_1]: Monthly Archives" params="<$mt:CategoryLabel$>"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><__trans phrase="[_1]" params="<$mt:ArchiveTitle$>"></a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/monthly_archive_list.mtml
===================================================================
--- /branches/release-36/default_templates/monthly_archive_list.mtml (revision 2052)
+++ /branches/release-36/default_templates/monthly_archive_list.mtml (revision 2052)
@@ -0,0 +1,16 @@
+<mt:IfArchiveTypeEnabled archive_type="Monthly">
+    <mt:ArchiveList archive_type="Monthly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-monthly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="[_1] <a href="[_2]">Archives</a>" params="<$mt:ArchiveTypeLabel$>%%<$mt:Link template="archive_index"$>"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><__trans phrase="[_1] ([_2])" params="<$mt:ArchiveTitle$>%%<$mt:ArchiveCount$>"></a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/signin.mtml
===================================================================
--- /branches/release-36/default_templates/signin.mtml (revision 2052)
+++ /branches/release-36/default_templates/signin.mtml (revision 2052)
@@ -0,0 +1,65 @@
+<script type="text/javascript" src="<$mt:Link template="<__trans phrase="JavaScript">"$>"></script>
+<div class="widget-sign-in widget">
+    <h3 class="widget-header"><__trans phrase="Sign In"></h3>
+    <div class="widget-content">
+<script type="text/javascript">
+/* <![CDATA[ */
+var name, id, url, blog_ids;
+if (typeof(commenter_name) != 'undefined')
+    name = commenter_name
+if (typeof(commenter_id) != 'undefined')
+    id = commenter_id;
+if (typeof(commenter_url) != 'undefined')
+    url = commenter_url;
+if (typeof(commenter_blog_ids) != 'undefined')
+    blog_ids = commenter_blog_ids;
+
+if (!name && !id) {
+    if ('<$mt:CGIHost exclude_port="1"$>' != '<$mt:BlogHost exclude_port="1"$>') {
+        document.write('<scr' + 'ipt src="<$mt:CGIPath$><$mt:CommentScript$>?__mode=cmtr_name_js">');
+        document.write("</scr" + "ipt>");
+    } else {
+        name = getCookie('commenter_name');
+        ids = getCookie('commenter_id').split(':');
+        id = ids[0];
+        blog_ids = ids[1];
+        url = getCookie('commenter_url');
+    }
+}
+showMessage(name, id, url);
+
+function showMessage(commenter_name, commenter_id, commenter_url) {
+    static = location.href;
+    if ( commenter_name &&
+         ( !commenter_id 
+        || commenter_blog_ids.indexOf("'<$mt:BlogID$>'") > -1))
+    {
+        var url;
+        if (commenter_id) {
+            url = '<$mt:CGIPath$><$mt:CommentScript$>?__mode=edit_profile&commenter=' + commenter_id + '&blog_id=<$mt:BlogID$>';
+            url += '&static=' + static;
+        } else if (commenter_url) {
+            url = commenter_url;
+        } else {
+            url = null;
+        }
+        var content = '<__trans phrase="You are signed in as " escape="js">';
+        if (url) {
+            content += '<a href="' + url + '">' + commenter_name + '</a>';
+        } else {
+            content += commenter_name;
+        }
+        content += '.  (<a href="<$mt:RemoteSignOutLink no_static="1"$>&static=' + static + '"><__trans phrase="sign out" escape="js"></a>)';
+        document.write(content);
+    } else if (commenter_name) {
+        document.write('<__trans phrase="You do not have permission to sign in to this blog." escape="js"> (<a href="<$mt:RemoteSignOutLink no_static="1"$>&static=' + static + '"><__trans phrase="sign out" escape="js"></a>)');
+    } else {
+    <mt:IfRegistrationAllowed>
+        document.write('<a href="<$mt:CGIPath$><$mt:CommentScript$>?__mode=login&blog_id=<$mt:BlogID$>&static=' + static + '"><__trans phrase="Sign In" escape="js"></a>');
+    </mt:IfRegistrationAllowed>
+    }
+}
+/* ]]> */
+</script>
+    </div>
+</div>
Index: /branches/release-36/default_templates/pages_list.mtml
===================================================================
--- /branches/release-36/default_templates/pages_list.mtml (revision 2052)
+++ /branches/release-36/default_templates/pages_list.mtml (revision 2052)
@@ -0,0 +1,36 @@
+<mt:IfArchiveTypeEnabled archive_type="Page">
+<div class="widget-pages widget">
+    <h3 class="widget-header"><__trans phrase="Pages"></h3>
+    <div class="widget-content">
+    <mt:Pages no_folder="1" sort_by="title" sort_order="ascend">
+        <mt:PagesHeader>
+        <ul class="widget-list">
+        </mt:PagesHeader>
+            <li class="widget-list-item"><a href="<$mt:PagePermalink$>" title="<$mt:PageTitle$>"><$mt:PageTitle$></a></li>
+        <mt:PagesFooter>
+        </ul>
+        </mt:PagesFooter>
+    </mt:Pages>
+    <mt:TopLevelFolders>
+        <mt:FolderHeader>
+        <ul class="widget-list">
+        </mt:FolderHeader>
+            <li class="widget-list-item"><b><$mt:FolderLabel$></b>
+        <mt:Pages sort_by="title" sort_order="ascend">
+            <mt:PagesHeader>
+                <ul class="widget-list">
+            </mt:PagesHeader>
+                    <li class="widget-list-item"><a href="<$mt:PagePermalink$>" title="<$mt:PageTitle$>"><$mt:PageTitle$></a></li>
+            <mt:PagesFooter>
+                </ul>
+            </mt:PagesFooter>
+        </mt:Pages>
+        <$mt:SubFolderRecurse$>
+            </li>
+        <mt:FolderFooter>
+        </ul>
+        </mt:FolderFooter>
+    </mt:TopLevelFolders>
+   </div>
+</div>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/about_this_page.mtml
===================================================================
--- /branches/release-36/default_templates/about_this_page.mtml (revision 2052)
+++ /branches/release-36/default_templates/about_this_page.mtml (revision 2052)
@@ -0,0 +1,74 @@
+<div class="widget-about-this-page widget">
+    <h3 class="widget-header">
+<mt:If name="entry_template">
+        <__trans phrase="About this Entry">
+<mt:Else>
+    <mt:If name="archive_template">
+        <__trans phrase="About this Archive">
+    </mt:If>
+</mt:If>
+<mt:If name="archive_index">
+        <__trans phrase="About Archives">
+</mt:If>
+    </h3>
+    <div class="widget-content">
+<mt:If name="archive_index">
+        <p><__trans phrase="This page contains links to all the archived content."></p>
+</mt:If>
+<mt:If name="entry_template">
+        <p class="first"><__trans phrase="This page contains a single entry by [_1] published on <em>[_2]</em>." params="<$mt:EntryAuthorLink$>%%<$mt:EntryDate format="%x %X"$>"></p>
+    <mt:EntryPrevious>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> was the previous entry in this blog." params="<$mt:EntryPermalink$>%%<$mt:EntryTitle remove_html="1"$>"></p>
+    </mt:EntryPrevious>
+    <mt:EntryNext>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the next entry in this blog." params="<$mt:EntryPermalink$>%%<$mt:EntryTitle remove_html="1"$>"></p>
+    </mt:EntryNext>
+</mt:If>
+<mt:If name="category_archive">
+    <mt:If name="datebased_archive">
+        <p class="first"><__trans phrase="This page is a archive of entries in the <strong>[_1]</strong> category from <strong>[_2]</strong>." params="<$mt:CategoryLabel$>%%<$mt:ArchiveDate format="%B %Y"$>"></p>
+        <mt:ArchivePrevious>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the previous archive." params="<$mt:ArchiveLink$>%%<$mt:ArchiveTitle$>"></p>
+        </mt:ArchivePrevious>
+        <mt:ArchiveNext>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the next archive." params="<$mt:ArchiveLink$>%%<$mt:ArchiveTitle$>"></p>
+        </mt:ArchiveNext>
+    <mt:Else>
+        <p class="first"><__trans phrase="This page is a archive of recent entries in the <strong>[_1]</strong> category." params="<$mt:CategoryLabel$>"></p>
+        <mt:CategoryPrevious>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the previous category." params="<$mt:CategoryArchiveLink$>%%<$mt:CategoryLabel$>"></p>
+        </mt:CategoryPrevious>
+        <mt:CategoryNext>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the next category." params="<$mt:CategoryArchiveLink$>%%<$mt:CategoryLabel$>"></p>
+        </mt:CategoryNext>
+    </mt:If>
+</mt:If>
+<mt:If name="author_archive">
+    <mt:If name="datebased_archive">
+        <p class="first"><__trans phrase="This page is a archive of recent entries written by <strong>[_1]</strong> in <strong>[_2]</strong>." params="<$mt:AuthorDisplayName$>%%<$mt:ArchiveDate format="%B %Y"$>"></p>
+        <mt:ArchivePrevious>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the previous archive." params="<$mt:ArchiveLink$>%%<$mt:ArchiveTitle$>"></p>
+        </mt:ArchivePrevious>
+        <mt:ArchiveNext>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the next archive." params="<$mt:ArchiveLink$>%%<$mt:ArchiveTitle$>"></p>
+        </mt:ArchiveNext>
+    <mt:Else>
+        <p class="first"><__trans phrase="This page is a archive of recent entries written by <strong>[_1]</strong>." params="<$mt:AuthorDisplayName$>"></p>
+    </mt:If>
+</mt:If>
+<mt:If name="datebased_only_archive">
+        <p class="first"><__trans phrase="This page is an archive of entries from <strong>[_2]</strong> listed from newest to oldest." params="<$mt:BlogName$>%%<$mt:ArchiveDate format="%B %Y"$>"></p>
+    <mt:ArchivePrevious>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the previous archive." params="<$mt:ArchiveLink$>%%<$mt:ArchiveTitle$>"></p>
+    </mt:ArchivePrevious>
+    <mt:ArchiveNext>
+        <p><__trans phrase="<a href="[_1]">[_2]</a> is the next archive." params="<$mt:ArchiveLink$>%%<$mt:ArchiveTitle$>"></p>
+    </mt:ArchiveNext>
+</mt:If>
+<mt:If name="archive_index">
+        <p><__trans phrase="Find recent content on the <a href="[_1]">main index</a>." params="<$mt:BlogURL$>"></p>
+<mt:Else>
+        <p><__trans phrase="Find recent content on the <a href="[_1]">main index</a> or look in the <a href="[_2]">archives</a> to find all content." params="<$mt:BlogURL$>%%<$mt:Link template="archive_index"$>"></p>
+</mt:If>
+    </div>
+</div>
Index: /branches/release-36/default_templates/calendar.mtml
===================================================================
--- /branches/release-36/default_templates/calendar.mtml (revision 2052)
+++ /branches/release-36/default_templates/calendar.mtml (revision 2052)
@@ -0,0 +1,37 @@
+<mt:IfArchiveTypeEnabled archive_type="Individual">
+<div class="widget-calendar widget">
+    <h3 class="widget-header"><$mt:Date format="%B %Y"$></h3>
+    <div class="widget-content">
+        <table summary="<__trans phrase="Monthly calendar with links to daily posts">">
+            <tr>
+                <th abbr="<__trans phrase="Sunday">"><__trans phrase="Sun"></th>
+                <th abbr="<__trans phrase="Monday">"><__trans phrase="Mon"></th>
+                <th abbr="<__trans phrase="Tuesday">"><__trans phrase="Tue"></th>
+                <th abbr="<__trans phrase="Wednesday">"><__trans phrase="Wed"></th>
+                <th abbr="<__trans phrase="Thursday">"><__trans phrase="Thu"></th>
+                <th abbr="<__trans phrase="Friday">"><__trans phrase="Fri"></th>
+                <th abbr="<__trans phrase="Saturday">"><__trans phrase="Sat"></th>
+            </tr>
+    <mt:Calendar>
+        <mt:CalendarWeekHeader>
+            <tr>
+        </mt:CalendarWeekHeader>
+                <td>
+        <mt:CalendarIfEntries>
+            <mt:Entries lastn="1">
+                    <a href="<$mt:EntryPermalink$>"><$mt:CalendarDay$></a>
+            </mt:Entries>
+        </mt:CalendarIfEntries>
+        <mt:CalendarIfNoEntries>
+                    <$mt:CalendarDay$>
+        </mt:CalendarIfNoEntries>
+        <mt:CalendarIfBlank>&nbsp;</mt:CalendarIfBlank>
+                </td>
+        <mt:CalendarWeekFooter>
+            </tr>
+        </mt:CalendarWeekFooter>
+    </mt:Calendar>
+        </table>
+    </div>
+</div>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/recent_entries.mtml
===================================================================
--- /branches/release-36/default_templates/recent_entries.mtml (revision 2052)
+++ /branches/release-36/default_templates/recent_entries.mtml (revision 2052)
@@ -0,0 +1,16 @@
+<mt:IfNonZero tag="BlogEntryCount">
+    <mt:Entries lastn="10">
+        <mt:EntriesHeader>
+<div class="widget-recent-entries widget-archives widget">
+    <h3 class="widget-header"><__trans phrase="Recent Entries"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:EntriesHeader>
+            <li class="widget-list-item"><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
+        <mt:EntriesFooter>
+        </ul>
+    </div>
+</div>
+        </mt:EntriesFooter>
+    </mt:Entries>
+</mt:IfNonZero>
Index: /branches/release-36/default_templates/date_based_author_archives.mtml
===================================================================
--- /branches/release-36/default_templates/date_based_author_archives.mtml (revision 2052)
+++ /branches/release-36/default_templates/date_based_author_archives.mtml (revision 2052)
@@ -0,0 +1,68 @@
+<mt:IfArchiveTypeEnabled archive_type="Author-Yearly">
+    <mt:ArchiveList archive_type="Author-Yearly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-author-yearly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Author Yearly Archives"></h3>
+    <div class="widget-content">
+                <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+                </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
+<mt:IfArchiveTypeEnabled archive_type="Author-Monthly">
+    <mt:ArchiveList archive_type="Author-Monthly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-author-monthly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Author Monthly Archives"></h3>
+    <div class="widget-content">
+                <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+                </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
+<mt:IfArchiveTypeEnabled archive_type="Author-Weekly">
+<div class="widget-archive-author-weekly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Author Weekly Archives"></h3>
+    <div class="widget-content">
+    <mt:ArchiveList archive_type="Author-Weekly">
+        <mt:ArchiveListHeader>
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
+<mt:IfArchiveTypeEnabled archive_type="Author-Daily">
+    <mt:ArchiveList archive_type="Author-Daily">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-author-daily widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Author Daily Archives"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
Index: /branches/release-36/default_templates/date_based_category_archives.mtml
===================================================================
--- /branches/release-36/default_templates/date_based_category_archives.mtml (revision 2052)
+++ /branches/release-36/default_templates/date_based_category_archives.mtml (revision 2052)
@@ -0,0 +1,68 @@
+<mt:IfArchiveTypeEnabled archive_type="Category-Yearly">
+    <mt:ArchiveList archive_type="Category-Yearly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-category-yearly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Category Yearly Archives"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
+<mt:IfArchiveTypeEnabled archive_type="Category-Monthly">
+    <mt:ArchiveList archive_type="Category-Monthly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-category-monthly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Category Monthly Archives"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
+<mt:IfArchiveTypeEnabled archive_type="Category-Weekly">
+    <mt:ArchiveList archive_type="Category-Weekly">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-category-weekly widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Category Weekly Archives"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
+<mt:IfArchiveTypeEnabled archive_type="Category-Daily">
+    <mt:ArchiveList archive_type="Category-Daily">
+        <mt:ArchiveListHeader>
+<div class="widget-archive-category-daily widget-archive widget">
+    <h3 class="widget-header"><__trans phrase="Category Daily Archives"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> (<$mt:ArchiveCount$>)</a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
+
Index: /branches/release-36/default_templates/creative_commons.mtml
===================================================================
--- /branches/release-36/default_templates/creative_commons.mtml (revision 2052)
+++ /branches/release-36/default_templates/creative_commons.mtml (revision 2052)
@@ -0,0 +1,8 @@
+<mt:BlogIfCCLicense>
+<div class="widget-creative-commons widget">
+   <div class="widget-content">
+      <a href="<$mt:BlogCCLicenseURL$>"><img alt="Creative Commons License" src="<$mt:BlogCCLicenseImage$>" /></a><br />
+      <__trans phrase="This weblog is licensed under a"> <a href="<$mt:BlogCCLicenseURL$>"><__trans phrase="Creative Commons License"></a>.
+   </div>
+</div>
+</mt:BlogIfCCLicense>
Index: /branches/release-36/default_templates/author_archive_list.mtml
===================================================================
--- /branches/release-36/default_templates/author_archive_list.mtml (revision 2052)
+++ /branches/release-36/default_templates/author_archive_list.mtml (revision 2052)
@@ -0,0 +1,16 @@
+<mt:IfArchiveTypeEnabled archive_type="Author">
+    <mt:ArchiveList archive_type="Author">
+        <mt:ArchiveListHeader>
+<div class="widget-archive widget-archive-author widget">
+    <h3 class="widget-header"><__trans phrase="Authors"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:ArchiveListHeader>
+            <li class="widget-list-item"><a href="<$mt:ArchiveLink$>"><__trans phrase="[_1] ([_2])" params="<$mt:ArchiveTitle$>%%<$mt:ArchiveCount$>"></a></li>
+        <mt:ArchiveListFooter>
+        </ul>
+    </div>
+</div>
+        </mt:ArchiveListFooter>
+    </mt:ArchiveList>
+</mt:IfArchiveTypeEnabled>
Index: /branches/release-36/default_templates/powered_by.mtml
===================================================================
--- /branches/release-36/default_templates/powered_by.mtml (revision 2052)
+++ /branches/release-36/default_templates/powered_by.mtml (revision 2052)
@@ -0,0 +1,5 @@
+<div class="widget-powered widget">
+    <div class="widget-content">
+        <a href="<__trans phrase="_MTCOM_URL">"><img src="<$mt:StaticWebPath$>images/mt4-bug-pbmt-white.png" alt="<__trans phrase="Powered by Movable Type [_1]" params="<$mt:Version$>">" width="120" height="75" /></a>
+    </div>
+</div>
Index: /branches/release-36/default_templates/tag_cloud.mtml
===================================================================
--- /branches/release-36/default_templates/tag_cloud.mtml (revision 2052)
+++ /branches/release-36/default_templates/tag_cloud.mtml (revision 2052)
@@ -0,0 +1,10 @@
+<div class="widget-tag-cloud widget">
+    <h3 class="widget-header"><__trans phrase="Tag Cloud"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+    <mt:Tags top="20">
+            <li class="rank-<$mt:TagRank max="10"$> widget-list-item"><a href="javascript:void(0)" onclick="location.href='<$MTTagSearchLink encode_js="1"$>'" rel="tag"><$mt:TagName$></a></li>
+    </mt:Tags>
+        </ul>
+    </div>
+</div>
Index: /branches/release-36/default_templates/recent_assets.mtml
===================================================================
--- /branches/release-36/default_templates/recent_assets.mtml (revision 2052)
+++ /branches/release-36/default_templates/recent_assets.mtml (revision 2052)
@@ -0,0 +1,16 @@
+<mt:IfNonZero tag="AssetCount">
+    <mt:Assets type="image" lastn="10">
+        <mt:AssetsHeader>
+<div class="widget-recent-assets widget">
+    <h3 class="widget-header"><__trans phrase="Recent Assets"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        </mt:AssetsHeader>
+        <li class="item"><a class="asset-image" href="<$mt:AssetURL$>"><img src="<$mt:AssetThumbnailURL height="70"$>" class="asset-img-thumb" alt="<$mt:AssetLabel$>" title="<$mt:AssetLabel$>" /></a></li>
+        <mt:AssetsFooter>
+        </ul>
+    </div>
+</div>
+        </mt:AssetsFooter>
+    </mt:Assets>
+</mt:IfNonZero>
Index: /branches/release-36/default_templates/search.mtml
===================================================================
--- /branches/release-36/default_templates/search.mtml (revision 2052)
+++ /branches/release-36/default_templates/search.mtml (revision 2052)
@@ -0,0 +1,37 @@
+<div class="widget-search widget">
+    <h3 class="widget-header"><__trans phrase="Search"></h3>
+    <div class="widget-content">
+        <form method="get" action="<$mt:CGIPath$><$mt:SearchScript$>">
+            <input type="text" id="search" class="ti" name="search" value="<$mt:SearchString$>" />
+<mt:If name="search_results">
+            <input type="hidden" name="IncludeBlogs" value="<$mt:SearchIncludeBlogs$>" />
+            <input type="hidden" name="limit" value="<MTSearchMaxResults>" />
+            <MTIgnore>
+            <!-- use these options only with MT::App::Search::Legacy -->
+            <ul class="search-options">
+                <li><input type="checkbox" name="CaseSearch" /> <__trans phrase="Case sensitive"></li>
+                <li><input type="checkbox" name="RegexSearch" /> <__trans phrase="Regex search"></li>
+            </ul>
+            </MTIgnore>
+<mt:else>
+            <input type="hidden" name="IncludeBlogs" value="<$mt:BlogID$>" />
+            <input type="hidden" name="limit" value="<MTSearchMaxResults>" />
+</mt:if>
+            <input type="submit" accesskey="4" value="<__trans phrase="Search">" />
+        </form>
+    </div>
+</div>
+<mt:If name="search_results">
+    <mt:IfTagSearch>
+<div class="widget-tags widget">
+    <h3 class="widget-header"><__trans phrase="Tags"></h3>
+    <div class="widget-content">
+        <ul class="widget-list">
+        <mt:Tags>
+            <li class="widget-list-item"><a href="javascript:void(0)" onclick="location.href='<$MTTagSearchLink encode_js="1"$>'"><__trans phrase="[_1] ([_2])" params="<$mt:TagName$>%%<$mt:TagCount$>"></a></li>
+        </mt:Tags>
+        </ul>
+    </div>
+</div>
+    </mt:IfTagSearch>
+</mt:If>
Index: /branches/release-36/lib/MT/Upgrade.pm
===================================================================
--- /branches/release-36/lib/MT/Upgrade.pm (revision 2049)
+++ /branches/release-36/lib/MT/Upgrade.pm (revision 2052)
@@ -1948,4 +1948,9 @@
         my $obj = MT::Template->new;
         $obj->build_dynamic(0);
+        if ( ( 'widgetset' eq $val->{type} )
+          && ( exists $val->{widgets} ) ) {
+            my $modulesets = delete $val->{widgets};
+            $obj->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog_id) );
+        }
         foreach my $v (keys %$val) {
             $obj->column($v, $val->{$v}) if $obj->has_column($v);
Index: /branches/release-36/lib/MT/Core.pm
===================================================================
--- /branches/release-36/lib/MT/Core.pm (revision 1947)
+++ /branches/release-36/lib/MT/Core.pm (revision 2052)
@@ -713,4 +713,9 @@
                 content => qq{<mt:SetVarBlock name="variable">\n    \$0\n</mt:SetVarBlock>\n},
             },
+            'widget_manager' => {
+                trigger => 'widget',
+                label => 'Widget Set',
+                content => '<$mt:WidgetSet name="$0"$>',
+            },
         },
     };
Index: /branches/release-36/lib/MT/Blog.pm
===================================================================
--- /branches/release-36/lib/MT/Blog.pm (revision 2051)
+++ /branches/release-36/lib/MT/Blog.pm (revision 2052)
@@ -244,4 +244,9 @@
             $obj->include_with_ssi(1) if $pub_opts->{include_with_ssi};
         }
+        if ( ( 'widgetset' eq $val->{type} )
+          && ( exists $val->{widgets} ) ) {
+            my $modulesets = delete $val->{widgets};
+            $obj->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog->id) );
+        }
         $obj->save;
         if ($val->{mappings}) {
Index: /branches/release-36/lib/MT/CMS/Template.pm
===================================================================
--- /branches/release-36/lib/MT/CMS/Template.pm (revision 2051)
+++ /branches/release-36/lib/MT/CMS/Template.pm (revision 2052)
@@ -961,4 +961,9 @@
         $val->{text} = $app->translate_templatized( $val->{text} );
         my $tmpl = MT::Template->new;
+        if ( ( 'widgetset' eq $val->{type} )
+          && ( exists $val->{modulesets} ) ) {
+            my $modulesets = delete $val->{modulesets};
+            $tmpl->modulesets( join ',', @$modulesets );
+        }
         $tmpl->set_values($val);
         $tmpl->build_dynamic(0);
@@ -1724,4 +1729,9 @@
                 # we found that the previous template had not been
                 # altered, so replace it with new default template...
+                if ( ( 'widgetset' eq $val->{type} )
+                  && ( exists $val->{widgets} ) ) {
+                    my $modulesets = delete $val->{widgets};
+                    $tmpl->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog_id) );
+                }
                 $tmpl->text( $val->{text} );
                 $tmpl->identifier( $val->{identifier} );
@@ -1734,4 +1744,9 @@
                 # create this one...
                 my $tmpl = new MT::Template;
+                if ( ( 'widgetset' eq $val->{type} )
+                  && ( exists $val->{widgets} ) ) {
+                    my $modulesets = delete $val->{widgets};
+                    $tmpl->modulesets( MT::Template->widgets_to_modulesets($modulesets, $blog_id) );
+                }
                 $tmpl->build_dynamic(0);
                 $tmpl->set_values(
@@ -1979,4 +1994,293 @@
 }
 
+sub save_widget {
+    my $app = shift;
+    my $q   = $app->param;
+
+    $app->validate_magic() or return;
+    my $author = $app->user;
+
+    my $id = $q->param('id');
+
+    if ( !$author->is_superuser ) {
+        $app->run_callbacks( 'cms_save_permission_filter.template', $app, $id )
+          || return $app->error(
+            $app->translate( "Permission denied: [_1]", $app->errstr() ) );
+    }
+
+    my $filter_result = $app->run_callbacks( 'cms_save_filter.widgetset', $app );
+
+    if ( !$filter_result ) {
+        return edit_widget( $app, { error => $app->translate( "Save failed: [_1]", $app->errstr ) } );
+    }
+
+    my $class = $app->model('template');
+    my $obj;
+    if ( $id ) {
+        $obj = $class->load($id)
+            or return $app->error($app->translate("Invalid ID [_1]", $id));
+    }
+    else {
+        $obj = $class->new;
+    }
+
+    my $original = $obj->clone();
+    $obj->name($q->param('name'));
+    $obj->type('widgetset');
+    $obj->blog_id( $q->param('blog_id') || 0 );
+    $obj->modulesets($q->param('modules'));
+
+    unless (
+        $app->run_callbacks( 'cms_pre_save.template', $app, $obj, $original ) )
+    {
+        return edit_widget( $app, { error => $app->translate( "Save failed: [_1]", $app->errstr ) } );
+    }
+
+    $obj->save
+      or return $app->error(
+        $app->translate( "Saving object failed: [_1]", $obj->errstr ) );
+
+    $app->run_callbacks( 'cms_post_save.template', $app, $obj, $original )
+      or return $app->error( $app->errstr() );
+
+    $app->redirect(
+        $app->uri(
+            'mode' => 'edit_widget',
+            args =>
+              { blog_id => $obj->blog_id, 'saved' => 1, rebuild => 1, id => $obj->id }
+        )
+    );
+}
+
+sub edit_widget {
+    my $app = shift;
+    my (%opt) = @_;
+
+    my $q       = $app->param();
+    my $id      = scalar($q->param('id')) || $opt{id};
+    my $blog_id = scalar $q->param('blog_id') || 0;
+
+    my $tmpl_class = $app->model('template');
+    require MT::Promise;
+    my $obj_promise = MT::Promise::delay(
+        sub {
+            return $tmpl_class->load($id) || undef;
+        }
+    );
+
+    if ( !$app->user->is_superuser ) {
+        $app->run_callbacks( 'cms_view_permission_filter.template',
+            $app, $id, $obj_promise )
+          || return $app->error(
+            $app->translate( "Permission denied: [_1]", $app->errstr() ) );
+    }
+
+    my $param = {
+        blog_id      => $blog_id,
+        search_type  => "template",
+        search_label => MT::Template->class_label_plural,
+        $id ? ( id => $id ) : (), 
+        exists($opt{rebuild}) ? ( rebuild => $opt{rebuild} ) : (),
+        exists($opt{error}) ? ( error => $opt{error} ) : (),
+        exists($opt{saved}) ? ( saved => $opt{saved} ) : ()
+    };
+    if ($blog_id) {
+        my $blog = $app->blog;
+        # include_system/include_cache are only applicable
+        # to blog-level templates
+        $param->{include_system} = $blog->include_system;
+        $param->{include_cache} = $blog->include_cache;
+        $param->{include_with_ssi}      = 0;
+        $param->{cache_path}            = '';
+        $param->{cache_enabled}         = 0;
+        $param->{cache_expire_type}     = 0;
+        $param->{cache_expire_period}   = '';
+        $param->{cache_expire_interval} = 0;
+        $param->{ssi_type} = uc $blog->include_system;
+    }
+    
+    my $iter = $tmpl_class->load_iter(
+        { type => 'widget', blog_id => $blog_id ? [ $blog_id, 0 ] : 0 },
+        { sort => 'name', direction => 'ascend' }
+    );
+
+    my %all_widgets;
+    while (my $m = $iter->()) {
+        next unless $m;
+        $all_widgets{ $m->id } = $m->name;
+    }
+
+    my @inst_modules;
+    my $wtmpl;
+    if ( $id ) {
+        $wtmpl = $obj_promise->force()
+          or return $app->error(
+            $app->translate(
+                "Load failed: [_1]",
+                $tmpl_class->errstr || $app->translate("(no reason given)")
+            )
+          );
+        $param->{name} = $wtmpl->name;
+        $param->{include_with_ssi} = $wtmpl->include_with_ssi
+          if defined $wtmpl->include_with_ssi;
+        $param->{cache_path}       = $wtmpl->cache_path
+          if defined $wtmpl->cache_path;
+        $param->{cache_expire_type} = $wtmpl->cache_expire_type
+          if defined $wtmpl->cache_expire_type;
+        my ( $period, $interval ) =
+          _get_schedule( $wtmpl->cache_expire_interval );
+        $param->{cache_expire_period}   = $period   if defined $period;
+        $param->{cache_expire_interval} = $interval if defined $interval;
+        my @events = split ',', $wtmpl->cache_expire_event;
+        foreach my $name (@events) {
+            $param->{ 'cache_expire_event_' . $name } = 1;
+        }
+        my $modulesets = $wtmpl->modulesets;
+        if ( $modulesets ) {
+            my @modules = split ',', $modulesets;
+            foreach my $mid ( @modules ) {
+                push @inst_modules, { id => $mid, name => $all_widgets{$mid} };
+                delete $all_widgets{$mid};
+            }
+        }
+    }
+    $param->{installed} = \@inst_modules if @inst_modules;
+    my @avail_modules = map { { id => $_, name => $all_widgets{$_} } }
+        keys %all_widgets;
+    $param->{available} = \@avail_modules;
+
+    my $res = $app->run_callbacks('cms_edit.widgetset', $app, $id, $wtmpl, $param);
+    if (!$res) {
+        return $app->error($app->callback_errstr());
+    }
+
+    $app->load_tmpl('edit_widget.tmpl', $param);
+}
+
+sub list_widget {
+    my $app = shift;
+    my (%opt) = @_;
+    my $q = $app->param;
+
+    my $perms = $app->blog ? $app->permissions : $app->user->permissions;
+    return $app->return_to_dashboard( redirect => 1 )
+      unless $perms || $app->user->is_superuser;
+    if ( $perms && !$perms->can_edit_templates ) {
+        return $app->return_to_dashboard( permission => 1 );
+    }
+    my $blog_id = $q->param('blog_id') || 0;
+
+    my $widget_loop = &build_template_table( $app,
+        load_args => [ 
+            { type => 'widget', blog_id => $blog_id ? [ $blog_id, 0 ] : 0 },
+            { sort => 'name', direction => 'ascend' }
+        ],
+    );
+    
+    my $param = {
+        widget_table   => $widget_loop,
+        object_type    => "widgetset",
+        search_type    => "template",
+        search_label   => MT::Template->class_label_plural,
+        listing_screen => 1,
+        screen_id      => "list-widget-set",
+        $blog_id ? ( blog_view => 1, blog_id => $blog_id ) : (),
+        exists($opt{rebuild}) ? ( rebuild => $opt{rebuild} ) : (),
+        exists($opt{error}) ? ( error => $opt{error} ) : (),
+        exists($opt{deleted}) ? ( saved => $opt{deleted} ) : ()
+    };
+
+    my $iter = $app->model('template')->load_iter(
+        { type => 'widgetset', blog_id => $blog_id ? [ $blog_id, 0 ] : 0 },
+        { sort => 'name', direction => 'ascend' }
+    );
+    my @widgetmanagers;
+    while ( my $widgetset = $iter->() ) {
+        next unless $widgetset;
+        my $ws = { 
+            id => $widgetset->id,
+            widgetmanager => $widgetset->name,
+        };
+        if ( my $modulesets = $widgetset->modulesets ) {
+            $ws->{widgets} = $modulesets;
+            my @names;
+            foreach my $module ( split ',', $modulesets ) { 
+                my ( $widget ) = grep { $_->{id} eq $module } @$widget_loop;
+                push @names, $widget->{name} if $widget;
+            }
+            $ws->{names} = join(', ', @names) if @names;
+        }
+        push @widgetmanagers, $ws;
+    }
+    $param->{object_loop} = \@widgetmanagers if @widgetmanagers;
+
+    $app->load_tmpl('list_widget.tmpl', $param);
+}
+
+sub delete_widget {
+    my $app  = shift;
+    my $q    = $app->param;
+    my $type = $q->param('_type');
+
+    return $app->errtrans("Invalid request.")
+      unless $type;
+
+    return $app->error( $app->translate("Invalid request.") )
+      if $app->request_method() ne 'POST';
+
+    $app->validate_magic() or return;
+
+    my $tmpl_class = $app->model('template');
+
+    for my $id ( $q->param('id') ) {
+        next unless $id;    # avoid 'empty' ids
+
+        my $obj = $tmpl_class->load($id);
+        next unless $obj;
+        $app->run_callbacks( 'cms_delete_permission_filter.template',
+            $app, $obj )
+          || return $app->error(
+            $app->translate( "Permission denied: [_1]", $app->errstr() ) );
+
+        $obj->remove
+          or return $app->errtrans(
+            'Removing [_1] failed: [_2]',
+            $app->translate('template'),
+            $obj->errstr
+          );
+        $app->run_callbacks( 'cms_post_delete.template', $app, $obj );
+    }
+    $app->call_return;
+}
+
+sub restore_widgetmanagers {
+    my ($cb, $objects, $deferred, $errors, $callback) = @_;
+    my @keys = grep { $_ =~ /^MT::Template#/ } keys( %$objects );
+    foreach my $key ( @keys ) {
+        my $tmpl = $objects->{$key};
+        next unless 'widgetset' eq $tmpl->type;
+        my $modulesets = $tmpl->modulesets;
+        next unless $modulesets;
+        $callback->( MT->translate( 'Restoring widget set [_1]... ', $tmpl->name ) );
+
+        my @tmpl_ids = split ',', $modulesets;
+        my @new_ids;
+        foreach my $id ( @tmpl_ids ) {
+            my $new_tmpl = $objects->{"MT::Template#$id"};
+            next unless $new_tmpl;
+            push @new_ids, $new_tmpl->id;
+        }
+        if ( @new_ids ) {
+            $tmpl->modulesets( join(',', @new_ids) );
+            $tmpl->save;
+            $callback->( MT->translate("Done.") . "\n" );
+        }
+        else {
+            $callback->( MT->translate("Failed.") . "\n" );
+        }
+    }
+    1;
+}
+
 {
     my @period_options = (
Index: /branches/release-36/lib/MT/Template/ContextHandlers.pm
===================================================================
--- /branches/release-36/lib/MT/Template/ContextHandlers.pm (revision 2049)
+++ /branches/release-36/lib/MT/Template/ContextHandlers.pm (revision 2052)
@@ -361,4 +361,6 @@
             Include => \&_hdlr_include,
             Link => \&_hdlr_link,
+            WidgetManager => \&_hdlr_widget_manager,
+            WidgetSet => \&_hdlr_widget_manager,
 
             ErrorMessage => \&_hdlr_error_message,
@@ -9000,3 +9002,32 @@
 }
 
+sub _hdlr_widget_manager {
+    my ( $ctx, $args ) = @_;
+    my $tmpl_name = $args->{name}
+        or return $ctx->error(MT->translate("name is required."));
+    my $blog_id = $args->{blog_id} || $ctx->{__stash}{blog_id} || 0;
+
+    require MT::Template;
+    my $tmpl = MT::Template->load({ name => $tmpl_name,
+                                    blog_id => $blog_id ? [ 0, $blog_id ] : 0,
+                                    type => 'widgetset' })
+        or return $ctx->error(MT->translate("Specified WidgetSet not found."));
+    my $text = $tmpl->text;
+    return $ctx->build($text) if $text;
+
+    my $modulesets = $tmpl->modulesets;
+    return ''; # empty widgetset is not an error
+
+    my $string_tmpl = '<mt:include widget="%s">';
+    my @selected = split ','. $modulesets;
+    foreach my $mid (@selected) {
+        my $wtmpl = MT::Template->load($mid)
+            or return $ctx->error(MT->translate(
+                "Can't find included template widget '[_1]'", $mid ));
+        $text .= sprintf( $string_tmpl, $wtmpl->name );
+    }
+    return '' unless $text;
+    return $ctx->build($text);
+}
+
 1;
Index: /branches/release-36/lib/MT/App/CMS.pm
===================================================================
--- /branches/release-36/lib/MT/App/CMS.pm (revision 1982)
+++ /branches/release-36/lib/MT/App/CMS.pm (revision 2052)
@@ -53,5 +53,6 @@
 
         ## Edit methods
-        'edit_role'  => "${pkg}User::edit_role",
+        'edit_role'   => "${pkg}User::edit_role",
+        'edit_widget' => "${pkg}Template::edit_widget",
 
         ## Listing methods
@@ -59,4 +60,5 @@
         'list_entry'    => "${pkg}Entry::list",
         'list_template' => "${pkg}Template::list",
+        'list_widget'   => "${pkg}Template::list_widget",
         'list_page'     => "${pkg}Page::list",
         'list_comment'  => {
@@ -96,12 +98,14 @@
 
         ## Save
-        'save_cat'     => "${pkg}Category::save",
-        'save_entries' => "${pkg}Entry::save_entries",
-        'save_pages'   => "${pkg}Page::save_pages",
-        'save_entry'   => "${pkg}Entry::save",
-        'save_role'    => "${pkg}User::save_role",
+        'save_cat'       => "${pkg}Category::save",
+        'save_entries'   => "${pkg}Entry::save_entries",
+        'save_pages'     => "${pkg}Page::save_pages",
+        'save_entry'     => "${pkg}Entry::save",
+        'save_role'      => "${pkg}User::save_role",
+        'save_widget'    => "${pkg}Template::save_widget",
 
         ## Delete
         'delete_entry'   => "${pkg}Entry::delete",
+        'delete_widget'   => "${pkg}Template::delete_widget",
 
         ## List actions
@@ -1390,4 +1394,11 @@
             system_permission    => 'edit_templates',
         },
+        'design:widgets'  => {
+            label         => 'Widgets',
+            mode          => 'list_widget',
+            order         => 200,
+            permission    => 'edit_templates',
+            view          => "blog",
+        },
 
         'prefs:general' => {
@@ -1696,4 +1707,5 @@
             $pkg . 'post_save.template'   => "${pfx}Template::post_save",
             $pkg . 'post_delete.template' => "${pfx}Template::post_delete",
+            'restore' => "${pfx}Template::restore_widgetmanagers",
 
             # tags
Index: /branches/release-36/lib/MT/Template.pm
===================================================================
--- /branches/release-36/lib/MT/Template.pm (revision 2049)
+++ /branches/release-36/lib/MT/Template.pm (revision 2052)
@@ -44,4 +44,5 @@
         'cache_expire_event' => 'string meta',
         'cache_path' => 'string meta',
+        'modulesets' => 'string meta',
     },
     indexes => {
@@ -283,4 +284,59 @@
 }
 
+sub widgets_to_modulesets {
+    my $pkg = shift;
+    my ( $widgets, $blog_id ) = @_;
+    return unless $widgets && @$widgets;
+
+    my @widgets = map { MT->translate( $_ ) } @$widgets;
+
+    my @wtmpls = $pkg->load(
+        { name => \@widgets, blog_id => $blog_id ? [ $blog_id, 0 ] : 0, type => 'widget' }
+    );
+    my @wids;
+    foreach my $name ( @widgets ) {
+        my ( $widget ) = grep { $_->name eq $name } @wtmpls;
+        next unless $widget;
+        push @wids, $widget->id;
+    }
+    return join ',', @wids;
+}
+
+sub save_widgetset {
+    my $obj = shift;
+
+    my $ms = $obj->modulesets;
+    # build module list
+    my @inst;
+    if ( $ms && $ms =~ /;/ ) {
+        my @mods = split /;/, $ms;
+        for (@mods) {
+            # tmpl_id = column index . order in column ;
+            my ($id, $col) = /(\d+)=(\d+)\.(\d+)/;
+            push @inst, $id if $col && ( $col == 1 );
+        }
+        $obj->modulesets( join ',', @inst );
+    }
+    else {
+        @inst = split /,/, $obj->modulesets;
+    }
+
+    my @widgets = MT::Template->load(
+        { id => \@inst, type => 'widget',
+          blog_id => $obj->blog_id ? [ 0, $obj->blog_id ] : '0' },
+        { fetchonly => [ 'id', 'name' ] }
+    );
+
+    my $string_tmpl = '<mt:include widget="%s">';
+    my $text = q();
+    foreach my $wid (@inst) {
+        my ( $tmpl ) = grep { $_->id eq $wid } @widgets;
+        next unless $tmpl;
+        $text .= sprintf( $string_tmpl, $tmpl->name );
+    }
+    $obj->text($text) if $text;
+    return $obj->SUPER::save;
+}
+
 sub save {
     my $tmpl = shift;
@@ -289,4 +345,8 @@
         && ($existing->type eq $tmpl->type)) {
         return $tmpl->error(MT->translate('Template with the same name already exists in this blog.'));
+    }
+
+    if ( 'widgetset' eq $tmpl->type ) {
+        return $tmpl->save_widgetset();
     }
 
Index: /branches/release-36/lib/MT/DefaultTemplates.pm
===================================================================
--- /branches/release-36/lib/MT/DefaultTemplates.pm (revision 1709)
+++ /branches/release-36/lib/MT/DefaultTemplates.pm (revision 2052)
@@ -141,4 +141,132 @@
             'trackbacks' => {
                 label => 'Trackbacks',
+            },
+        },
+        'widget' => {
+            'about_this_page' => {
+                fielname => 'about_this_page.mtml',
+                label => 'About This Page',
+            },
+            'archive_widgets_group' => {
+                fielname => 'archive_widgets_group.mtml',
+                label => 'Archive Widgets Group',
+            },
+            'author_archive_list' => {
+                fielname => 'author_archive_list.mtml',
+                label => 'Author Archives',
+            },
+            'current_author_monthly_archive_list' => {
+                fielname => 'current_author_monthly_archive_list.mtml',
+                label => 'Current Author Monthly Archives',
+            },
+            'calendar' => {
+                fielname => 'calendar.mtml',
+                label => 'Calendar',
+            },
+            'category_archive_list' => {
+                fielname => 'category_archive_list.mtml',
+                label => 'Category Archives',
+            },
+            'current_category_monthly_archive_list' => {
+                fielname => 'current_category_monthly_archive_list.mtml',
+                label => 'Current Category Monthly Archives',
+            },
+            'creative_commons' => {
+                fielname => 'creative_commons.mtml',
+                label => 'Creative Commons',
+            },
+            'main_index_widgets_group' => {
+                fielname => 'main_index_widgets_group.mtml',
+                label => 'Home Page Widgets Group',
+            },
+            'monthly_archive_dropdown' => {
+                fielname => 'monthly_archive_dropdown.mtml',
+                label => 'Monthly Archives Dropdown',
+            },
+            'monthly_archive_list' => {
+                fielname => 'monthly_archive_list.mtml',
+                label => 'Monthly Archives',
+            },
+            'pages_list' => {
+                fielname => 'pages_list.mtml',
+                label => 'Page Listing',
+            },
+            'recent_assets' => {
+                fielname => 'recent_assets.mtml',
+                label => 'Recent Assets',
+            },
+            'powered_by' => {
+                fielname => 'powered_by.mtml',
+                label => 'Powered By',
+            },
+            'recent_comments' => {
+                fielname => 'recent_comments.mtml',
+                label => 'Recent Comments',
+            },
+            'recent_entries' => {
+                fielname => 'recent_entries.mtml',
+                label => 'Recent Entries',
+            },
+            'search' => {
+                fielname => 'search.mtml',
+                label => 'Search',
+            },
+            'signin' => {
+                fielname => 'signin.mtml',
+                label => 'Sign In',
+            },
+            'syndication' => {
+                fielname => 'syndication.mtml',
+                label => 'Syndication',
+            },
+            'tag_cloud' => {
+                fielname => 'tag_cloud.mtml',
+                label => 'Tag Cloud',
+            },
+            'technorati_search' => {
+                fielname => 'technorati_search.mtml',
+                label => 'Technorati Search',
+            },
+            'date_based_author_archives' => {
+                fielname => 'date_based_author_archives.mtml',
+                label => 'Date-Based Author Archives',
+            },
+            'date_based_category_archives' => {
+                fielname => 'date_based_category_archives.mtml',
+                label => 'Date-Based Category Archives',
+            }
+        },
+        'widgetset' => {
+            '2column_layout_sidebar' => {
+                order => 1000,
+                label   => '2-column layout - Sidebar',
+                widgets => [
+                    'Search',
+                    'About This Page',
+                    'Home Page Widgets Group',
+                    'Archive Widgets Group',
+                    'Page Listing',
+                    'Syndication',
+                    'Powered By',
+                ],
+            },
+            '3column_layout_primary_sidebar' => {
+                order => 1000,
+                label   => '3-column layout - Primary Sidebar',
+                widgets => [
+                    'Archive Widgets Group',
+                    'Page Listing',
+                    'Syndication',
+                    'Powered By',
+                ],
+            },
+            '3column_layout_secondary_sidebar' => {
+                order => 1000,
+                label   => '3-column layout - Secondary Sidebar',
+                widgets => [
+                    'Search',
+                    'Home Page Widgets Group',
+                    'About This Page',
+                ],
             },
         },
@@ -238,4 +366,5 @@
                 }
                 $tmpl->{set} = $type; # system, index, archive, etc.
+                $tmpl->{order} = 0 unless exists $tmpl->{order};
 
                 $type = 'custom' if $type eq 'module';
@@ -274,4 +403,5 @@
     }
     my @tmpls = (values(%tmpls), values(%global_tmpls));
+    @tmpls = sort { $a->{order} <=> $b->{order} } @tmpls;
     MT->run_callbacks('DefaultTemplateFilter' . ($set ? '.' . $set : ''), \@tmpls);
     return \@tmpls;
Index: /anches/release-36/plugins/WidgetManager/lib/WidgetManager/Plugin.pm
===================================================================
--- /branches/release-36/plugins/WidgetManager/lib/WidgetManager/Plugin.pm (revision 1734)
+++  (revision )
@@ -1,151 +1,0 @@
-# WidgetManager plugin for Movable Type
-# Author: Byrne Reese, Six Apart (http://www.sixapart.com)
-# Released under the Artistic License
-#
-# $Id$
-
-package WidgetManager::Plugin;
-
-use strict;
-
-sub _hdlr_widget_manager {
-    my $ctx = shift;
-    my $args = shift;
-
-    my $blog_id = $ctx->stash('blog_id');
-
-    my $plugin = MT->component('WidgetManager');
-    my $modulesets = load_selected_modules($plugin, $blog_id);
-
-    return '' unless $modulesets;
-    return '' unless $modulesets->{$args->{name}};
-
-    my @selected = split(/\s*,\s*/,$modulesets->{$args->{name}});
-
-    my $res = "";
-    foreach my $mid (@selected) {
-        require MT::Template;
-        my $tmpl = MT::Template->load({ id => $mid,
-                                        blog_id => $blog_id })
-            or return $ctx->error(MT->translate(
-                "Can't find included template widget '[_1]'", $mid ));
-        defined(my $out = $ctx->tag('include', { widget => $tmpl->name }))
-            or return $ctx->error($ctx->errstr);
-        $res .= $out;
-    }
-    return $res;
-}
-
-sub load_selected_modules {
-    my ($plugin, $blog_id) = @_;
-    my $config = $plugin->get_config_hash('blog:'.$blog_id);
-    return $config && $config->{modulesets} ? $config->{modulesets} : undef;
-}
-
-sub clone_blog_widgemanagers {
-    my $cb      = shift;
-    my (%params) = @_;
-    my $plugin  = $cb->plugin;
-
-    my $report = sub {};
-    my $label = 'widgetmgr';
-
-    if (my $callback = $params{callback}) {
-        my $state;
-        $report = sub { 
-            my $msg;
-            if ($state) {
-                $msg = $state . ' ' . (+shift);
-            } else {
-                $msg = $state = shift;
-            }
-            $callback->($msg, $label)
-        };
-    }
-
-    $report->($plugin->translate('Cloning Widgets for blog...'));
-
-    my $modulesets = $plugin->load_selected_modules($params{old_blog_id});    
-    if ( ! $modulesets or ! keys %$modulesets ) {
-        return $report->($plugin->translate("[_1] records processed.", 0));
-    }
-
-    my @widgetmanagers;
-    foreach my $key (sort keys %$modulesets) {
-        # Collect the available widgets for this key.
-        my @w = ();
-        for my $w ( split /\s*,\s*/, $modulesets->{$key} ) {
-            push @w, $params{template_map}{$w} if $params{template_map}{$w};
-        }
-        $modulesets->{$key} = join(',', @w);
-    }
-
-    my $vars = { modulesets => $modulesets, installed => 1 };
-    my $pdata_obj = $plugin->get_config_obj('blog:'.$params{new_blog_id});
-    my $configuration = $pdata_obj->data() || {};
-    $configuration->{$_} = $vars->{$_} for keys %$vars;
-    $pdata_obj->data($configuration);
-    $pdata_obj->save();
-
-    my $counter = scalar keys %$modulesets;
-    $report->($plugin->translate("[_1] records processed.", $counter));
-}
-
-sub remove_blog_widgetmanager {
-    my $cb      = shift;
-    my $plugin  = $cb->plugin;
-
-    my @pdata_objs;
-    require MT::PluginData;
-    # post_remove_all
-    if (! ref($_[0]) and $_[0] eq 'MT::Blog') {
-        @pdata_objs = MT::PluginData->load({ plugin => $plugin->key});
-    }
-    # post_remove
-    elsif (ref($_[0]) eq 'MT::Blog') {
-        @pdata_objs = 
-            MT::PluginData->load({  plugin => $plugin->key,
-                                    key    => 'configuration:blog:'.$_[0]->id });
-    }
-    $_->remove foreach @pdata_objs;
-}
-
-sub create_default_widgetsets {
-    my ($cb, $blog, $tmpl_list) = @_;
-    require WidgetManager::CMS;
-    WidgetManager::CMS::create_default_widgetsets($blog->id);
-    1;
-}
-
-sub restore_widgetmanagers {
-    my ($cb, $objects, $deferred, $errors, $callback) = @_;
-    my $plugin  = $cb->plugin;
-    my @keys = grep { $_ =~ /^MT::PluginData#/ } keys( %$objects );
-    foreach my $key ( @keys ) {
-        my $pd = $objects->{$key};
-        next unless $plugin->key eq $pd->plugin;
-        my $config = $pd->data;
-        next unless $config;
-        my $modulesets = $config->{modulesets};
-        next unless $modulesets;
-
-        foreach my $mod_key ( keys %$modulesets ) {
-            $callback->( $plugin->translate( 'Restoring widgetmanager [_1]... ', $mod_key ) );
-            my $tmpl_ids = $modulesets->{$mod_key};
-            my @tmpl_ids = split ',', $tmpl_ids;
-            my @new_ids;
-            foreach my $id ( @tmpl_ids ) {
-                my $tmpl = $objects->{"MT::Template#$id"};
-                next unless $tmpl;
-                push @new_ids, $tmpl->id;
-            }
-            $modulesets->{$mod_key} = join(',', @new_ids);
-            $callback->( $plugin->translate("Done.") . "\n" );
-        }
-        $pd->data({ modulesets => $modulesets });
-        $pd->save;
-    }
-    1;
-}
-
-1;
Index: /anches/release-36/plugins/WidgetManager/lib/WidgetManager/CMS.pm
===================================================================
--- /branches/release-36/plugins/WidgetManager/lib/WidgetManager/CMS.pm (revision 2047)
+++  (revision )
@@ -1,408 +1,0 @@
-# Widget Manager plugin for Movable Type
-# Author: Byrne Reese, Six Apart (http://www.sixapart.com)
-# Released under the Artistic License
-#
-# $Id$
-
-package WidgetManager::CMS;
-
-use strict;
-
-sub plugin {
-    return MT->component('WidgetManager');
-}
-
-sub _permission_check {
-    my $app = MT->instance;
-    return ($app->user && $app->user->blog_perm($app->param('blog_id'))->can_edit_templates);
-}
-
-sub save {
-    my $app = shift;
-
-    return $app->error($app->translate('Permission denied.'))
-        unless _permission_check();
-
-    my $q = $app->param();
-
-    my $blog_id = scalar $q->param('blog_id');
-
-    my $str = build_module_list($q->param('modules'));
-
-    # Load the current widgetmanager data
-    my $current = $q->param('widgetmanager') || '';
-    $current = $q->param('name') if $current eq 'New Widget Manager';
-    my $modulesets = plugin()->load_selected_modules($blog_id);
-    $modulesets = {} unless $modulesets;
-
-    # delete old set
-    delete $modulesets->{$q->param('widgetmanager') || ''};
-    # Handle renaming: Delete the entry that has changed names.
-    delete $modulesets->{$q->param('old_name')}; # unless $q->param('old_name') eq $q->param('name');
-    if(exists $modulesets->{$q->param('name')}) {
-        return $app->error($app->translate(
-            "Can't duplicate the existing '[_1]' Widget Manager. Please go back and enter a unique name.",
-            $q->param('name')))
-    }
-    # add it back with a potential new name
-    $modulesets->{$q->param('name')} = $str;
-
-    plugin()->set_config_value('modulesets',$modulesets,"blog:$blog_id");
-
-    return $app->redirect( $app->uri( mode => 'list_widget', args => { blog_id => $blog_id, rebuild => 1 } ) );
-}
-
-sub delete {
-    my $app = shift;
-
-    return $app->error($app->translate('Permission denied.'))
-        unless _permission_check();
-
-    my $q = $app->param();
-    my $blog_id = scalar $q->param('blog_id');
-
-    my $modulesets = plugin()->load_selected_modules($blog_id);
-    $modulesets = {} unless $modulesets;
-
-    my @ids = $q->param('id');
-    delete $modulesets->{$_} for @ids;
-
-    plugin()->set_config_value('modulesets',$modulesets,"blog:$blog_id");
-    
-    return $app->redirect( $app->uri( mode => 'list_widget', args => { blog_id => $blog_id, deleted => 1 } ) );
-}
-
-sub edit {
-    my $app = shift;
-    my (%opt) = @_;
-
-    return $app->error($app->translate('Permission denied.'))
-        unless _permission_check();
-
-      my $q = $app->param();
-      my $blog_id = scalar $q->param('blog_id');
-
-      install_default_widgets($blog_id, 1);
-
-      my $tmpl = $app->load_tmpl('edit.tmpl');
-      $tmpl->param('blog_id'  => $blog_id);
-      $app->add_breadcrumb($app->translate('Main Menu'),$app->{mtscript_url});
-      require MT::Blog;
-      my $blog = MT::Blog->load ($blog_id);
-      $app->add_breadcrumb($blog->name, $app->mt_uri(mode => 'menu', args => { blog_id => $blog_id }));
-      $app->add_breadcrumb($app->translate('Widget Manager'),'?__mode=list_widget&blog_id='.$blog_id);
-      $app->add_breadcrumb($q->param('widgetmanager'));
-
-      my $modulesets = plugin()->load_selected_modules($blog_id);
-      $modulesets = {} unless $modulesets;
-
-      my @names = sort keys %$modulesets;
-      my $widgetmanager = $q->param('widgetmanager') || $names[0] || '';
-
-      # Find non-conflicting name for new Widget Manager
-      if ($widgetmanager eq $app->translate('New Widget Set')) { 
-          $widgetmanager = $app->translate('Widget Manager');
-          if (grep(/^\Q$widgetmanager\E$/, @names)) {
-              my $i = 1;
-              while (grep(/^\Q$widgetmanager $i\E$/, @names)) {
-                  $i++;
-              }
-              # $widgetmanager = "$widgetmanager $i";
-              $widgetmanager = "";
-          }
-      }
-
-      my @selected = exists($modulesets->{$widgetmanager})
-        ? split(/\s*,\s*/,$modulesets->{$widgetmanager})
-        : ();
-
-      my %constraints;
-      $constraints{blog_id} = $blog_id;
-      $constraints{type}    = 'widget';
-      my %options;
-      $options{sort}      = 'name';
-      $options{direction} = 'ascend';
-      require MT::Template;
-      my $iter = MT::Template->load_iter( \%constraints, \%options );
-      my @avail_modules;
-      my @inst_modules;
-      while (my $m = $iter->()) {
-          my $name = $m->name();
-          push @avail_modules, {
-            id => $m->id(),
-            name => $name,
-            selected => in_array($m->id,@selected),
-          };
-      }
-      foreach my $mid (@selected) {
-          for (my $i = 0; $i <= $#avail_modules; $i++) {
-              if ($avail_modules[$i]->{id} == $mid) {
-                  push @inst_modules,$avail_modules[$i];
-                  splice(@avail_modules,$i,1);
-              }
-          }
-      }
-
-      my @widgetmanagers = map { { widgetmanager => $_ } } keys %$modulesets;
-      $tmpl->param(object_loop => \@widgetmanagers);
-      $tmpl->param(search_type  => "template");
-      $tmpl->param(search_label => MT::Template->class_label_plural);
-
-      $tmpl->param(available => \@avail_modules);
-      $tmpl->param(installed => \@inst_modules);
-      $tmpl->param(name      => $widgetmanager);
-
-      $app->{breadcrumbs}[-1]{is_last} = 1;
-      $tmpl->param(breadcrumbs       => $app->{breadcrumbs});
-      $tmpl->param(plugin_version    => $MT::Plugin::WidgetManager::VERSION);
-      $tmpl->param(rebuild           => $opt{rebuild});
-      return $app->build_page($tmpl);
-}
-
-sub list {
-    my $app = shift;
-    my (%opt) = @_;
-
-    return $app->return_to_dashboard(redirect => 1)
-        unless $app->param('blog_id');
-
-    return $app->return_to_dashboard(permission => 1)
-        unless _permission_check();
-
-      my $q = $app->param;
-      my $blog_id = int(scalar $q->param('blog_id'));
-
-      my $tmpl = $app->load_tmpl('list.tmpl');
-      $tmpl->param('blog_id'  => $blog_id);
-      $app->add_breadcrumb($app->translate("Main Menu"),$app->{mtscript_url});
-      require MT::Blog;
-      my $blog = MT::Blog->load ($blog_id);
-      $app->add_breadcrumb($blog->name,$app->mt_uri( mode => 'menu', args => { blog_id => $blog_id }));
-      $app->add_breadcrumb($app->translate("Widget Manager"));
-
-      my $modulesets = plugin()->load_selected_modules($blog_id) || {};
-
-      my (%constraints, %options);
-      $constraints{blog_id} = $blog_id;
-      $constraints{type}    = 'widget';
-      $options{sort}        = 'name';
-      $options{direction}   = 'ascend';
-
-      require MT::Template;
-      my $iter = MT::Template->load_iter( \%constraints, \%options );
-      my %avail;
-      while (my $m = $iter->()) {
-          my $name = $m->name();
-          $avail{$m->id()} = $name;
-      }
-
-      my @names = sort keys %$modulesets;
-      my $widgetmanager = $q->param('widgetmanager') || $names[0] || '';
-
-      my @widgetmanagers;
-      my @keys = sort keys %$modulesets;
-
-      my $offset = $app->param('offset') || 0;
-      $tmpl->param( list_start => $offset + 1 );
-      $tmpl->param( list_end   => $offset + scalar @keys );
-
-      foreach my $key (@keys) {
-          # Collect the available widgets for this key.
-          my @w = ();
-          for my $w ( split /\s*,\s*/, $modulesets->{$key} ) {
-              push @w, $avail{$w} if $avail{$w};
-          }
-          push @widgetmanagers,{
-            widgetmanager => $key,
-            names   => join(', ', @w),
-            widgets => $modulesets->{$key}
-          };
-    }
-    if ($widgetmanager eq 'New Widget Manager') {
-        $widgetmanager = $q->param('name');
-    }
-
-    require MT::CMS::Template;
-    my $widget_loop = MT::CMS::Template::build_template_table( $app,
-        load_args => [ { type => 'widget', blog_id => $blog_id },
-        { sort => 'name', direction => 'ascend' } ],
-    );
-    $tmpl->param('widget_table', $widget_loop);
-    $tmpl->param('blog_view', 1) if $blog_id;
-
-    $tmpl->param(object_loop  => \@widgetmanagers);
-    $tmpl->param(object_type  => "widgetset");
-    $tmpl->param(search_type  => "template");
-    $tmpl->param(search_label => MT::Template->class_label_plural);
-
-    $app->{breadcrumbs}[-1]{is_last} = 1;
-    $tmpl->param(breadcrumbs       => $app->{breadcrumbs});
-    $tmpl->param(plugin_version    => $MT::Plugin::WidgetManager::VERSION);
-    $tmpl->param(rebuild           => $app->param('rebuild') || 0);
-    $tmpl->param(deleted           => $app->param('deleted') || 0);
-    $tmpl->param(listing_screen => 1);
-    $tmpl->param(screen_id => "list-widget-set");
-
-    return $app->build_page($tmpl);
-}
-
-sub build_module_list {
-    my $str = shift;
-    my @mods = split /;/, $str;
-    my @inst;
-    for (@mods) {
-        my ($id, $col) = /(\d+)=(\d+)\.(\d+)/;
-        push @inst, $id if $col == 1;
-    }
-    return join ',', @inst;
-}
-
-sub in_array {
-    my ($needle, @haystack) = @_;
-    for (@haystack) {
-        return 1 if $_ eq $needle;
-    }
-    return 0;
-}
-
-sub install_module {
-    my($blog_id, $name, $text) = @_;
-    my $app = MT->instance;
-    require MT::Template;
-    my $tmpl = MT::Template->new;
-    $tmpl->blog_id($blog_id);
-    $tmpl->type('widget');
-    $tmpl->name($app->translate($name));
-    $tmpl->text($app->translate_templatized($text));
-    $tmpl->save;
-    return $tmpl;
-}
-
-sub create_default_widgetsets {
-    my $app = MT->instance;
-    my ($blog_id) = @_;
-
-    my ( %constraints, %options );
-    $constraints{blog_id} = $blog_id;
-    $constraints{type}    = 'widget';
-    $options{sort}        = 'name';
-    $options{direction}   = 'ascend';
-
-    require MT::Template;
-    my $iter = MT::Template->load_iter( \%constraints, \%options );
-    my %widgets;
-    while ( my $tmpl = $iter->() ) {
-        my $name = $tmpl->name();
-        $widgets{$name} = $tmpl->id();
-    }
-
-    my $widgetsets = [
-        {
-            label   => '2-column layout - Sidebar',
-            widgets => [
-                'Search',
-                'About This Page',
-                'Home Page Widgets Group',
-                'Archive Widgets Group',
-                'Page Listing',
-                'Syndication',
-                'Powered By',
-            ],
-        },
-        {
-            label   => '3-column layout - Primary Sidebar',
-            widgets => [
-                'Archive Widgets Group',
-                'Page Listing',
-                'Syndication',
-                'Powered By',
-            ],
-        },
-        {
-            label   => '3-column layout - Secondary Sidebar',
-            widgets => [
-                'Search',
-                'Home Page Widgets Group',
-                'About This Page',
-            ],
-        },
-    ];
-
-    my $modulesets = plugin()->load_selected_modules($blog_id);
-    $modulesets = {} unless $modulesets;
-
-    foreach my $widgetset ( @{$widgetsets} ) {
-        my $label = plugin()->translate( $widgetset->{label} );
-        my @ids;
-        foreach my $widget ( @{ $widgetset->{widgets} } ) {
-            my $name = plugin()->translate($widget);
-            push @ids, $widgets{$name} if $widgets{$name};
-        }
-        $modulesets->{$label} = join ',', @ids;
-    }
-
-    plugin()->set_config_value( 'modulesets', $modulesets, "blog:$blog_id" );
-}
-
-sub install_default_widgets {
-    my $app = MT->instance;
-    my ( $blog_id, $reinstall ) = @_;
-    my ($tmpl,$default_widget_templates);
-
-    # Gather the existing modules.
-    my $modules = {};
-    require MT::Template;
-    for ( MT::Template->load({ blog_id => $blog_id, type => 'widget' }) ) {
-        my $name = $_->name();
-        $modules->{$name} = $_->linked_file();  # XXX The linked_file is undef for this plugin modules for some reason.
-    }
-
-    use File::Spec;
-    my $widgets_dir = File::Spec->catfile(plugin()->{full_path}, 'default_widgets');
-    my $cfg_file = File::Spec->catfile($widgets_dir, 'widgets.cfg');
-
-    local(*FH, $_, $/);
-    $/ = "\n";
-    open FH, $cfg_file or
-        return $app->error(MT->translate(
-            "Error opening file '[_1]': [_2]", $cfg_file, "$!" ));
-    my $cfg = join('',<FH>);
-    eval "$cfg;";
-    close FH;
-
-    foreach (@$default_widget_templates) {
-        next if exists $modules->{plugin()->translate($_->{label})};
-        open(TMPL, File::Spec->catfile($widgets_dir, $_->{template})) or die "Error: $!\n";
-        while (my $line = <TMPL>) {
-            $_->{text} .= $line;
-        }
-        close TMPL;
-        $tmpl = install_module($blog_id, $_->{label}, $_->{text});
-    }
-
-    unless( $reinstall ) {
-        # Set the 'installed' bit in the config
-        installed($blog_id, 1);
-
-        # Now that the plugin is installed for this blog, create a default widget sets
-        # with all modules pre-installed.
-        create_default_widgetsets($blog_id);
-    }
-}
-
-sub installed {
-    my $config = {};
-    my $app = MT->instance;
-    my ( $blog_id, $save ) = @_;
-
-    my $plugin = plugin();
-    if ($save) {
-        # Set the installed bit, save and return
-        return $plugin->set_config_value('installed',1,"blog:$blog_id");
-    } else {
-        # Return early if status check
-        return $plugin->get_config_value('installed',"blog:$blog_id");
-    }
-}
-
-1;
Index: /branches/release-36/plugins/WidgetManager/WidgetManager.pl
===================================================================
--- /branches/release-36/plugins/WidgetManager/WidgetManager.pl (revision 1713)
+++ /branches/release-36/plugins/WidgetManager/WidgetManager.pl (revision 2052)
@@ -15,14 +15,19 @@
 use base qw( MT::Plugin );
 use constant DEBUG => 0;
-our $VERSION = '1.0';
+use MT::Template;
+use MT::Util qw( escape_unicode );
+use MT::I18N qw( encode_text );
+
+our $VERSION = '1.1';
 
 my $plugin = MT::Plugin::WidgetManager->new({
-    id          => 'WidgetManager',
-    name        => 'Widget Manager',
-    description => q(<MT_TRANS phrase="Maintain your blog's widget content using a handy drag and drop interface.">),
-    version     => $VERSION,
-    author_name => 'Six Apart',
-    key         => 'widget-manager',
-    l10n_class  => 'WidgetManager::L10N',
+    id             => 'WidgetManager',
+    name           => 'Widget Manager Upgrade Assistant',
+    description    => q(<MT_TRANS phrase="Widget Manager version 1.1; This version of the plugin is to upgrade data from older version of Widget Manager that has been shipped with Movable Type to the Movable Type core schema.  No other features are included.  You can safely remove this plugin after installing/upgrading Movable Type.\">),
+    version        => $VERSION,
+    schema_version => $VERSION,
+    author_name    => 'Six Apart, Ltd.',
+    key            => 'widget-manager',
+    l10n_class     => 'WidgetManager::L10N',
 });
 MT->add_plugin($plugin);
@@ -33,100 +38,64 @@
     my $plugin = shift;
     $plugin->registry({
-        tags => {
-            help_url => sub { MT->translate('http://www.movabletype.org/documentation/appendices/tags/%t.html') },
-            function => {
-                WidgetManager => '$WidgetManager::WidgetManager::Plugin::_hdlr_widget_manager',
-                WidgetSet => '$WidgetManager::WidgetManager::Plugin::_hdlr_widget_manager',
+        upgrade_functions => {
+            'upgrade_widgetmanagers_nv' => {
+                # this is to workaround absence of PluginSchemaVersion
+                code => \&upgrade_widgetmanagers,
             },
-        },
-        callbacks => {
-            'clone_blog_widgets' => {
-                callback => 'MT::Blog::post_clone',
-                handler => '$WidgetManager::WidgetManager::Plugin::clone_blog_widgemanagers',
-            },
-            'remove_blog_widgets' => {
-                callback => 'MT::Blog::post_remove',
-                handler => '$WidgetManager::WidgetManager::Plugin::remove_blog_widgetmanager',
-            },
-            'DefaultTemplateFilter' => '$WidgetManager::MT::Plugin::WidgetManager::default_templates',
-            'MT::Blog::post_create_default_templates' => '$WidgetManager::WidgetManager::Plugin::create_default_widgetsets',
-            'restore' => '$WidgetManager::WidgetManager::Plugin::restore_widgetmanagers',
-        },
-        applications => {
-            cms => {
-                methods => {
-                    list_widget => '$WidgetManager::WidgetManager::CMS::list',
-                    edit_widget => '$WidgetManager::WidgetManager::CMS::edit',
-                    delete_widget => '$WidgetManager::WidgetManager::CMS::delete',
-                    save_widget => '$WidgetManager::WidgetManager::CMS::save',
-                },
-                menus => {
-                    'design:widgets' => {
-                        label => 'Widgets',
-                        mode => 'list_widget',
-                        order => 200,
-                        permission => 'edit_templates',
-                        view => "blog",
-                    },
-                },
-                template_snippets => {
-                    'widget_manager' => {
-                        label => 'Widget Set',
-                        content => '<$mt:WidgetSet name="$0"$>',
-                        trigger => 'widget',
-                    },
-                },
-            },
+            'upgrade_widgetmanagers' => {
+                version_limit => 1.1,
+                code => \&upgrade_widgetmanagers,
+            }
         },
     });
+    return 1;
 }
 
-sub load_selected_modules { 
-    require WidgetManager::Plugin; 
-    WidgetManager::Plugin::load_selected_modules(@_); 
-}
+sub _disable_widgetmanager { 
+    my $switch = MT->config('PluginSwitch') || {}; 
+    $switch->{$plugin->{plugin_sig}} = 0; 
+    MT->config('PluginSwitch', $switch, 1); 
+    MT->config->save_config(); 
+} 
 
-sub default_templates {
-    my $cb = shift;
-    my ($tmpl_list) = @_;
+sub _translate_escape { 
+    my $trans = $plugin->translate(@_); 
+    return $trans if $MT::Upgrade::CLI; 
+    $trans = MT::I18N::encode_text($trans, undef, 'utf-8'); 
+    return MT::Util::escape_unicode($trans); 
+} 
 
-    my $widgetmgr = MT::Plugin::WidgetManager->instance;
-    my $widget_tmpls = $widgetmgr->templates(MT->instance);
-    push @$tmpl_list, @$widget_tmpls;
-}
+sub upgrade_widgetmanagers { 
+    my $upg = shift; 
 
-sub templates {
-    my $plugin = shift;
-    my ($app) = @_;
-    my $default_widget_templates;
-
-    use File::Spec;
-    my $widgets_dir = File::Spec->catfile($plugin->{full_path}, 'default_widgets');
-    my $cfg_file = File::Spec->catfile($widgets_dir, 'widgets.cfg');
-    
-    local(*FH, $_, $/);
-    $/ = "\n";
-    open FH, $cfg_file or
-        return $app->error(MT->translate(
-                               "Error opening file '[_1]': [_2]", $cfg_file, "$!" ));
-    my $cfg = join('',<FH>);
-    eval "$cfg;";
-    close FH;
-
-    my @tmpls;
-    require MT::Template;
-    foreach (@$default_widget_templates) {
-        open(TMPL, File::Spec->catfile($widgets_dir, $_->{template})) or die "Error: $!\n";
-        while (my $line = <TMPL>) {
-            $_->{text} .= $line;
+    require MT::PluginData;
+    my $iter = MT::PluginData->load_iter(
+        { plugin => $plugin->key }
+    );
+    while ( my $pd = $iter->() ) {
+        next unless $plugin->key eq $pd->plugin;
+        my ( $blog_id ) = $pd->key =~ /configuration:blog:(\d+)/;
+        next unless $blog_id;
+        my $config = $pd->data;
+        next unless $config;
+        my $modulesets = $config->{modulesets};
+        next unless $modulesets;
+        foreach my $mod_key ( keys %$modulesets ) {
+            $upg->progress(_translate_escape('Moving storage of Widget Manager [_1]...', $mod_key));
+            my $tmpl_ids = $modulesets->{$mod_key};
+            my $tmpl = MT::Template->new;
+            $tmpl->blog_id($blog_id);
+            $tmpl->name($mod_key);
+            $tmpl->type('widgetset');
+            $tmpl->build_dynamic(0);
+            $tmpl->rebuild_me(0);
+            $tmpl->modulesets($tmpl_ids);
+            $tmpl->save_widgetset
+                or $upg->progress(_translate_escape('Failed.')), next;
+            $upg->progress(_translate_escape('Done.'));
         }
-        close TMPL;
-        my $tmpl = MT::Template->new;
-        $tmpl->{type} = 'widget';
-        $tmpl->{name} = $plugin->translate($_->{label});
-        $tmpl->{text} = $plugin->translate_templatized($_->{text});
-        push @tmpls, $tmpl;
+        $pd->remove;
     }
-    return \@tmpls;
+    _disable_widgetmanager;
 }
 
Index: /branches/release-36/mt-static/css/widget.css
===================================================================
--- /branches/release-36/mt-static/css/widget.css (revision 2052)
+++ /branches/release-36/mt-static/css/widget.css (revision 2052)
@@ -0,0 +1,86 @@
+td.widgetmanager-name {
+    width: 150px;
+}
+
+#widget-manager-listing table {
+    border-bottom: 0;
+}
+
+.textarea-wrapper {
+    width: 290px;
+}
+
+#stage {
+    position: relative;
+    width: 620px;
+}
+
+#installed-column {
+    width: 300px;
+    background-color: #e6ecf2;
+    float: left;
+}
+
+#center-column {
+    width: 20px;
+    text-align: center;
+    float: left;
+}
+
+#available-column {
+    width: 300px;
+    background-color: #eee;
+    float: left;
+}
+
+#installed-column p,
+#available-column p {
+    margin: 0 0 5px 0;
+    padding: 5px 0;
+    background-color: #8faebe;
+    color: #fff;
+    text-align: center;
+    font-weight: bold;
+}
+#available-column p {
+    background-color: #bbb;
+}
+
+#stage-drop {
+    display: none;
+}
+
+.module {
+    position: absolute;
+    display: none;
+    width: 100%;
+    border: 1px solid #a3b8cc;
+    background-color: #fff;
+    padding: 5px;
+    font-size: x-small;
+    line-height: 1;
+}
+#available-column .module {
+    border: 1px solid #bbb;
+}
+
+.module-name {
+    float: left;
+    text-align: left;
+}
+
+.module-edit {
+    float: right;
+    text-align: right;
+    text-transform: lowercase;
+}
+
+.module a:link,
+.module a:visited,
+.module a:hover,
+.module a:active {
+    color: #333;
+    font-weight: normal;
+    text-decoration: none;
+}
+
Index: /branches/release-36/mt-static/js/widget.js
===================================================================
--- /branches/release-36/mt-static/js/widget.js (revision 2052)
+++ /branches/release-36/mt-static/js/widget.js (revision 2052)
@@ -0,0 +1,163 @@
+function edit_different_widgetmanager( blog_id ) {
+    var current = getByID('current-widgetmanager').value;
+    window.location = '?__mode=manage&blog_id='+blog_id+'&widgetmanager='+current;
+}
+
+// -------------------------------------------------------------------
+// selectAllOptions(select_object)
+//  This function takes a select box and selects all options (in a 
+//  multiple select object). This is used when passing values between
+//  two select boxes. Select all options in the right box before 
+//  submitting the form so the values will be sent to the server.
+// -------------------------------------------------------------------
+function selectAllOptions(obj) {
+	if (!hasOptions(obj)) { return; }
+	for (var i=0; i<obj.options.length; i++) {
+		obj.options[i].selected = true;
+	}
+}
+
+// -------------------------------------------------------------------
+// hasOptions(obj)
+//  Utility function to determine if a select object has an options array
+// -------------------------------------------------------------------
+function hasOptions(obj) {
+	if (obj!=null && obj.options!=null) { return true; }
+	return false;
+}
+
+// -------------------------------------------------------------------
+// swapOptions(select_object,option1,option2)
+//  Swap positions of two options in a select list
+// -------------------------------------------------------------------
+function swapOptions(obj,i,j) {
+	var o = obj.options;
+	var i_selected = o[i].selected;
+	var j_selected = o[j].selected;
+	var temp = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
+	var temp2= new Option(o[j].text, o[j].value, o[j].defaultSelected, o[j].selected);
+	o[i] = temp2;
+	o[j] = temp;
+	o[i].selected = j_selected;
+	o[j].selected = i_selected;
+}
+
+// -------------------------------------------------------------------
+// moveOptionUp(select_object)
+//  Move selected option in a select list up one
+// -------------------------------------------------------------------
+function moveOptionUp(obj) {
+	if (!hasOptions(obj)) { return; }
+	var i;
+	for (i=0; i<obj.options.length; i++) {
+		if (obj.options[i].selected) {
+			if (i != 0 && !obj.options[i-1].selected) {
+				swapOptions(obj,i,i-1);
+				obj.options[i-1].selected = true;
+			}
+		}
+	}
+}
+
+// -------------------------------------------------------------------
+// moveOptionDown(select_object)
+//  Move selected option in a select list down one
+// -------------------------------------------------------------------
+function moveOptionDown(obj) {
+	if (!hasOptions(obj)) { return; }
+      	var i;
+	for (i=obj.options.length-1; i>=0; i--) {
+		if (obj.options[i].selected) {
+			if (i != (obj.options.length-1) && ! obj.options[i+1].selected) {
+				swapOptions(obj,i,i+1);
+				obj.options[i+1].selected = true;
+			}
+		}
+	}
+}
+
+<!-- Original:  Phil Webb (phil@philwebb.com) -->
+<!-- Web Site:  http://www.philwebb.com -->
+
+<!-- This script and many more are available free online at -->
+<!-- The JavaScript Source!! http://javascript.internet.com -->
+
+function move(fbox, tbox) {
+	var arrFbox = new Array();
+	var arrTbox = new Array();
+	var arrLookup = new Array();
+	var i;
+	for (i = 0; i < tbox.options.length; i++) {
+		arrLookup[tbox.options[i].text] = tbox.options[i].value;
+		arrTbox[i] = tbox.options[i].text;
+	}
+	var fLength = 0;
+	var tLength = arrTbox.length;
+	for(i = 0; i < fbox.options.length; i++) {
+		arrLookup[fbox.options[i].text] = fbox.options[i].value;
+		if (fbox.options[i].selected && fbox.options[i].value != "") {
+			arrTbox[tLength] = fbox.options[i].text;
+			tLength++;
+		} else {
+			arrFbox[fLength] = fbox.options[i].text;
+			fLength++;
+		}
+	}
+	arrFbox.sort();
+	//arrTbox.sort();
+	fbox.length = 0;
+	tbox.length = 0;
+	var c;
+	for(c = 0; c < arrFbox.length; c++) {
+		var no = new Option();
+		no.value = arrLookup[arrFbox[c]];
+		no.text = arrFbox[c];
+		fbox[c] = no;
+	}
+	for(c = 0; c < arrTbox.length; c++) {
+		var no = new Option();
+		no.value = arrLookup[arrTbox[c]];
+		no.text = arrTbox[c];
+		tbox[c] = no;
+	}
+}
+
+function move_item(val, fbox, tbox) {
+	var arrFbox = new Array();
+	var arrTbox = new Array();
+	var arrLookup = new Array();
+	var i;
+	for (i = 0; i < tbox.options.length; i++) {
+		arrLookup[tbox.options[i].text] = tbox.options[i].value;
+		arrTbox[i] = tbox.options[i].text;
+	}
+	var fLength = 0;
+	var tLength = arrTbox.length;
+	for(i = 0; i < fbox.options.length; i++) {
+		arrLookup[fbox.options[i].text] = fbox.options[i].value;
+		if (fbox.options[i].value == val) {
+			arrTbox[tLength] = fbox.options[i].text;
+			tLength++;
+		} else {
+			arrFbox[fLength] = fbox.options[i].text;
+			fLength++;
+		}
+	}
+	arrFbox.sort();
+	arrTbox.sort();
+	fbox.length = 0;
+	tbox.length = 0;
+	var c;
+	for(c = 0; c < arrFbox.length; c++) {
+		var no = new Option();
+		no.value = arrLookup[arrFbox[c]];
+		no.text = arrFbox[c];
+		fbox[c] = no;
+	}
+	for(c = 0; c < arrTbox.length; c++) {
+		var no = new Option();
+		no.value = arrLookup[arrTbox[c]];
+		no.text = arrTbox[c];
+		tbox[c] = no;
+	}
+}
Index: /branches/release-36/tmpl/cms/edit_widget.tmpl
===================================================================
--- /branches/release-36/tmpl/cms/edit_widget.tmpl (revision 2052)
+++ /branches/release-36/tmpl/cms/edit_widget.tmpl (revision 2052)
@@ -0,0 +1,371 @@
+<mt:setvarblock name="page_title"><mt:if name="id"><__trans phrase="Edit Widget Set"><mt:else><__trans phrase="Create Widget Set"></mt:if>
+</mt:setvarblock>
+<$mt:setvar name="position_actions_bottom" value="1"$>
+<mt:setvarblock name="html_head" append="1">
+<link rel="stylesheet" href="<mt:var name="static_uri">css/widget.css" type="text/css" />
+<script type="text/javascript" src="<mt:var name="static_uri">/js/widget.js"></script>
+<script type="text/javascript">
+/* <![CDATA[ */
+var colWidth = 350;
+var modWidth = 275;
+var modHeight = 30;
+var gCols;
+
+var isIE = navigator.userAgent.indexOf('MSIE') >= 0;
+var isOpera = navigator.userAgent.indexOf('Opera') >= 0;
+var isSafari = navigator.userAgent.indexOf('Safari') >= 0;
+var curMod, curCol;
+var dragStartX, dragStartY;
+var topZIndex = 10;
+
+function checkName() {
+    widgetname = getByID('name').value;
+    if (!widgetname) {
+        alert('<__trans phrase="Please use a unique name for this widget set." escape="js">');
+        return false;
+    }
+}
+
+
+var gDropIndex, gDrop;
+var gCanDrop = 0;
+
+function init () {
+    gDrop = new Object();
+    gDrop.node = getByID('stage-drop');
+
+    gCols = new Array();
+
+    gCols[0] = new Column('installed-column', 0, 0);
+
+<mt:loop name="installed">
+    gCols[0].addModule('<mt:var name="id">');
+</mt:loop>
+
+    gCols[1] = new Column('available-column', 1, 322);
+
+<mt:loop name="available">
+    gCols[1].addModule('<mt:var name="id">');
+</mt:loop>
+
+    calculateHeight();
+}
+
+function Column (label, index, left) {
+    this.label = label;
+    this.node = getByID(label);
+    this.node.style.height = '110px';
+    this.x = left;
+    this.y = 0;
+    this.offsetX = offsetX(this.node) - this.x;
+    this.offsetY = offsetY(this.node) - this.y;
+    this.startX = this.x + 5;
+    this.startY = this.y + 35;
+    this.index = index;
+    this.width = colWidth;
+    this.height = 100;
+    this.modules = new Array();
+    return this;
+}
+
+Column.prototype.addModule = function (key, label) {
+    var row = this.modules.length;
+    this.modules[row] = new Module(key, label, row, this.index, this);
+}
+
+Column.prototype.moveModule = function (module, index) {
+    var inCol = (curCol.index == module.col);
+    if (inCol && (module.row == index)) {
+        module.move(module.x, module.y);
+        return;
+    }
+    if (inCol && module.row < index) index--;
+    
+    // Remove the module from the old column...
+    var i;
+    var oldMods = gCols[module.col].modules;
+    for (i = module.row + 1; i < oldMods.length; i++) {
+        oldMods[i].y -= modHeight;
+        oldMods[i].row--;
+        oldMods[i].move(oldMods[i].x, oldMods[i].y);
+        oldMods[i-1] = oldMods[i];
+    }
+    oldMods.length--;
+    if (inCol && index > oldMods.length) index--;
+    
+    // ... and insert it into the new column.
+    var newMods = curCol.modules;
+    for (i = newMods.length-1; i >= index; i--) {
+        newMods[i].y += modHeight;
+        newMods[i].row++;
+        newMods[i].move(newMods[i].x, newMods[i].y);
+        newMods[i+1] = newMods[i];
+    }
+    module.colObj = curCol;
+    module.row = index;
+    module.col = curCol.index;
+    module.x = curCol.startX;
+    module.y = curCol.startY + index * modHeight;
+    module.move(module.x, module.y);
+    newMods[index] = module;
+    
+    calculateHeight();
+}
+
+function Module (key, label, row, col, colObj) {
+        this.key = key;
+        this.label = label;
+        this.row = row;
+        this.col = col;
+        this.colObj = colObj;
+        this.node = getByID('module-' + key);
+        this.node.onmousedown = this.dragStart;
+        this.node.module = this;
+        this.x = colObj.startX;
+        this.y = colObj.startY + modHeight * row;
+        this.move(this.x, this.y);
+        this.node.style.width = modWidth + 'px';
+        this.node.style.display = 'block';
+        return this;
+}
+
+Module.prototype.move = function (x, y) {
+    move(this.node, x, y);
+}
+
+Module.prototype.dragStart = function (event) {
+    document.onmousemove = dragMove;
+    document.onmouseup = dragStop;
+    gCanDrop = 0;
+    var module = this.module;
+    dragStartX = cursorX(event);
+    dragStartY = cursorY(event);
+    module.node.style.zIndex = topZIndex;
+    curMod = module;
+    return false;
+}
+
+function dragMove (event) {
+    if (!curMod) return true;
+    var x = cursorX(event);
+    var y = cursorY(event);
+    curMod.move(curMod.x + x - dragStartX, curMod.y + y - dragStartY);
+    var i;
+    curCol = null;
+    for (i = 0; i< gCols.length; i++) {
+        var adjX = gCols[i].x + gCols[i].offsetX;
+        var adjY = gCols[i].y + gCols[i].offsetY;
+        if ((x > adjX) &&
+            (x < adjX + gCols[i].width) &&
+            (y > adjY) &&
+            (y < adjY + gCols[i].height)) {
+            curCol = gCols[i];
+            break;
+        }
+    }
+    if (curCol == null) {
+        gDrop.node.style.display = 'none';
+        gCanDrop = 0;
+        return false;
+    }
+    gDropIndex = Math.floor((y - curCol.y - curCol.offsetY) / modHeight + 0.0);
+    if (gDropIndex < 0)
+        gDropIndex = 0;
+    if (gDropIndex > curCol.modules.length)
+        gDropIndex = curCol.modules.length;
+    if (!gCanDrop) {
+        gCanDrop = 1;
+        gDrop.node.style.display = 'block';
+    }
+    move(gDrop.node, curCol.startX, curCol.startY + gDropIndex * modHeight - 8);
+    return false;
+}
+
+function dragStop (event) {
+    if (!curMod) return true;
+    gDrop.node.style.display = 'none';
+    if (!curCol || !gCanDrop)
+        curMod.move(curMod.x, curMod.y);
+    else
+        curCol.moveModule(curMod, gDropIndex);
+    curMod = null;
+    return false;
+}
+
+function moduleListStr () {
+    var s = '';
+    var i, j;
+    for (i = 0; i < gCols.length; i++)
+        for (j = 0; j < gCols[i].modules.length; j++)
+            s += gCols[i].modules[j].key + '=' + (i+1) + '.' + (j+1) + ';';
+    return s;
+}
+
+function move (node, x, y) {
+    node.style.left = x + 'px';
+    node.style.top = y + 'px';
+}
+
+function offsetX (node) {
+    var o = node.offsetLeft;
+    while((node = node.offsetParent) != null)
+        o += node.offsetLeft;
+    return o;
+}
+
+function offsetY (node) {
+    var o = node.offsetTop;
+    while((node = node.offsetParent) != null)
+        o += node.offsetTop;
+    return o;
+}
+
+function cursorX (event) {
+    var x;
+    if (isIE || isOpera) {
+        x = window.event.clientX;
+        if (document.documentElement.scrollLeft)
+            x += document.documentElement.scrollLeft;
+        if(!isOpera) x += document.body.scrollLeft;
+    } else {
+        x = event.clientX;
+        if (!isSafari)
+            x += window.scrollX;
+    }
+    return x;
+}
+
+function cursorY (event) {
+    var y;
+    if (isIE || isOpera) {
+        y = window.event.clientY;
+        if (document.documentElement.scrollTop)
+            y += document.documentElement.scrollTop;
+        if(!isOpera) y += document.body.scrollTop;
+    } else {
+        y = event.clientY;
+        if (!isSafari)
+            y += window.scrollY;
+    }
+    return y;
+}
+
+function calculateHeight () {
+    var i, newHeight;
+    var maxMods = 0;
+    for (i = 0; i < gCols.length; i++) {
+        if (gCols[i].modules.length > maxMods) {
+            maxMods = gCols[i].modules.length;
+        }
+    }
+    if ((maxMods * modHeight) < 100) {
+        newHeight = 100;
+    } else {
+        newHeight = (maxMods + 1) * modHeight;
+    }
+    for (i = 0; i < gCols.length; i++) {
+        gCols[i].height = newHeight;
+        gCols[i].node.style.height = (newHeight + 10) + 'px';
+    }
+    getByID('center-column').style.height = (newHeight + 10) + 'px';
+    getByID('stage').style.height = (newHeight + 10) + 'px';
+    return true;
+}
+
+function toggleCache(id) {
+    if ("expire-time" == id) {
+        toggleDisable('cache-time-value', 0);
+        toggleDisable('cache-time-unit', 0);
+    } else {
+        toggleDisable('cache-time-value', 1);
+        toggleDisable('cache-time-unit', 1);
+    }
+    var es = DOM.getElement('cache-events').getElementsByTagName('input');
+    for (var i=0, len=es.length; i<len; i++)
+        toggleDisable( es[i].id, "expire-event" != id )
+    return false;
+}
+
+TC.attachLoadEvent( init );
+/* ]]> */
+</script>
+</mt:setvarblock>
+
+<mt:include name="include/header.tmpl">
+
+<div id="msg-block">
+<mt:if name="saved">
+    <mtapp:statusmsg
+        id="saved"
+        class="success">
+        <__trans phrase="Your template changes have been saved.">
+    </mtapp:statusmsg>
+</mt:if>
+<mt:if name="error">
+    <mtapp:statusmsg
+        id="generic-error"
+        class="error">
+        <mt:var name="error">
+    </mtapp:statusmsg>
+</mt:if>
+</div>
+
+<div id="edit-form">
+
+    <form onsubmit="this.modules.value = moduleListStr(); return checkName();" id="manager" name="manager" method="post" action="<mt:var name="script_url">">
+      <input type="hidden" name="__mode" value="save_widget" />
+      <mt:if name="id"><input type="hidden" name="id" value="<mt:var name="id">" /></mt:if>
+      <input type="hidden" name="blog_id" value="<mt:var name="blog_id">" />
+      <input type="hidden" name="magic_token" value="<mt:var name="magic_token">" />
+      <input type="hidden" name="modules" value="" />
+
+      <fieldset>
+      <mtapp:setting
+          id="name"
+          label="<__trans phrase="Set Name">">
+          <div class="textarea-wrapper">
+              <input name="name" id="name" class="full-width" value="<mt:var name="name">" />
+          </div>
+      </mtapp:setting>
+
+      <mtapp:setting
+          id="widgets"
+          label="<__trans phrase="Drag and drop the widgets you want into the Installed column.">">
+          <div id="stage" class="pkg">
+              <div id="installed-column" class="pkg">
+                  <p><__trans phrase="Installed Widgets"></p>
+              <mt:loop name="installed">
+                  <div id="module-<mt:var name="id">" class="module pkg">
+                    <div class="module-name"><a href="javascript:void(0)"><mt:var name="name"></a></div>
+                    <div class="module-edit"><a href="<mt:var name="script_url">?__mode=view&amp;_type=template&amp;id=<mt:var name="id">&amp;blog_id=<mt:var name="blog_id">" target="_new"><__trans phrase="edit"></a></div>
+                  </div>
+              </mt:loop>
+              </div>
+              <div id="center-column" class="pkg">&nbsp;</div>
+              <div id="available-column" class="pkg">
+                  <p><__trans phrase="Available Widgets"></p>
+              <mt:loop name="available">
+                  <div id="module-<mt:var name="id">" class="module pkg">
+                    <div class="module-name"><a href="javascript:void(0)"><mt:var name="name"></a></div>
+                    <div class="module-edit"><a href="<mt:var name="script_url">?__mode=view&amp;_type=template&amp;id=<mt:var name="id">&amp;blog_id=<mt:var name="blog_id">" target="_new"><__trans phrase="edit"></a></div>
+                  </div>
+              </mt:loop>
+              </div>
+              <div id="stage-drop">&nbsp;</div>
+          </div>
+      </mtapp:setting>
+      </fieldset>
+
+    <mt:setvarblock name="action_buttons">
+        <button
+            type="submit"
+            accesskey="s"
+            title="<__trans phrase="Save changes to this widget set (s)">"
+            class="primary-button"
+            ><__trans phrase="Save Changes"></button>
+    </mt:setvarblock>
+    <mt:include name="include/actions_bar.tmpl" bar_position="bottom" hide_pager="1" settings_bar="1">
+    </form>
+</div>
+
+<mt:include name="include/footer.tmpl">
Index: /branches/release-36/tmpl/cms/list_widget.tmpl
===================================================================
--- /branches/release-36/tmpl/cms/list_widget.tmpl (revision 2052)
+++ /branches/release-36/tmpl/cms/list_widget.tmpl (revision 2052)
@@ -0,0 +1,101 @@
+<mt:setvarblock name="page_title"><__trans phrase="Widgets"></mt:setvarblock>
+
+<mt:var name="position_actions_top" value="1">
+<mt:setvarblock name="html_head" append="1">
+<link rel="stylesheet" href="<mt:var name="static_uri">css/widget.css" type="text/css" />
+<script type="text/javascript" src="<mt:var name="static_uri">/js/widget.js"></script>
+<script type="text/javascript">
+/* <![CDATA[ */
+var widgetSetTableSelect;
+var widgetTableSelect;
+function init() {
+    // setup
+    widgetSetTableSelect = new TC.TableSelect( "widgetset-listing-table" );
+    widgetSetTableSelect.rowSelect = true;
+    widgetTableSelect = new TC.TableSelect( "widget-listing-table" );
+    widgetTableSelect.rowSelect = true;
+}
+
+TC.attachLoadEvent( init );
+/* ]]> */
+</script>
+</mt:setvarblock>
+<mt:setvarblock name="action_buttons">
+    <a href="javascript:void(0)"
+        onclick="doRemoveItems(getByID('widgetset-listing-form'), '<__trans phrase="Widget Set" escape="js">', '<__trans phrase="Widget Sets" escape="js">', '', '', 'delete_widget'); return false;"
+        accesskey="x"
+        title="<__trans phrase="Delete selected Widget Sets (x)">"
+        ><__trans phrase="Delete"></a>
+</mt:setvarblock>
+<mt:setvarblock name="related_content">
+    <mt:if name="object_loop">
+        <mtapp:widget id="tips" label="<__trans phrase="Helpful Tips">">
+            <p><__trans phrase="To add a widget set to your templates, use the following syntax:"></p>
+            <p><__trans phrase="<strong>&lt;$MTWidgetSet name=&quot;Name of the Widget Set&quot;$&gt;</strong>"></p>
+        </mtapp:widget>
+    </mt:if>
+</mt:setvarblock>
+<mt:setvarblock name="system_msg">
+    <mt:if name="rebuild">
+        <mtapp:statusmsg id="saved-msg" class="success" rebuild="all">
+        <__trans phrase="Your changes to the widget set have been saved.">
+        </mtapp:statusmsg>
+    </mt:if>
+    <mt:if name="deleted">
+        <mtapp:statusmsg id="delete-msg" class="info" rebuild="all">
+        <__trans phrase="You have successfully deleted the selected widget set(s) from your blog.">
+        </mtapp:statusmsg>
+    </mt:if>
+</mt:setvarblock>
+
+<mt:include name="include/header.tmpl">
+
+<mt:setvarblock name="listing_header">
+    <h3><__trans phrase="Widget Sets"></h3>
+    <p><a href="<mt:var name="script_url">?__mode=edit_widget&amp;blog_id=<mt:var name="blog_id">" class="icon-left icon-create"><__trans phrase="Create Widget Set"></a></p>
+</mt:setvarblock>
+<mtapp:listing
+    hide_pager="1">
+    <mt:if name="__first__">
+    <thead>
+        <tr>
+            <th class="cb"><input type="checkbox" name="id-head" value="all" class="select" /></th>
+            <th width="40%" class="widgetmanager-name"><__trans phrase="Name"></th>
+            <th width="59%" class="widgetmanager-widgets"><__trans phrase="Installed Widgets"></th>
+        </tr>
+    </thead>
+    <tbody>
+    </mt:if>
+        <tr class="<mt:if name="__odd__">odd<mt:else>even</mt:if>">
+            <td class="cb"><input type="checkbox" name="id" value="<mt:var name="id">" class="select" /></td>
+            <td class="widgetmanager-name"><a href="?__mode=edit_widget&blog_id=<mt:var name="blog_id">&id=<mt:var name="id">"><mt:var name="widgetmanager"></a></td>
+            <td class="widgetmanager-widgets"><mt:var name="names"></td>
+        </tr>
+    <mt:if name="__last__">
+    </tbody>
+    </mt:if>
+<mt:else>
+    <div id="<$mt:var name="template_type"$>-listing" class="listing zero-state-listing zero-state">
+        <div class="listing-header">
+            <$mt:var name="listing_header"$>
+        </div>
+        <mtapp:statusmsg
+            id="zero-state"
+            class="info zero-state">
+            <__trans phrase="No Widget Sets could be found.">
+        </mtapp:statusmsg>
+    </div>
+</mtapp:listing>
+
+<mt:setvarblock name="create_link">
+<p><a href="<mt:var name="script_url">?__mode=view&amp;_type=template&amp;type=widget&amp;blog_id=<mt:var name="blog_id">" class="icon-left icon-create"><__trans phrase="Create widget template"></a></p>
+</mt:setvarblock>
+
+<mt:include name="include/template_table.tmpl"
+    object_loop="$widget_table"
+    template_type="widget"
+    object_label="<__trans phrase="Widget Template">"
+    object_label_plural="<__trans phrase="Widget Templates">"
+    template_type_label="<__trans phrase="Widget Templates">">
+
+<mt:include name="include/footer.tmpl">
