You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2016/05/27 22:50:42 UTC

[20/47] roller git commit: Beginnings of a Bootstrap rewrite of the Roller editor/admin UI, using Struts-Bootstrap plugin. The main menu and edit weblog page are essentially complete.

Beginnings of a Bootstrap rewrite of the Roller editor/admin UI, using Struts-Bootstrap plugin.
The main menu and edit weblog page are essentially complete.


Project: http://git-wip-us.apache.org/repos/asf/roller/repo
Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/2da6c3c2
Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/2da6c3c2
Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/2da6c3c2

Branch: refs/heads/bootstrap-ui
Commit: 2da6c3c2e28419f68244e0c362c15be96013d5f9
Parents: 624ad3b
Author: Dave Johnson <sn...@apache.org>
Authored: Mon Dec 21 10:40:29 2015 -0500
Committer: Dave Johnson <sn...@apache.org>
Committed: Mon Dec 21 10:40:29 2015 -0500

----------------------------------------------------------------------
 app/pom.xml                                     |    6 +
 .../resources/ApplicationResources.properties   |   21 +-
 app/src/main/webapp/WEB-INF/jsps/core/Login.jsp |  230 +-
 .../main/webapp/WEB-INF/jsps/core/MainMenu.jsp  |  235 +-
 .../WEB-INF/jsps/core/MainMenuSidebar.jsp       |   36 +-
 .../webapp/WEB-INF/jsps/editor/EntryEdit.jsp    |  591 +-
 .../webapp/WEB-INF/jsps/editor/EntryEditor.jsp  |   76 +-
 .../webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp |    1 -
 .../webapp/WEB-INF/jsps/taglibs-struts2.jsp     |   12 +-
 .../webapp/WEB-INF/jsps/tiles/bannerStatus.jsp  |  118 +-
 .../webapp/WEB-INF/jsps/tiles/head-ajax.jsp     |   21 +-
 app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp |   21 +-
 app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp |   76 +-
 .../WEB-INF/jsps/tiles/tiles-mainmenupage.jsp   |   80 +-
 .../WEB-INF/jsps/tiles/tiles-simplepage.jsp     |   61 +-
 .../WEB-INF/jsps/tiles/tiles-tabbedpage.jsp     |   82 +-
 .../webapp/WEB-INF/jsps/tiles/userStatus.jsp    |   38 +
 app/src/main/webapp/WEB-INF/tiles.xml           |   54 +-
 .../css/bootstrap-theme.css                     |  587 ++
 .../css/bootstrap-theme.min.css                 |    6 +
 .../bootstrap-3.3.6-dist/css/bootstrap.css      | 6760 ++++++++++++++++++
 .../bootstrap-3.3.6-dist/css/bootstrap.min.css  |    6 +
 .../fonts/glyphicons-halflings-regular.eot      |  Bin 0 -> 20127 bytes
 .../fonts/glyphicons-halflings-regular.svg      |  288 +
 .../fonts/glyphicons-halflings-regular.ttf      |  Bin 0 -> 45404 bytes
 .../fonts/glyphicons-halflings-regular.woff     |  Bin 0 -> 23424 bytes
 .../fonts/glyphicons-halflings-regular.woff2    |  Bin 0 -> 18028 bytes
 .../bootstrap-3.3.6-dist/js/bootstrap.js        | 2363 ++++++
 .../bootstrap-3.3.6-dist/js/bootstrap.min.js    |    7 +
 .../roller-ui/bootstrap-3.3.6-dist/js/npm.js    |   13 +
 app/src/main/webapp/roller-ui/styles/roller.css |  821 +--
 31 files changed, 11081 insertions(+), 1529 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/pom.xml
----------------------------------------------------------------------
diff --git a/app/pom.xml b/app/pom.xml
index 7266ad9..9adfed9 100644
--- a/app/pom.xml
+++ b/app/pom.xml
@@ -262,6 +262,12 @@
         </dependency>
 
         <dependency>
+            <groupId>com.jgeppert.struts2.bootstrap</groupId>
+            <artifactId>struts2-bootstrap-plugin</artifactId>
+            <version>2.0.3</version>
+        </dependency>
+
+        <dependency>
             <groupId>xml-security</groupId>
             <artifactId>xmlsec</artifactId>
             <version>1.3.0</version>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/resources/ApplicationResources.properties
----------------------------------------------------------------------
diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties
index 0a2f8c5..2b753ce 100644
--- a/app/src/main/resources/ApplicationResources.properties
+++ b/app/src/main/resources/ApplicationResources.properties
@@ -640,9 +640,9 @@ issued during the upgrade process:
 # ----------------------------------------------------------------------- Login
 
 loginPage.title=Welcome to Roller
-loginPage.prompt=Please enter your username and password to login.
-loginPage.openIdPrompt=Please login via OpenID
-loginPage.openIdHybridPrompt=Or, login with your username and password
+loginPage.prompt=Please login
+loginPage.openIdPrompt=Login with OpenID
+loginPage.openIdHybridPrompt=Or with username
 loginPage.userName=Username
 loginPage.password=Password
 loginPage.openID=OpenID username
@@ -707,8 +707,8 @@ macro.weblog.noEntriesForCategory=No entries found for specified category
 mainPage.category=Category
 mainPage.searchWeblogs=Search for blogs
 mainPage.actions=Actions
-mainPage.loggedInAs=logged in as
-mainPage.currentWebsite=editing weblog
+mainPage.loggedInAs=Logged in as
+mainPage.currentWebsite=Editing weblog
 mainPage.mainMenu=Main Menu
 
 # ------------------------------------------------------------------ Maintenance
@@ -1493,7 +1493,7 @@ weblogEdit.publishedEntries=Recent Entries
 weblogEdit.post=Post to Weblog
 weblogEdit.permaLink=Permalink
 weblogEdit.published=Published
-weblogEdit.pubTime=Pub&nbsp;Time&nbsp;
+weblogEdit.pubTime=Publishing Time
 weblogEdit.save=Save as Draft
 weblogEdit.scheduled=Scheduled
 weblogEdit.scheduledEntries=Scheduled Entries
@@ -1749,19 +1749,20 @@ activate your user account by clicking the link that is sent to you via e-mail.
 
 # ---------------------------------------------------------------- Your Weblogs
 
-yourWebsites.title=Main Menu
- yourWebsites.actions=Actions
+yourWebsites.title=Your Weblogs
+yourWebsites.actions=Actions
 
-yourWebsites.prompt.noBlog=You''ve got a user account, but no weblog. \
+yourWebsites.prompt.noBlog=You have a user account, but no weblog. \
 Would you like to
 yourWebsites.createOne=create one?
 
-yourWebsites.prompt.hasBlog=Select a weblog to edit, manage, or configure.
+yourWebsites.prompt.hasBlog=Access your weblogs here or create a new one.
 
 yourWebsites.accept=accept
 yourWebsites.decline=decline
 
 yourWebsites.resign=Resign
+yourWebsites.youHave=You have
 yourWebsites.permission=Permission
 yourWebsites.confirmResignation=Are you sure you wish to resign from weblog [{0}]?
 yourWebsites.weblog=Link

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp
index bf9914d..fbb87df 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp
@@ -18,150 +18,130 @@
 
 <%-- Body of the login page, invoked from login.jsp --%>
 <%@ page import="org.apache.roller.weblogger.config.WebloggerConfig" %>
-<%@ page import="org.apache.roller.weblogger.config.AuthMethod" %>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
 <%!
-String securityCheckUrl = null;
-boolean cmaEnabled = "CMA".equals(WebloggerConfig.getAuthMethod());
+    String securityCheckUrl = null;
+    boolean cmaEnabled = "CMA".equals( WebloggerConfig.getAuthMethod() );
 %>
 
 <%
-if (cmaEnabled) {
-    securityCheckUrl = "/j_security_check";
-} else {
-    securityCheckUrl = "/roller_j_security_check";
-}
+    if (cmaEnabled) {
+        securityCheckUrl = "/j_security_check";
+    } else {
+        securityCheckUrl = "/roller_j_security_check";
+    }
 %>
 
-<s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
-    
-    <p><s:text name="loginPage.openIdPrompt" /></p>
-    
-    <form method="post" id="loginOpenIDForm"       
-          action="/roller/roller_j_openid_security_check"      
-          onsubmit="saveOpenidIdentifier(this)">      
-        <!-- action="<c:url value='roller_j_openid_security_check'/>"  -->
-        <table width="80%">
-            <tr>
-                <td width="20%" align="right"><s:text name="loginPage.openID" /></td>
-                <td width="80%">
-                    <input type="text" name="openid_identifier" id="openid_identifier" class="f_openid_identifier" size="40" maxlength="255" style="width: 35%"/>
-                </td>
-            </tr>    
-            <tr>
-                <td width="20%"></td>
-                <td width="80%">
-                    <input type="submit" name="submit" id="submit" value="<s:text name='loginPage.loginOpenID'/>" />
-                </td>
-            </tr>
-        </table> 
-    </form>
-</s:if>
-
-<s:if test="authMethod != 'OPENID'">
-
-    <s:if test="authMethod == 'DB_OPENID'">
-        <p><s:text name="loginPage.openIdHybridPrompt" /></p>
+<div class="container">
+
+    <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
+
+        <form method="post" id="loginOpenIDForm" class="form-signin"
+              action="/roller/roller_j_openid_security_check" onsubmit="saveOpenidIdentifier(this)">
+
+            <h2 class="form-signin-heading"><s:text name="loginPage.openIdPrompt"/></h2>
+
+            <label for="openid_identifier" class="sr-only"><s:text name="loginPage.openID"/></label>
+            <input class="form-control" type="text" name="openid_identifier" id="openid_identifier"/>
+
+            <button type="submit" name="submit" id="submit" class="btn btn-lg btn-primary btn-block"
+                    value="<s:text name='loginPage.loginOpenID'/>"></button>
+
+        </form>
+
     </s:if>
