diff --git a/penta-sessions.js b/penta-sessions.js
index 938fd258a64da1efc2c6177f7f0c5d23716c6978..adad9d79308c8fb81269f5fe3b9727cca85f26ab 100644
--- a/penta-sessions.js
+++ b/penta-sessions.js
@@ -4,97 +4,6 @@ Copyright (c) 2011-2012, M Rawash <mrawash@gmail.com>
 Released under the most recent GPL <http://www.gnu.org/licenses/gpl.html>
 */
 
-XML.ignoreWhitespace = false;
-XML.prettyPrinting = false;
-var INFO =
-<plugin name="penta-sessions" version="0.1"
-        href="https://github.com/gwash/penta-sessions"
-        summary="Pentadactyl Session Manager"
-        xmlns={NS}>
-    <author email="mrawash@gmail.com">M Rawash</author>
-    <license href="http://www.gnu.org/licenses/gpl.html">GPL</license>
-    <project name="Pentadactyl" min-version="1.0"/>
-    <p>
-        This plugin provides Vim-like session handeling.
-    </p>
-        <note>Only operates on current window</note>
-    <item>
-        <tags>'sesdir' 'sessiondir'</tags>
-        <spec>'sessiondir' 'sesdir'</spec>
-        <type>string</type>
-        <default>{options.runtimepath}/sessions/</default>
-        <description>
-            <p>
-                The default directory to save/load sessions from.
-            </p>
-        </description>
-    </item>
-    <item>
-        <tags>'sesfile' 'sessionfile'</tags>
-        <spec>'sessionfile' 'sesfile'</spec>
-        <type>string</type>
-        <default></default>
-        <description>
-            <p>
-                The session file you are currently working with, this will be set automatically whenever you
-                save or load a session, but you can set it manually if you want.
-            </p>
-        </description>
-    </item>
-    <item>
-        <tags>ss :sessions :sessionsave :mkses :mksession</tags>
-        <strut/>
-        <spec>:sessions<oa>ave</oa><oa>!</oa> <oa>file</oa></spec>
-        <spec>ss</spec>
-        <description>
-            <p>
-                Saves current session to an ExCommand <oa>file</oa>, which can be restored later 
-                with <ex>:sessionload <oa>file</oa></ex>.
-            </p>
-            <p>
-                If <oa>file</oa> is just a basename (without directory path), it will create a session file 
-                with that name in the <o>sessiondir</o>.
-                <example><ex>:sessionsave</ex> pythonref</example>
-            </p>
-            <p>
-                If no <oa>file</oa> was specified it will save to a numbered file (based on current date) in <o>sessiondir</o>.
-            </p>
-            <p>
-                Adding ! will overwrite the file if it exists.
-                <example><ex>:sessionsave!</ex> {options.runtimepath}/sessions/gapi.penta</example>
-            </p>
-        </description>
-    </item>
-    <item>
-        <tags>sa :sessiona :sessionappend :sessionadd</tags>
-        <strut/>
-        <spec>:sessiona<oa>ppend</oa><oa>!</oa> <oa>file</oa></spec>
-        <spec>sa</spec>
-        <description>
-            <p>
-                Appends current tab to an existing session <oa>file</oa>. If a ! was supplied it will append all tabs
-                in current window instead.
-            </p>
-            <p>
-                If <oa>file</oa> is a basename, it will look for it in <o>sessiondir</o>.
-            </p>
-        </description>
-    </item>
-    <item>
-        <tags>sl :sessionl :sessionload</tags>
-        <strut/>
-        <spec>:sessionl<oa>oad</oa><oa>!</oa> <oa>file</oa></spec>
-        <spec>sl</spec>
-        <description>
-            <p>
-                Loads session from <oa>file</oa>, replacing all tabs in current window if no ! was added.
-            </p>
-            <p>
-                If <oa>file</oa> is a basename, it will look for it in <o>sessiondir</o>.
-            </p>
-        </description>
-    </item>
-</plugin>;
 
 var setsessiondir = function (value) {
     let dir = io.File(value);
@@ -120,6 +29,22 @@ group.options.add(['sessionfile', 'sesfile'],
     'string', ''
 )
 
+group.options.add(['sessionoptions', 'sesop'],
+    "Set what will be saved with :sessionsave",
+    "stringlist", 'curdir,help,tabs',
+    {
+        completer: function (context) [
+            ["blank", "Empty tabs"],
+            ["curdir", "Current directory"],
+            ["help", "Help tabs"],
+            ["options", "All options and mappings"],
+            ["runtime", "Current runtime path(s)"],
+            ["sesdir", "Session directory as current directory"],
+            ["tabs", "Normal tabs"]
+        ]
+    }
+)
+
 group.commands.add(['sessions[ave]','mkses[sion]'],
     'Save current window',
     function(args) {
@@ -129,16 +54,37 @@ group.commands.add(['sessions[ave]','mkses[sion]'],
       
         dactyl.assert(!file.exists() || args.bang, _("io.exists", file.path.quote()));
 
-        let data = '" vim: set ft=pentadactyl:\n';
-        data+='\ncd '+io.cwd.path;
-        data+='\nse rtp='+options.runtimepath;
-        data+='\nse sesdir='+options.sessiondir;
-        tabs.visibleTabs.forEach(function (tab, i) {
-            data+='\nt '+tab.linkedBrowser.contentDocument.location.href;
-        });
+        let sesop = options.sessionoptions.toString();
+        let lines = new Array('" vim: set ft=pentadactyl:\n');
+
+        if (/sesdir/.test(sesop))
+            lines.push('silent cd '+options.sessiondir);
+        else if (/curdir/.test(sesop))
+            lines.push('silent cd '+io.cwd.path);
+        
+        if (/runtime/.test(sesop))
+            lines.push('set runtimepath='+options.runtimepath);
+
+        if (/options/.test(sesop)) {
+            let cmds = [cmd.serialize().map(commands.commandToString, cmd) for
+                    (cmd in commands.iterator()) if (cmd.serialize)];
+            cmds = array.flatten(cmds);
+            lines = lines.concat(cmds);
+        }
+        
+        if (/tabs/.test(sesop)) {
+            tabs.visibleTabs.forEach(function (tab, i) {
+                let loc = tab.linkedBrowser.contentDocument.location.href;
+                if (/^dactyl:\/\/help\//.test(loc) && !/help/.test(sesop))
+                    return;
+                if (loc == 'about:blank' && !/blank/.test(sesop))
+                    return;
+                lines.push('tabopen '+loc);
+            });
+        }
 
         try {
-            file.write(data);
+            file.write(lines.join('\n'));
         } catch(e) {
             dactyl.echoerr(_("io.notWriteable", file.path.quote()));
             return;
@@ -170,10 +116,10 @@ group.commands.add(['sessiona[ppend]', 'sessionadd'],
         let data = '';
         if (args.bang) {
             tabs.visibleTabs.forEach(function (tab, i) {
-                data+='\nt '+tab.linkedBrowser.contentDocument.location.href;
+                data+='\ntabopen '+tab.linkedBrowser.contentDocument.location.href;
             });
         } else {
-            data+='\nt '+gBrowser.mCurrentTab.linkedBrowser.contentDocument.location.href;
+            data+='\ntabopen '+gBrowser.mCurrentTab.linkedBrowser.contentDocument.location.href;
         }
 
         try {
@@ -239,4 +185,124 @@ group.mappings.add([modes.NORMAL], ['sl'],
 );
 
 
+XML.ignoreWhitespace = false;
+XML.prettyPrinting = false;
+var INFO =
+<plugin name="penta-sessions" version="0.1"
+        href="https://github.com/gwash/penta-sessions"
+        summary="Pentadactyl Session Manager"
+        xmlns={NS}>
+    <author email="mrawash@gmail.com">M Rawash</author>
+    <license href="http://www.gnu.org/licenses/gpl.html">GPL</license>
+    <project name="Pentadactyl" min-version="1.0"/>
+    <p>
+        This plugin provides Vim-like session handeling.
+    </p>
+        <note>Only operates on current window</note>
+    <item>
+        <tags>'sesdir' 'sessiondir'</tags>
+        <spec>'sessiondir' 'sesdir'</spec>
+        <type>string</type>
+        <default>{options.get("sessiondir").stringDefaultValue}</default>
+        <description>
+            <p>
+                The default directory to save/load sessions from.
+            </p>
+        </description>
+    </item>
+    <item>
+        <tags>'sesfile' 'sessionfile'</tags>
+        <spec>'sessionfile' 'sesfile'</spec>
+        <type>string</type>
+        <default></default>
+        <description>
+            <p>
+                The session file you are currently working with, this will be set 
+                automatically whenever you save or load a session, but you can set it
+                manually if you want.
+            </p>
+        </description>
+    </item>
+    <item>
+        <tags>'sesop' 'sessionoptions'</tags>
+        <spec>'sessionoptions' 'sesop'</spec>
+        <type>stringlist</type>
+        <default>{options.get("sessionoptions").stringDefaultValue}</default>
+        <description>
+            <p>
+                Changes the effect of the <ex>:sessionsave</ex> command.  It is a comma
+                separated list of words.  Each word enables saving and restoring
+                something:
+            </p>
+            <dl>
+            { template.map(options.get("sessionoptions").completer(), function ([k, v])
+                <><dt>{k}</dt> <dd>{v}</dd></>) }
+            </dl>
+            <note>
+                "sesdir" overrides "curdir" if added.
+            </note>
+        </description>
+    </item>
+
+    <item>
+        <tags>ss :sessions :sessionsave :mkses :mksession</tags>
+        <strut/>
+        <spec>:sessions<oa>ave</oa><oa>!</oa> <oa>file</oa></spec>
+        <spec>ss</spec>
+        <description>
+            <p>
+                Saves current session to an ExCommand <oa>file</oa>, which can be 
+                restored later with <ex>:sessionload <oa>file</oa></ex>.
+            </p>
+            <p>
+                If <oa>file</oa> is just a basename (without directory path), it will
+                create a session file with that name in the <o>sessiondir</o>.
+                <example>
+                    <ex>:sessionsave</ex> pythonref
+                </example>
+            </p>
+            <p>
+                If no <oa>file</oa> was specified it will save to a numbered file
+                (based on current date) in <o>sessiondir</o>.
+            </p>
+            <p>
+                Adding ! will overwrite the file if it exists.
+                <example>
+                    <ex>:sessionsave!</ex> {options.runtimepath}/sessions/gapi.penta
+                </example>
+            </p>
+        </description>
+    </item>
+    <item>
+        <tags>sa :sessiona :sessionappend :sessionadd</tags>
+        <strut/>
+        <spec>:sessiona<oa>ppend</oa><oa>!</oa> <oa>file</oa></spec>
+        <spec>sa</spec>
+        <description>
+            <p>
+                Appends current tab to an existing session <oa>file</oa>. If a ! was
+                supplied it will append all tabs in current window instead.
+            </p>
+            <p>
+                If <oa>file</oa> is a basename, it will look for it in <o>sessiondir</o>.
+            </p>
+        </description>
+    </item>
+    <item>
+        <tags>sl :sessionl :sessionload</tags>
+        <strut/>
+        <spec>:sessionl<oa>oad</oa><oa>!</oa> <oa>file</oa></spec>
+        <spec>sl</spec>
+        <description>
+            <p>
+                Loads session from <oa>file</oa>, replacing all tabs in current window
+                if no ! was added.
+            </p>
+            <p>
+                If <oa>file</oa> is a basename, it will look for it in <o>sessiondir</o>.
+            </p>
+        </description>
+    </item>
+</plugin>;
+
 /* vim:se sts=4 sw=4 et: */