Index: src/orca/brlmon.py
===================================================================
--- src/orca/brlmon.py	(revision 2519)
+++ src/orca/brlmon.py	(working copy)
@@ -28,6 +28,30 @@
 
 import gtk
 
+# Attribute/Selection mask strings:
+#
+DOT_7 =   '\x40' # 01000000
+DOT_8 =   '\x80' # 10000000
+DOTS_78 = '\xc0' # 11000000
+    
+# Markup strings:
+#
+NORMAL = " size='xx-large'"
+
+CURSOR_CELL_EMPTY =   " background='black'" \
+                    + " weight='ultrabold'" \
+                    + " style='italic'"
+
+CURSOR_CELL =   " background='white'" \
+              + " weight='ultrabold'" \
+              + " style='italic'" \
+
+ATTRIBUTE_7 = " underline='low'"
+
+ATTRIBUTE_8 = " underline='error'"
+
+ATTRIBUTE_78 = " underline='double'"
+
 class BrlMon(gtk.Window):
 
     """Displays a GUI braille monitor that mirrors what is being
@@ -101,7 +125,7 @@
 
         self.move(x, 0)
 
-    def writeText(self, cursorCell, string):
+    def writeText(self, cursorCell, string, mask=None):
         """Display the given text and highlight the given
         cursor cell.  A cursorCell of 0 means no cell has
         the cursor.
@@ -129,33 +153,29 @@
             else:
                 char = string[i]
 
+            markup = NORMAL
             if i == (cursorCell - 1):
                 if string[i] == " ":
-                    self.cellLabels[i].set_markup(
-                        "<span"\
-                        + " background='black'" \
-                        + " weight='ultrabold'" \
-                        + " style='italic'"\
-                        + " size='xx-large'"\
-                        + ">%s</span>" \
-                        % char)
+                    markup += CURSOR_CELL_EMPTY
                 else:
-                    self.cellLabels[i].set_markup(
-                        "<span"\
-                        + " background='white'" \
-                        + " weight='ultrabold'" \
-                        + " style='italic'"\
-                        + " size='xx-large'"\
-                        + ">%s</span>" \
-                        % char)
+                    markup += CURSOR_CELL
                 self.cellFrames[i].set_shadow_type(
                     gtk.SHADOW_IN)
             else:
-                self.cellLabels[i].set_markup(
-                    "<span size='xx-large'>%s</span>" % char)
                 self.cellFrames[i].set_shadow_type(
                     gtk.SHADOW_OUT)
 
+            if mask:
+                if (mask[i] == DOTS_78):
+                    markup += ATTRIBUTE_78
+                elif (mask[i] == DOT_7):
+                    markup += ATTRIBUTE_7
+                elif (mask[i] == DOT_8):
+                    markup += ATTRIBUTE_8
+
+            self.cellLabels[i].set_markup(
+                "<span" + markup + ">%s</span>" % char)
+
         # Pad the rest
         #
         for i in range(len(string), len(self.cellFrames)):
Index: src/orca/settings.py
===================================================================
--- src/orca/settings.py	(revision 2519)
+++ src/orca/settings.py	(working copy)
@@ -103,6 +103,7 @@
     "enableBrailleGrouping",
     "brailleVerbosityLevel",
     "brailleRolenameStyle",
+    "brailleSelectorIndicator",
     "enableBrailleMonitor",
     "enableMagnifier",
     "enableMagCursor",
@@ -129,7 +130,9 @@
     "sayAllStyle",
     "keyboardLayout",
     "speakBlankLines",
-    "enabledTextAttributes",
+    "enabledSpokenTextAttributes",
+    "enabledBrailledTextAttributes",
+    "textAttributesBrailleIndicator",
     "enableProgressBarUpdates",
     "progressBarUpdateInterval"
 ]
@@ -191,6 +194,16 @@
 BRAILLE_ROLENAME_STYLE_LONG  = 1 # full rolename
 brailleRolenameStyle    = BRAILLE_ROLENAME_STYLE_LONG
 
+# Braille Selection Indicator (see brailleSelectorIndicator).
+# The values represent the character to be used in the attrOr
+# field of brlAPI's writeStruct.
+#
+BRAILLE_SEL_NONE = '\x00' # 00000000
+BRAILLE_SEL_7    = '\x40' # 01000000
+BRAILLE_SEL_8    = '\x80' # 10000000
+BRAILLE_SEL_BOTH = '\xc0' # 11000000
+brailleSelectorIndicator = BRAILLE_SEL_BOTH
+
 # Speech punctuation levels (see verbalizePunctuationStyle).
 #
 PUNCTUATION_STYLE_NONE = 3
@@ -426,8 +439,28 @@
 # it won't be spoken. If no value part is given, then that attribute will
 # always be spoken.
 
-enabledTextAttributes = "size:; family-name:; weight:400; indent:0; underline:none; strikethrough:false; justification:left; style:normal;"
+enabledSpokenTextAttributes = "size:; family-name:; weight:400; indent:0; underline:none; strikethrough:false; justification:left; style:normal;"
 
+# The default set of text attributes to be brailled for the user. Specific
+# application scripts (or individual users can override these values if
+# so desired. Each of these text attributes is of the form <key>:<value>;
+# The <value> part will be the "default" value for that attribute. In
+# other words, if the attribute for a given piece of text has that value,
+# it won't be spoken. If no value part is given, then that attribute will
+# always be brailled.
+
+enabledBrailledTextAttributes = "size:; family-name:; weight:400; indent:0; underline:none; strikethrough:false; justification:left; style:normal;"
+
+# Text Attributes Braille Indicator (see textAttributesBrailleIndicator).
+# The values represent the character to be used in the attrOr
+# field of brlAPI's writeStruct.
+#
+TEXT_ATTR_BRAILLE_NONE = '\x00' # 00000000
+TEXT_ATTR_BRAILLE_7    = '\x40' # 01000000
+TEXT_ATTR_BRAILLE_8    = '\x80' # 10000000
+TEXT_ATTR_BRAILLE_BOTH = '\xc0' # 11000000
+textAttributesBrailleIndicator = TEXT_ATTR_BRAILLE_NONE
+
 # The limit to enable a repeat character count to be spoken.
 # If set to 0, then there will be no repeat character count.
 # Each character will be spoken singularly (i.e. "dash dash