-    
-    <s:else>
-        <p><s:text name="loginPage.prompt" /></p>
-    </s:else>
-    
-    <form method="post" id="loginForm" 
-          action="<c:url value="<%= securityCheckUrl %>"/>"
-          onsubmit="saveUsername(this)">
-
-        <table width="80%">
-
-            <tr>
-                <td width="20%" align="right"><s:text name="loginPage.userName" /></td>
-                <td width="80%">
-                    <input type="text" name="j_username" id="j_username" size="25" />
-                </td>
-            </tr>
-
-            <tr>
-                <td width="20%" align="right"><s:text name="loginPage.password" /></td>
-                <td width="80%">
-                    <input type="password" name="j_password" id="j_password" size="20" />
-                </td>
-            </tr>
+
+    <s:if test="authMethod != 'OPENID'">
+
+
+        <form method="post" id="loginForm" class="form-signin"
+              action="<c:url value="<%= securityCheckUrl %>"/>"
+              onsubmit="saveUsername(this)">
+
+            <s:if test="authMethod == 'DB_OPENID'">
+                <h2 class="form-signin-heading"><s:text name="loginPage.openIdHybridPrompt"/></h2>
+            </s:if>
+
+            <s:else>
+                <h2 class="form-signin-heading"><s:text name="loginPage.prompt"/></h2>
+            </s:else>
+
+            <label for="j_username" class="sr-only"> <s:text name="loginPage.userName"/> </label>
+            <input type="text" class="form-control" name="j_username" id="j_username" placeholder="Username"/>
+
+            <label for="j_password" class="sr-only"> <s:text name="loginPage.password"/> </label>
+            <input type="password" class="form-control" name="j_password" id="j_password" placeholder="Password"/>
 
             <c:if test="${rememberMeEnabled}">
-            <tr>
-                <td width="20%"></td>
-                <td width="80%">
-                    <input type="checkbox" name="_spring_security_remember_me" id="_spring_security_remember_me" />
-                    <label for="rememberMe">
-                        <s:text name="loginPage.rememberMe" />
-                    </label>
-                </td>
-            </tr>
+                <label>
+                    <input type="checkbox" name="_spring_security_remember_me" id="_spring_security_remember_me"/>
+                    <s:text name="loginPage.rememberMe"/>
+                </label>
             </c:if>
 
-            <tr>
-                <td width="20%"></td>
-                <td width="80%">
-                    <input type="submit" name="login" id="login" value="<s:text name='loginPage.login' />" />
-                    <input type="reset" name="reset" id="reset" value="<s:text name='loginPage.reset' />"
-                        onclick="document.getElementById('j_username').focus()" />
-                </td>
-            </tr>        
+            <button class="btn btn-lg btn-primary btn-block" type="submit" name="login" id="login">
+                <s:text name='loginPage.login'/>
+            </button>
 
-        </table>    
-    </form>
-</s:if>
+            <button class="btn btn-lg btn-primary btn-block" type="reset" name="reset" id="reset"
+                    onclick="document.getElementById('j_username').focus()">
+                <s:text name='loginPage.reset'/>
+            </button>
+
+        </form>
+    </s:if>
+
+</div>
 
 <script>
