diff --git a/source/braille.py b/source/braille.py
index 6971d81..dd21716 100644
--- a/source/braille.py
+++ b/source/braille.py
@@ -363,6 +363,9 @@ class Region(object):
 		#: Whether this region should be positioned at the absolute left of the display when focused.
 		#: @type: bool
 		self.focusToHardLeft = False
+		#: Indicates whether processed text by getProperties should be dotted 7 and 8 
+		#: @type: bool
+		self.markWithDots78 = False
 
 	def update(self):
 		"""Update this region.
@@ -405,6 +408,11 @@ class Region(object):
 				pass
 		else:
 			brailleCursorPos = None
+		# Mrk cells with 7 and 8 if required
+		if self.markWithDots78:
+			for pos in xrange(0, len(self.brailleCells)):
+				self.brailleCells[pos] |= DOT7 | DOT8
+			
 		self.brailleCursorPos = brailleCursorPos
 
 	def routeTo(self, braillePos):
@@ -433,19 +441,64 @@ class TextRegion(Region):
 		super(TextRegion, self).__init__()
 		self.rawText = text
 
+def mapToRawText(text, role, states, **options):
+	if text is None or role is None:
+		return " "
+	txt = options.get('value') if options.get('value') else options.get('name') if options.get('name') else None
+	text = text.replace('%t', txt) if txt is not None else text.replace('%t', '')
+	text = text.replace('%s', states) if states else text.replace('%s', '')
+	# text = text.replace('%r', role) if role else text
+	# text = text.replace('%n', options.get('name')) if options.get('name') else text
+	text = text.replace('%h', options.get('keyboardShortcut')) if options.get('keyboardShortcut') else text.replace('%h', '')
+	if options.get('positionInfo') is not None:
+		positionInfo = options.get('positionInfo')
+		text = text.replace('%i', str(positionInfo.get('indexInGroup'))) if positionInfo.get('indexInGroup') else text.replace('%i', '')
+		text = text.replace('%I', str(positionInfo.get('similarItemsInGroup'))) if positionInfo.get('similarItemsInGroup') else text.replace('%I', '')
+	text = text.replace('%c', str(options.get('columnNumber'))) if options.get('columnNumber') else text.replace('%c', '')
+	text = text.replace('%o', str(options.get('rowNumber'))) if options.get('rowNumber') else text.replace('%o', '')
+	text = text.replace('%d', options.get('description')) if options.get('description') else text.replace('%d', '')
+	return text if text is not None and len(text)>1 else " "
+
 def getBrailleTextForProperties(**propertyValues):
-	textList = []
 	name = propertyValues.get("name")
-	if name:
-		textList.append(name)
-	role = propertyValues.get("role")
+	role = propertyValues.get("role") 
 	states = propertyValues.get("states")
+	positiveStateText = []
+	negativeStateText = []
+	if states:
+		positiveStates = controlTypes.processPositiveStates(role, states, controlTypes.REASON_FOCUS, states)
+		positiveStateText.extend(positiveStateLabels.get(state, controlTypes.stateLabels[state]) for state in positiveStates)
+		negativeStates = controlTypes.processNegativeStates(role, states, controlTypes.REASON_FOCUS, None)
+		negativeStateText.extend(negativeStateLabels.get(state, controlTypes.negativeStateLabels.get(state, _("not %s") % controlTypes.stateLabels[state])) for state in negativeStates)
+
 	positionInfo = propertyValues.get("positionInfo")
 	level = positionInfo.get("level") if positionInfo else None
 	cellCoordsText=propertyValues.get('cellCoordsText')
 	rowNumber = propertyValues.get("rowNumber")
 	columnNumber = propertyValues.get("columnNumber")
 	includeTableCellCoords = propertyValues.get("includeTableCellCoords", True)
+	value = propertyValues.get("value")
+	description = propertyValues.get("description")
+	keyboardShortcut = propertyValues.get("keyboardShortcut")
+
+	# Braille mapper takes precidence. If rule is not found in current config
+	# just continue with old behaviour 
+	try:
+		val = config.conf['braillemapper'][str(role)]
+		positiveStateText.extend(negativeStateText)
+		states = " ".join([x for x in positiveStateText if x])
+		del propertyValues['states']
+		del propertyValues['role']
+		return mapToRawText(val, 
+		role if role else propertyValues.get("_role"),
+		states, **propertyValues)
+	except KeyError:   # no settings found so ignroe it
+		pass
+	
+	# since braillemapper is processed or failed continue with default presentation scheme
+	textList = []
+	if name:
+		textList.append(name)
 	if role is not None:
 		if role == controlTypes.ROLE_HEADING and level:
 			# Translators: Displayed in braille for a heading with a level.
@@ -464,20 +517,15 @@ def getBrailleTextForProperties(**propertyValues):
 	else:
 		role = propertyValues.get("_role")
 		roleText = None
-	value = propertyValues.get("value")
 	if value and role not in controlTypes.silentValuesForRoles:
 		textList.append(value)
-	if states:
-		positiveStates = controlTypes.processPositiveStates(role, states, controlTypes.REASON_FOCUS, states)
-		textList.extend(positiveStateLabels.get(state, controlTypes.stateLabels[state]) for state in positiveStates)
-		negativeStates = controlTypes.processNegativeStates(role, states, controlTypes.REASON_FOCUS, None)
-		textList.extend(negativeStateLabels.get(state, controlTypes.negativeStateLabels.get(state, _("not %s") % controlTypes.stateLabels[state])) for state in negativeStates)
+	if positiveStateText or negativeStateText:
+		textList.extend(positiveStateText)
+		textList.extend(negativeStateText)
 	if roleText:
 		textList.append(roleText)
-	description = propertyValues.get("description")
 	if description:
 		textList.append(description)
-	keyboardShortcut = propertyValues.get("keyboardShortcut")
 	if keyboardShortcut:
 		textList.append(keyboardShortcut)
 	if positionInfo:
@@ -529,7 +577,8 @@ class NVDAObjectRegion(Region):
 	def update(self):
 		obj = self.obj
 		presConfig = config.conf["presentation"]
-		text = getBrailleTextForProperties(name=obj.name, role=obj.role,
+		role = obj.role
+		text = getBrailleTextForProperties(name=obj.name, role=role,
 			value=obj.value if not NVDAObjectHasUsefulText(obj) else None ,
 			states=obj.states,
 			description=obj.description if presConfig["reportObjectDescriptions"] else None,
@@ -537,6 +586,15 @@ class NVDAObjectRegion(Region):
 			positionInfo=obj.positionInfo if presConfig["reportObjectPositionInformation"] else None,
 			cellCoordsText=obj.cellCoordsText if config.conf["documentFormatting"]["reportTableCellCoords"] else None,
 		)
+		try:
+			for r in config.conf['braillemapper']['dots78roles'].split(' '):
+				if role and int(r) is role:
+					self.markWithDots78 = True
+					break
+			
+		except KeyError:
+			pass
+
 		self.rawText = text + self.appendText
 		super(NVDAObjectRegion, self).update()
 
@@ -654,6 +712,7 @@ class TextInfoRegion(Region):
 
 	def _getTypeformFromFormatField(self, field):
 		typeform = louis.plain_text
+		
 		if field.get("bold", False):
 			typeform |= louis.bold
 		if field.get("italic", False):
diff --git a/source/config/__init__.py b/source/config/__init__.py
index d93e720..15d5eef 100644
--- a/source/config/__init__.py
+++ b/source/config/__init__.py
@@ -95,6 +95,9 @@ confspec = ConfigObj(StringIO(
 	[[__many__]]
 		port = string(default="")
 
+# Braille mapper settings
+[braillemapper]
+
 # Presentation settings
 [presentation]
 		reportKeyboardShortcuts = boolean(default=true)