Index: src/orca/orca-setup.glade
===================================================================
--- src/orca/orca-setup.glade	(revision 2519)
+++ src/orca/orca-setup.glade	(working copy)
@@ -1614,6 +1614,149 @@
 		      <property name="fill">False</property>
 		    </packing>
 		  </child>
+
+		  <child>
+		    <widget class="GtkFrame" id="brailleSelectionFrame">
+		      <property name="visible">True</property>
+		      <property name="label_xalign">0</property>
+		      <property name="label_yalign">0.5</property>
+		      <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+		      <child>
+			<widget class="GtkAlignment" id="alignment57">
+			  <property name="visible">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xscale">1</property>
+			  <property name="yscale">1</property>
+			  <property name="top_padding">0</property>
+			  <property name="bottom_padding">0</property>
+			  <property name="left_padding">12</property>
+			  <property name="right_padding">0</property>
+
+			  <child>
+			    <widget class="GtkVBox" id="vbox28">
+			      <property name="border_width">3</property>
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">0</property>
+
+			      <child>
+				<widget class="GtkRadioButton" id="brailleSelectionNoneButton">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">_None</property>
+				  <property name="use_underline">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <signal name="toggled" handler="brailleSelectionChanged" last_modification_time="Thu, 28 Jun 2007 20:00:47 GMT"/>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkRadioButton" id="brailleSelection7Button">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Dot _7</property>
+				  <property name="use_underline">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">brailleSelectionNoneButton</property>
+				  <signal name="toggled" handler="brailleSelectionChanged" last_modification_time="Thu, 28 Jun 2007 20:01:03 GMT"/>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkRadioButton" id="brailleSelection8Button">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Dot _8</property>
+				  <property name="use_underline">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">brailleSelectionNoneButton</property>
+				  <signal name="toggled" handler="brailleSelectionChanged" last_modification_time="Thu, 28 Jun 2007 20:01:28 GMT"/>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkRadioButton" id="brailleSelectionBothButton">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Dots 7 an_d 8</property>
+				  <property name="use_underline">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+				  <property name="active">False</property>
+				  <property name="inconsistent">False</property>
+				  <property name="draw_indicator">True</property>
+				  <property name="group">brailleSelectionNoneButton</property>
+				  <signal name="toggled" handler="brailleSelectionChanged" last_modification_time="Thu, 28 Jun 2007 20:01:43 GMT"/>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label28">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">&lt;b&gt;Selection Indicator&lt;/b&gt;</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">True</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="type">label_item</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
 		</widget>
 		<packing>
 		  <property name="tab_expand">False</property>
@@ -3559,129 +3702,286 @@
 		  </child>
 
 		  <child>
-		    <widget class="GtkFrame" id="adjustAttributesFrame">
-		      <property name="border_width">5</property>
+		    <widget class="GtkVBox" id="vbox26">
 		      <property name="visible">True</property>
-		      <property name="label_xalign">0</property>
-		      <property name="label_yalign">0.5</property>
-		      <property name="shadow_type">GTK_SHADOW_NONE</property>
+		      <property name="homogeneous">True</property>
+		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkAlignment" id="alignment54">
+			<widget class="GtkFrame" id="adjustAttributesFrame">
+			  <property name="border_width">5</property>
 			  <property name="visible">True</property>
-			  <property name="xalign">0.5</property>
-			  <property name="yalign">0.5</property>
-			  <property name="xscale">1</property>
-			  <property name="yscale">1</property>
-			  <property name="top_padding">0</property>
-			  <property name="bottom_padding">0</property>
-			  <property name="left_padding">12</property>
-			  <property name="right_padding">0</property>
+			  <property name="label_xalign">0</property>
+			  <property name="label_yalign">0.5</property>
+			  <property name="shadow_type">GTK_SHADOW_NONE</property>
 
 			  <child>
-			    <widget class="GtkVBox" id="vbox25">
-			      <property name="border_width">5</property>
+			    <widget class="GtkAlignment" id="alignment55">
 			      <property name="visible">True</property>
-			      <property name="homogeneous">False</property>
-			      <property name="spacing">0</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xscale">1</property>
+			      <property name="yscale">1</property>
+			      <property name="top_padding">0</property>
+			      <property name="bottom_padding">0</property>
+			      <property name="left_padding">12</property>
+			      <property name="right_padding">0</property>
 
 			      <child>
-				<widget class="GtkButton" id="textMoveToTopButton">
+				<widget class="GtkVBox" id="vbox25">
 				  <property name="border_width">5</property>
 				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="label" translatable="yes">Move to _top</property>
-				  <property name="use_underline">True</property>
-				  <property name="relief">GTK_RELIEF_NORMAL</property>
-				  <property name="focus_on_click">True</property>
-				  <signal name="clicked" handler="textMoveToTopButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:14 GMT"/>
-				</widget>
-				<packing>
-				  <property name="padding">0</property>
-				  <property name="expand">False</property>
-				  <property name="fill">False</property>
-				</packing>
-			      </child>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
 
-			      <child>
-				<widget class="GtkButton" id="textMoveUpOneButton">
-				  <property name="border_width">5</property>
-				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="label" translatable="yes">Move _up one</property>
-				  <property name="use_underline">True</property>
-				  <property name="relief">GTK_RELIEF_NORMAL</property>
-				  <property name="focus_on_click">True</property>
-				  <signal name="clicked" handler="textMoveUpOneButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:22 GMT"/>
+				  <child>
+				    <widget class="GtkButton" id="textMoveToTopButton">
+				      <property name="border_width">5</property>
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Move to _top</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <signal name="clicked" handler="textMoveToTopButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:14 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="textMoveUpOneButton">
+				      <property name="border_width">5</property>
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Move _up one</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <signal name="clicked" handler="textMoveUpOneButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:22 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="textMoveDownOneButton">
+				      <property name="border_width">5</property>
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Move _down one</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <signal name="clicked" handler="textMoveDownOneButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:28 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="textMoveToBottomButton">
+				      <property name="border_width">5</property>
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Move to _bottom</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <signal name="clicked" handler="textMoveToBottomButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:36 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
 				</widget>