-<s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
-function focusToOpenidForm() {
-    return (document.getElementById && document.getElementById("j_username") === null) ||
-        getCookie("favorite_authentication_method") !== "username";
-}
-
-if (document.getElementById) {
-    if (document.getElementById && getCookie("openid_identifier") !== null) {
-        document.getElementById("openid_identifier").value = getCookie("openid_identifier");
+    <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
+    function focusToOpenidForm() {
+        return (document.getElementById && document.getElementById("j_username") === null) ||
+                getCookie("favorite_authentication_method") !== "username";
+    }
+
+    if (document.getElementById) {
+        if (document.getElementById && getCookie("openid_identifier") !== null) {
+            document.getElementById("openid_identifier").value = getCookie("openid_identifier");
+        }
+        if (focusToOpenidForm()) {
+            document.getElementById("openid_identifier").focus();
+        }
     }
-    if (focusToOpenidForm()) {
-        document.getElementById("openid_identifier").focus();
+
+    function saveOpenidIdentifier(theForm) {
+        var expires = new Date();
+        expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
+        setCookie("openid_identifier", theForm.openid_identifier.value, expires);
+        setCookie("favorite_authentication_method", "openid");
     }
-}
-
-function saveOpenidIdentifier(theForm) {
-    var expires = new Date();
-    expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
-    setCookie("openid_identifier",theForm.openid_identifier.value,expires);
-    setCookie("favorite_authentication_method", "openid");
-}
-</s:if>
-
-<s:if test="authMethod != 'OPENID'">
-function focusToUsernamePasswordForm() {
-    return (document.getElementById && document.getElementById("openid_identifier") === null) ||
-        getCookie("favorite_authentication_method") === "username";
-}
-
-if (document.getElementById) {
-    if (getCookie("username") != null) {
-        if (document.getElementById) {
-            document.getElementById("j_username").value = getCookie("username");
-            if (focusToUsernamePasswordForm()) {
-                document.getElementById("j_password").focus();
+    </s:if>
+
+    <s:if test="authMethod != 'OPENID'">
+    function focusToUsernamePasswordForm() {
+        return (document.getElementById && document.getElementById("openid_identifier") === null) ||
+                getCookie("favorite_authentication_method") === "username";
+    }
+
+    if (document.getElementById) {
+        if (getCookie("username") != null) {
+            if (document.getElementById) {
+                document.getElementById("j_username").value = getCookie("username");
+                if (focusToUsernamePasswordForm()) {
+                    document.getElementById("j_password").focus();
+                }
             }
+        } else if (focusToUsernamePasswordForm()) {
+            document.getElementById("j_username").focus();
         }
-    } else if (focusToUsernamePasswordForm()) {
-        document.getElementById("j_username").focus();
     }
-}
-
-function saveUsername(theForm) {
-    var expires = new Date();
-    expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
-    setCookie("username",theForm.j_username.value,expires);
-    setCookie("favorite_authentication_method", "username");
-}
-</s:if>
+
+    function saveUsername(theForm) {
+        var expires = new Date();
+        expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
+        setCookie("username", theForm.j_username.value, expires);
+        setCookie("favorite_authentication_method", "username");
+    }
+    </s:if>
 </script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
index 6b10819..6a5b547 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
@@ -59,123 +59,126 @@
     
     <s:iterator id="perms" value="existingPermissions">
 
-        <div class="yourWeblogBox">  
-
-            <span class="mm_weblog_name"><img src='<c:url value="/images/folder.png"/>' />&nbsp;<s:property value="#perms.weblog.name" /></span>
-                
-            <table class="mm_table" width="100%" cellpadding="0" cellspacing="0">
-               <tr>
-               <td valign="top">
-
-                   <table cellpadding="0" cellspacing="0">
-                       
-                       <tr>
-                           <td class="mm_subtable_label"><s:text name='yourWebsites.weblog'/></td>
-                           <td><a href='<s:property value="#perms.weblog.absoluteURL" />'>
-                               <s:property value="#perms.weblog.absoluteURL" />
-                           </a></td>                          
-                       </tr>
-                       
-                       <tr>
-                           <td class="mm_subtable_label"><s:text name='yourWebsites.permission'/></td>
-                           <td><s:if test='#perms.hasAction("admin")'  >ADMIN</s:if>
-                           <s:if test='#perms.hasAction("post")'       >AUTHOR</s:if>
-                           <s:if test='#perms.hasAction("edit_draft")' >LIMITED</s:if></td>
-                       </tr>
-                       
-                       <tr>
-                           <td class="mm_subtable_label"><s:text name='generic.description' /></td>
-                           <td><s:property value="#perms.weblog.about" escape="false" /></td>
-                       </tr>
-
-                       <tr>
-                           <td class="mm_subtable_label"><s:text name='yourWebsites.userCount' /></td>   
-                           <td><s:property value="#perms.weblog.userCount" /></td>
-                       </tr>
-
-                       <tr>
-                           <td class="mm_subtable_label"><s:text name='yourWebsites.todaysHits' /></td>   
-                           <td><s:property value="#perms.weblog.todaysHits" /></td>
-                       </tr>
-                       
-                   </table>
-
-               </td>
-               
-               <td class="mm_table_actions" width="20%" align="left" >
-
-                       <s:url action="entryAdd" namespace="/roller-ui/authoring" id="newEntry">
-                           <s:param name="weblog" value="#perms.weblog.handle" />
-                       </s:url>
-                       <img src='<s:url value="/images/table_edit.png"/>' />
-                       <s:a href="%{newEntry}"><s:text name="yourWebsites.newEntry" /></s:a>
-                       <br />
-
-                       <%-- Show Entries link with count for users above LIMITED permission --%>
-                       <s:if test='!(#perms.hasAction("edit_draft"))'>
-                           <s:url action="entries" namespace="/roller-ui/authoring" id="editEntries">
-                               <s:param name="weblog" value="#perms.weblog.handle" />
-                           </s:url>
-                           <img src='<s:url value="/images/table_multiple.png"/>' />
-                           <s:a href="%{editEntries}"><s:text name="yourWebsites.editEntries" /> (<s:property value="#perms.weblog.entryCount" />)</s:a>
-                           <br />
-                       </s:if>
-
-                       <%-- Show Comments link with count for users above LIMITED permission --%>
-                       <s:if test='!(#perms.hasAction("edit_draft"))'>
-                           <s:url action="comments" namespace="/roller-ui/authoring" id="manageComments">
-                               <s:param name="weblog" value="#perms.weblog.handle" />
-                           </s:url>
-                           <img src='<s:url value="/images/page_white_edit.png"/>' />
-                           <s:a href="%{manageComments}"><s:text name="yourWebsites.manageComments" /> (<s:property value="#perms.weblog.commentCount" />)</s:a>
-                           <br />
-                       </s:if>
-
-                       <%-- Only admins get access to theme and config settings --%>
-                       <s:if test='#perms.hasAction("admin")'>
-                           
-                           <%-- And only show theme option if custom themes are enabled --%>
-                           <s:if test="getProp('themes.customtheme.allowed')">
-                               <s:if test="#perms.weblog.editorTheme == 'custom'">
-                                   <s:url action="templates" namespace="/roller-ui/authoring" id="weblogTheme">
-                                       <s:param name="weblog" value="#perms.weblog.handle" />
-                                   </s:url>
-                               </s:if>
-                               <s:else>
-                                   <s:url action="themeEdit" namespace="/roller-ui/authoring" id="weblogTheme">
-                                       <s:param name="weblog" value="#perms.weblog.handle" />
-                                   </s:url>
-                               </s:else>
-                               <img src='<s:url value="/roller-ui/images/layout.png"/>' />
-                               <a href='<s:property value="weblogTheme" />'>
-                                   <s:text name="yourWebsites.theme" /></a> 
-                               <br />
-                           </s:if>
-                           
-                           <s:url action="weblogConfig" namespace="/roller-ui/authoring" id="manageWeblog">
-                               <s:param name="weblog" value="#perms.weblog.handle" />
-                           </s:url>
-                           <img src='<s:url value="/images/cog.png"/>' />
-                           <a href='<s:property value="manageWeblog" />'>
-                               <s:text name="yourWebsites.manage" /></a> 
-                           <br />
-                       </s:if>
-
-                       <%-- don't allow last admin to resign from blog --%>
-                       <s:if test='!(#perms.hasAction("admin") && #perms.weblog.adminUserCount == 1)'>
-                          <img src='<c:url value="/images/delete.png"/>' />
-                          <s:url action="memberResign" namespace="/roller-ui/authoring" id="resignWeblog">
-                              <s:param name="weblog" value="#perms.weblog.handle" />
-                          </s:url>
-                          <a href='<s:property value="resignWeblog" />'>
-                              <s:text name='yourWebsites.resign' />
-                          </a>
-                       </s:if>
-
-               </td>
-               </tr>
-            </table>
+        <div class="well yourWeblogBox">  
+
+            <h3 class="mm_weblog_name">
+                <span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span>
+                &nbsp;<s:property value="#perms.weblog.name" />
+            </h3>
+
+            <p> <a href='<s:property value="#perms.weblog.absoluteURL" />'>
+            <s:property value="#perms.weblog.absoluteURL" /></a></p>
+
+            <p><s:property value="#perms.weblog.about" escape="false" /></p>
             
+            <p>You have 
+            <s:if test='#perms.hasAction("admin")'>ADMIN</s:if>
+            <s:if test='#perms.hasAction("post")'>AUTHOR</s:if>
+            <s:if test='#perms.hasAction("edit_draft")'>LIMITED</s:if>
+            <s:text name='yourWebsites.permission'/></p>
+            
+            <div class="btn-group" role="group" aria-label="...">
+
+                <%-- New entry button --%>
+                <button type="button" class="btn btn-default">
+                    <s:url action="entryAdd" namespace="/roller-ui/authoring" id="newEntry">
+                        <s:param name="weblog" value="#perms.weblog.handle"/>
+                    </s:url>
+                    <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
+                    <s:a href="%{newEntry}"><s:text name="yourWebsites.newEntry"/></s:a>
+                </button>
+
+                <s:if test='!(#perms.hasAction("edit_draft"))'>
+                    
+                    <%-- Show Entries button with count for users above LIMITED permission --%>
+                    <button type="button" class="btn btn-default">
+                        <s:url action="entries" namespace="/roller-ui/authoring" id="editEntries">
+                            <s:param name="weblog" value="#perms.weblog.handle"/>
+                        </s:url>
+                        <span class="glyphicon glyphicon-list" aria-hidden="true"></span>
+                        <s:a href="%{editEntries}"><s:text name="yourWebsites.editEntries"/></s:a>
+                        <span class="badge"><s:property value="#perms.weblog.entryCount"/></span>
+                    </button>
+                    
+                </s:if>
+
+                <s:if test='!(#perms.hasAction("edit_draft"))'>
+                    
+                    <%-- Show Comments button with count for users above LIMITED permission --%>
+                    <button type="button" class="btn btn-default">
+                        <s:url action="comments" namespace="/roller-ui/authoring" id="manageComments">
+                            <s:param name="weblog" value="#perms.weblog.handle"/>
+                        </s:url>
+                        <span class="glyphicon glyphicon-comment" aria-hidden="true"></span>
+                        <s:a href="%{manageComments}"><s:text name="yourWebsites.manageComments"/></s:a>
+                        <span class="badge"><s:property value="#perms.weblog.commentCount"/></span>
+                    </button>
+                    
+                </s:if>
+
+
+                <%-- Only admins get access to theme and config settings --%>
+                <s:if test='#perms.hasAction("admin")'>
+
+                    <%-- And only show theme option if custom themes are enabled --%>
+                    <s:if test="getProp('themes.customtheme.allowed')">
+
+                        <s:if test="#perms.weblog.editorTheme == 'custom'">
+
+                            <%-- Templates button --%>
+                            <button type="button" class="btn btn-default">
+                                <s:url action="templates" namespace="/roller-ui/authoring" id="weblogTheme">
+                                    <s:param name="weblog" value="#perms.weblog.handle"/>
+                                </s:url>
+                            </button>
+
+                        </s:if>
+                        <s:else>
+
+                            <%-- Theme edit button --%>
+                            <button type="button" class="btn btn-default">
+                                <s:url action="themeEdit" namespace="/roller-ui/authoring" id="weblogTheme">
+                                    <s:param name="weblog" value="#perms.weblog.handle"/>
+                                </s:url>
+                                <span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span>
+                                <a href='<s:property value="weblogTheme" />'>
+                                    <s:text name="yourWebsites.theme"/></a>
+                            </button>
+
+                        </s:else>
+
+                    </s:if>
+
+
+                    <%-- Resign button --%>
+                    <button type="button" class="btn btn-default">
+                        <s:url action="weblogConfig" namespace="/roller-ui/authoring" id="manageWeblog">
+                            <s:param name="weblog" value="#perms.weblog.handle"/>
+                        </s:url>
+                        <span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
+                        <a href='<s:property value="manageWeblog" />'>
+                            <s:text name="yourWebsites.manage"/></a>
+                    </button>
+
+                </s:if>
+
+                    <%-- don't allow last admin to resign from blog --%>
+                <s:if test='!(#perms.hasAction("admin") && #perms.weblog.adminUserCount == 1)'>
+
+                    <button type="button" class="btn btn-default">
+                        <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
+                        <s:url action="memberResign" namespace="/roller-ui/authoring" id="resignWeblog">
+                            <s:param name="weblog" value="#perms.weblog.handle"/>
+                        </s:url>
+                        <a href='<s:property value="resignWeblog" />'>
+                            <s:text name='yourWebsites.resign'/>
+                        </a>
+                    </button>
+
+                </s:if>
+
+            </div>
+
         </div>
         
     </s:iterator>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
index 4aa6ef9..ba13272 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
@@ -22,29 +22,47 @@
         <div class="menu-tl">
             
             <div class="sidebarInner">
-                <h3><s:text name="yourWebsites.actions" /></h3>
                 
+                <%-- 
+                <h4><s:text name="yourWebsites.actions" /></h4> 
                 <hr size="1" noshade="noshade" />
-                
-                <h3><a href="<s:url action="profile"/>"><s:text name="yourWebsites.editProfile" /></a></h3>
+                --%>
+
+                <%-- Edit profile --%>
+
+                <h4><span class="glyphicon glyphicon-user" aria-hidden="true"></span>
+                <a href="<s:url action="profile"/>"><s:text name="yourWebsites.editProfile" /></a></h4>
                 <p><s:text name="yourWebsites.editProfile.desc" /></p>
 
+                <%-- Edit profile --%>
+                
                 <s:if test="getBooleanProp('webservices.enableAtomPub') && getProp('webservices.atomPubAuth') == 'oauth'">
-                    <h3><a href="<s:url action="oauthKeys" />"><s:text name="yourWebsites.oauthKeys" /></a></h3>
+                    <h4><span class="glyphicon glyphicon-lock" aria-hidden="true"></span>
+                    <a href="<s:url action="oauthKeys" />"><s:text name="yourWebsites.oauthKeys" /></a></h4>
                     <p><s:text name="yourWebsites.oauthKeys.desc" /></p>
                 </s:if>
 
+                <%-- Create weblog --%>
+                
                 <s:if test="getBooleanProp('site.allowUserWeblogCreation') && (getBooleanProp('groupblogging.enabled') || (existingPermissions.isEmpty && pendingPermissions.isEmpty))">
-                    <h3><a href="<s:url action="createWeblog" />"><s:text name="yourWebsites.createWeblog" /></a></h3>
+                    <h4><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+                    <a href="<s:url action="createWeblog" />"><s:text name="yourWebsites.createWeblog" /></a></h4>
                     <p><s:text name="yourWebsites.createWeblog.desc" /></p>
                 </s:if>
 
-                <s:if test="userIsAdmin">               
-                    <h3><a href="<s:url action="globalConfig" namespace="/roller-ui/admin" />"><s:text name="yourWebsites.globalAdmin" /></a></h3>          
+                <s:if test="userIsAdmin">
+
+                    <%-- Roller settings --%>
+
+                    <h4><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
+                    <a href="<s:url action="globalConfig" namespace="/roller-ui/admin" />"><s:text name="yourWebsites.globalAdmin" /></a></h4>          
                     <p><s:text name="yourWebsites.globalAdmin.desc" /></p>
+
+                    <%-- Planet settings --%>
                     
-                    <s:if test="getBooleanProp('planet.aggregator.enabled')">               
-                        <h3><a href="<s:url action="planetConfig" namespace="/roller-ui/admin" />"><s:text name="yourWebsites.planetAdmin" /></a></h3>
+                    <s:if test="getBooleanProp('planet.aggregator.enabled')">
+                        <h4><span class="glyphicon glyphicon-globe" aria-hidden="true"></span>
+                        <a href="<s:url action="planetConfig" namespace="/roller-ui/admin" />"><s:text name="yourWebsites.planetAdmin" /></a></h4>
                         <p><s:text name="yourWebsites.planetAdmin.desc" /></p>
                     </s:if>
                 </s:if>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
index 45c5224..1a54a2f 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
@@ -17,16 +17,16 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>' />
+<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>'/>
 
 <script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
 <script src='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js"/>'></script>
 
 <style>
-#tagAutoCompleteWrapper {
-    width:40em; /* set width here or else widget will expand to fit its container */
-    padding-bottom:2em;
-}
+    #tagAutoCompleteWrapper {
+        width: 40em; /* set width here or else widget will expand to fit its container */
+        padding-bottom: 2em;
+    }
 </style>
 
 <%-- Titling, processing actions different between entry add and edit --%>
@@ -40,325 +40,358 @@
 </s:else>
 
 <p class="subtitle">
-    <s:text name="%{#subtitleKey}" >
-        <s:param value="actionWeblog.handle" />
+    <s:text name="%{#subtitleKey}">
+        <s:param value="actionWeblog.handle"/>
     </s:text>
 </p>
 
-<s:form id="entry">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:hidden name="bean.status" />
+<s:form id="entry" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+    <s:hidden name="bean.status"/>
     <s:if test="actionName == 'entryEdit'">
-        <s:hidden name="bean.id" />
+        <s:hidden name="bean.id"/>
     </s:if>
 
     <%-- ================================================================== --%>
     <%-- Title, category, dates and other metadata --%>
 
-    <table class="entryEditTable" cellpadding="0" cellspacing="0" style="width:100%">
-
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="title"><s:text name="weblogEdit.title" /></label>
-            </td>
-            <td>
-                <s:textfield name="bean.title" size="70" maxlength="255" tabindex="1" style="width:60%"/>
-            </td>
-        </tr>
-
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="weblogEdit.status" /></label>
-            </td>
-            <td>
-                <s:if test="bean.published">
-                    <span style="color:green; font-weight:bold">
-                        <s:text name="weblogEdit.published" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
-                    </span>
-                </s:if>
-                <s:elseif test="bean.draft">
-                    <span style="color:orange; font-weight:bold">
-                        <s:text name="weblogEdit.draft" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
-                    </span>
-                </s:elseif>
-                <s:elseif test="bean.pending">
-                    <span style="color:orange; font-weight:bold">
-                        <s:text name="weblogEdit.pending" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
-                    </span>
-                </s:elseif>
-                <s:elseif test="bean.scheduled">
-                    <span style="color:orange; font-weight:bold">
-                        <s:text name="weblogEdit.scheduled" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
-                    </span>
-                </s:elseif>
-                <s:else>
-                    <span style="color:red; font-weight:bold"><s:text name="weblogEdit.unsaved" /></span>
-                </s:else>
-            </td>
-        </tr>
+    <%-- title --%>
+    <s:textfield label="%{getText('weblogEdit.title')}" name="bean.title" maxlength="255" tabindex="1"/>
 
+    <%-- status --%>
+    <div class="form-group">
+        <label class="col-sm-3 control-label" for="weblogEdit.status"><s:text name="weblogEdit.status"/></label>
 
-        <s:if test="actionName == 'entryEdit'">
-            <tr>
-                <td class="entryEditFormLabel">
-                    <label for="permalink"><s:text name="weblogEdit.permaLink" /></label>
-                </td>
-                <td>
-                    <s:if test="bean.published">
-                        <a id="entry_bean_permalink" href='<s:property value="entry.permalink" />'><s:property value="entry.permalink" /></a>
-                        <img src='<s:url value="/images/launch-link.png"/>' />
-                    </s:if>
-                    <s:else>
-                        <s:property value="entry.permalink" />
-                    </s:else>
-                </td>
-            </tr>
-        </s:if>
+        <div class="col-sm-9 controls">
+            <s:if test="bean.published">
+                <span class="label label-success">
+                    <s:text name="weblogEdit.published"/>
+                    (<s:text name="weblogEdit.updateTime"/>
+                    <s:date name="entry.updateTime"/>)
+                </span>
+            </s:if>
+            <s:elseif test="bean.draft">
+                <span class="label label-info">
+                    <s:text name="weblogEdit.draft"/>
+                    (<s:text name="weblogEdit.updateTime"/>
+                    <s:date name="entry.updateTime"/>)
+                </span>
+            </s:elseif>
+            <s:elseif test="bean.pending">
+                <span class="label label-warning">
+                    <s:text name="weblogEdit.pending"/>
+                    (<s:text name="weblogEdit.updateTime"/>
+                    <s:date name="entry.updateTime"/>)
+                </span>
+            </s:elseif>
+            <s:elseif test="bean.scheduled">
+                <span class="label label-info">
+                    <s:text name="weblogEdit.scheduled"/>
+                    (<s:text name="weblogEdit.updateTime"/>
+                    <s:date name="entry.updateTime"/>)
+                </span>
+            </s:elseif>
+            <s:else>
+                <span class="label label-danger"><s:text name="weblogEdit.unsaved"/></span>
+            </s:else>
+        </div>
 
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="categoryId"><s:text name="weblogEdit.category" /></label>
-            </td>
-            <td>
-                <s:select name="bean.categoryId" list="categories" listKey="id" listValue="name" size="1" />
-            </td>
-        </tr>
-
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="title"><s:text name="weblogEdit.tags" /></label>
-            </td>
-            <td>
-                <s:textfield id="tagAutoComplete" cssClass="entryEditTags" name="bean.tagsAsString" size="70" maxlength="255" tabindex="3" style="width:30%"/>
-            </td>
-        </tr>
-
-        <s:if test="actionWeblog.enableMultiLang">
-                <tr>
-                    <td class="entryEditFormLabel">
-                        <label for="locale"><s:text name="weblogEdit.locale" /></label>
-                    </td>
-                    <td>
-                        <s:select name="bean.locale" size="1" list="localesList" listValue="displayName" />
-                    </td>
-                </tr>
-            </table>
-        </s:if>
-        <s:else>
-            </table>
-            <s:hidden name="bean.locale"/>
-        </s:else>
+    </div>
+
+    <%-- permalink --%>
+    <s:if test="actionName == 'entryEdit'">
+        <div class="form-group">
+            <label for="entry_bean_permalink"><s:text name="weblogEdit.permaLink"/></label>
+            <s:if test="bean.published">
+                <a id="entry_bean_permalink" href='<s:property value="entry.permalink" />'>
+                    <s:property value="entry.permalink"/>
+                </a>
+                <img src='<s:url value="/images/launch-link.png"/>'/>
+            </s:if>
+            <s:else>
+                <s:property value="entry.permalink"/>
+            </s:else>
+        </div>
+    </s:if>
 
+    <%-- tags --%>
+    <s:textfield label="%{getText('weblogEdit.tags')}" id="tagAutoComplete" name="bean.tagsAsString"
+                 maxlength="255" tabindex="3"/>
 
-    <%-- ================================================================== --%>
-    <%-- Weblog editor --%>
+    <%-- category --%>
+    <s:select label="%{getText('weblogEdit.category')}" name="bean.categoryId"
+              list="categories" listKey="id" listValue="name"/>
 
-    <s:include value="%{editor.jspPage}" />
+    <s:if test="actionWeblog.enableMultiLang">
+        <s:select label="%{getText('weblogEdit.locale')}" name="bean.locale" size="1"
+                  list="localesList" listValue="displayName"/>
+    </s:if>
 
-    <br />
+    <s:else>
+        <s:hidden name="bean.locale"/>
+    </s:else>
 
-    <%-- ================================================================== --%>
-    <%-- plugin chooser --%>
 
-    <s:if test="!entryPlugins.isEmpty">
-        <div id="pluginControlToggle" class="controlToggle">
-            <span id="ipluginControl">+</span>
-            <a class="controlToggle" onclick="javascript:toggleControl('pluginControlToggle','pluginControl')">
-            <s:text name="weblogEdit.pluginsToApply" /></a>
-        </div>
-        <div id="pluginControl" class="miscControl" style="display:none">
-            <s:checkboxlist theme="roller" name="bean.plugins" list="entryPlugins" listKey="name" listValue="name" />
-        </div>
-    </s:if>
+    <div class="panel-group" id="accordion">
 
+        <%-- Weblog editor --%>
 
-    <%-- ================================================================== --%>
-    <%-- advanced settings  --%>
+        <s:include value="%{editor.jspPage}"/>
+
+        <%-- Plugins --%>
+
+        <s:if test="!entryPlugins.isEmpty">
+
+            <div class="panel panel-default" id="panel-plugins">
+                <div class="panel-heading">
+
+                    <h4 class="panel-title">
+                        <a aria-expanded="false"
+                           data-toggle="collapse" data-target="#collapsePlugins" href="#collapsePlugins">
+                            <s:text name="weblogEdit.pluginsToApply"/> </a>
+                    </h4>
+
+                </div>
+                <div id="collapsePlugins" class="panel-collapse collapse in">
+                    <div class="panel-body">
+
+                        <s:checkboxlist name="bean.plugins" list="entryPlugins" listKey="name" listValue="name"/>
+
+                    </div>
+                </div>
+            </div>
 
-    <div id="miscControlToggle" class="controlToggle">
-        <span id="imiscControl">+</span>
-        <a class="controlToggle" onclick="javascript:toggleControl('miscControlToggle','miscControl')">
-        <s:text name="weblogEdit.miscSettings" /></a>
-    </div>
-    <div id="miscControl" class="miscControl" style="display:none">
-
-        <label for="link"><s:text name="weblogEdit.pubTime" /></label>
-        <div>
-            <s:select name="bean.hours" list="hoursList" />
-            :
-            <s:select name="bean.minutes" list="minutesList" />
-            :
-            <s:select name="bean.seconds" list="secondsList" />
-            &nbsp;&nbsp;
-            <script>
-            $(function() {
-                $( "#entry_bean_dateString" ).datepicker({
-                    showOn: "button",
-                    buttonImage: "../../images/calendar.png",
-                    buttonImageOnly: true,
-                    changeMonth: true,
-                    changeYear: true
-                });
-            });
-            </script>
-            <s:textfield name="bean.dateString" size="12" readonly="true"/>
-            <s:property value="actionWeblog.timeZone" />
-        </div>
-        <br />
-
-        <s:checkbox name="bean.allowComments" />
-        <s:text name="weblogEdit.allowComments" />
-        <s:text name="weblogEdit.commentDays" />
-        <s:select name="bean.commentDays" list="commentDaysList" size="1" listKey="key" listValue="value" />
-        <br />
-
-        <s:checkbox name="bean.rightToLeft" />
-        <s:text name="weblogEdit.rightToLeft" />
-        <br />
-
-        <s:if test="authenticatedUser.hasGlobalPermission('admin')">
-            <s:checkbox name="bean.pinnedToMain" />
-            <s:text name="weblogEdit.pinnedToMain" /><tags:help key="weblogEdit.pinnedToMain.tooltip"/>
-            <br />
         </s:if>
-        <br />
-
-		<table>
-			<tr>
-				<td><s:text name="weblogEdit.searchDescription" />:<tags:help key="weblogEdit.searchDescription.tooltip"/></td>
-				<td><s:textfield name="bean.searchDescription" size="60" maxlength="255" style="width:100%"/> </td>
-			</tr>
-            <tr>
-				<td><s:text name="weblogEdit.enclosureURL" />:<tags:help key="weblogEdit.enclosureURL.tooltip"/></td>
-				<td><s:textfield name="bean.enclosureURL" size="40" maxlength="255" style="width:100%"/></td>
-			</tr>
-            <s:if test="actionName == 'entryEdit'">
-                <tr>
-                    <td></td>
-                    <td><s:if test="bean.enclosureURL != null">
-                        <s:text name="weblogEdit.enclosureType" />: <s:property value='entry.findEntryAttribute("att_mediacast_type")' />
-                        <s:text name="weblogEdit.enclosureLength" />: <s:property value='entry.findEntryAttribute("att_mediacast_length")' />
-                    </s:if></td>
-                </tr>
-            </s:if>
-		</table>
-    </div>
 
+        <%-- Advanced settings --%>
+
+        <div class="panel panel-default" id="panel-settings">
+            <div class="panel-heading">
+
+                <h4 class="panel-title">
+                    <a class="accordion-toggle" aria-expanded="false"
+                       data-toggle="collapse" data-parent="#collapseAdvanced" href="#collapseAdvanced">
+                        <s:text name="weblogEdit.miscSettings"/> </a>
+                </h4>
+
+            </div>
+            <div id="collapseAdvanced" class="panel-collapse collapse in">
+                <div class="panel-body">
+
+                    <div class="form-group">
+
+                        <label class="col-sm-3 control-label"><s:text name="weblogEdit.pubTime"/></label>
+                        
+                        <div class="col-sm-9 controls">
+                            
+                            <s:select theme="simple" name="bean.hours" list="hoursList"/> :
+                            <s:select theme="simple" name="bean.minutes" list="minutesList"/> : 
+                            <s:select theme="simple" name="bean.seconds" list="secondsList"/>
+                            &nbsp;&nbsp;
+                            <script>
+                                $(function () {
+                                    $("#entry_bean_dateString").datepicker({
+                                        showOn: "button",
+                                        buttonImage: "../../images/calendar.png",
+                                        buttonImageOnly: true,
+                                        changeMonth: true,
+                                        changeYear: true
+                                    });
+                                });
+                            </script>
+                            &nbsp;&nbsp;
+                            <s:textfield theme="simple" name="bean.dateString" readonly="true"/>
+                            &nbsp;&nbsp;
+                            <s:property value="actionWeblog.timeZone"/>
+                            
+                        </div>
+
+                    </div>
+
+                    
+                    <%--
+                    <s:checkbox label="%{getText('weblogEdit.allowComments')}" name="bean.allowComments"/>
+                    <s:select label="%{getText('weblogEdit.commentDays')}" name="bean.commentDays" 
+                              list="commentDaysList" listKey="key" listValue="value"/>
+                    --%>
+
+                    <%-- use raw HTML tags here, Struts-Bootstrap does not provide this --%>                    
+                    <div class="form-group">
+                        
+                        <label class="col-sm-3 control-label" for="entry_bean_allowComments">
+                            <s:text name="weblogEdit.allowComments" />
+                        </label>
+                        
+                        <div class="col-sm-9 controls">
+
+                            <div class="input-group">
+                                
+                                <span class="input-group-addon">
+                                    <input type="checkbox" name="bean.allowComments"
+                                           value="true" checked="checked" id="entry_bean_allowComments"/>
+                                    <input type="hidden" id="__checkbox_entry_bean_allowComments"
+                                           name="__checkbox_bean.allowComments" value="true"/> 
+                                </span>
+
+                                <select name="bean.commentDays" id="entry_bean_commentDays" class="form-control">
+                                    <option value="0" selected="selected">unlimited days</option>
+                                    <option value="3">3 days</option>
+                                    <option value="7">7 days</option>
+                                    <option value="14">14 days</option>
+                                    <option value="30">30 days</option>
+                                    <option value="60">60 days</option>
+                                    <option value="90">90 days</option>
+                                </select>
+                                    
+                            </div> <!-- /input-group -->
+                            
+                        </div>
+                        
+                    </div> <!-- /form-group -->
+
+                    <s:checkbox label="%{getText('weblogEdit.rightToLeft')}" name="bean.rightToLeft"/>
+                   
+                    <%-- global admin can pin items to front page weblog --%>
+                    <s:if test="authenticatedUser.hasGlobalPermission('admin')">
+                        <s:checkbox label="%{getText('weblogEdit.pinnedToMain')}" name="bean.pinnedToMain"
+                        tooltop="%{getText('weblogEdit.pinnedToMain.tooltip')}" />
+                    </s:if>
+
+                    <s:textfield label="%{getText('weblogEdit.searchDescription')}" name="bean.searchDescription" 
+                                 maxlength="255" tooltip="%{getText('weblogEdit.searchDescription.tooltip')}" />
+                
+                    <s:textfield label="%{getText('weblogEdit.enclosureURL')}" name="bean.enclosureURL" 
+                                 maxlength="255" tooltip="%{getText('weblogEdit.enclosureURL.tooltip')}" />
+                
+                    <s:if test="actionName == 'entryEdit'">
+                        <s:if test="bean.enclosureURL != null">
+                            <s:text name="weblogEdit.enclosureType"/>:
+                            <s:property value='entry.findEntryAttribute("att_mediacast_type")'/>
+                            <s:text name="weblogEdit.enclosureLength"/>:
+                            <s:property value='entry.findEntryAttribute("att_mediacast_length")'/>
+                        </s:if>
+                    </s:if>
+                    
+                </div>
+                
+            </div>
+            
+        </div> 
+    
+    </div>
+    
 
     <%-- ================================================================== --%>
-    <%-- the button box --%>
-
-    <br>
-    <div class="control">
-        <span style="padding-left:7px">
-            <s:submit value="%{getText('weblogEdit.save')}" action="%{#mainAction}!saveDraft" />
-            <s:if test="actionName == 'entryEdit'">
-                <input type="button" name="fullPreview"
-                                    value="<s:text name='weblogEdit.fullPreviewMode' />"
-                                    onclick="fullPreviewMode()" />
-            </s:if>
-            <s:if test="userAnAuthor">
-                <s:submit value="%{getText('weblogEdit.post')}" action="%{#mainAction}!publish"/>
-            </s:if>
-            <s:else>
-                <s:submit value="%{getText('weblogEdit.submitForReview')}" action="%{#mainAction}!publish"/>
-            </s:else>
-        </span>
+    <%-- The button box --%>
 
+        <%-- save draft --%>
+        <s:submit cssClass="btn btn-default" 
+                  value="%{getText('weblogEdit.save')}" 
+                  action="%{#mainAction}!saveDraft"/>
+
+        <s:if test="actionName == 'entryEdit'">
+            
+            <%-- preview mode --%>
+            <input class="btn btn-default" type="button" name="fullPreview"
+                   value="<s:text name='weblogEdit.fullPreviewMode' />"
+                   onclick="fullPreviewMode()"/>
+        </s:if>
+        <s:if test="userAnAuthor">
+            
+            <%-- publish --%>
+            <s:submit cssClass="btn btn-default" 
+                      value="%{getText('weblogEdit.post')}" 
+                      action="%{#mainAction}!publish"/>
+        </s:if>
+        <s:else>
+            
+            <%-- submit for review --%>
+            <s:submit cssClass="btn btn-default" 
+                      value="%{getText('weblogEdit.submitForReview')}" 
+                      action="%{#mainAction}!publish" />
+        </s:else>
+    
+        <%-- delete --%>
         <s:if test="actionName == 'entryEdit'">
             <span style="float:right">
                 <s:url var="removeUrl" action="entryRemove">
-                    <s:param name="weblog" value="actionWeblog.handle" />
-                    <s:param name="removeId" value="%{entry.id}" />
+                    <s:param name="weblog" value="actionWeblog.handle"/>
+                    <s:param name="removeId" value="%{entry.id}"/>
                 </s:url>
-                <input type="button" value="<s:text name='weblogEdit.deleteEntry'/>" onclick="window.location='<s:property value="removeUrl" escape="false" />'" />
+                <input class="btn btn-default" type="button" 
+                       value="<s:text name='weblogEdit.deleteEntry'/>"
+                       onclick="window.location='<s:property value="removeUrl" escape="false"/>'"/>
             </span>
         </s:if>
-    </div>
 
-    
+
     <%-- ================================================================== --%>
     <%-- Trackback control --%>
+
     <s:if test="actionName == 'entryEdit' && userAnAuthor">
-        <br />
-        <h2><s:text name="weblogEdit.trackback" /></h2>
-        <s:text name="weblogEdit.trackbackUrl" />
-        <br />
+        <br/>
+        <h2><s:text name="weblogEdit.trackback"/></h2>
+        <s:text name="weblogEdit.trackbackUrl"/>
+        <br/>
         <s:textfield name="trackbackUrl" size="80" maxlength="255" style="width:35%"/>
 
-        <s:submit value="%{getText('weblogEdit.sendTrackback')}" action="entryEdit!trackback" />
+        <s:submit value="%{getText('weblogEdit.sendTrackback')}" action="entryEdit!trackback"/>
     </s:if>
 
 </s:form>
 
 <script>
-function fullPreviewMode() {
-    window.open('<s:property value="previewURL" />');
-}
-
-//Get cookie to determine state of control
-if (getCookie('control_miscControl') != null) {
-    if(getCookie('control_miscControl') == 'true'){
-        toggle('miscControl');
-        togglePlusMinus('imiscControl');
-    }
-}
-if (getCookie('control_pluginControl') != null) {
-    if(getCookie('control_pluginControl') == 'true'){
-        toggle('pluginControl');
-        togglePlusMinus('ipluginControl');
+    function fullPreviewMode() {
+        window.open('<s:property value="previewURL" />');
     }
-}
-$(function() {
-function split( val ) {
-    return val.split( / \s*/ );
-}
-function extractLast( term ) {
-    return split( term ).pop();
-}
-$( "#tagAutoComplete" )
-    // don't navigate away from the field on tab when selecting an item
-    .bind( "keydown", function( event ) {
-        if ( event.keyCode === $.ui.keyCode.TAB && $( this ).autocomplete( "instance" ).menu.active ) {
-            event.preventDefault();
+
+    $(function () {
+        function split(val) {
+            return val.split(/ \s*/);
         }
-    })
-    .autocomplete({
-        delay: 500,
-        source: function(request, response) {
-            $.getJSON("<s:property value='jsonAutocompleteUrl' />", { format: 'json', prefix: extractLast( request.term ) },
-            function(data) {
-                response($.map(data.tagcounts, function (dataValue) {
-                    return {
-                        value: dataValue.tag
-                    };
-                }))
-            })
-        },
-        focus: function() {
-            // prevent value inserted on focus
-            return false;
-        },
-        select: function( event, ui ) {
-            var terms = split( this.value );
-            // remove the current input
-            terms.pop();
-            // add the selected item
-            terms.push( ui.item.value );
-            // add placeholder to get the space at the end
-            terms.push( "" );
-            this.value = terms.join( " " );
-            return false;
+
+        function extractLast(term) {
+            return split(term).pop();
         }
+
+        $("#tagAutoComplete")
+        // don't navigate away from the field on tab when selecting an item
+                .bind("keydown", function (event) {
+                    if (event.keyCode === $.ui.keyCode.TAB && $(this).autocomplete("instance").menu.active) {
+                        event.preventDefault();
+                    }
+                })
+                .autocomplete({
+                    delay: 500,
+                    source: function (request, response) {
+                        $.getJSON("<s:property value='jsonAutocompleteUrl' />", {
+                                    format: 'json',
+                                    prefix: extractLast(request.term)
+                                },
+                                function (data) {
+                                    response($.map(data.tagcounts, function (dataValue) {
+                                        return {
+                                            value: dataValue.tag
+                                        };
+                                    }))
+                                })
+                    },
+                    focus: function () {
+                        // prevent value inserted on focus
+                        return false;
+                    },
+                    select: function (event, ui) {
+                        var terms = split(this.value);
+                        // remove the current input
+                        terms.pop();
+                        // add the selected item
+                        terms.push(ui.item.value);
+                        // add placeholder to get the space at the end
+                        terms.push("");
+                        this.value = terms.join(" ");
+                        return false;
+                    }
+                });
     });
-});
 </script>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp
index 5050b29..d881f87 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp
@@ -18,26 +18,52 @@
 <%-- This page is designed to be included in EntryEdit.jsp --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
+
 <%-- ********************************************************************* --%>
-<%-- Text editors --%>
+<%-- HTML text areas for editing content and summary --%>
+
+<div class="panel panel-default" id="panel-content">
+    <div class="panel-heading">
 
-<p class="toplabel">
+        <h4 class="panel-title">
+        <a data-toggle="collapse" data-target="#collapseContentEditor" href="#collapseContentEditor">
+            <s:text name="weblogEdit.content"/> </a>
+        </h4>
+        
+    </div>
+    <div id="collapseContentEditor" class="panel-collapse collapse in">
+        <div class="panel-body">
 
-</p>
+            <span style="font-weight:normal;float:right;">
+                <a href="#" onClick="onClickAddImage();"><s:text name="weblogEdit.insertMediaFile"/></a>
+            </span>
+                
+            <s:textarea id="edit_content" name="bean.text" cols="75" rows="25" tabindex="5"/>
 
-<div id="accordion">
-    <h3>
-        <s:text name="weblogEdit.content" />
-        <span style="font-weight:normal;float:right;">
-            <a href="#" onClick="onClickAddImage();"><s:text name="weblogEdit.insertMediaFile" /></a>
-        </span>
-    </h3>
-    <div>
-        <s:textarea id="edit_content" name="bean.text" cols="75" rows="25" cssStyle="width: 100%" tabindex="5"/>
+        </div>
     </div>
-    <h3><s:text name="weblogEdit.summary"/><tags:help key="weblogEdit.summary.tooltip"/></h3>
-    <div>
-        <s:textarea id="edit_summary" name="bean.summary" cols="75" rows="10" cssStyle="width: 100%" tabindex="6"/>
+</div>
+
+<%-- summary --%>
+
+<div class="panel panel-default" id="panel-summary">
+    <div class="panel-heading">
+
+        <h4 class="panel-title">
+            <a href="#collapseSummaryEditor"
+               aria-controls="collapseSummaryEditor" aria-expanded="false"
+               data-toggle="collapse" data-target="#collapseSummaryEditor" >
+               <s:text name="weblogEdit.summary"/>
+            </a>
+        </h4>
+        
+    </div>
+    <div id="collapseSummaryEditor" class="panel-collapse collapse in">
+        <div class="panel-body">
+
+            <s:textarea id="edit_summary" name="bean.summary" cols="75" rows="10" tabindex="6"/>
+
+        </div>
     </div>
 </div>
 
@@ -55,6 +81,7 @@
     </iframe>
 </div>
 
+
 <%-- ********************************************************************* --%>
 <%-- Editor event handling, on close, on add image, etc. --%>
 
@@ -79,9 +106,9 @@
 
     function onSelectMediaFile(name, url, isImage) {
         $("#mediafile_edit_lightbox").dialog("close");
-        $("#mediaFileEditor").attr('src','about:blank');
+        $("#mediaFileEditor").attr('src', 'about:blank');
         if (isImage == "true") {
-            insertMediaFile('<a href="' + url + '"><img src="' + url + '?t=true" alt="' + name+ '"></img></a>');
+            insertMediaFile('<a href="' + url + '"><img src="' + url + '?t=true" alt="' + name + '"></img></a>');
         } else {
             insertMediaFile('<a href="' + url + '">' + name + '</a>');
         }
@@ -89,13 +116,10 @@
 </script>
 
 <s:if test="editor.id == 'editor-text.jsp'">
-    <%-- Plain text editor (raw HTML entry) --%>
+
+    <%-- Media insertion for plain textarea editor --%>
 
     <script>
-        $(function() {
-            $( "#accordion" ).accordion({
-            });
-        });
         function insertMediaFile(anchorTag) {
             insertAtCursor(document.getElementById('edit_content'), anchorTag);
         }
@@ -126,9 +150,11 @@
             }
         }
     </script>
+    
 </s:if>
 <s:else>
-    <%-- Rich text editor (Xinha, see: http://trac.xinha.org/wiki/NewbieGuide) --%>
+    
+    <%-- Include the Rich text editor (Xinha, see: http://trac.xinha.org/wiki/NewbieGuide) --%>
 
     <s:url var="xinhaHome" value="/roller-ui/authoring/editors/xinha-0.96.1"></s:url>
     <script>
@@ -137,6 +163,7 @@
         _editor_lang = "en";        // And the language we need to use in the editor.
         _editor_skin = "blue-look"; // If you want use a skin, add the name (of the folder) here
     </script>
+    
     <script src="<s:property value="xinhaHome" />/XinhaCore.js"></script>
 
     <script>
@@ -153,6 +180,8 @@
             });
         });
 
+        <%-- Media insertion for Xinha editor --%>
+        
         function insertMediaFile(anchorTag) {
             xinha_editors.edit_content.insertHTML(anchorTag);
         }
@@ -199,4 +228,5 @@
 
         Xinha._addEvent(window,'load', xinha_init);
     </script>
+    
 </s:else>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp
index 08d7e4a..e2e96a9 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp
@@ -16,7 +16,6 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
 
 
 <script>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
index fbef230..9156adc 100644
--- a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
@@ -16,11 +16,17 @@
   directory of this distribution.
 --%>
 <% response.setContentType("text/html; charset=UTF-8"); %>
+
 <%@ page language="java" contentType="text/html; charset=UTF-8" %>
+
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="/struts-tags" prefix="s" %>
+
+<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
 <%@ taglib uri="http://jakarta.apache.org/taglibs/string-1.1" prefix="str" %>
-<%@ taglib tagdir="/WEB-INF/tags" prefix="tags"%>
+
+<%@ taglib uri="/struts-tags" prefix="s" %>
+<%@ taglib uri="/struts-bootstrap-tags" prefix="sboo" %>
+
+<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp
index 03ea6f9..4258949 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp
@@ -17,50 +17,104 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<div class="bannerStatusBox">
-    
-    <table class="bannerStatusBox" cellpadding="0" cellspacing="0">
-        <tr>
-            <td class="bannerLeft">
-                
-                <s:if test="authenticatedUser != null">
-                    <s:text name="mainPage.loggedInAs" />
-                    <a href="<s:url action="menu" namespace="/roller-ui" />"><s:property value="authenticatedUser.userName"/></a>
-                </s:if>
-                
+<nav class="navbar navbar-default navbar-static-top navbar-inverse">
+    <div class="container">
+        <div id="navbar" class="navbar-collapse collapse">
+
+            <div class="navbar-header">
+                <button type="button" class="navbar-toggle collapsed" 
+                        data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+                    <span class="sr-only">Toggle navigation</span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                </button>
+                <a class="navbar-brand" href="#">Apache Roller</a>
+            </div>
+            
+            <ul class="nav navbar-nav">
+i
+                <%-- <s:if test="authenticatedUser != null">
+                    <li>
+                        <a href="<s:url action="menu" namespace="/roller-ui" />">
+                            <s:text name="mainPage.loggedInAs" />: <s:property value="authenticatedUser.userName"/> 
+                        </a>
+                    </li>
+                </s:if> --%>
                 
                 <s:if test="actionWeblog != null">
-                    - <s:text name="mainPage.currentWebsite" />
-                    <b><a href='<s:property value="actionWeblog.absoluteURL" />'>
-                            <s:property value="actionWeblog.handle" />
-                    </a></b>
+                    
+                    <%-- <li>
+                        <a href='<s:property value="actionWeblog.absoluteURL" />'>
+                            <s:text name="mainPage.currentWebsite" />: <s:property value="actionWeblog.handle" />
+                        </a>
+                    </li> --%> 
+
+                    <s:set name="tabMenu" value="menu"/>
+                    <s:if test="#tabMenu != null">
+                        <s:iterator id="tab" value="#tabMenu.tabs">
+                            <li class="dropdown">
+                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
+                                   aria-haspopup="true" aria-expanded="false">
+                                    <s:text name="%{#tab.key}"/> <span class="caret"></span>
+                                </a>
+                                <ul class="dropdown-menu">
+                                    <s:iterator id="tabItem" value="#tab.items" status="stat">
+                                        <li>
+                                            <a href="<s:url action="%{#tabItem.action}">
+                                                <s:param name="weblog" value="actionWeblog.handle"/></s:url>">
+                                                <s:text name="%{#tabItem.key}"/>
+                                            </a>
+                                        </li>
+                                    </s:iterator>
+                                </ul>
+                            </li>
+                        </s:iterator>
+                    </s:if>
                     
                 </s:if>
-                
-            </td>
+
+            </ul>
             
-            <td class="bannerRight">
-                
-                <a href="<s:url value='/'/>"><s:property value="getProp('site.shortName')"/></a>
-                
-                | <a href="<s:url action='menu' namespace='/roller-ui' />"><s:text name="mainPage.mainMenu" /></a>
+            <ul class="nav navbar-nav navbar-right">
                 
+                <li><a href="<s:url value='/'/>"><s:property value="getProp('site.shortName')"/></a></li>
+
+                <li>
+                    <a href="<s:url action='menu' namespace='/roller-ui' />">
+                        <s:text name="mainPage.mainMenu" /></a>
+                </li>
+
                 <s:if test="authenticatedUser != null">
-                    | <a href="<s:url action='logout' namespace='/roller-ui' />"><s:text name="navigationBar.logout"/></a>
+                    <li>
+                        <a href="<s:url action='logout' namespace='/roller-ui' />">
+                            <s:text name="navigationBar.logout"/></a>
+                    </li>
                 </s:if>
                 <s:else>
-                    | <a href="<s:url action='login-redirect' namespace='/roller-ui' />"><s:text name="navigationBar.login"/></a>
-                    
+                    <li>
+                        <a href="<s:url action='login-redirect' namespace='/roller-ui' />">
+                            <s:text name="navigationBar.login"/></a>
+                    </li>
+
                     <s:if test="getBooleanProp('users.registration.enabled') && getProp('authentication.method') != 'ldap'">
-                        | <a href="<s:url action='register' namespace='/roller-ui' />"><s:text name="navigationBar.register"/></a>
+                        <li>
+                            <a href="<s:url action='register' namespace='/roller-ui' />">
+                                <s:text name="navigationBar.register"/></a>
+                        </li>
                     </s:if>
+                    
                     <s:elseif test="getProp('users.registration.url') != null && getProp('users.registration.url') > 0">
-                        | <a href="<s:property value="getProp('users.registration.url')"/>"><s:text name="navigationBar.register"/></a>
+                        <li>
+                            <a href="<s:property value="getProp('users.registration.url')"/>">
+                                <s:text name="navigationBar.register"/></a>
+                        </li>
                     </s:elseif>
                 </s:else>
                 
-            </td>
-        </tr>
-    </table>
-    
-</div>
+            </ul>
+        </div><!--/.nav-collapse -->
+    </div>
+</nav>
+
+

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp
index f890ec9..2acbab6 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp
@@ -2,18 +2,35 @@
 This default stuff goes in the HTML head element of each page
 You can override it with your own file via WEB-INF/tiles-def.xml
 --%>
+
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
+<%--
 <link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssreset/cssreset-min.css'/>" />
 <link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssfonts/cssfonts-min.css'/>" />
 <link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssbase/cssbase-min.css'/>" />
-
 <link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/layout.css"/>' />
 <link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/roller.css"/>' />
 <link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/menu.css"/>' />
-
 <link rel="stylesheet" media="all" href="<s:url value="/roller-ui/theme/"/><s:property value="getProp('editor.theme')" />/colors.css" />
+--%>
+
+<%-- jquery and bootstrap --%>
 
+<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
+<link rel="stylesheet" media="all"
+      href='<s:url value="/roller-ui/bootstrap-3.3.6-dist/css/bootstrap.min.css"/>' />
+<link rel="stylesheet" media="all"
+      href='<s:url value="/roller-ui/bootstrap-3.3.6-dist/css/bootstrap-theme.min.css"/>' />
+<script src="<s:url value="/roller-ui/bootstrap-3.3.6-dist/js/bootstrap.min.js"/>"></script>
+
+<%-- the links generated by the Struts-Bootstrap plugin are 404s --%>
+
+<sb:head includeScripts="false" includeScriptsValidation="false"/>
+
+<%-- roller Javascropt and styles --%>
+
+<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/roller.css"/>' />
 <script src="<s:url value="/theme/scripts/roller.js"/>"></script>
 
 <%-- struts2 head disabled until we need it --%>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp
index 912cd4b..23efc18 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp
@@ -2,16 +2,33 @@
 This default stuff goes in the HTML head element of each page
 You can override it with your own file via WEB-INF/tiles-def.xml
 --%>
+
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
+<%--
 <link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssreset/cssreset-min.css'/>" />
 <link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssfonts/cssfonts-min.css'/>" />
 <link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssbase/cssbase-min.css'/>" />
-
 <link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/layout.css"/>' />
 <link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/roller.css"/>' />
 <link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/menu.css"/>' />
+<link rel="stylesheet" media="all" href="<s:url value="/roller-ui/theme/"/><s:property value="getProp('editor.theme')" />/colors.css" />
+--%>
+
+<%-- jquery and bootstrap --%>
 
-<link rel="stylesheet" media="all" href="<s:url value="/roller-ui/theme/"/><s:property value="getProp('editor.theme')"/>/colors.css" />
+<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
+<link rel="stylesheet" media="all" 
+      href='<s:url value="/roller-ui/bootstrap-3.3.6-dist/css/bootstrap.min.css"/>' />
+<link rel="stylesheet" media="all" 
+      href='<s:url value="/roller-ui/bootstrap-3.3.6-dist/css/bootstrap-theme.min.css"/>' />
+<script src="<s:url value="/roller-ui/bootstrap-3.3.6-dist/js/bootstrap.min.js"/>"></script>
 
+<%-- the links generated by the Struts-Bootstrap plugin are 404s --%>
+
+<sb:head includeScripts="false" includeScriptsValidation="false"/>
+
+<%-- roller Javascropt and styles --%>
+
+<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/roller.css"/>' />
 <script src="<s:url value="/theme/scripts/roller.js"/>"></script>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
index 3928e07..6166efb 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
@@ -20,41 +20,47 @@
 <s:set name="tabMenu" value="menu"/>
 <s:if test="#tabMenu != null">
 
-<table class="menuTabTable" cellspacing="0" >
-<tr>
-<s:iterator id="tab" value="#tabMenu.tabs" >
-    <s:if test="#tab.selected">
-        <s:set name="selectedTab" value="#tab" />
-        <td class="menuTabSelected">
-    </s:if>
-    <s:else>
-        <td class="menuTabUnselected">
-    </s:else>
-    <div class="menu-tr">
-        <div class="menu-tl">
-            &nbsp;&nbsp;<a href="<s:url action="%{#tab.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tab.key}" /></a>&nbsp;&nbsp;
-        </div>
-    </div>
-    </td>
-    <td class="menuTabSeparator"></td>
-</s:iterator>
-</tr>
-</table>
-
-<table class="menuItemTable" cellspacing="0" >
-    <tr>
-        <td class="padleft">
-            <s:iterator id="tabItem" value="#selectedTab.items" status="stat">
-                <s:if test="!#stat.first">|</s:if>
-                <s:if test="#tabItem.selected">
-                    <a class="menuItemSelected" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tabItem.key}" /></a>
-                </s:if>
-                <s:else>
-                    <a class="menuItemUnselected" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tabItem.key}" /></a>
-                </s:else>
+    <%-- 
+    <nav class="navbar navbar-default">
+        <div class="container-fluid">
+            <div id="navbar" class="navbar-collapse collapse">
+                <ul class="nav navbar-nav">
+
+                    <s:iterator id="tab" value="#tabMenu.tabs">
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" 
+                                aria-haspopup="true" aria-expanded="false">
+                                <s:text name="%{#tab.key}"/> <span class="caret"></span>
+                            </a>
+                            <ul class="dropdown-menu">
+                                <s:iterator id="tabItem" value="#tab.items" status="stat">
+                                    <li>
+                                        <a href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>">
+                                            <s:text name="%{#tabItem.key}"/>
+                                        </a>
+                                    </li>
+                                </s:iterator>
+                            </ul>
+                        </li>
+                    </s:iterator>
+                    
+                </ul>
+            </div> <!--/.nav-collapse -->
+        </div> <!--/.container-fluid -->
+    </nav>
+
+    <s:iterator id="tab" value="#tabMenu.tabs">
+
+        <h3><s:text name="%{#tab.key}"/></h3>
+
+        <div class="list-group">
+            <s:iterator id="tabItem" value="#tab.items" status="stat">
+                <a class="list-group-item" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>">
+                    <s:text name="%{#tabItem.key}"/></a>
             </s:iterator>
-        </td>
-    </tr>
-</table>
+        </div>
 
+    </s:iterator>
+    --%>
+        
 </s:if>

http://git-wip-us.apache.org/repos/asf/roller/blob/2da6c3c2/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp
index 3613fc3..9f5c3c5 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp
@@ -18,47 +18,49 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 <!doctype html>
 <html>
-    <head>
-        <meta charset="utf-8">
-        <meta http-equiv="X-UA-Compatible" content="IE=edge">
-        <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon">
-        <title><s:property value="getProp('site.shortName')"/>: <s:property value="pageTitle" /></title>
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon">
+    <title><s:property value="getProp('site.shortName')"/>: <s:property value="pageTitle"/></title>
 
-        <tiles:insertAttribute name="head" />     
-        <style>
-            <tiles:insertAttribute name="styles" />
-        </style>
-    </head>
-    <body>
-        
-        <div id="banner">
-            <tiles:insertAttribute name="bannerStatus" />
-        </div>
-        
-        <div id="content">
-            <div id="leftcontent_wrap">
-                <div id="leftcontent"> 
-                </div>
-            </div>
-            
-            <div id="centercontent_wrap">
-                <div id="centercontent">   
-                    <h1><s:property value="pageTitle" /></h1>
-                    <tiles:insertAttribute name="messages" /> 
-                    <tiles:insertAttribute name="content" />    
-                </div>
-            </div>
-            
-            <div id="rightcontent_wrap">
-                <div id="rightcontent"> 
-                    <tiles:insertAttribute name="sidebar" />
-                </div>
+    <tiles:insertAttribute name="head"/>
+    <style>
+        <tiles:insertAttribute name="styles" />
+    </style>
+</head>
+<body>
+
+<tiles:insertAttribute name="bannerStatus"/>
+
+<div class="row">
+    
+    <div class="col-md-3 roller-column-left">
+        <div class="panel panel-default">
+            <div class="panel-body">
+                <tiles:insertAttribute name="sidebar"/>
             </div>
         </div>
-        
-        <div id="footer">
-            <tiles:insertAttribute name="footer" />
+    </div>
+    
+    <div class="col-md-9 roller-column-right">
+
+        <div class="panel panel-default">
+            <div class="panel-body">
+                <h1><s:property value="pageTitle"/></h1>
+                <tiles:insertAttribute name="messages"/>
+                <tiles:insertAttribute name="content"/>
+            </div>
         </div>
-        
-    </body>
+
+    </div>
+</div>
+
+<footer class="footer">
+    <div class="container">
+        <tiles:insertAttribute name="footer"/>
+    </div>
+</footer>
+
+</body>
 </html>