diff --git a/dclish/dclish.go b/dclish/dclish.go
new file mode 100644
index 0000000000000000000000000000000000000000..aae284583a565a9b8f233989c170cfa0a0a7a3cb
--- /dev/null
+++ b/dclish/dclish.go
@@ -0,0 +1,49 @@
+// Package dclish A DCL-like command line parser.
+package dclish
+
+import (
+	"fmt"
+	"strings"
+)
+
+// ActionFunc is the function that a command runs.
+type ActionFunc func(string, *Command) error
+
+// Flag is a flag for a command.
+type Flag struct {
+	Name        string
+	Value       string
+	Description string
+}
+
+// Flags is the list of flags.
+type Flags []*Flag
+
+// Command contains the definition of a command, it's flags and subcommands.
+type Command struct {
+	Command     string
+	Flags       Flags
+	Args        []string
+	Commands    []*Command
+	Action      ActionFunc
+	Description string
+}
+
+// Commands is the full list of commands.
+type Commands []*Command
+
+// ParseAndRun parses a command line and runs the command.
+func (c Commands) ParseAndRun(line string) error {
+	// TODO: this doesn't handle a DCL command line completely.
+	words := strings.Fields(line)
+	fmt.Printf("TODO ParseAndRun sees: %s\n", words)
+	cmd := strings.ToUpper(words[0])
+	for i := range c {
+		if c[i].Command == cmd {
+			fmt.Printf("Command help:\n%s\n", c[i].Description)
+			return nil
+		}
+	}
+	fmt.Printf("ERROR: Unknown command '%s'\n", cmd)
+	return nil
+}
diff --git a/repl/command.go b/repl/command.go
index 5567900ba7bf065af140e08863794346ad293653..dd0a2f9f385dcd50af33974b93f51351f96c22a6 100644
--- a/repl/command.go
+++ b/repl/command.go
@@ -1,412 +1,2661 @@
 // Package repl implements the main event loop.
 package repl
 
-type command struct {
-	command   string
-	boolFlags []string
-	strFlags  []string
-	args []string
-	commands  []*command
-	action    func(string, *command) error
-	}
+import "git.lyda.ie/kevin/bulletin/dclish"
 