-				<packing>
-				  <property name="padding">0</property>
-				  <property name="expand">False</property>
-				  <property name="fill">False</property>
-				</packing>
 			      </child>
+			    </widget>
+			  </child>
 
+			  <child>
+			    <widget class="GtkLabel" id="label26">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Adjust selected
+attributes&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="type">label_item</property>
+			    </packing>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkFrame" id="brailleIndicatorFrame">
+			  <property name="border_width">5</property>
+			  <property name="visible">True</property>
+			  <property name="label_xalign">0</property>
+			  <property name="label_yalign">0.5</property>
+			  <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+			  <child>
+			    <widget class="GtkAlignment" id="alignment56">
+			      <property name="visible">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xscale">1</property>
+			      <property name="yscale">1</property>
+			      <property name="top_padding">0</property>
+			      <property name="bottom_padding">0</property>
+			      <property name="left_padding">12</property>
+			      <property name="right_padding">0</property>
+
 			      <child>
-				<widget class="GtkButton" id="textMoveDownOneButton">
-				  <property name="border_width">5</property>
+				<widget class="GtkVBox" id="vbox27">
+				  <property name="border_width">3</property>
 				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="label" translatable="yes">Move _down one</property>
-				  <property name="use_underline">True</property>
-				  <property name="relief">GTK_RELIEF_NORMAL</property>
-				  <property name="focus_on_click">True</property>
-				  <signal name="clicked" handler="textMoveDownOneButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:28 GMT"/>
-				</widget>
-				<packing>
-				  <property name="padding">0</property>
-				  <property name="expand">False</property>
-				  <property name="fill">False</property>
-				</packing>
-			      </child>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">0</property>
 
-			      <child>
-				<widget class="GtkButton" id="textMoveToBottomButton">
-				  <property name="border_width">5</property>
-				  <property name="visible">True</property>
-				  <property name="can_focus">True</property>
-				  <property name="label" translatable="yes">Move to _bottom</property>
-				  <property name="use_underline">True</property>
-				  <property name="relief">GTK_RELIEF_NORMAL</property>
-				  <property name="focus_on_click">True</property>
-				  <signal name="clicked" handler="textMoveToBottomButtonClicked" last_modification_time="Fri, 08 Jun 2007 17:30:36 GMT"/>
+				  <child>
+				    <widget class="GtkRadioButton" id="textBrailleNoneButton">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">_None</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <signal name="toggled" handler="brailleIndicatorChanged" last_modification_time="Wed, 20 Jun 2007 15:35:15 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkRadioButton" id="textBraille7Button">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Dot _7</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <property name="group">textBrailleNoneButton</property>
+				      <signal name="toggled" handler="brailleIndicatorChanged" last_modification_time="Wed, 20 Jun 2007 15:35:33 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkRadioButton" id="textBraille8Button">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Dot _8</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <property name="group">textBrailleNoneButton</property>
+				      <signal name="toggled" handler="brailleIndicatorChanged" last_modification_time="Wed, 20 Jun 2007 15:35:46 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkRadioButton" id="textBrailleBothButton">
+				      <property name="visible">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">Dots 7 an_d 8</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				      <property name="active">False</property>
+				      <property name="inconsistent">False</property>
+				      <property name="draw_indicator">True</property>
+				      <property name="group">textBrailleNoneButton</property>
+				      <signal name="toggled" handler="brailleIndicatorChanged" last_modification_time="Wed, 20 Jun 2007 15:35:57 GMT"/>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
 				</widget>
-				<packing>
-				  <property name="padding">0</property>
-				  <property name="expand">False</property>
-				  <property name="fill">False</property>
-				</packing>
 			      </child>
 			    </widget>
 			  </child>
-			</widget>
-		      </child>
 
-		      <child>
-			<widget class="GtkLabel" id="adjustAttributesFrameLabel">
-			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">&lt;b&gt;Adjust selected
-attributes&lt;/b&gt;</property>
-			  <property name="use_underline">False</property>
-			  <property name="use_markup">True</property>
-			  <property name="justify">GTK_JUSTIFY_LEFT</property>
-			  <property name="wrap">False</property>
-			  <property name="selectable">False</property>
-			  <property name="xalign">0.5</property>
-			  <property name="yalign">0.5</property>
-			  <property name="xpad">0</property>
-			  <property name="ypad">0</property>
-			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-			  <property name="width_chars">-1</property>
-			  <property name="single_line_mode">False</property>
-			  <property name="angle">0</property>
+			  <child>
+			    <widget class="GtkLabel" id="label27">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;b&gt;Braille Indicator&lt;/b&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="type">label_item</property>
+			    </packing>
+			  </child>
 			</widget>
 			<packing>
-			  <property name="type">label_item</property>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
 			</packing>
 		      </child>
 		    </widget>
@@ -3694,7 +3994,7 @@
 		</widget>
 		<packing>
 		  <property name="tab_expand">False</property>
-		  <property name="tab_fill">True</property>
+		  <property name="tab_fill">False</property>
 		</packing>
 	      </child>
 
Index: src/orca/orca_prefs.py
===================================================================
--- src/orca/orca_prefs.py	(revision 2519)
+++ src/orca/orca_prefs.py	(working copy)
@@ -204,13 +204,50 @@
     else:
         return "orca.settings.LAPTOP_MODIFIER_KEYS"
 
-def _getTextAttributesString(enabledTextAttributes):
-    """ Returns a string that represents the enabled text attributes 
+def _getSpokenTextAttributesString(enabledSpokenTextAttributes):
+    """ Returns a string that represents the enabled spoken text attributes 
     passed in.
     """
 
-    return "\"" + enabledTextAttributes + "\""
+    return "\"" + enabledSpokenTextAttributes + "\""
 
+def _getBrailledTextAttributesString(enabledBrailledTextAttributes):
+    """ Returns a string that represents the enabled brailled text attributes
+    passed in.
+    """
+
+    return "\"" + enabledBrailledTextAttributes + "\""
+
+def _getTextAttributesBrailleIndicatorString(brailleIndicator):
+    """Returns a string that represents the text attribute braille indicator
+    value passed in."""
+
+    if brailleIndicator == settings.TEXT_ATTR_BRAILLE_NONE:
+        return "orca.settings.TEXT_ATTR_BRAILLE_NONE"
+    elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_7:
+        return "orca.settings.TEXT_ATTR_BRAILLE_7"
+    elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_8:
+        return "orca.settings.TEXT_ATTR_BRAILLE_8"
+    elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_BOTH:
+        return "orca.settings.TEXT_ATTR_BRAILLE_BOTH"
+    else:
+        return "orca.settings.TEXT_ATTR_BRAILLE_NONE"
+
+def _getBrailleSelectionIndicatorString(selectionIndicator):
+    """Returns a string that represents the braille selection indicator
+    value passed in."""
+
+    if selectionIndicator == settings.BRAILLE_SEL_NONE:
+        return "orca.settings.BRAILLE_SEL_NONE"
+    elif selectionIndicator == settings.BRAILLE_SEL_7:
+        return "orca.settings.BRAILLE_SEL_7"
+    elif selectionIndicator == settings.BRAILLE_SEL_8:
+        return "orca.settings.BRAILLE_SEL_8"
+    elif selectionIndicator == settings.BRAILLE_SEL_BOTH:
+        return "orca.settings.BRAILLE_SEL_BOTH"
+    else:
+        return "orca.settings.BRAILLE_SEL_NONE"
+
 def _getVerbosityString(verbosityLevel):
     """Returns a string that represents the verbosity level passed in."""
     if verbosityLevel == settings.VERBOSITY_LEVEL_BRIEF:
@@ -485,6 +522,8 @@
             value = _getVerbosityString(prefsDict[key])
         elif key == "brailleRolenameStyle":
             value = _getBrailleRolenameStyleString(prefsDict[key])
+        elif key == "brailleSelectorIndicator":
+            value = _getBrailleSelectionIndicatorString(prefsDict[key])
         elif key == "verbalizePunctuationStyle":
             value = _getVerbalizePunctuationStyleString(prefsDict[key])
         elif key == "sayAllStyle":
@@ -501,8 +540,12 @@
             value = _getKeyboardLayoutString(prefsDict[key])
         elif key == "orcaModifierKeys":
             value = _getOrcaModifierKeysString(prefsDict[key])
-        elif key == "enabledTextAttributes":
-            value = _getTextAttributesString(prefsDict[key])
+        elif key == "enabledSpokenTextAttributes":
+            value = _getSpokenTextAttributesString(prefsDict[key])
+        elif key == "enabledBrailledTextAttributes":
+            value = _getBrailledTextAttributesString(prefsDict[key])
+        elif key == "textAttributesBrailleIndicator":
+            value = _getTextAttributesBrailleIndicatorString(prefsDict[key])
         else:
             value = prefsDict[key]
 
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 2519)
+++ src/orca/default.py	(working copy)
@@ -3283,7 +3283,7 @@
             # Get a dictionary of text attributes that the user cares about.
             #
             [userAttrList, userAttrDict] = \
-                self.textAttrsToDictionary(settings.enabledTextAttributes)
+                self.textAttrsToDictionary(settings.enabledSpokenTextAttributes)
 
             # Create a dictionary of just the items we are interested in.
             # Always include size and family-name. For the others, if the
Index: src/orca/braille.py
===================================================================
--- src/orca/braille.py	(revision 2519)
+++ src/orca/braille.py	(working copy)
@@ -292,6 +292,16 @@
         been scrolled off the display."""
         pass
 
+    def getAttributeMask(self):
+        """Creates a string which can be used as the attrOr field of brltty's
+        write structure for the purpose of indicating text attributes and
+        selection."""
+
+        # Create an empty mask.
+        #
+        mask = ['\x00'] * len(self.string)
+        return "".join(mask)
+
 class Component(Region):
     """A subclass of Region backed by an accessible.  This Region will react
     to any cursor routing key events and perform the default action on the
@@ -373,7 +383,8 @@
 
         self._maxCaretOffset = self.lineOffset + len(string.decode("UTF-8"))
 
-        string = string + eol
+        self.eol = eol
+        string = string + self.eol
 
         self.label = label
         if self.label:
@@ -418,6 +429,101 @@
         newCaretOffset = min(self.lineOffset + offset, self._maxCaretOffset)
         self.accessible.text.setCaretOffset(newCaretOffset)
 
+    def getAttributeMask(self):
+        """Creates a string which can be used as the attrOr field of brltty's
+        write structure for the purpose of indicating text attributes and
+        selection."""
+
+        text = self.accessible.text
+
+        # Start with an empty mask.
+        #
+        stringLength = len(self.string) - len(self.eol)
+        attrMask = ['\x00']*stringLength
+
+        attrIndicator = settings.textAttributesBrailleIndicator
+        selIndicator = settings.brailleSelectorIndicator
+        indicateAttr = (attrIndicator != settings.TEXT_ATTR_BRAILLE_NONE)
+        indicateSel = (selIndicator != settings.BRAILLE_SEL_NONE)
+
+        if indicateAttr:
+            # Identify what attributes the user cares about.  Also get the
+            # default attributes for the text object because those attributes
+            # may not be included as attributes for the character.
+            #
+            script = orca_state.activeScript
+            enabledAttributes = settings.enabledBrailledTextAttributes
+            [userAttrList, userAttrDict] = \
+                script.textAttrsToDictionary(enabledAttributes)
+            defaultAttributes = text.getDefaultAttributes()
+            [defaultAttrList, defaultAttrDict] = \
+                script.textAttrsToDictionary(defaultAttributes)
+
+            # [[[TODO - HACK - JD: The end offset returned by SO/OOo is the
+            # offset of the first character that doesn't have the attribute
+            # in question; all other apps return the offset of the last
+            # character that has that attribute]]]
+            #
+            adjustment = 0
+            if orca_state.locusOfFocus.app.name == "soffice.bin":
+                adjustment += 1
+
+            i = self.lineOffset
+            endOffset = self.lineOffset + stringLength
+            while i < endOffset:
+                for attribute in userAttrList:
+                    defaultValue = None
+                    if attribute in defaultAttrList:
+                        defaultValue = defaultAttrDict[attribute]
+                    [value, start, end, defined] = \
+                            text.getAttributeValue(i, attribute)
+
+                    notOfInterest = userAttrDict[attribute]
+                    if defined:
+                        weCare = (value != notOfInterest)
+                    elif defaultValue and len(notOfInterest):
+                        weCare = (defaultValue != notOfInterest)
+                    else:
+                        weCare = False
+
+                    if weCare and start >= 0:
+                        maskStart = start - self.lineOffset
+                        maskEnd = end - self.lineOffset - adjustment
+                        maskLength = maskEnd - maskStart
+                        attrMask[maskStart:maskEnd] = \
+                                                  [attrIndicator] * maskLength
+                i = end
+
+        if indicateSel:
+            nSelections = text.getNSelections()
+            if nSelections:
+                for i in range(0, nSelections):
+                    [start, end] = text.getSelection(i)
+                    maskStart = max(self.lineOffset, start) - self.lineOffset
+                    maskEnd = end - self.lineOffset
+                    # Combine the selection indicator with the attribute
+                    # indicator.
+                    #
+                    for j in range(maskStart, maskEnd):
+                        if attrMask[j] != '\x00' \
+                           and attrMask[j] != selIndicator:
+                            attrMask[j] = '\xc0'
+                        else:
+                            attrMask[j] = selIndicator
+
+        mask = "".join(attrMask)
+
+        # Add empty mask characters for the EOL character as well as for
+        # any label that might be present.
+        #
+        for i in range (0, len(self.eol)):
+            mask += '\x00'
+        if self.label:
+            for i in range (0, len(self.label) + 1):
+                mask = '\x00' + mask
+
+        return mask
+
 class ReviewComponent(Component):
     """A subclass of Component that is to be used for flat review mode."""
 
@@ -489,11 +595,12 @@
         If the region with focus is not on this line, then the index
         will be -1.
 
-        Returns [string, offsetIndex]
+        Returns [string, offsetIndex, attributeMask]
         """
 
         string = ""
         focusOffset = -1