-var commands = []*command{
-	{
-		command: "ADD",
-		boolFlags: []string{
-			"/ALL",
-			"/BELL",
-			"/BROADCAST",
-			"/CLUSTER",
-			"/EDIT",
-			"/EXPIRATION",
-			"/EXTRACT",
-			"/FOLDER",
-			"/LOCAL",
-			"/NODES",
-			"/NOINDENT",
-			"/PERMANENT",
-			"/SUBJECT",
-			"/SHUTDOWN",
-			"/SYSTEM",
-			"/USERNAME",
+var commands = dclish.Commands{
+	{
+		Command: "ADD",
+		Description: `Adds a message to the specified folder.  A file can be specified which
+contains the message.  Otherwise, BULLETIN will prompt for the text.
+BULLETIN will ask for an expiration date and a header to contain the
+topic of the message.
+ 
+  Format:
+    ADD [file-name]
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `This option is restricted to privileged users.  It is used in conjunction
+with the /BROADCAST qualifier.  If specified, all terminals are sent the
+message.  Otherwise, only users are sent the message.
+`,
+			},
+			{
+				Name: "/BELL",
+				Description: `This option is restricted to privileged users.  It is used in conjunction 
+with the /BROADCAST qualifier.  If specified, the bell is rung on the 
+terminals when the message is broadcasted.
+`,
+			},
+			{
+				Name: "/BROADCAST",
+				Description: `This option is restricted to privileged users and SYSTEM folders.  If
+specified, a message is both stored and broadcasted to all users logged
+in at the time.  If the folder is remote, a message will be broadcast on
+all nodes which are connected to that folder, unless /LOCAL is specified.
+A node which does not have BULLCP running cannot have a message
+broadcasted to it, (even though it is able to create a remote folder).
+ 
+See also /ALL and /BELL.
+`,
+			},
+			{
+				Name: "/CLUSTER",
+				Description: `/[NO]CLUSTER
+ 
+This option specifies that broadcasted messages should be sent to all
+nodes in the cluster.  /CLUSTER is the default.
+`,
+			},
+			{
+				Name: "/EDIT",
+				Description: `/[NO]EDIT
+Determines whether or not the editor is invoked to edit the message
+you are adding.  /EDIT is the default if you have added /EDIT to your
+BULLETIN command line.
+`,
+			},
+			{
+				Name: "/EXPIRATION",
+				Description: `/EXPIRATION=time
+ 
+Specifies the time at which the message is to expire.  Either absolute
+time: [dd-mmm-yyyy] hh:mm:ss, or delta time: dddd [hh:mm:ss] can be
+used.
+`,
+			},
+			{
+				Name: "/EXTRACT",
+				Description: `Specifies that the text of the previously read message should be included
+at the beginning of the new message.  The previous message must be in the
+same folder.  This qualifier is valid only when used with /EDIT.  The
+text is indented with > at the beginning of each line.  This can be
+suppressed with /NOINDENT.
+`,
+			},
+			{
+				Name: "/FOLDER",
+				Description: `/FOLDER=(foldername,[...])
+ 
+Specifies the foldername into which the message is to  be  added.   Does
+not  change the current selected folder.  Folders can be either local or
+remote folders.  Thus, a  nodename  can  precede  the  foldername  (this
+assumes that the remote node is capable of supporting this feature, i.e.
+the BULLCP process is running on that node.  If  it  is  not,  you  will
+receive an error message).  If the the foldername is specified with only
+a nodename, i.e. FOO::, the foldername is assumed to be GENERAL.   NOTE:
+Specifying  remote nodes is only possible if that remote node is running
+a special BULLCP process.  If it isn't, the only way to add messages  to
+that  remote  node is via the /NODE command.  However, /FOLDER is a much
+quicker method, and much more versatile.
+ 
+You can specify logical names which translate  to  one  or  more  folder
+names.   I.e.   $  DEFINE ALL_FOLDERS "VAX1,VAX2,VAX3", and then specify
+ALL_FOLDERS after /FOLDER=.  Note that the quotation marks are required.
+ 
+When using /FOLDER for remote nodes, proxy logins are used to  determine
+if privileged options are allowed.  If they are not allowed, the message
+will still be added, but without the privileged settings.
+`,
+			},
+			{
+				Name: "/LOCAL",
+				Description: `Specifies  that  when  /BROADCAST  is specified for a remote folder, the
+message is broadcasted ONLY on the local node.
+`,
+			},
+			{
+				Name: "/NODES",
+				Description: `/NODES=(nodes[,...])
+ 
+Specifies  to send the message to the listed DECNET nodes.  The BULLETIN
+utility  must  be  installed  properly  on  the   other   nodes.    (See
+installation  notes). You can specify a different username to use at the
+other nodes by either using the USERNAME qualifier, or by specifying the
+nodename   with   2   semi-colons   followed   by   the  username,  i.e.
+nodename::username.  If you specify a username, you will be prompted for
+the password of the account on the other nodes.
+ 
+Additionally,  you  can  specify logical names which translate to one or
+more node names.  I.e.  $ DEFINE ALL_NODES  "VAX1,VAX2,VAX3",  and  then
+specify /NODES=ALL_NODES.  Note that the quotation marks are required.
+ 
+NOTE:  It  is  preferable  to  use /FOLDER instead of /NODE if possible,
+since adding messages via /FOLDER is much quicker.
+`,
+			},
+			{
+				Name: "/NOINDENT",
+				Description: `See /EXTRACT for information on this qualifier.
+`,
+			},
+			{
+				Name: "/NOSIGNATURE",
+				Description: `Specifies to suppress the automatically appended signature, if one exists.
+Signatures are appended for postings to mailing lists and to responds.
+See the help topic POST Signature_file for signature information.
+`,
+			},
+			{
+				Name: "/PERMANENT",
+				Description: `If specified, message will be a permanent message and will never expire.
+If an expiration limit is set, then permament is not allowed unless
+user has privileges.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `/SUBJECT=description
+ 
+Specifies the subject of the message to be added.
+`,
+			},
+			{
+				Name: "/SHUTDOWN",
+				Description: `/SHUTDOWN[=nodename]
+This option is restricted to privileged users.  If specified, message
+will be automatically deleted after a computer shutdown has occurred.
+This option is restricted to SYSTEM folders.
+ 
+If the bulletin files are shared between cluster nodes, the message
+will be deleted after the node on which the message was submitted from
+is rebooted.  If you wish the message to be deleted after a different
+node reboots, you have the option of specifying that node name.
+ 
+NOTE: If the folder is a remote folder, the message will be deleted
+after the remote node reboots, not the node from which the message was
+added.  The nodename cannot be specified with a remote folder.
+`,
+			},
+			{
+				Name: "/SYSTEM",
+				Description: `This option is restricted to privileged users.  If specified, message
+is both saved in the folder and displayed in full as a system message
+when a user logs in.  System messages should be as brief as possible to
+avoid the possibility that system messages could scroll off the screen.
+This option is restricted to SYSTEM folders.
+`,
+			},
+			{
+				Name: "/USERNAME",
+				Description: `Specifies username to be used at remote DECNET nodes when adding messages
+to DECNET nodes via the /NODE qualifier.
+`,
+			},
 		},
 	},
 	{
-		command: "ATTACH",
-		// 2 Parameters
-		// 2 Qualifiers
-		// 2 Examples
+		Command: "ATTACH",
+		Description: `Permits you to switch control of your  terminal  from  your  current
+process to another process in your job.
+ 
+The ATTACH command allows you to move quickly between processes that
+you have created with the SPAWN command.  For example, while you are
+editing a file, you can SPAWN a subprocess to read a new message.
+Enter the ATTACH command to get back to back to the editing session.
+If you want to read another new message, you can use the ATTACH command
+to get back to the BULLETN subprocess you already created.
+ 
+   Format:
+ 
+       ATTACH [/PARENT] [process-name]
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "Parameters",
+				Description: `process-name
+ 
+  Indicates the name of the subprocess to which the connection  is  to
+  be made. Only the /PARENT qualifier or a process-name may be specified.
+ 
+`,
+			},
+			{
+				Name: "Qualifiers",
+				Description: `/PARENT
+ 
+   Allows you to attach to your process' parent process.
+   If there is no parent process an error message is printed.
+ 
+ 
+`,
+			},
+			{
+				Name: "Examples",
+				Description: `  1.   
+       $ SPAWN BULLETIN
+       %DCL-S-SPAWNED, process MAGNANI_3 spawned
+       %DCL-S-ATTACHED, terminal now attached to process MAGNANI_3
+       BULLETIN> ATTACH MAGNANI_2
+       %DCL-S-RETURNED, control returned to process MAGNANI_2
+       $ ATTACH MAGNANI_3
+       BULLETIN>
+ 
+ 
+  This  example  shows  how  to  spawn  subprocesses  (MAGNANI_2   and
+  MAGNANI_3) to move from BULLETIN to DCL back to BULLETIN.  The ATTACH 
+  command  allows you to transfer control between subprocesses.
+ 
+ 
+                                  NOTE
+ 
+      You always SPAWN a new process and ATTACH to a process  that
+      already exists.
+`,
+			},
+		},
 	},
 	{
-		command: "BACK",
+		Command: "BACK",
+		Description: `Displays the message preceding the current message.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used to read the message.  This is
+useful for scanning a long message.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder.  The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders.  If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+			},
+		},
 	},
 	{
-		command: "BULLETIN",
+		Command: "BULLETIN",
+		Description: `The BULLETIN utility permits a user to create a message for reading by
+all users.  Users are notified upon logging in that new messages have
+been added, and what the topic of the messages are.  Actual reading of
+the messages is optional. (See the command SET READNEW for info on
+automatic reading.)  Messages are automatically deleted when their
+expiration date has passed.
+`,
 	},
 	{
-		command: "CHANGE",
-		boolFlags: []string{
-			"/ALL",
-			"/EDIT",
-			"/EXPIRATION",
-			"/GENERAL",
-			"/HEADER",
-			"/NEW",
-			"/NUMBER",
-			"/PERMANENT",
-			"/SHUTDOWN[=nodename]",
-			"/SUBJECT",
-			"/SYSTEM",
-			"/TEXT",
+		Command: "CHANGE",
+		Description: `Replaces or modifies existing stored message.  This is for changing part
+or all of a message without causing users who have already seen the
+message to be notified of it a second time.  You can select qualifiers so
+that either the message text, expiration date, or the header are to be
+changed.  If no qualifier is added, the default is that all these parameters
+are to be changed.  If the text of the message is to be changed, a file can
+be specified which contains the text.  If the editor is used for changing
+the text, the old message text will be extracted.  This can be suppressed
+by the qualifier /NEW.
+ 
+  Format:
+    CHANGE [file-name]
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Makes the changes to all the messages in the folder.  Only the expiration
+date and message headers can be changed if this qualifier is specified.
+`,
+			},
+			{
+				Name: "/EDIT",
+				Description: `/[NO]EDIT
+Determines whether or not the editor is invoked to edit the message
+you are replacing.  The old message text is read into the editor unless
+a file-name or /NEW is specified.  /EDIT is the default if you have
+added /EDIT to your BULLETIN command line.
+`,
+			},
+			{
+				Name: "/EXPIRATION",
+				Description: `/EXPIRATION[=time]
+ 
+Specifies the time at which the message is to expire.  Either absolute
+time: [dd-mmm-yyyy] hh:mm:ss, or delta time: dddd [hh:mm:ss] can be
+used.  If no time is specified, you will be prompted for the time.
+`,
+			},
+			{
+				Name: "/GENERAL",
+				Description: `Specifies that the message is to be converted from a SYSTEM message to
+a GENERAL message.  This only applies to the GENERAL folder.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `Specifies that the message header is to be replaced.  You will be
+prompted for the new message description.
+`,
+			},
+			{
+				Name: "/NEW",
+				Description: `If the editor is to be used for replacing the text of the message,
+NEW specifies not to read in the old message text, and that a totally
+new text is to be read in.
+`,
+			},
+			{
+				Name: "/NUMBER",
+				Description: `/NUMBER=message_number[-message_number1]
+ 
+Specifies the message or messages to be replaced. If this qualifier is 
+omitted, the message that is presently being read will be replaced.
+A range of messages can be specified, i.e. /NUMBER=1-5.  Only the expiration
+date and message headers can be changed if a range is specified.
+ 
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+			},
+			{
+				Name: "/PERMANENT",
+				Description: `Specifies that the message is to be made permanent.
+`,
+			},
+			{
+				Name: "/SHUTDOWN[=nodename]",
+				Description: `Specifies that the message is to expire after the next computer
+shutdown.  This option is restricted to SYSTEM folders.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `/SUBJECT=description
+ 
+Specifies the subject of the message to be added.
+`,
+			},
+			{
+				Name: "/SYSTEM",
+				Description: `Specifies that the message is to be made a SYSTEM message.  This is a
+privileged command and is restricted to SYSTEM folders.
+`,
+			},
+			{
+				Name: "/TEXT",
+				Description: `Specifies that the message text is to be replaced.
+`,
+			},
 		},
 	},
 	{
-		command: "COPY",
-		boolFlags: []string{
-			"/ALL",
-			"/MERGE",
-			"/ORIGINAL",
+		Command: "COPY",
+		Description: `Copies a message to another folder  without  deleting  it  from  the
+current folder.
+ 
+  Format:
+ 
+    COPY folder-name [message_number][-message_number1]
+ 
+The folder-name is the name of the folder to which the message is to be
+copied to.  Optionally, a range of messages which are to be copied can be
+specified following the folder name, i.e. COPY NEWFOLDER 2-5.
+ 
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Specifies to copy all the messages in the old folder.
+`,
+			},
+			{
+				Name: "/GROUPS",
+				Description: `/GROUPS=(newsgroup,[...])
+ 
+Valid only if a NEWS group is selected.  Specifies to send the message to
+the specified NEWS group(s) in addition to the selected NEWS group.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Valid only if destination folder is a news group.  Specifies that header
+of message is to be included with the text when the text is copied.
+The default is /NOHEADER.
+`,
+			},
+			{
+				Name: "/MERGE",
+				Description: `Specifies that the original date and time of the copied messages are
+saved and that the messages are placed in correct chronological order 
+in the new folder.  This operation is lengthy if the new folder is large.
+`,
+			},
+			{
+				Name: "/ORIGINAL",
+				Description: `Specifies that the owner of the copied message will be the original owner
+of the message.  The default is that the copied message will be owned by
+the person copying the message.
+`,
+			},
 		},
 	},
 	{
-		command: "CREATE",
-		boolFlags: []string{
-			"/BRIEF",
-			"/DESCRIPTION",
-			"/ID",
-			"/NODE",
-			"/NOTIFY",
-			"/OWNER",
-			"/PRIVATE",
-			"/READNEW",
-			"/REMOTENAME",
-			"/SHOWNEW",
-			"/SEMIPRIVATE",
-			"/SYSTEM",
+		Command: "CREATE",
+		Description: `Creates a folder of messages.  This is similar to the folders in the VMS
+MAIL utility.  Folders are often created so that messages of  a  similar
+topic are grouped separately, or to restrict reading of certain messages
+to  specified  users.   Once  created,  that  message  is  automatically
+selected  (see information on SELECT command).  The commands that can be
+used to modify the folder's characteristics  are:  MODIFY,  REMOVE,  SET
+ACCESS, SET BBOARD, SET NODE, and SET SYSTEM.
+ 
+  Format:
+    CREATE folder-name
+ 
+The  folder-name is limited to 25 letters and must not include spaces or
+characters that are also invalid  in  filenames  (this  is  because  the
+folder is stored in a file name created with the folder name).
+ 
+NOTE:  Creation  of folders may be a restricted command if the installer
+has  elected  to  install  it  as  such.   This  is  done  by  modifying
+BULLCOM.CLD.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALWAYS",
+				Description: `Specifies that  the  folder  has  the  ALWAYS  attribute.   This  causes
+messages  in  the  folder  to  be displayed differently when logging in.
+SYSTEM messages will be displayed every time a user logs in, rather than
+just  once.   Non-SYSTEM  message  will also be displayed every time (in
+whatever mode is selected, i.e. BRIEF, SHOWNEW, or  READNEW)  until  the
+user  actually  reads  that  message  (or a later one).  This feature is
+meant for messages which are very important, and thus you want  to  make
+sure they are read.
+`,
+			},
+			{
+				Name: "/BRIEF",
+				Description: `Specifies that all users automatically have BRIEF set for this folder.
+Only a privileged user can use this qualifier.  (See HELP SET BRIEF for
+more information.)
+`,
+			},
+			{
+				Name: "/DESCRIPTION",
+				Description: `/DESCRIPTION=description
+ 
+Specifies the description of the folder, which is displayed using the
+SHOW FOLDER command.  If omitted, you are prompted for a description.
+ 
+If this folder is to receive messages from a network mailing list
+via the BBOARD feature, and you wish to use the POST and RESPOND/LIST
+commands, the address of the mailing list should be included in the
+description.  This is done by enclosing the address using <> and
+placing it at the end of the description, i.e.
+ 
+              INFOVAX MAILING LIST <INFO-VAX@KL.SRI.COM>
+ 
+If a mailer protocol is needs to be added to the network address in
+order for it to be sent by VMS MAIL, i.e. protocol%"address",  the
+appropriate protocol can be specified by either hardcoding it into the
+file BULLNEWS.INC before compiling BULLETIN, or by defining the system
+logical name BULL_NEWS_MAILER (it is the same protocol used by the NEWS
+feature in order to respond to NEWS messages).  The default protocol is
+IN%.  If desired, you can specify the protocol with the address, i.e. 
+ 
+              INFOVAX MAILING LIST <IN%"INFO-VAX@KL.SRI.COM">
+`,
+			},
+			{
+				Name: "/ID",
+				Description: `Designates that the name specified as the owner name is a rights
+identifier.  The creator's process must have the identifier presently
+assigned to it.  Any process which has that identifier assigned to it
+will be able to control the folder as if it were the folder's owner.
+This is used to allow more than one use to control a folder.
+ 
+Note: This feature will not work during remote access to the folder.
+`,
+			},
+			{
+				Name: "/NODE",
+				Description: `/NODE=node
+ 
+Specifies that the folder is a remote folder at the specified node.
+A remote folder is a folder in which the messages are actually stored
+on a folder at a remote DECNET node.  The specified node is checked to
+see if a folder of the same name is located on that node.  If so, the
+folder will then be modified to point to that folder.  For example if
+there was a folder on node A with name INFO, and you issued the command:
+                        CREATE INFO/NODE=A
+from node B, then if INFO is selected on node B, you will actually
+obtain the folder INFO on node A.  In this manner, a folder can be shared
+between more than one node. This capability is only present if the BULLCP
+process is running on the remote node via the BULL/STARTUP command.
+If the remote folder name is different from the local folder name, the
+remote folder name is specified using the /REMOTENAME qualifier.
+ 
+NOTE: If a message is added to a remote node, the message is stored
+immediately.  However, a user logging into another node might not be
+immediately alerted that the message is present.  That information is
+only updated every 15 minutes (same algorithm for updating BBOARD
+messages), or if a user accesses that folder.  Thus, if the folder is
+located on node A, and the message is added from node B, and a user logs
+in to node C, the BULLETIN login notification might not notify the user
+of the message.  However, if the message is added with /BROADCAST, the
+message will be broadcasted immediately to all nodes.
+`,
+			},
+			{
+				Name: "/NOTIFY",
+				Description: `Specifies that all users automatically have NOTIFY set for this folder.
+Only a privileged user can use this qualifier.  (See HELP SET NOTIFY for
+more information.)
+`,
+			},
+			{
+				Name: "/OWNER",
+				Description: `/OWNER=username
+Specifies the owner of the folder.  This is a privileged command.
+See also /ID.
+`,
+			},
+			{
+				Name: "/PRIVATE",
+				Description: `Specifies that the folder can only be accessed by users who have been
+granted access via the SET ACCESS command.  Note: This option uses ACLs
+and users who are granted access must be entered into the Rights Data Base.
+If the RDB does not exist on your system, a privileged user will have to
+create it.  If a user is not in the RDB, this program will automatically
+enter the user into it (unless this feature was disabled  during the
+compilation of this program).  NOTE: See HELP SET ACCESS for more info.
+`,
+			},
+			{
+				Name: "/READNEW",
+				Description: `Specifies that all users automatically have READNEW set for this folder.
+Only a privileged user can use this qualifier.  (See HELP SET READNEW for
+more information.)
+`,
+			},
+			{
+				Name: "/REMOTENAME",
+				Description: `/REMOTENAME=foldername
+Valid only if /NODE is present, i.e. that the folder is a remote folder.
+Specifies the name of the remote folder name.  If not specified, it is
+assumed that the remote name is the same as the local name.
+`,
+			},
+			{
+				Name: "/SHOWNEW",
+				Description: `Specifies that all users automatically have SHOWNEW set for this folder.
+Only a privileged user can use this qualifier.  (See HELP SET SHOWNEW for
+more information.)
+`,
+			},
+			{
+				Name: "/SEMIPRIVATE",
+				Description: `Similar to /PRIVATE, except that the folder is restricted only with
+respect to adding or modifying messages.  All users can read the folder.
+`,
+			},
+			{
+				Name: "/SYSTEM",
+				Description: `Specifies that the folder is a SYSTEM folder.  A SYSTEM folder is
+allowed to have SYSTEM and SHUTDOWN messages added to it.  By default,
+the GENERAL folder is a SYSTEM folder.  This is a privileged command.
+ 
+If this is a remote folder, /SYSTEM cannot be specified unless the
+folder at the other node is also a SYSTEM folder.
+`,
+			},
 		},
 	},
 	{
-		command: "CURRENT",
-		boolFlags: []string{
-			"/EDIT",
+		Command: "Ctrl-C",
+		Description: `Except for when BULLETIN is awaiting input from the terminal, a 
+CTRL-C will cause BULLETIN to abort the execution of any command.  If
+BULLETIN is waiting for terminal input, a CTRL-C will cause BULLETIN
+to return to the BULLETIN> prompt.  If for some reason the user wishes
+to suspend BULLETIN, CTRL-Y will usually do so.  However, this is not
+always true, as BULLETIN will ignore the CTRL-Y if it has a data file
+opened at the time. (Otherwise it would be possible to put the files
+in a state such that they would be inaccessible by other users.)
+`,
+	},
+	{
+		Command: "CURRENT",
+		Description: `Displays the beginning of the message you are currently reading.  If
+you  are  reading  a long message and want to display the first part
+of the message again, you can enter the CURRENT command.
+ 
+  Format:
+ 
+    CURRENT
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used to read the message.  This is
+useful for scanning a long message.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder.  The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders.  If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+			},
 		},
 	},
 	{
-		command: "DELETE",
-		boolFlags: []string{
-			"/ALL",
-			"/IMMEDIATE",
-			"/NODES",
-			"/SUBJECT",
-			"/USERNAME",
+		Command: "DELETE",
+		Description: `Deletes the specified message.  If no message is specified, the current
+message is deleted.  Only the original owner or a privileged user can
+delete a message.  Note that the message is not deleted immediately, but
+its expiration is set 15 minutes in the future.  This is to allow a user
+to recover the message using the UNDELETE command.  If you want the
+message deleted immediately, use the /IMMEDIATE qualifier.
+ 
+  Format:
+    DELETE [message_number][-message_number1]
+ 
+The message's relative number is found by the DIRECTORY command.  It is
+possible to delete a range of messages by specifying two numbers
+separated by a dash, i.e. DELETE 1-5.  However, a range cannot be
+specified if the folder is remote.
+ 
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Specifies to delete all the messages in the folder.  Note:  This will
+not work for remote folders.  Only one message can be deleted from a
+remote folder at a time.
+`,
+			},
+			{
+				Name: "/IMMEDIATE",
+				Description: `Specifies that the message is to be deleted immediately.
+`,
+			},
+			{
+				Name: "/NODES",
+				Description: `/NODES=(nodes[,...])
+ 
+Specifies to delete the message at the listed DECNET nodes.  The BULLETIN
+utility must be installed properly on the other nodes.  You can specify
+a different username to use at the other nodes by either using the
+USERNAME qualifier, or by specifying the nodename with 2 semi-colons
+followed by the username, i.e. nodename::username.  If you specify a
+username, you will be prompted for the password of the account on the
+other nodes.  The /SUBJECT must be specified to identify the specific
+message that is to be deleted.
+ 
+Additionally, you can specify logical names which translate to one or
+more node names.  I.e.  $ DEFINE ALL_NODES "VAX1,VAX2,VAX3", and then
+specify /NODES=ALL_NODES.  Note that the quotation marks are required.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `/SUBJECT=subject
+ 
+Specifies the subject of the bulletin to be deleted at a remote DECNET
+node.  The DECNET node must be specified with the /NODE qualifier.
+The specified subject need not be the exact subject of the message.
+It can be a substring of the subject.  This is in case you have forgotten
+the exact subject that was specified.  Case is not critical either.
+You will be notified if the deletion was successful.
+`,
+			},
+			{
+				Name: "/USERNAME",
+				Description: `Specifies username to be used at remote DECNET nodes when deleting messages
+on other DECNET nodes via the /NODE qualifier.
+`,
+			},
 		},
 	},
 	{
-		command: "DIRECTORY",
-		boolFlags: []string{
-			"/DESCRIBE",
-			"/EXPIRATION",
-			"/FOLDERS",
-			"/MARKED",
-			"/NEW",
-			"/REPLY",
-			"/SEARCH",
-			"/SINCE",
-			"/START",
-			"/SUBJECT",
+		Command: "DIRECTORY",
+		Description: `Lists a summary of the messages.  The message number, submitter's name,
+date, and subject of each message is displayed.
+ 
+  Format:
+ 
+    DIRECTORY [folder]
+ 
+If  a  folder is specified, that folder is selected before the directory
+is listed.  Unless otherwise specified, listing starts  with  the  first
+newest message.  If there are no new messages, listing will start at the
+first message, or if a message has already been read, it will  start  at
+that message.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Lists all messages.  Used if the qualifiers /MARKED, /UNMARKED, /SEEN,
+or /UNSEEN were previously specified. 
+`,
+			},
+			{
+				Name: "/DESCRIBE ",
+				Description: `Valid when used with /FOLDERS.  Specifies to include description of
+folder. 
+`,
+			},
+			{
+				Name: "/EXPIRATION",
+				Description: `Shows the message's expiration date rather than the creation date.
+`,
+			},
+			{
+				Name: "/END",
+				Description: `/END=message_number
+ 
+Indicates the last message number you want to display.
+`,
+			},
+			{
+				Name: "/FOLDERS",
+				Description: `Lists the available message folders.  Shows last message date and number
+of  messages  in  folder.   An asterisk (*) next to foldername indicates
+that there are unread messages in  that  folder.   This  will  not  show
+newsgroups.  To see newsgroups, use the NEWS command or DIR/NEWS.
+`,
+			},
+			{
+				Name: "/MARKED",
+				Description: `Lists messages that have been marked (indicated by an asterisk).
+This is equivalent to selecting the folder with /MARKED, i.e. only
+marked messages will be shown and be able to be read.  To see all
+messages, use either /ALL, or reselect the folder. 
+`,
+			},
+			{
+				Name: "/UNMARKED",
+				Description: `Lists messages that have not been marked (marked messages are indicated
+by an asterisk).  Using /UNMARKED is equivalent to selecting the folder
+with /UNMARKED, i.e. only unmarked messages will be shown and be able
+to be read.  To see all messages, use either /ALL, or reselect the
+folder. 
+`,
+			},
+			{
+				Name: "/SEEN",
+				Description: `Lists messages that have been seen (indicated by a greater than sign). 
+Using /SEEN is equivalent to selecting the folder with /SEEN, i.e. only
+seen messages will be shown and be able to be read.  To see all
+messages, use either /ALL, or reselect the folder. 
+`,
+			},
+			{
+				Name: "/UNSEEN",
+				Description: `Lists messages that have not been seen (seen message are indicated by a
+greater than sign). Using /UNSEEN is equivalent to selecting the folder
+with /UNSEEN, i.e. only unseen messages will be shown and be able to be
+read.  To see all messages, use either /ALL, or reselect the folder. 
+`,
+			},
+			{
+				Name: "/NEW",
+				Description: `Specifies  to  start  the  listing  of  messages  with  the first unread
+message.
+`,
+			},
+			{
+				Name: "/NEWS",
+				Description: `Lists the available news groups.  This does the same thing as  the  NEWS
+command.  See that command for qualifiers which apply.
+`,
+			},
+			{
+				Name: "/PRINT",
+				Description: `Specifies that the text of the messages which are found by the
+DIRECTORY command are to be printed.  All qualifiers which are valid
+for the PRINT command are valid in conjunction with /PRINT.  The list
+of messages to be printed will be displayed on the terminal (in
+nopaging format). 
+`,
+			},
+			{
+				Name: "/REPLY",
+				Description: `Specifies that only messages which are replies to the current message
+are to be displayed.  This cannot be used in conjunction with /MARKED.
+`,
+			},
+			{
+				Name: "/SEARCH",
+				Description: `/SEARCH=[string]
+ 
+Specifies that only messages which contain the specified string are
+to be displayed.  This cannot be used in conjunction with /MARKED.
+If no string is specified, the previously specified string is used.
+`,
+			},
+			{
+				Name: "/SINCE",
+				Description: `/SINCE=date
+ 
+Displays a listing of all the messages created on or after the
+specified date.  If no date is specified, the default is TODAY.
+`,
+			},
+			{
+				Name: "/START",
+				Description: `/START=message_number
+ 
+Indicates the first message number you want to display.  For example,
+to  display  all the messages beginning with number three, enter the
+command line DIRECTORY/START=3.  Not valid with /FOLDER.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `/SUBJECT=[string]
+ 
+Specifies that only messages which contain the specified string in it's
+subject header are to be displayed.  This cannot be used in conjunction
+with /MARKED.  If no string is specified, the previously specified string
+is used.
+`,
+			},
 		},
 	},
 	{
-		command: "EXIT",
+		Command: "EXIT",
+		Description: `Exits the BULLETIN program.
+`,
 	},
 	{
-		command: "EXTRACT",
+		Command: "EXTRACT",
+		Description: `Synonym for FILE command.
+`,
 	},
 	{
-		command: "FILE",
-		boolFlags: []string{
-			"/ALL",
-			"/FF",
-			"/HEADER",
-			"/NEW",
+		Command: "FILE",
+		Description: `Copies the current message to the named file.  The file-name parameter
+is required.  If the file exists, the message is appended to the file,
+unless the /NEW qualifier is specified.
+ 
+  Format:
+    FILE filename [message_number][-message_number1],[...]
+ 
+A range of messages to be copied can optionally be specified, i.e.
+FILE 2-5.
+ 
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Copies all the messages in the current folder.
+`,
+			},
+			{
+				Name: "/FF",
+				Description: `Specifies that a form feed is placed between messages in the file.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Controls whether a header containing the owner, subject, and date of the 
+message is written in the file.  The default is to write the header.
+`,
+			},
+			{
+				Name: "/NEW",
+				Description: `Specifies that a new file is to be created.  Otherwise, if the specified
+file exists, the file would be appended to that file.
+`,
+			},
 		},
 	},
 	{
-		command: "Folders",
+		Command: "FIRST",
+		Description: `Specifies that the first message in the folder is to be read.
+`,
 	},
 	{
-		command: "HELP",
+		Command: "FORWARD",
+		Description: `Synonym for MAIL command.
+`,
 	},
 	{
-		command: "INDEX",
-		boolFlags: []string{
-			"/MARKED",
-			"/NEW",
-			"/RESTART",
+		Command: "Folders",
+		Description: `All messages are divided into separate folders.  The default folder is
+GENERAL.  New folders can be created by any user.  As an example, the
+following creates a folder for GAMES related messages: 
+ 
+BULLETIN> CREATE GAMES
+Enter a one line description of folder.
+GAMES
+ 
+To see the list of available folders, use DIRECTORY/FOLDERS.  To select
+a specific folder, use the SELECT command.  
+ 
+If a user selects a folder and enters the SET READNEW command, that
+user will be alerted of topics of new messages at login time, and will 
+then be given the option of reading them.  Similar to READNEW is SHOWNEW,
+which displays the topics but doesn't prompt to read them.  Even less is
+SET BRIEF, which will cause only a one line output indicating that there
+are new messages in the folder.  There also is the SET NOTIFY option,
+which will cause a message to be broadcast to a user's terminal alerting
+the user that a new message has been added.  Any of these options can be
+the default for the folder by using the /DEFAULT switch on the command.
+ 
+A folder can be restricted to only certain users, if desired.  This is 
+done by specifying CREATE/PRIVATE.  Afterwards, access to the folder is 
+controlled by the creator by the SET [NO]ACCESS command.  If /SEMIPRIVATE
+rather than /PRIVATE is specified, all users can read the messages in the
+folder, but only those give access can add messages.
+ 
+A folder can be converted into a remote folder using CREATE/NODE or SET
+NODE.  A remote folder is one which points to a folder on a remote DECNET
+node.  Messages added to a remote node are actually stored on the folder
+on the remote node.  The BULLCP process (created by BULLETIN/STARTUP)
+must be running on the remote node for this option to be used.
+ 
+A folder can be specified as a SYSTEM folder, i.e. one in which SYSTEM/
+SHUTDOWN/BROADCAST messages can be added.  By default, the GENERAL folder
+is a SYSTEM folder (and cannot be changed).  One use for this is to create
+a remote SYSTEM folder which is shared by all nodes, so that the GENERAL
+folder is used for messages pertaining only to the local host, while the
+remote folder is used for messages pertaining to all nodes.  Another
+use is to create a folder for posting SYSTEM messages only meant for a
+certain UIC group.  This is done by creating a PRIVATE SYSTEM folder, and
+giving access to that UIC group.  Only users in that UIC group will see
+the messages in that folder when they log in.
+`,
+	},
+	{
+		Command: "HELP",
+		Description: `To obtain help on any topic, type:
+ 
+        HELP  topic
+`,
+	},
+	{
+		Command: "INDEX",
+		Description: `Gives directory listing of all folders in alphabetical order. If the
+INDEX command is re-entered while the listing is in progress, the listing
+will skip to the next folder.  This is useful for skipping a particular
+folder.  It also can be used to continue the listing from where one left
+off after one has read a message.
+ 
+  Format:
+       INDEX
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/MARKED",
+				Description: `Lists messages that have been marked (marked messages are indicated by
+an asterisk).  This is equivalent to selecting the folder with /MARKED,
+i.e. only marked messages will be shown and be able to be read. 
+`,
+			},
+			{
+				Name: "/UNMARKED",
+				Description: `Lists messages that have not been marked (marked messages are indicated
+by an asterisk).  Using /UNMARKED is equivalent to selecting the folder
+with /UNMARKED, i.e. only unmarked messages will be shown and be able
+to be read.
+`,
+			},
+			{
+				Name: "/SEEN",
+				Description: `Lists messages that have been seen (indicated by a greater than sign). 
+Using /SEEN is equivalent to selecting the folder with /SEEN, i.e. only
+seen messages will be shown and be able to be read.
+`,
+			},
+			{
+				Name: "/UNSEEN",
+				Description: `Lists messages that have not been seen (seen message are indicated by a
+greater than sign). Using /UNSEEN is equivalent to selecting the folder
+with /UNSEEN, i.e. only unseen messages will be shown and be able to be
+read.
+`,
+			},
+			{
+				Name: "/NEW",
+				Description: `Specifies to start the listing of each folder with the first unread message.
+Otherwise, the listing will start with the first message in the folder.
+If the INDEX command is re-entered for continuing the listing, /NEW must
+be respecified.
+`,
+			},
+			{
+				Name: "/RESTART",
+				Description: `If specified, causes the listing to be reinitialized and start from the
+first folder.
+`,
+			},
+			{
+				Name: "/SUBSCRIBE",
+				Description: `If specified, lists only those news folders which have been subscribed to.
+`,
+			},
 		},
 	},
 	{
-		command: "KEYPAD",
+		Command: "KEYPAD",
+		Description: `+--------+--------+--------+--------+
+             | PF1    | PF2    | PF3    | PF4    |
+             |   GOLD |   HELP | EXTRACT|SHOW KEY|
+             |        |ST NOKEY|  FILE  |SH KY/PR|
+             |--------|--------|--------|--------|
+             | 7      | 8      | 9      | --     |
+             |  ADD   | REPLY  |  MAIL  |READ/NEW|
+             | ADD/EDI|RP/ED/EX|M/NOHEAD|SHOW NEW|
+             |--------|--------|--------|--------|
+             | 4      | 5      | 6      | ,      |
+             | CURRENT| RESPOND|  LAST  | DIR/NEW|
+             |CURR/EDI|RS/ED/EX|        |  INDEX |
+             |--------|--------|--------|--------|
+             | 1      | 2      | 3      |ENTER   |
+             |  BACK  |  PRINT |   DIR  |        |
+             |  NEXT  |P/NONOTI|DIR/FOLD|        |
+             |--------+--------|--------| ENTER  |
+             | 0               | .      | SELECT |
+             | SHOW FOLDER/FULL| DELETE |        |
+             |    SHOW FLAGS   | UNDELE |        |
+             +-----------------+--------+--------+
+`,
 	},
 	{
-		command: "LAST",
+		Command: "LAST",
+		Description: `Displays the last message in the current folder.
+ 
+  Format:
+       LAST
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used to read the message.  This is
+useful for scanning a long message.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder.  The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders.  If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+			},
+		},
 	},
 	{
-		command: "MAIL",
-		boolFlags: []string{
-			"/HEADER",
-			"/SUBJECT",
+		Command: "MAIL",
+		Description: `Invokes the VAX/VMS Personal Mail Utility (MAIL) to send the message
+which you are reading to the specified recipients.
+ 
+  Format:
+ 
+    MAIL recipient-name[s]
+ 
+The input for the recipient name is exactly the same format as used by
+the MAIL command at DCL level.  Note that this means when specifying an
+address that has quotes, in order to pass the quotes you must specify
+triple quotes.  I.e. a network address of the form xxx%"address" must
+be specified as xxx%"""address""".
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used to edit the message before
+mailing it.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Controls whether a header containing the owner, subject, and date of the 
+message is written in the mail.  The default is to write the header.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `/SUBJECT=text
+ 
+Specifies the subject of the mail message. If the text consists of more
+than one word, enclose the text in quotation marks (").
+ 
+If you omit this qualifier, the description of the message will be used
+as the subject.
+`,
+			},
 		},
 	},
 	{
-		command: "MARK",
+		Command: "MARK",
+		Description: `Sets the current or message-id message as marked. Marked messages are
+displayed with an asterisk in the left hand column of the directory
+listing.  A marked message can serve as a reminder of important
+information.  The UNMARK command sets the current or message-id message
+as unmarked.
+ 
+   Format:
+ 
+       MARK [message-number or numbers]
+       UNMARK [message-number or numbers]
+ 
+NOTE: The list of marked messages for non-NEWS folders are stored in a
+file username.BULLMARK, and NEWS folders are stored in
+username.NEWSMARK. The files are created in the directory pointed to by
+the logical name BULL_MARK.  If BULL_MARK is not defined, SYS$LOGIN
+will be used. 
+`,
 	},
 	{
-		command: "MODIFY",
-		boolFlags: []string{
-			"/DESCRIPTION",
-			"/ID",
-			"/NAME",
-			"/OWNER",
+		Command: "MODIFY",
+		Description: `Modifies the database information for the current folder.  Only the
+owner of the folder or a user with privileges can use this command. 
+ 
+  Format:
+ 
+    MODIFY
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/DESCRIPTION",
+				Description: `Specifies a new description for the folder.  You will be prompted for
+the text of the description.
+ 
+NOTE: If this folder is to receive messages from a network mailing list
+via the BBOARD feature, and you wish to use the POST and RESPOND/LIST
+commands, the address of the mailing list should be included in the
+description.  This is done by enclosing the address using <> and
+placing it at the end of the description, i.e.
+ 
+              INFOVAX MAILING LIST <IN%"INFO-VAX@KL.SRI.COM">
+`,
+			},
+			{
+				Name: "/ID",
+				Description: `Designates that the name specified as the owner name is a rights
+identifier.  The creator's process must have the identifier presently
+assigned to it.  Any process which has that identifier assigned to it
+will be able to control the folder as if it were the folder's owner.
+This is used to allow more than one use to control a folder.
+ 
+Note: This feature will not work during remote access to the folder.
+`,
+			},
+			{
+				Name: "/NAME",
+				Description: `/NAME=foldername
+ 
+Specifies a new name for the folder.
+`,
+			},
+			{
+				Name: "/OWNER",
+				Description: `/OWNER=username
+ 
+Specifies a new owner for the folder.  If the owner does not have
+privileges, BULLETIN will prompt for the password of the new owner
+account in order to okay the modification.  See also /ID.
+`,
+			},
 		},
 	},
 	{
-		command: "MOVE",
-		boolFlags: []string{
-			"/ALL",
-			"/MERGE",
-			"/ORIGINAL",
+		Command: "MOVE",
+		Description: `Moves a message to another  folder and deletes it from  the  current
+folder.
+ 
+  Format:
+ 
+    MOVE folder-name [message_number][-message_number1]
+ 
+The folder-name is the name of the folder to which the message is to be
+be moved to.  Optionally, a range of messages which are to be moved can be
+specified following the folder name, i.e. COPY NEWFOLDER 2-5.  However,
+if the old folder is remote, they will be copied but not deleted, as
+only one message can be delted from a remote folder at a time.
+ 
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Specifies to move all the messages from the old folder.  Note:  If the
+old folder is remote, they will be copied but not deleted, as only one
+message can be deleted from a remote folder at a time.
+`,
+			},
+			{
+				Name: "/GROUPS",
+				Description: `/GROUPS=(newsgroup,[...])
+ 
+Valid only if a NEWS group is selected.  Specifies to send the message to
+the specified NEWS group(s) in addition to the selected NEWS group.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Valid only if destination folder is a news group.  Specifies that header
+of message is to be included with the text when the text is copied.
+The default is /NOHEADER.
+`,
+			},
+			{
+				Name: "/MERGE",
+				Description: `Specifies that the original date and time of the moved messages are
+saved and that the messages are placed in correct chronological order 
+in the new folder.  This operation is lengthy if the new folder is large.
+`,
+			},
+			{
+				Name: "/ORIGINAL",
+				Description: `Specifies that the owner of the moved message will be the original owner
+of the message.  The default is that the moved message will be owned by
+the person moving the message.
+`,
+			},
+		},
+	},
+	{
+		Command: "NEWS",
+		Description: `Displays the list of available news groups.
+ 
+Format:
+ 
+	NEWS [string]
+ 
+If  the  string is specified, lists news groups whose name contains that
+string.  If the string contains an asterisk, a wild card match  will  be
+applied.   I.e.  if ALT* is specified, all groups starting with ALT will
+be displayed.
+ 
+The  status  column of the display  shows the status of the news  group.
+"y"  means the news group is available.  "m"  means  the  news  group is
+moderated, and posting may or may not be allowable.  "x" means the  news
+group has been deactived by the local server.  "=" means the news  group
+has been renamed.  The new name is shown on the display line immediately
+following the old name.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/NEWGROUP",
+				Description: `If specified, will list new news groups that have been added since the
+last time that a user has accessed a news group.  If there are new
+groups, a user will see a message indicating that there are new groups
+when the user accesses a news group.
+`,
+			},
+			{
+				Name: "/START",
+				Description: `/START=string
+ 
+If specified, the list will start with the  first  group  which  follows
+alphabetically  after  that  string.  I.e. if /START=B is specified, the
+list will start with groups whose name starts with a B.
+`,
+			},
+			{
+				Name: "/SUBSCRIBE",
+				Description: `If specified, lists only those news folders which have been subscribed to.
+An asterisk before the group indicates that new messages are present for
+that folder.
+`,
+			},
 		},
 	},
 	{
-		command: "NEXT",
+		Command: "NEXT",
+		Description: `Skips to the next message and displays it.  This is useful when paging
+through the messages and you encounter a particularly long message
+that you would like to skip over.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used to read the message.  This is
+useful for scanning a long message.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder.  The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders.  If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+			},
+		},
 	},
 	{
-		command: "POST",
-		boolFlags: []string{
-			"/CC",
-			"/EDIT",
-			"/EXTRACT",
-			"/NOINDENT",
-			"/SUBJECT",
+		Command: "POST",
+		Description: `If a NEWS group is selected, posts a message to that group.  If a normal
+folder is selected, sends a message via MAIL to the network mailing list
+which  is  associated  with  the  selected  folder.   The address of the
+mailing  list  must  be  stored  using  either   CREATE/DESCRIPTION   or
+MODIFY/DESCRIPTION.  See help on those commands for more information.
+ 
+  Format:
+    POST [file-name]
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/CC",
+				Description: `/CC=user[s]
+Specifies additional users that should receive the mail message.
+`,
+			},
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used for creating the mail message.
+`,
+			},
+			{
+				Name: "/EXTRACT",
+				Description: `Specifies that the text of the message that is being read should be
+included in the mail message.  This qualifier is valid only when used
+with /EDIT.  The text of the message is indented with > at the
+beginning of each line.  This can be suppressed with /NOINDENT.
+`,
+			},
+			{
+				Name: "/GROUPS",
+				Description: `/GROUPS=(newsgroup,[...])
+ 
+Valid only if a NEWS group is selected.  Specifies to send the message to
+the specified NEWS group(s) in addition to the selected NEWS group.
+`,
+			},
+			{
+				Name: "/NOINDENT",
+				Description: `See /EXTRACT for information on this qualifier.
+`,
+			},
+			{
+				Name: "/NOSIGNATURE",
+				Description: `Specifies to suppress the automatically appended signature, if one exists.
+Signatures are appended for postings to mailing lists and to responds.
+See the help topic POST Signature_file for signature information.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `/SUBJECT=text
+ 
+Specifies the subject of the mail message. If the text consists of more
+than one word, enclose the text in quotation marks (").
+ 
+If you omit this qualifier, you will prompted for the subject.
+`,
+			},
+			{
+				Name: "Signature_file",
+				Description: `It is possibly to have the contents of a file be automatically appended
+to the end of a message added with the POST and/or the RESPOND command.
+This file is known as a signature file, and it typically contains one's
+name, address, or perhaps a favorite quote.  The name of the file should
+be SYS$LOGIN:BULL_SIGNATURE.TXT, and it should be a simple text file.  In
+order to specify a different file to use, define the logical name
+BULL_SIGNATURE to point to the desired file.
+ 
+It is possible to specify that portions or all of the signature file are
+to be included only for specific folders or news groups.  Simply surround
+the exclusive text starting with the line "START <folder-name>" and ending
+with the line "END", i.e.
+ 
+START INFOVAX
+This line will only appear in the INFOVAX folder.
+END
+START MISC.TEST
+This line will only appear in the news folder MISC.TEST.
+END
+This line will appear in all postings.
+ 
+Note that an empty line is automatically created to separate the text of
+the message and the contents of the signature file.
+`,
+			},
 		},
 	},
 	{
-		command: "PRINT",
-		boolFlags: []string{
-			"/ALL",
-			"/FORM",
-			"/HEADER",
-			"/NOTIFY",
-			"/QUEUE",
+		Command: "PRINT",
+		Description: `Queues a copy of the message you are currently  reading  (or  have 
+just read)  for  printing.   The file created by the PRINT command
+is not released to the print queue until you exit, unless you add
+the qualifier /NOW or change one of the print job's qualifiers.
+Multiple messages are concatenated into one print job.
+ 
+   Format:
+ 
+       PRINT [message_number][-message_number1],[...]
+ 
+A range of messages to be printed can optionally be specified, i.e.
+PRINT 2-5.
+ 
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+ 
+NOTE:  The qualifier /PRINT is present on the DIRECTORY command.  This
+provides more flexibility than is present with the PRINT command.  For
+example, if you want to print all messages with a particular string in
+it's subject line, DIRECTORY/PRINT/SUBJ would allow you do it.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Prints all the messages in the current folder.
+`,
+			},
+			{
+				Name: "/FORM",
+				Description: `Specifies the name or number of the form that you want for the print
+job.  Codes for form types are installation-defined.  You can use the
+SHOW QUEUE/FORM command at DCL level to find out the form types
+available for your system.  Use the SHOW QUEUE/FULL command at DCL
+level to find out the name of the mounted form and the default form for
+a particular queue.  If you specify a form whose stock is different
+from the stock of the form mounted on the queue, your job is placed in
+a pending state until the stock of the mounted form of the queue is
+set equal to the stock of the form associated with the job.  (In order
+to have your job print, the system manager should stop the queue,
+physically change the paper stock on the output device, and restart the
+queue specifying the new form type as the mounted form.)
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Controls whether a header containing the owner, subject, and date of the 
+message is printed at the beginning. The default is to write the header.
+`,
+			},
+			{
+				Name: "/NOTIFY",
+				Description: `/[NO]NOTIFY
+ 
+Indicates that you will be notified by a broadcast message  when  the
+file or files have been printed.  If /NONOTIFY is specified, there
+is no notification.  The default is /NOTIFY.
+`,
+			},
+			{
+				Name: "/NOW",
+				Description: `Sends all messages that have been queued for printing with the PRINT
+command during this session to the printer. 
+`,
+			},
+			{
+				Name: "/QUEUE",
+				Description: `/QUEUE=queue_name
+ 
+The name of the queue to which a message is to be sent.  If the /QUEUE
+qualifier  is  not  specified,  the message is queued to SYS$PRINT.
+`,
+			},
 		},
 	},
 	{
-		command: "READ",
-		boolFlags: []string{
-			"/EDIT",
-			"/MARKED",
-			"/NEW",
-			"/PAGE",
-			"/SINCE",
+		Command: "READ",
+		Description: `Displays  the  specified message.  If you do not specify a message, then
+the first time you enter the command, the first message  in  the  folder
+will  be  displayed.   However, if there are new messages, the first new
+message will be displayed.  Each time you enter the  command,  the  next
+page, or if there are no more pages, the next message will be displayed.
+ 
+  Format:
+    READ [message-number]
+ 
+The message's relative number is found by the DIRECTORY command.
+If you specify a number greater than the number of messages in the
+folder, the last message in the folder will be displayed.
+ 
+NOTE: The READ command can be abbreviated by omitting the READ command,
+i.e. typing the command "2" is equivalent to "READ 2", and simply
+hitting the <RETURN> key is equivalent to "READ". 
+ 
+BULLETIN normally stores only the latest message that has been read per
+folder. It can optionally store and display which messages have been
+read in a folder on a per message basis.  For information on this, see
+the help on the SEEN command. 
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/ALL",
+				Description: `Specifies to read all messages.  Used after /MARKED, /UNMARKED, /SEEN,
+or /UNSEEN had been specified.
+`,
+			},
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used to read the message.  This is
+useful for scanning a long message.
+`,
+			},
+			{
+				Name: "/HEADER",
+				Description: `/[NO]HEADER
+ 
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder.  The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders.  If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+			},
+			{
+				Name: "/MARKED",
+				Description: `Specifies to read only messages that have been marked (marked messages
+are indicated by an asterisk).  Using /MARKED is equivalent to
+selecting the folder with /MARKED, i.e. only marked messages will be
+shown and be able to be read.   To see all messages, use either /ALL,
+or reselect the folder. 
+`,
+			},
+			{
+				Name: "/UNMARKED",
+				Description: `Specifies to read only messages that have not been marked (marked
+messages are indicated by an asterisk).  Using /UNMARKED is equivalent
+to selecting the folder with /UNMARKED, i.e. only unmarked messages
+will be shown and be able to be read.  To see all messages, either
+reselect the folder or specify /ALL.
+`,
+			},
+			{
+				Name: "/SEEN",
+				Description: `Specifies to read only messages that have been seen (indicated by a
+greater than sign). Using /SEEN is equivalent to selecting the folder
+with /SEEN, i.e. only seen messages will be shown and be able to be
+read.  To see all messages, use either /ALL, or reselect the folder. 
+`,
+			},
+			{
+				Name: "/UNSEEN",
+				Description: `Specifies to read only messages that have not been seen (seen message
+are indicated by a greater than sign). Using /UNSEEN is equivalent to
+selecting the folder with /UNSEEN, i.e. only unseen messages will be
+shown and be able to be read.  To see all messages, use either /ALL, or
+reselect the folder. 
+`,
+			},
+			{
+				Name: "/NEW",
+				Description: `Specifies to read the first unread message.
+`,
+			},
+			{
+				Name: "/PAGE",
+				Description: `/[NO]PAGE
+ 
+Specifies that the display of the message will pause when it reaches the
+end of the page.  If /NOPAGE is specified, the whole message will be
+displayed.  This is useful for terminals that can store more than one
+screenful at a time, and that have a remote printer that can then print
+the contents of the terminal's memory.
+`,
+			},
+			{
+				Name: "/SINCE",
+				Description: `/SINCE=date
+ 
+Specifies to read the first message created on or after the specified
+date.  If no date is specified, the default is TODAY.
+`,
+			},
 		},
 	},
 	{
-		command: "REMOVE",
+		Command: "REMOVE",
+		Description: `Removes a folder.  Only the owner of a folder or a privileged  user  can
+remove the folder.
+ 
+  Format:
+    REMOVE folder-name
+`,
 	},
 	{
-		command: "REPLY",
-		boolFlags: []string{
-			"/EXTRACT",
-			"/NOINDENT",
+		Command: "REPLY",
+		Description: `Adds message with subject of message being the subject of the  currently
+read message with "RE:" preceeding it.  Format and qualifiers is exactly
+the same as the ADD command except for /NOINDENT and /EXTRACT.
+ 
+  Format:
+    REPLY [file-name]
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/EXTRACT",
+				Description: `Specifies that the text of the message should be included in the reply
+mail message.  This qualifier is valid only when used with /EDIT.  The
+text of the message is indented with > at the beginning of each line.
+This can be suppressed with /NOINDENT.
+`,
+			},
+			{
+				Name: "/NOINDENT",
+				Description: `See /EXTRACT for information on this qualifier.
+`,
+			},
 		},
 	},
 	{
-		command: "RESPOND",
-		boolFlags: []string{
-			"/CC",
-			"/EDIT",
-			"/EXTRACT",
-			"/LIST",
-			"/NOINDENT",
-			"/SUBJECT",
+		Command: "RESPOND",
+		Description: `Invokes the VAX/VMS Personal Mail Utility (MAIL) to send a reply mail
+message to the owner of the currently read message.
+ 
+  Format:
+    RESPOND [file-name]
+ 
+If you wish to use another method for sending the mail, define BULL_MAILER
+to point to a command procedure.  This procedure will then be executed in
+place of MAIL, and the parameters passed to it are the username and subject
+of the message.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/CC",
+				Description: `/CC=user[s]
+Specifies additional users that should receive the reply.
+`,
+			},
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used for creating the reply mail
+message.
+`,
+			},
+			{
+				Name: "/EXTRACT",
+				Description: `Specifies that the text of the message should be included in the reply
+mail message.  This qualifier is valid only when used with /EDIT.  The
+text of the message is indented with > at the beginning of each line.
+This can be suppressed with /NOINDENT.
+`,
+			},
+			{
+				Name: "/GROUPS",
+				Description: `/GROUPS=(newsgroup,[...])
+ 
+Valid only if a NEWS group is selected and /LIST is present.  Specifies
+to send the message to the specified NEWS group(s) in addition to the
+selected NEWS group.
+`,
+			},
+			{
+				Name: "/LIST",
+				Description: `Specifies that the reply should also be sent to the network mailing list
+associated with the folder.  The mailing list address should be stored
+in the folder description.  See CREATE/DESCRIPTION or MODIFY/DESCRIPTION
+for more informaton.
+`,
+			},
+			{
+				Name: "/NOINDENT",
+				Description: `See /EXTRACT for information on this qualifier.
+`,
+			},
+			{
+				Name: "/NOSIGNATURE",
+				Description: `Specifies to suppress the automatically appended signature, if one exists.
+Signatures are appended for postings to mailing lists and to responds.
+See the help topic POST Signature_file for signature information.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `/SUBJECT=text
+ 
+Specifies the subject of the mail message. If the text consists of more
+than one word, enclose the text in quotation marks (").
+ 
+If you omit this qualifier, the description of the message will be used
+as the subject preceeded by "RE: ".
+`,
+			},
 		},
 	},
 	{
-		command: "QUIT",
+		Command: "QUIT",
+		Description: `Exits the BULLETIN program.
+`,
 	},
 	{
-		command: "SEARCH",
-		boolFlags: []string{
-			"/REPLY",
-			"/REVERSE",
-			"/START",
-			"/SUBJECT",
+		Command: "SEARCH",
+		Description: `Searches the currently selected folder for the  message  containing  the
+first occurrence of the specified text string.
+ 
+   Format:
+ 
+       SEARCH [search-string]
+ 
+The search starts from the first message in the current folder.  The
+search includes both the text of the message, and the description header.
+If a "search-string" is not specified, a search is made using the
+previously specified string, starting with the message following the
+one you are currently reading (or have just read).  Once started, a
+search can be aborted by typing a CTRL-C.
+`,
+		Flags: dclish.Flags{
+			{
+				Name: "/EDIT",
+				Description: `Specifies that the editor is to be used for reading the message.
+`,
+			},
+			{
+				Name: "/FOLDER",
+				Description: `/FOLDER=(folder,[...])
+ 
+Specifies a list of folders to be searched.  The search will start by
+selecting the first folder in the list and searching the messages for
+a match.  If, during a search, no more matches or messages are found,
+the next folder in the list is automatically selected.  The presently
+selected folder can be included in the search by specifying "" as the
+first folder in the list.
+`,
+			},
+			{
+				Name: "/REPLY",
+				Description: `Specifies that messages are to be searched for that are replies to the
+currently read message, or the message specified by /START.  Replies are
+messages which have subject of the original message prefaced by "Re:".
+`,
+			},
+			{
+				Name: "/REVERSE",
+				Description: `Specifies that the messages are to be searched in reverse order.  If
+no starting message is specified, the search is started from the last
+message.
+`,
+			},
+			{
+				Name: "/START",
+				Description: `/START=message_number
+ 
+Specifies the message number to start the search at.
+`,
+			},
+			{
+				Name: "/SUBJECT",
+				Description: `Specifies that only the subject of the messages are to be searched.
+`,
+			},
 		},
 	},
 	{
-		command: "SELECT",
-		boolFlags: []string{
-			"/MARKED",
-		},
+		Command: "SEEN",
+		Description: `Sets the current or message-id message as seen. This allows you to keep
+track of messages on a per message basis.  Seen messages are displayed
+with a greater than sign in the left hand column of the directory
+listing.  Once you have used the SEEN command once, messages will be
+automatically be set as being SEEN when they are read.  The UNSEEN
+command sets the current or message-id message as unseen. 
+ 
+   Format:
+ 
+       SEEN [message-number or numbers]
+       UNSEEN [message-number or numbers]
+ 
+Keeping track of seen messages requires very little overhead for NEWS
+folders.  However, there is a moderate overhead for regular non-NEWS
+folders.  If you have used the SEEN command and wish to disable the
+automatic marking of messages in regular folders as SEEN when they are
+read, type the command SEEN/NOREAD.  To reenable, simply use the SEEN
+command again. 
+ 
+NOTE: The list of SEEN messages for non-NEWS folders are stored in a
+file username.BULLMARK, and NEWS folders are stored in
+username.NEWSMARK. The files are created in the directory pointed to by
+the logical name BULL_MARK.  If BULL_MARK is not defined, SYS$LOGIN
+will be used. 
+`,
 	},
 	{
-		command: "SET",
-		commands: []*command{
+		Command: "SELECT",
+		Description: `Selects a folder of messages.  See HELP Folders for a description  of  a
+folder.   Once a folder has been selected, all commands, i.e. DIRECTORY,
+READ, etc. will apply only to those messages.  Use the CREATE command to
+create  a  folder.   Use the DIRECTORY/FOLDER command to see the list of
+folders that have been created.
+ 
+ Format:
+ 
+     SELECT [node-name::][folder-name]
+ 
+The complete folder name need not be specified.  BULLETIN  will  try  to
+find the closest matching name.  I.e. INFOV can be used for INFOVAX.
+ 
+Omitting the folder name will select the default general messages.
+ 
+The  node  name can be specified only if the remote node has the special
+BULLCP process running (invoked by BULLETIN/STARTUP command.)
+ 
+After selecting a folder, the user will notified of the number of unread
+messages,  and  the  message  pointer will be placed at the first unread
+message.
+ 
+BULLETIN automatically determines if the selcted name is a NEWS group by
+detecting if a period is present in the name being  specified,  as  most
+NEWS  groups  contain  a  period,  whereas  a real folder cannot.  A few
+special NEWS groups, i.e. JUNK and CONTROL, do not contain a period.  If
+desired,  you can select these groups by enclosing them in double quotes
+("), and typing the name in lower case.
+`,
+		Flags: dclish.Flags{
 			{
-				command: "ACCESS",
-				boolFlags: []string{
-					//3 id
-					"/ALL",
-					"/READ",
-					//3 Warning
-				},
+				Name: "/MARKED",
+				Description: `Selects  only messages that have been marked (indicated by an asterisk).
+After using /MARKED, in order to see all messages, the folder will  have
+to be reselected.
+`,
 			},
+		},
+	},
+	{
+		Command: "SET",
+		Description: `The SET command  is  used  with  other  commands  to  define  or  change
+characteristics of the BULLETIN Utility.
+ 
+  Format:
+ 
+    SET option
+`,
+		Flags: dclish.Flags{
 			{
-				command: "BBOARD",
-				boolFlags: []string{
-					"/EXPIRATION",
-					"/SPECIAL",
-					"/VMSMAIL",
-					//3 More_information
-				},
+				Name: "ACCESS",
+				Description: `Controls  access  to  a  private  folder.   A private folder can only be
+selected by users who have been granted access.  Only the owner of  that
+folder is allowed to grant access.
+ 
+  Format:
+ 
+    SET [NO]ACCESS id-name [folder-name]
+ 
+The id-name can be one or more ids from the system Rights  Database  for
+which  access  is  being  modified.   It  can  also be a file name which
+contains a list of  ids.   For  more  information  concerning  usage  of
+private  folders, see HELP CREATE /PRIVATE.  NOTE: Access is created via
+ACLs.  If a user's process privileges are set  to  override  ACLs,  that
+user  will  be  able  to  access  the folder even if access has not been
+granted.
+ 
+It  is suggested that if you plan on granting access to many users, that
+you create an id using the AUTHORIZE utility and then use the SET ACCESS
+command  to  grant  access  to  that id.  Then, you can use the GRANT/ID
+command in AUTHORIZE to grant the id to users, and this will give  those
+users  access to the folder.  This is preferred because of problems with
+running into system quota when checking for acls on a file with a  large
+amount  of  acls.   It  is also means that you don't have to remember to
+remove the access for that user from a folder if that  user  is  removed
+from the system.
+ 
+A user with BULLETIN privileges (see HELP SET  PRIV)  will  be  able  to
+select a protected folder regardless of the access settings.  However, a
+user without explicit access will not receive login notifications of new
+messages,  and thus will not be able to set any login flags.  (NOTE:  If
+such a user selects such a folder and then uses SET ACCESS to grant  him
+or  herself  access,  the user must reselect the folder in order for the
+new access to take affect in order to be able to set login flags.)
+3 id
+The id-name can be one or  more  ids  contained  in  the  system  Rights
+Database.   This  includes  usernames  and  UICs.  A UIC that contains a
+comma must be enclosed in quotes.   UICs  can  contain  wildcards,  i.e.
+"[130,*]".   Note that by default, a process is given the process rights
+id SYS$NODE_nodename, where nodename is the decnet nodename.   Thus,  by
+specifing  this id, a folder can be restricted to a specific node, which
+is useful when the folder is shared among nodes in a cluster.
+ 
+Alternatively,  the  id-name  can be a filename which contains a list of
+ids.  The filename should be preceeded by a "@".  If the suffix  is  not
+specified, it will be assumed that the suffix is ".DIS" .
+3 /ALL
+Specifies that access to the folder is granted to all users.   If  /READ
+is  not  specified,  the  folder will no longer be private.  If /READ is
+specified, all users will have read access, but  only  privileged  users
+will  have  write access (of course non-privileged users can gain access
+via a later SET ACCESS command.)
+ 
+Format:
+ 
+    SET ACCESS /ALL [folder-name]
+3 /READ
+Specifies that access to the folder will be limited to being able to
+read the messages.
+3 Warning
+If  a  user  logs  in after a private folder has been created but before
+being given access, and then is given  access,  any  defaults  that  the
+folder  has,  i.e. /BRIEF, /READNEW, & /NOTIFY, will not be set for that
+user. This is because if the  id  is  not  a  username,  it  becomes  an
+extremely  lengthy  operation  to check each user to see if have that id
+assigned to them.  The alternative is to set the defaults for all  users
+after  every  SET  ACCESS,  but that might cause problems with users who
+have manually reset those defaults.  The  correct  solution  requires  a
+large programming modification, which will be done in a later version.
+`,
 			},
 			{
-				command: "BRIEF",
-				boolFlags: []string{
-					"/ALL",
-					"/DEFAULT",
-					"/FOLDER",
-					"/PERMANENT",
-				},
+				Name: "ALWAYS",
+				Description: `Specifies  that  the  selected  folder  has  the ALWAYS attribute.  This
+causes messages in the folder to be displayed differently  when  logging
+in.  SYSTEM messages will be displayed every time a user logs in, rather
+than just once.  Non-SYSTEM message will also be  displayed  every  time
+(in  whatever  mode  is selected, i.e. BRIEF, SHOWNEW, or READNEW) until
+the user actually reads that message (or a later one).  This feature  is
+meant  for  messages which are very important, and thus you want to make
+sure they are read.
+ 
+  Format:
+ 
+    SET [NO]ALWAYS
+`,
 			},
 			{
-				command: "CONTINUOUS_BRIEF",
+				Name: "BBOARD",
+				Description: `Specifies  a username to be used as a BBOARD destination.  Mail which is
+sent to that user are converted into messages.  This command will  apply
+to  the  selected folder, and each folder can have its own BBOARD.  Only
+privileged users or owners of the folders can  set  BBOARD.   Note:  The
+specified  account  must  have  the DISUSER flag specified in the system
+authorization file, and it either must be given  SYSPRV  privileges,  or
+the  scratch  bboard_directory  (specified when compiling BULLETIN) must
+have world rwed  protection.   Also,  certain  system  parameters  which
+affect  detached  subprocesses  are  usually  too low for the subprocess
+which is spawned to read the mail.  The  parameters  and  the  suggested
+values  are:  PQL_DPGFLQUOTA = 10000, PQL_DWSQUOTA = 500, and PQL_DFILLM
+= 30.  If you are not using the BULLCP process, the subprocess limit for
+users must be at least 2.
+ 
+  Format:
+ 
+    SET BBOARD [username]
+ 
+BBOARD cannot be set for remote folders.   See  also  the  commands  SET
+STRIP and SET DIGEST for options on formatting BBOARD messages.
+ 
+If BULLCP is running, BBOARD is updated every 15 minutes.  If you want
+to length this period, define BULL_BBOARD_UPDATE to be the number of
+minutes, between updates.  I.e. DEFINE/SYSTEM BULL_BBOARD_UPDATE "30"
+will cause the updates to be don every 30 minutes.
+ 
+NOTE: If you want to control the expiration date on a per message basis,
+you can do so by adding a special header line to the message.  The form
+is Expires: or X-Expires: followed by the date in the form DD MMM YYYY.
+The time will always be 00:00, even if the time is specified on the line.
+3 /EXPIRATION
+ /EXPIRATION=days
+ /NOEXPIRATION
+ 
+Specifies the number of days the message created by the BBOARD is to  be
+retained.   The  default  is  14  days.   The  highest limit that can be
+specified is 30 days.  This can be overridden by a user with privileges.
+If /NOEXPIRATION is specified, messages will become permanent.
+ 
+NOTE:  This  value is the same value as specified by SET DEFAULT_EXPIRE.
+If one is changed, the other will change also.
+3 /SPECIAL
+Specifies that the input should be processed  using  a  special  command
+procedure,  and  not  to  use the simple VMS MAIL to message conversion.
+Specifying a username is optional.  To remove  this  feature,  you  must
+either  SET  NOBBOARD,  or  SET  BBOARD  and  specify  a  username.  See
+installation notes for exactly how to use this feature.
+3 /VMSMAIL
+Used in conjunction with  /SPECIAL.   If  /SPECIAL  and  a  username  is
+specified,  and the conversion still takes its input from VMS MAIL, then
+the VMS system mail file is checked to see if new mail  exists  for  the
+specified  user  before  running the command procedure.  This saves time
+and avoids creating subprocesses.  (Useful if input is digest format.)
+3 Listserv
+For a LISTSERV mailing list, only a subscribed user can post to it.   If
+the  BBOARD  account  is subscribed to the list in order for BULLETIN to
+receive the list, only the BBOARD account will be able to  post  to  it.
+This  problem  is  solved  by  placing  the  word LISTSERV in the folder
+description line. Then, messages sent to the mailing list  by  the  POST
+command will be sent from the BBOARD account rather than from the user's
+account.  For example, the folder description might be:
+ 
+FAKE MAILING LIST <FAKELIST@FAKENODE.BITNET> LISTSERV.
+ 
+If  you  have  PMDF  or  MX  installed,  the  corresponding logical name
+PMDF_REPLY_TO or MX_REPLY_TO will be temporarily defined in order to add
+a  REPLY-TO:   line  to  the  message  header to display the real user's
+address.
+ 
+Users  who  use the method described in HELP SET BBOARD MORE_INFORMATION
+should note the following:  When using this LISTSERV feature, the BBOARD
+account  must be a real account, not simply a VMS MAIL forwarding entry.
+Mail can only be sent from a real account.  However, if mail  forwarding
+is  set for that the account, the account does not need a real directory
+or a unique uic, since it will not need space to store mail.
+ 
+In order to be able to send LISTSERV commands from  the  BBOARD  account
+without  having  to  actually  login  to  the BBOARD account, there is a
+utility included with BULLETIN called SETUSER.  This requires privileges
+to use.  After compiling it, use the link command:
+ 
+	LINK SETUSER,SYS$SYSTEM:SYS.STB/SELECT
+ 
+When  you  run  it, it will prompt for a username.  After verifying that
+the given username  is  a  valid  account,  it  will  then  change  your
+process's username.  You can then send mail from that account.
+ 
+If you are using PMDF or MX, and wish to use this feature, you can still
+do  so  by  setting BBOARD.  As long as the BBOARD account is not a real
+account, it will work properly, even though the mail feed is not  really
+coming from the BBOARD account.
+ 
+In order to find out if the LISTSERV mailing list will accept posts only
+from subscribed users, send  the  command  'REV  listname'.   This  will
+retrieve the file listname.LIST.  It begins with a list of keywords.  If
+the keyword 'send' is set  to  'public',  you  don't  need  to  set  the
+LISTSERV  switch.   If it's set to 'private', you do.  For a description
+of the keywords and the meaning of their settings, send any LISTSERV the
+command  'INFO  KEY'. Note that the 'listname.LIST' files include a list
+of owners and subscribers.  If 'send' is set to 'owners',  then  neither
+the public nor the subscribers can post to the list.
+ 
+3 More_information
+If more than one folder is to have a BBOARD setting,  only  one  of  the
+BBOARD  names  need  be  a real account.  All other names could be names
+whose mail is  forwarded  to  the  real  account.   BULLETIN  will  then
+determine  from  the mail header which folder the mail is to be sent to.
+Forwarding can be enabled for any name within MAIL by the command:
+ 
+    MAIL> SET FORWARD/USER=from_name to_name
+ 
+Any  mail  sent  to  FROM_NAME will be forwarded to TO_NAME.  Thus, only
+TO_NAME need be a real account.  For example, if you  have  INFOVAX  and
+LASER-LOVERS  folders,  you need create only a INFOVAX account, and then
+forward LASER-LOVERS mail to INFOVAX within mail using the  command  SET
+FORWARD/USER=LASER-LOVERS  INFOVAX.   You  would  then  do  a SET BBOARD
+INFOVAX for the INFOVAX folder, and  SET  BBOARD  LASER-LOVERS  for  the
+LASER-LOVERS  folder.   This method will speed up the BBOARD conversion,
+since mail need be read only from one account.  NOTE: Folders that  have
+the  /SPECIAL  set  on  their  BBOARD  accounts  cannot  have their mail
+forwarded to BBOARD accounts that don't have /SPECIAL set.   Folders  of
+the  same  type, i.e. that use the same /SPECIAL command procedure, must
+be grouped separately.
+ 
+The BBOARD account must match the mailing list name.  If you prefer  not
+to  have  them  match,  then  you must include the actual address of the
+mailing list in the folder description in  the  format  described  under
+HELP CREATE /DESCRIPTION.
+`,
 			},
 			{
-				command: "DEFAULT_EXPIRE",
+				Name: "BRIEF",
+				Description: `Controls whether you will be alerted upon logging  that  there  are  new
+messages  in the currently selected folder.  A new message is defined as
+one that has been created since the last time you logged in or  accessed
+BULLETIN.   Note  the  difference between BRIEF and READNEW.  The latter
+causes a listing of the description of the new messages to be  displayed
+and  prompts  the user to read the messages.  Setting BRIEF will clear a
+READNEW setting (and visa versa).
+ 
+  Format:
+ 
+    SET [NO]BRIEF
+3 /ALL
+Specifies that the SET [NO]BRIEF option is the default for all users for
+the specified folder.  This is a privileged qualifier.
+3 /DEFAULT
+Specifies that the [NO]BRIEF option is the default for the specified
+folder.  This is a privileged qualifier.  It will only affect brand new
+users (or those that have never logged in).  Use /ALL to modify all users.
+3 /FOLDER
+   /FOLDER=foldername
+ 
+Specifies the folder for which the option is to modified.  If not
+specified, the selected folder is modified. Valid only with NOBRIEF.
+3 /PERMANENT
+   /[NO]PERMANENT
+ 
+Specifies that BRIEF is a permanent flag and cannot be changed by the
+individual, except if changing to SHOWNEW or READNEW.  This is a
+privileged qualifier.
+`,
 			},
 			{
-				command: "DIGEST",
+				Name: "CONTINUOUS_BRIEF",
+				Description: `Specifies that if BRIEF is set for a folder, and there are new messages,
+the notification message "there are new messages" will be displayed every
+time when logging in, until the new messages are read.  Normally, the
+BRIEF setting causes notification only at the first time that new messages
+are detected.
+ 
+  Format:
+ 
+    SET [NO]CONTINUOUS_BRIEF
+ 
+NOTE: Both SET GENERIC and SET CONTINUOUS_BRIEF cannot be set for the
+same user.
+`,
 			},
 			{
-				command: "DUMP",
+				Name: "DEFAULT_EXPIRE",
+				Description: `Specifies  the  number  of days the message created by BBOARD (or direct
+PMDF path) is to be retained.  The default  is  14  days.   The  highest
+limit  that  can  be  specified is 30 days.  This can be overridden by a
+user with privileges.
+ 
+This  also  specifies the default expiration date when adding a message.
+If no expiration date is  entered  when  prompted  for  a  date,  or  if
+prompting  has been disabled via SET NOPROMPT_EXPIRE, this value will be
+used.
+ 
+  Format:
+ 
+    SET DEFAULT_EXPIRE days
+ 
+If -1 is specified, messages will become permanent.  If 0 is  specified,
+no  default expiration date will be present.  The latter should never be
+specified for a  folder  with  a  BBOARD,  or  else  the  messages  will
+disappear.
+ 
+NOTE: This value is the same value that SET BBOARD/EXPIRATION specifies.
+If one is changed, the other will change also.
+`,
 			},
 			{
-				command: "EXPIRE_LIMIT",
+				Name: "DIGEST",
+				Description: `Affect  only  messages  which are added via either the BBOARD option, or
+written directly from a network mailing program  (i.e.  PMDF).   Several
+mailing  lists  use  digest  format  to  send  their  messages, i.e. the
+messages are concatenated into one long message.  If DIGEST is set,  the
+messages will be separated into individual BULLETIN messages.
+ 
+  Format:
+ 
+    SET [NO]DIGEST
+ 
+The command SHOW FOLDER/FULL will show if DIGEST has been set.
+ 
+`,
 			},
 			{
-				command: "FOLDER",
-				boolFlags: []string{
-					"/MARKED",
-				},
+				Name: "DUMP",
+				Description: `Specifies that messages deleted from the  selected  folder  are  written
+into  a dump (or log) file.  The name of the log file is foldername.LOG,
+and it is located in the folder directory.
+ 
+  Format:
+ 
+    SET [NO]DUMP
+ 
+The  command  SHOW  FOLDER/FULL  will show if dump has been set.  (NOTE:
+SHOW FOLDER/FULL is a privileged command.)
+`,
 			},
 			{
-				command: "GENERIC",
-				boolFlags: []string{
-					"/DAYS",
-				},
+				Name: "EXPIRE_LIMIT",
+				Description: `Specifies expiration limit that is allowed for messages.  Non-privileged
+users cannot specify an expiration  that  exceeds  the  number  of  days
+specified.  Privileged users can exceed the limit.
+ 
+    SET [NO]EXPIRE_LIMIT [days]
+ 
+The command SHOW FOLDER/FULL will show  the  expiration  limit,  if  one
+exists.  (NOTE: SHOW FOLDER/FULL is a privileged command.) 
+`,
 			},
 			{
-				command: "KEYPAD",
+				Name: "FOLDER",
+				Description: `Select a folder of messages.  Identical to the SELECT command.  See help
+on that command for more information.
+ 
+  Format:
+ 
+    SET FOLDER [node-name::][folder-name]
+3 /MARKED
+Selects messages that have been marked (indicated by an asterisk).
+After using /MARKED, in order to see all messages, the folder will have
+to be reselected.
+`,
 			},
 			{
-				command: "LOGIN",
+				Name: "GENERIC",
+				Description: `Specifies  that  the  given  account is a "generic" account, i.e used by
+many different people.  If an  account  is  specified  as  GENERIC,  new
+messages  placed in the GENERAL folder will be displayed upon logging in
+for a specific number of days,  rather  than  only  once.   The  default
+period is 7 days.  This command is a privileged command.
+ 
+  Format:
+ 
+    SET [NO]GENERIC username
+ 
+NOTE: Both SET GENERIC and SET CONTINUOUS_BRIEF cannot be set for the
+same user.
+3 /DAYS
+ /DAYS=number_of_days
+ 
+Specifies the number days that new GENERAL messages will be displayed
+for upon logging in.
+`,
 			},
 			{
-				command: "NODE",
-				boolFlags: []string{
-					"/FOLDER",
-				},
+				Name: "KEYPAD",
+				Description: `Controls whether the keypad has been enabled such that the keys  on  the
+keypad correspond to command definitions.  These definitions can be seen
+via the SHOW KEYPAD command.  The default is NOKEYPAD unless the /KEYPAD
+qualifier has been added to the BULLETIN command line.
+ 
+  Format:
+ 
+    SET [NO]KEYPAD
+`,
 			},
 			{
-				command: "NOTIFY",
-				boolFlags: []string{
-					"/ALL",
-					"/DEFAULT",
-					"/FOLDER",
-					"/PERMANENT",
-				},
+				Name: "LOGIN",
+				Description: `Controls  whether  the  specified  user will be alerted of any messages,
+whether system or non-system, upon logging in.  If an  account  has  the
+DISMAIL  flag  set, SET NOLOGIN is automatically applied to that account
+during the first time that the account logs in.  However, this will  not
+occur  if DISMAIL is set for an old account.  Additionally, removing the
+DISMAIL flag will not automatically enable LOGIN.  (The reason  for  the
+above  was to avoid extra overhead for constant checking for the DISMAIL
+flag.)  This command is a privileged command.
+ 
+  Format:
+ 
+    SET [NO]LOGIN username
+`,
 			},
 			{
-				command: "PAGE",
+				Name: "NODE",
+				Description: `Modifies the selected folder from a local folder to a remote folder.   A
+remote folder is a folder in which the messages are actually stored on a
+folder at a remote DECNET node.  The SET NODE command specifies the name
+of  the  remote  node, and optionally the name of the remote folder.  If
+the remote folder name is not included, it is assumed to be the same  as
+the  local  folder.   When  the command is executed, the selected folder
+will then point to the remote folder.  If there  were  messages  in  the
+local folder, they will be deleted.  This feature is present only if the
+BULLCP process is running on the remote node.
+ 
+  Format:
+    SET NODE nodename [remotename]
+    SET NONODE
+ 
+NOTE: If one node adds a message to a remote node, other nodes connected
+to the same folder will not immediately be aware  of  the  new  message.
+This  info  is  updated  every  15  minutes,  or if a user accesses that
+folder.
+3 /FOLDER
+   /FOLDER=foldername
+ 
+Specifies the folder for which the node information is to modified.
+If not specified, the selected folder is modified.
+`,
 			},
 			{
-				command: "PRIVILEGES",
-				boolFlags: []string{
-					"/ID",
-				},
+				Name: "NOTIFY",
+				Description: `Specifies whether you will be notified via a broadcast  message  when  a
+message is added to the selected folder.
+ 
+  Format:
+ 
+    SET [NO]NOTIFY
+ 
+In a cluster, if the logical name MAIL$SYSTEM_FLAGS is defined so that
+bit 1 is set, users will be notified no matter which node they are logged
+in to.  If you wish to disable this, you should define BULL_SYSTEM_FLAGS
+so that bit 1 is cleared.
+3 /ALL
+Specifies that the SET [NO]NOTIFY option is the default for all users for
+the specified folder.  This is a privileged qualifier.
+3 /DEFAULT
+Specifies that the [NO]NOTIFY option is the default for the specified
+folder.  This is a privileged qualifier.  It will only affect brand new
+users (or those that have never logged in).  Use /ALL to modify all users.
+3 /FOLDER
+   /FOLDER=foldername
+ 
+Specifies the folder for which the option is to modified.  If not
+specified, the selected folder is modified. Valid only with NONOTIFY.
+3 /PERMANENT
+   /[NO]PERMANENT
+ 
+Specifies that NOTIFY is a permanent flag and cannot be changed by the
+individual. /DEFAULT must be specified. This is a privileged qualifier.
+`,
 			},
 			{
-				command: "PROMPT_EXPIRE",
+				Name: "PAGE",
+				Description: `Specifies whether any directory listing or message reading  output  will
+pause  when  it  reaches  the end of the page or not.  Setting NOPAGE is
+useful for terminals that can store more than one screenful at  a  time,
+and  that  have a remote printer that can then print the contents of the
+terminal's memory.  The default is PAGE, unless the default was  changed
+by specifying /NOPAGE on the command line to invoke BULLETIN.
+ 
+  Format:
+ 
+    SET [NO]PAGE
+`,
 			},
 			{
-				command: "READNEW",
-				boolFlags: []string{
-					"/ALL",
-					"/DEFAULT",
-					"/FOLDER",
-					"/PERMANENT",
-				},
+				Name: "PRIVILEGES",
+				Description: `Specifies  either  process  privileges  or  rights  identifiers that are
+necessary to use privileged commands.  Use the SHOW  PRIVILEGES  command
+to see what is presently set.  This is a privileged command.
+ 
+  Format:
+ 
+    SET PRIVILEGES parameters
+ 
+The parameters are one or  more  privileges  separated  by  commas.   To
+remove  a privilege, specify the privilege preceeded by "NO".  If /ID is
+specified, the parameters are rights identifiers.
+3 /ID
+ /[NO]ID
+ 
+If specified, then the rights identifier which is specified as the
+parameter will allow users holding that rights identifier to execute
+privileged commands.  If /NOID is specified, the identifier is removed.
+`,
 			},
 			{
-				command: "SHOWNEW",
-				boolFlags: []string{
-					"/ALL",
-					"/DEFAULT",
-					"/FOLDER",
-					"/PERMANENT",
-				},
+				Name: "PROMPT_EXPIRE",
+				Description: `Specifies  that  a  user  will  be  prompted for an expiration date when
+adding a message.  If NOPROMPT_EXPIRE is specified, the user will not be
+prompted, and the default expiration (which is set by SET DEFAULT_EXPIRE
+or SET BBOARD/EXPIRATION) will be  used.   If  the  value  specified  is
+greater   than  the  expiration  limit,  and  the  user  does  not  have
+privileges, then the expiration  limit  will  be  used  as  the  default
+expiration.  (If there is no expiration limit, and the user doesn't have
+privileges, then an error will result.)  PROMPT_EXPIRE is the default.
+ 
+  Format:
+ 
+    SET  [NO]PROMPT_EXPIRE
+`,
 			},
 			{
-				command: "STRIP",
+				Name: "READNEW",
+				Description: `Controls whether you will be prompted upon logging in  if  you  wish  to
+read new non-system or folder messages (if any exist).  A new message is
+defined as one that has been  added  since  the  last  login,  or  since
+accessing BULLETIN.  The default setting for READNEW is dependent on how
+the folder was created by the owner.
+ 
+In  order  to  apply  this to a specific folder, first select the folder
+(using the SELECT command), and then enter the SET READNEW command.
+ 
+  Format:
+ 
+    SET [NO]READNEW
+ 
+NOTE:  If  you  have several folders with READNEW enabled, each folder's
+messages will be displayed separately.  However, if you EXIT the READNEW
+mode before all the folders have been displayed, you will not be alerted
+of the new messages in the undisplayed folders the next time you  login.
+However,  if  you enter BULLETIN, you will be told that new messages are
+present in those other folders.  Also, it is not possible  to  EXIT  the
+READNEW mode if there are SYSTEM folders which have new messages. Typing
+the EXIT command will cause you to skip to those folders.  (See HELP SET
+SYSTEM for a description of a SYSTEM folder).
+3 /ALL
+Specifies that the SET [NO]READNEW option is the default for all users for
+the specified folder.  This is a privileged qualifier.  The difference
+between this and /DEFAULT is that the latter will only apply to new users
+(i.e. any users which have never executed BULLETIN).
+3 /DEFAULT
+Specifies that the [NO]READNEW option is the default for the specified
+folder.  This is a privileged qualifier.  It will only affect brand new
+users (or those that have never logged in).  Use /ALL to modify all users.
+3 /FOLDER
+   /FOLDER=foldername
+ 
+Specifies the folder for which the option is to modified.  If not
+specified, the selected folder is modified. Valid only with NOREADNEW.
+3 /PERMANENT
+   /[NO]PERMANENT
+ 
+Specifies that READNEW is a permanent flag and cannot be changed by the
+individual.  This is a privileged qualifier.
+`,
 			},
 			{
-				command: "SYSTEM",
+				Name: "SHOWNEW",
+				Description: `Controls whether a directory listing of new  messages  for  the  current
+folder  will  be displayed when logging in.  This is similar to READNEW,
+except you will not be prompted to read the messages.   The  default  is
+dependent  on how the folder was created by the owner.  A new message is
+defined as one that has been  added  since  the  last  login,  or  since
+accessing BULLETIN.
+ 
+In order to apply this to a specific folder,  first  select  the  folder
+(using  the  SELECT  command),  and  then enter the SET SHOWNEW command.
+ 
+  Format:
+ 
+    SET [NO]SHOWNEW
+3 /ALL
+Specifies that the SET [NO]SHOWNEW option is the default for all users for
+the specified folder.  This is a privileged qualifier.  The difference
+between this and /DEFAULT is that the latter will only apply to new users
+(i.e. any users which have never executed BULLETIN).
+3 /DEFAULT
+Specifies that the [NO]SHOWNEW option is the default for the specified
+folder.  This is a privileged qualifier.  It will only affect brand new
+users (or those that have never logged in).  Use /ALL to modify all users.
+3 /FOLDER
+   /FOLDER=foldername
+ 
+Specifies the folder for which the option is to modified.  If not
+specified, the selected folder is modified. Valid only with NOSHOWNEW.
+3 /PERMANENT
+   /[NO]PERMANENT
+ 
+Specifies that SHOWNEW is a permanent flag and cannot be changed by the
+individual, except if changing to READNEW. This is a privileged qualifier.
+`,
 			},
-		},
-	},
-	{
-		command: "SHOW",
-		commands: []*command{
 			{
-				command: "FLAGS",
+				Name: "STRIP",
+				Description: `Affect only messages which are added via either the BBOARD option, or
+written directly from a network mailing program (i.e. PMDF).  If
+STRIP is set, the header of the mail message will be stripped off
+before it is stored as a BULLETIN message.
+ 
+  Format:
+ 
+    SET [NO]STRIP
+ 
+The command SHOW FOLDER/FULL will show if STRIP has been set.
+`,
 			},
 			{
-				command: "FOLDER",
-				boolFlags: []string{
-					"/FULL",
-				},
+				Name: "SYSTEM",
+				Description: `Specifies that the selected folder is a SYSTEM folder.  A SYSTEM folder
+is allowed to have SYSTEM and SHUTDOWN messages added to it.  This is a
+privileged command.
+ 
+  Format:
+ 
+    SET [NO]SYSTEM
+ 
+By default, the GENERAL folder is a SYSTEM folder, and the setting for
+that folder cannot be removed.
+ 
+If the selected folder is remote, /SYSTEM cannot be specified unless the
+folder at the other node is also a SYSTEM folder.
+`,
 			},
+		},
+	},
+	{
+		Command: "SHOW",
+		Description: `The SHOW command displays information about certain characteristics.
+`,
+		Flags: dclish.Flags{
 			{
-				command: "KEYPAD",
-				boolFlags: []string{
-					"/PRINT",
-				},
+				Name: "FLAGS",
+				Description: `Shows whether BRIEF, NOTIFY, READNEW, or SHOWNEW has been set for the
+currently selected folder.
+`,
 			},
 			{
-				command: "NEW",
+				Name: "FOLDER",
+				Description: `Shows information about a folder of messages.  Owner and description are
+shown.  If the folder name is omitted, and a folder has been selected via
+the SELECT command, information about that folder is shown.
+ 
+  Format:
+ 
+    SHOW FOLDER [folder-name]
+3 /FULL
+Control whether all information of the folder is displayed.  This
+includes DUMP & SYSTEM settings, the access list if the folder is
+private, and BBOARD information.  This information is only those who
+have access to that folder.
+`,
 			},
 			{
-				command: "PRIVILEGES",
+				Name: "KEYPAD",
+				Description: `Displays the keypad command definitions.  If the keypad has been enabled
+by either the SET KEYPAD COMMAND, or /KEYPAD is specified on the command 
+line, the keypad keys will be defined as commands.  SHOW KEYPAD is the
+equivalent of HELP KEYPAD.
+ 
+NOTE: If the keypad is not enabled, PF2 is defined to be SET KEYPAD.
+3 /PRINT
+Prints the keypad definitions on the default printer (SYS$PRINT).
+`,
 			},
 			{
-				command: "USER",
-				boolFlags: []string{
-					"/ALL",
-					"/LOGIN",
-				},
+				Name: "NEW",
+				Description: `Shows folders which have new unread messages for which BRIEF or READNEW
+have been set.  (Note: If you enter BULLETIN but do not read new unread
+messages, you will not be notified about them the next time you enter
+BULLETIN.  This is a design "feature" and cannot easily be changed.)
+`,
 			},
 			{
-				command: "VERSION",
+				Name: "PRIVILEGES",
+				Description: `Shows the privileges necessary to use privileged commands.  Also shows
+any rights identifiers that would also give a user privileges.  (The
+latter are ACLs which are set on the BULLUSER.DAT file.)
+`,
 			},
 			{
-				command: "SPAWN",
+				Name: "USER",
+				Description: `Shows the last time that a user logged in, or if /FOLDER  is  specified,
+the  latest  message which a user has read in the folder.  If NOLOGIN is
+set for  a  user,  this  information  will  be  displayed.   This  is  a
+privileged  command.   Non-privileged users will only be able to display
+the information for their own account.
+ 
+  Format:
+    SHOW USER [username]
+ 
+The username is optional.  If omitted, the process's username  is  used.
+The  username should not be included if /ALL or /[NO]LOGIN is specified.
+ 
+NOTE: The last logged in time displayed is that which is stored when the
+BULLETIN/LOGIN command is executed, not that  which  VMS  stores.   Some
+sites  make  BULLETIN/LOGIN  an  optional  command for users to store in
+their own LOGIN.COM, so this command can be used  to  show  which  users
+have done this.
+3 /ALL
+Specifies that information for all users is to be displayed.  This is  a
+privileged command.
+3 /LOGIN
+ /[NO]LOGIN
+ 
+Specifies that only those users which do not have NOLOGIN set are to be
+displayed.  If negated, only those users with NOLOGIN set are displayed.
+This is a privileged command.  The qualifier /ALL need not be specified.
+3 /FOLDER
+   /FOLDER=[foldername]
+ 
+Specifies to display the latest message that was read by the user(s) for
+the  specified  foldername.   A newsgroup can be specified, but the info
+can only be shown if the user has subscribed to the newsgroup.   If  the
+foldername is not specified, the selected folder will be used.
+3 /SINCE
+   /SINCE=[date]
+ 
+Specifies  to display only those users whose latest read message date is
+the same date  or  later  than  the  specified  date.   If  no  date  is
+specified,  the  date  of  the  current message is used.  Only valid for
+folders or with /LOGIN.  Use /START for newsgroups.
+3 /START
+   /START=[number]
+ 
+Specifies  to  display only those users whose latest read message number
+is equal to or greather than the specified  number.   If  no  number  is
+specified,  the  message  number  of  the current message is used.  Only
+valid for newsgroups.  Use /SINCE for folders and with /LOGIN.
+`,
 			},
 			{
-				command: "UNDELETE",
+				Name: "VERSION",
+				Description: `Shows  the  version  of  BULLETIN  and  the date that the executable was
+linked.
+`,
 			},
 		},
 	},
+	{
+		Command: "SPAWN",
+		Description: `Creates  a  subprocess  of  the current process.  To return to BULLETIN,
+type LOGOUT.
+ 
+  Format:
+    SPAWN [command-string]
+ 
+NOTE: BULLETIN disables the use of  CONTROL-C,  so  that  you  must  use
+CONTROL-Y if you wish to break out of a spawned command.
+`,
+	},
+	{
+		Command: "SUBSCRIBE",
+		Description: `Used only for NEWS folders.  Specifies that BULLETIN will keep track  of
+the  newest  message  that has been read for that NEWS folder.  When the
+NEWS folder is selected, the message pointer will automatically point to
+the next newest message that has not been read.
+`,
+	},
+	{
+		Command: "UNDELETE",
+		Description: `Undeletes  he  specified  message  if  the message was deleted using the
+DELETE command.  Deleted messages are  not  actually  deleted  but  have
+their  expiration  date  set to 15 minutes in the future and are deleted
+then.  Undeleting the message will reset the expiration date back to its
+original  value.   Deleted  messages  will  be  indicated as such by the
+string (DELETED) when either reading or doing a directory listing.
+ 
+  Format:
+    UNDELETE [message-number]
+`,
+	},
+	{
+		Command: "UNSUBSCRIBE",
+		Description: `Used only for NEWS folders.  Specifies that BULLETIN will no longer keep
+track of the newest message that has been read for that NEWS folder.  See the
+SUBSCRIBE command for further info. 
+`,
+	},
 }
diff --git a/repl/repl.go b/repl/repl.go
index ce2ecd2db47cb41cb60c7abbcc7d146c8993a198..96683609cd0177fa42e88c9458570a2772b42bfc 100644
--- a/repl/repl.go
+++ b/repl/repl.go
@@ -3,7 +3,6 @@ package repl
 
 import (
 	"fmt"
-	"strings"
 
 	"github.com/chzyer/readline"
 )
@@ -22,13 +21,12 @@ func Loop(user string) error {
 		if err != nil {
 			return err
 		}
-		words := strings.Field(strings.ReplaceAll(line, "/", " /"))
-		if len(words) {
+		if len(line) == 0 {
 			continue
 		}
-		switch strings.ToUpper(words[0]) {
-		case "ADD":
-			commandAdd()
+		err = commands.ParseAndRun(line)
+		if err != nil {
+			return err
 		}
 	}