+        attributeMask = ""
         for region in self.regions:
             if region == _regionWithFocus:
                 focusOffset = len(string.decode("UTF-8"))
@@ -503,8 +610,10 @@
                 # BrlTTY.]]]
                 #
                 string += region.string.replace("\342\200\246", "...")
+            mask = region.getAttributeMask()
+            attributeMask += mask
 
-        return [string, focusOffset]
+        return [string, focusOffset, attributeMask]
 
     def getRegionAtOffset(self, offset):
         """Finds the Region at the given 0-based offset in this line.
@@ -631,7 +740,7 @@
             lineNum += 1
 
     line = _lines[_viewport[1]]
-    [string, offset] = line.getLineInfo()
+    [string, offset, attributeMask] = line.getLineInfo()
 
     # If the cursor is too far right, we scroll the viewport
     # so the cursor will be on the last cell of the display.
@@ -686,7 +795,7 @@
     # actually is in the string.
     #
     line = _lines[_viewport[1]]
-    [string, focusOffset] = line.getLineInfo()
+    [string, focusOffset, attributeMask] = line.getLineInfo()
     cursorOffset = -1
     if focusOffset >= 0:
         cursorOffset = focusOffset + _regionWithFocus.cursorOffset
@@ -742,6 +851,8 @@
             writeStruct.regionSize = len(substring.decode("UTF-8"))
             while writeStruct.regionSize < _displaySize[0]:
                 substring += " "
+                if attributeMask:
+                    attributeMask += '\x00'
                 writeStruct.regionSize += 1
             writeStruct.text = substring
             writeStruct.cursor = cursorCell
@@ -762,6 +873,9 @@
             #    myUnderline += '\xc0'
             #writeStruct.attrOr = myUnderline
 
+            if attributeMask:
+                writeStruct.attrOr = attributeMask[startPos:endPos]
+
             brlAPI.write(writeStruct)
     else:
         brl.writeText(cursorCell, substring)
@@ -770,7 +884,9 @@
         if not monitor:
             monitor = brlmon.BrlMon(_displaySize[0])
             monitor.show_all()
-        monitor.writeText(cursorCell, substring)
+        if attributeMask:
+            subMask = attributeMask[startPos:endPos]
+        monitor.writeText(cursorCell, substring, subMask)
     elif monitor:
         monitor.destroy()
 
@@ -854,7 +970,7 @@
     if len(_lines) > 0:
         lineNum = _viewport[1]
         newX = _viewport[0] + panAmount
-        [string, focusOffset] = _lines[lineNum].getLineInfo()
+        [string, focusOffset, attributeMask] = _lines[lineNum].getLineInfo()
         if newX < len(string.decode("UTF-8")):
             _viewport[0] = newX
 
Index: src/orca/orca_gui_prefs.py
===================================================================
--- src/orca/orca_gui_prefs.py	(revision 2519)
+++ src/orca/orca_gui_prefs.py	(working copy)
@@ -60,7 +60,7 @@
 
 (HANDLER, DESCRIP, MOD_MASK1, MOD_USED1, KEY1, TEXT1, MOD_MASK2, MOD_USED2, KEY2, TEXT2, MODIF, EDITABLE) = range(12)
 
-(IS_SPOKEN, NAME, VALUE) = range(3)
+(NAME, IS_SPOKEN, IS_BRAILLED, VALUE) = range(4)
 
 class orcaSetupGUI(orca_glade.GladeWrapper):
 
@@ -745,13 +745,14 @@
         self._setupSpeechSystems(factories)
         self.initializingSpeech = False
 
-    def _setTextAttributes(self, view, setAttributes, state, moveToTop=False):
-        """Given a set of text attributes, update the model used by the
+    def _setSpokenTextAttributes(self, view, setAttributes,
+                                 state, moveToTop=False):
+        """Given a set of spoken text attributes, update the model used by the
         text attribute tree view.
 
         Arguments:
         - view: the text attribute tree view.
-        - setAttributes: the list of attributes to update.
+        - setAttributes: the list of spoken text attributes to update.
         - state: the state (True or False) that they all should be set to.
         - moveToTop: if True, move these attributes to the top of the list.
         """
@@ -769,8 +770,8 @@
             for path in range(0, len(allAttrList)):
                 if attrList[i] == model[path][NAME]:
                     iter = model.get_iter(path)
-                    model.set(iter, IS_SPOKEN, state,
-                                    NAME, attrList[i],
+                    model.set(iter, NAME, attrList[i],
+                                    IS_SPOKEN, state,
                                     VALUE, attrDict[attrList[i]])
                     if moveToTop:
                         iter = model.get_iter(path)
@@ -780,25 +781,60 @@
 
         view.set_model(model)
 
+    def _setBrailledTextAttributes(self, view, setAttributes, state):
+        """Given a set of brailled text attributes, update the model used
+        by the text attribute tree view.
+
+        Arguments:
+        - view: the text attribute tree view.
+        - setAttributes: the list of brailled text attributes to update.
+        - state: the state (True or False) that they all should be set to.
+        """
+
+        model = view.get_model()
+        view.set_model(None)
+
+        defScript = default.Script(None)
+        [attrList, attrDict] = \
+            defScript.textAttrsToDictionary(setAttributes)
+        [allAttrList, allAttrDict] = \
+            defScript.textAttrsToDictionary(settings.allTextAttributes)
+
+        for i in range(0, len(attrList)):
+            for path in range(0, len(allAttrList)):
+                if attrList[i] == model[path][NAME]:
+                    iter = model.get_iter(path)
+                    model.set(iter, IS_BRAILLED, state)
+                    break
+
+        view.set_model(model)
+
     def _updateTextDictEntry(self):
         """The user has updated the text attribute list in some way. Update
-        the "enabledTextAttributes" preference string to reflect the current
-        state of the text attribute list.
+        the "enabledSpokenTextAttributes" and "enabledBrailledTextAttributes"
+        preference strings to reflect the current state of the corresponding
+        text attribute lists.
         """
 
         model = self.getTextAttributesView.get_model()
-        attrStr = ""
+        spokenAttrStr = ""
+        brailledAttrStr = ""
         noRows = model.iter_n_children(None)
         for path in range(0, noRows):
             if model[path][IS_SPOKEN]:
-                attrStr += model[path][NAME] + ":" + model[path][VALUE] + "; "
+                spokenAttrStr += model[path][NAME] + ":" + \
+                                 model[path][VALUE] + "; "
+            if model[path][IS_BRAILLED]:
+                brailledAttrStr += model[path][NAME] + ":" + \
+                                   model[path][VALUE] + "; "
 
-        self.prefsDict["enabledTextAttributes"] = attrStr
+        self.prefsDict["enabledSpokenTextAttributes"] = spokenAttrStr
+        self.prefsDict["enabledBrailledTextAttributes"] = brailledAttrStr
 
-    def textAttributeToggled(self, cell, path, model):
+    def textAttributeSpokenToggled(self, cell, path, model):
         """The user has toggled the state of one of the text attribute
-        checkboxes. Update our model to reflect this, then update the
-        "enabledTextAttributes" preference string.
+        checkboxes to be spoken. Update our model to reflect this, then
+        update the "enabledSpokenTextAttributes" preference string.
 
         Arguments:
         - cell: the cell that changed.
@@ -810,14 +846,30 @@
         model.set(iter, IS_SPOKEN, not model[path][IS_SPOKEN])
         self._updateTextDictEntry()
 
+    def textAttributeBrailledToggled(self, cell, path, model):
+        """The user has toggled the state of one of the text attribute
+        checkboxes to be brailled. Update our model to reflect this,
+        then update the "enabledBrailledTextAttributes" preference string.
+
+        Arguments:
+        - cell: the cell that changed.
+        - path: the path of that cell.
+        - model: the model that the cell is part of.
+        """
+
+        iter = model.get_iter(path)
+        model.set(iter, IS_BRAILLED, not model[path][IS_BRAILLED])
+        self._updateTextDictEntry()
+
     def textAttrValueEdited(self, cell, path, new_text, model):
         """The user has edited the value of one of the text attributes.
-        Update our model to reflect this, then update the 
-        "enabledTextAttributes" preference string.
+        Update our model to reflect this, then update the
+        "enabledSpokenTextAttributes" and "enabledBrailledTextAttributes"
+        preference strings.
 
         Arguments:
         - cell: the cell that changed.
-        - path: the path of that cell. 
+        - path: the path of that cell.
         - new_text: the new text attribute value string.
         - model: the model that the cell is part of.
         """
@@ -848,17 +900,18 @@
                       attribute will be spoken or not.
           NAME      - the text attribute name.
           VALUE     - if set, (and this attributes is enabled for speaking),
-                      then this attribute will be spoken unless it equals 
+                      then this attribute will be spoken unless it equals
                       this value.
         """
 
         self.getTextAttributesView = \
                        self.widgets.get_widget("textAttributesTreeView")
-        model = gtk.ListStore(gobject.TYPE_BOOLEAN,
-                              gobject.TYPE_STRING,
+        model = gtk.ListStore(gobject.TYPE_STRING,
+                              gobject.TYPE_BOOLEAN,
+                              gobject.TYPE_BOOLEAN,
                               gobject.TYPE_STRING)
 
-        # Initially setup the list store model based on the values of all 
+        # Initially setup the list store model based on the values of all
         # the known text attributes.
         #
         defScript = default.Script(None)
@@ -866,47 +919,76 @@
                 defScript.textAttrsToDictionary(settings.allTextAttributes)
         for i in range(0, len(allAttrList)):
             iter = model.append()
-            model.set(iter, IS_SPOKEN, False,
-                            NAME, allAttrList[i],
+            model.set(iter, NAME, allAttrList[i],
+                            IS_SPOKEN, False,
+                            IS_BRAILLED, False,
                             VALUE, allAttrDict[allAttrList[i]])
 
         self.getTextAttributesView.set_model(model)
 
-        # Attribute Name column (IS_SPOKEN and NAME).
+        # Attribute Name column (NAME).
         #
         column = gtk.TreeViewColumn(_("Attribute Name"))
         column.set_min_width(250)
         column.set_resizable(True)
+        renderer = gtk.CellRendererText()
+        column.pack_end(renderer, True)
+        column.set_attributes(renderer, text=NAME)
+        self.getTextAttributesView.insert_column(column, 0)
+
+        # Attribute Speak column (IS_SPOKEN).
+        #
+        column = gtk.TreeViewColumn(_("Speak"))
+        renderer = gtk.CellRendererText()
+        renderer.set_property("text", (_("speak")))
+        renderer.set_property("visible", False)
+        column.pack_end(renderer, True)
         renderer = gtk.CellRendererToggle()
         column.pack_start(renderer, False)
         column.set_attributes(renderer, active=IS_SPOKEN)
         renderer.connect("toggled",
-                         self.textAttributeToggled,
+                         self.textAttributeSpokenToggled,
                          model)
+        self.getTextAttributesView.insert_column(column, 1)
+        column.clicked()
 
+        # Attribute Mark in Braille column (IS_BRAILLED).
+        #
+        column = gtk.TreeViewColumn(_("Mark in braille"))
         renderer = gtk.CellRendererText()
+        renderer.set_property("text", (_("Mark in braille")))
+        renderer.set_property("visible", False)
         column.pack_end(renderer, True)
-        column.set_attributes(renderer, text=NAME)
-
-        self.getTextAttributesView.insert_column(column, 0)
+        renderer = gtk.CellRendererToggle()
+        column.pack_start(renderer, False)
+        column.set_attributes(renderer, active=IS_BRAILLED)
+        renderer.connect("toggled",
+                         self.textAttributeBrailledToggled,
+                         model)
+        self.getTextAttributesView.insert_column(column, 2)
         column.clicked()
 
         # Attribute Value column (VALUE)
         #
-        column = gtk.TreeViewColumn(_("Speak Unless"))
+        column = gtk.TreeViewColumn(_("Present Unless"))
         renderer = gtk.CellRendererText()
         renderer.set_property('editable', True)
         column.pack_end(renderer, True)
         column.set_attributes(renderer, text=VALUE)
         renderer.connect("edited", self.textAttrValueEdited, model)
 
-        self.getTextAttributesView.insert_column(column, 1)
+        self.getTextAttributesView.insert_column(column, 4)
 
         # Check all the enabled (spoken) text attributes.
         #
-        self._setTextAttributes(self.getTextAttributesView,
-                                settings.enabledTextAttributes, True, True)
+        self._setSpokenTextAttributes(self.getTextAttributesView,
+                            settings.enabledSpokenTextAttributes, True, True)
 
+        # Check all the enabled (brailled) text attributes.
+        #
+        self._setBrailledTextAttributes(self.getTextAttributesView,
+                                settings.enabledBrailledTextAttributes, True)
+
         # Connect a handler for when the user changes columns within the
         # view, so that we can adjust the search column for item lookups.
         #
@@ -978,6 +1060,16 @@
         else:
             self.brailleVerboseButton.set_active(True)
 
+        selectionIndicator = prefs["brailleSelectorIndicator"]
+        if selectionIndicator == settings.BRAILLE_SEL_7:
+            self.brailleSelection7Button.set_active(True)
+        elif selectionIndicator == settings.BRAILLE_SEL_8:
+            self.brailleSelection8Button.set_active(True)
+        elif selectionIndicator == settings.BRAILLE_SEL_BOTH:
+            self.brailleSelectionBothButton.set_active(True)
+        else:
+            self.brailleSelectionNoneButton.set_active(True)
+
         # Key Echo pane.
         #
         self.keyEchoCheckbutton.set_active(prefs["enableKeyEcho"])
@@ -1163,6 +1255,16 @@
         #
         self._createTextAttributesTreeView()
 
+        brailleIndicator = prefs["textAttributesBrailleIndicator"]
+        if brailleIndicator == settings.TEXT_ATTR_BRAILLE_7:
+            self.textBraille7Button.set_active(True)
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_8:
+            self.textBraille8Button.set_active(True)
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_BOTH:
+            self.textBrailleBothButton.set_active(True)
+        else:
+            self.textBrailleNoneButton.set_active(True)
+
         # General pane.
         #
         self.showMainWindowCheckButton.set_active(prefs["showMainWindow"])
@@ -1229,8 +1331,8 @@
         # We always want to re-order the text attributes page so that enabled
         # items are consistently at the top.
         #
-        self._setTextAttributes(self.getTextAttributesView,
-                                settings.enabledTextAttributes, True, True)
+        self._setSpokenTextAttributes(self.getTextAttributesView,
+                            settings.enabledSpokenTextAttributes, True, True)
 
         self.orcaSetupWindow.show()
 
@@ -1775,6 +1877,61 @@
 
         self.prefsDict["enableEchoByWord"] = widget.get_active()
 
+    def brailleSelectionChanged(self, widget):
+        """Signal handler for the "toggled" signal for the
+           brailleSelectionNoneButton, brailleSelection7Button,
+           brailleSelection8Button or brailleSelectionBothButton
+           GtkRadioButton widgets. The user has toggled the braille
+           selection indicator value. If this signal was generated
+           as the result of a radio button getting selected (as
+           opposed to a radio button losing the selection), set the
+           'brailleSelectorIndicator' preference to the new value.
+
+        Arguments:
+        - widget: the component that generated the signal.
+        """
+
+        if widget.get_active():
+            if widget.get_label() == _("Dot _7"):
+                self.prefsDict["brailleSelectorIndicator"] = \
+                    settings.BRAILLE_SEL_7
+            elif widget.get_label() == _("Dot _8"):
+                self.prefsDict["brailleSelectorIndicator"] = \
+                    settings.BRAILLE_SEL_8
+            elif widget.get_label() == _("Dots 7 an_d 8"):
+                self.prefsDict["brailleSelectorIndicator"] = \
+                    settings.BRAILLE_SEL_BOTH
+            else:
+                self.prefsDict["brailleSelectorIndicator"] = \
+                    settings.BRAILLE_SEL_NONE
+
+    def brailleIndicatorChanged(self, widget):
+        """Signal handler for the "toggled" signal for the
+           textBrailleNoneButton, textBraille7Button, textBraille8Button
+           or textBrailleBothButton GtkRadioButton widgets. The user has
+           toggled the text attributes braille indicator value. If this signal
+           was generated as the result of a radio button getting selected
+           (as opposed to a radio button losing the selection), set the
+           'textAttributesBrailleIndicator' preference to the new value.
+
+        Arguments:
+        - widget: the component that generated the signal.
+        """
+
+        if widget.get_active():
+            if widget.get_label() == _("Dot _7"):
+                self.prefsDict["textAttributesBrailleIndicator"] = \
+                    settings.TEXT_ATTR_BRAILLE_7
+            elif widget.get_label() == _("Dot _8"):
+                self.prefsDict["textAttributesBrailleIndicator"] = \
+                    settings.TEXT_ATTR_BRAILLE_8
+            elif widget.get_label() == _("Dots 7 an_d 8"):
+                self.prefsDict["textAttributesBrailleIndicator"] = \
+                    settings.TEXT_ATTR_BRAILLE_BOTH
+            else:
+                self.prefsDict["textAttributesBrailleIndicator"] = \
+                    settings.TEXT_ATTR_BRAILLE_NONE
+
     def punctuationLevelChanged(self, widget):
         """Signal handler for the "toggled" signal for the noneButton,
            someButton or allButton GtkRadioButton widgets. The user has
@@ -2345,56 +2502,65 @@
                     settings.LAPTOP_MODIFIER_KEYS
 
     def textSelectAllButtonClicked(self, widget):
-        """Signal handler for the "clicked" signal for the 
-        textSelectAllButton GtkButton widget. The user has clicked 
-        the Speak all button.  Check all the text attributes and 
-        then update the "enabledTextAttributes" preference string.
+        """Signal handler for the "clicked" signal for the
+        textSelectAllButton GtkButton widget. The user has clicked
+        the Speak all button.  Check all the text attributes and
+        then update the "enabledSpokenTextAttributes" and
+        "enabledBrailledTextAttributes" preference strings.
 
         Arguments:
         - widget: the component that generated the signal.
-        """ 
+        """
 
-        self._setTextAttributes(self.getTextAttributesView,
+        self._setSpokenTextAttributes(self.getTextAttributesView,
                                 settings.allTextAttributes, True)
+        self._setBrailledTextAttributes(self.getTextAttributesView,
+                                settings.allTextAttributes, True)
         self._updateTextDictEntry()
-        
+
     def textUnselectAllButtonClicked(self, widget):
-        """Signal handler for the "clicked" signal for the 
-        textUnselectAllButton GtkButton widget. The user has clicked 
-        the Speak none button. Uncheck all the text attributes and 
-        then update the "enabledTextAttributes" preference string.
+        """Signal handler for the "clicked" signal for the
+        textUnselectAllButton GtkButton widget. The user has clicked
+        the Speak none button. Uncheck all the text attributes and
+        then update the "enabledSpokenTextAttributes" and
+        "enabledBrailledTextAttributes" preference strings.
 
         Arguments:
-        - widget: the component that generated the signal. 
+        - widget: the component that generated the signal.
         """
 
-        self._setTextAttributes(self.getTextAttributesView,
+        self._setSpokenTextAttributes(self.getTextAttributesView,
                                 settings.allTextAttributes, False)
+        self._setBrailledTextAttributes(self.getTextAttributesView,
+                                settings.allTextAttributes, False)
         self._updateTextDictEntry()
-        
+
     def textResetButtonClicked(self, widget):
-        """Signal handler for the "clicked" signal for the 
+        """Signal handler for the "clicked" signal for the
         textResetButton GtkButton widget. The user has clicked
-        the Reset button. Reset all the text attributes to their 
-        initial state and then update the "enabledTextAttributes" 
-        preference string.
+        the Reset button. Reset all the text attributes to their
+        initial state and then update the "enabledSpokenTextAttributes"
+        and "enabledBrailledTextAttributes" preference strings.
 
         Arguments:
         - widget: the component that generated the signal.
         """
 
-        self._setTextAttributes(self.getTextAttributesView,
+        self._setSpokenTextAttributes(self.getTextAttributesView,
                                 settings.allTextAttributes, False)
-        self._setTextAttributes(self.getTextAttributesView,
-                                settings.enabledTextAttributes, True)
+        self._setSpokenTextAttributes(self.getTextAttributesView,
+                                settings.enabledSpokenTextAttributes, True)
+        self._setBrailledTextAttributes(self.getTextAttributesView,
+                                settings.enabledBrailledTextAttributes, True)
         self._updateTextDictEntry()
-        
+
     def textMoveToTopButtonClicked(self, widget):
         """Signal handler for the "clicked" signal for the
         textMoveToTopButton GtkButton widget. The user has clicked
-        the Move to top button. Move the selected rows in the text 
-        attribute view to the very top of the list and then update 
-        the "enabledTextAttributes" preference string.
+        the Move to top button. Move the selected rows in the text
+        attribute view to the very top of the list and then update
+        the "enabledSpokenTextAttributes" and "enabledBrailledTextAttributes"
+        preference strings.
 
         Arguments:
         - widget: the component that generated the signal.
@@ -2411,8 +2577,9 @@
         """Signal handler for the "clicked" signal for the
         textMoveUpOneButton GtkButton widget. The user has clicked
         the Move up one button. Move the selected rows in the text
-        attribute view up one row in the list and then update the 
-        "enabledTextAttributes" preference string.
+        attribute view up one row in the list and then update the
+        "enabledSpokenTextAttributes" and "enabledBrailledTextAttributes"
+        preference strings.
 
         Arguments:
         - widget: the component that generated the signal.
@@ -2432,7 +2599,8 @@
         textMoveDownOneButton GtkButton widget. The user has clicked
         the Move down one button. Move the selected rows in the text
         attribute view down one row in the list and then update the
-        "enabledTextAttributes" preference string.
+        "enabledSpokenTextAttributes" and "enabledBrailledTextAttributes"
+        preference strings.
 
         Arguments:
         - widget: the component that generated the signal.
@@ -2453,7 +2621,8 @@
         textMoveToBottomButton GtkButton widget. The user has clicked
         the Move to bottom button. Move the selected rows in the text
         attribute view to the bottom of the list and then update the
-        "enabledTextAttributes" preference string.
+        "enabledSpokenTextAttributes" and "enabledBrailledTextAttributes"
+        preference strings.
 
         Arguments:
         - widget: the component that generated the signal.
