diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 92fa6ada54d1314d35afdbeff3eccdc2b78d66f0..c41c19216ca37f5231f53d9b8d266a8cfacdb7ff 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -431,13 +431,30 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
 	mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form));
 }
 
-LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Params &p)
-:	mVisible(p.visible),
-	mResponse(p.response),
-	mType(p.type),
-	mTag(p.tag),
-	mName(p.name)
+LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Rule &p)
 {
+	if (p.show.isChosen())
+	{
+		mType = p.show.type;
+		mTag = p.show.tag;
+		mName = p.show.name;
+		mVisible = true;
+	}
+	else if (p.hide.isChosen())
+	{
+		mType = p.hide.type;
+		mTag = p.hide.tag;
+		mName = p.hide.name;
+		mVisible = false;
+	}
+	else if (p.respond.isChosen())
+	{
+		mType = p.respond.type;
+		mTag = p.respond.tag;
+		mName = p.respond.name;
+		mVisible = false;
+		mResponse = p.respond.response;
+	}
 }
 
 LLNotification::LLNotification(const LLNotification::Params& p) : 
@@ -1465,18 +1482,9 @@ bool LLNotifications::loadVisibilityRules()
 	const std::string xml_filename = "notification_visibility.xml";
 	std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename);
 
-	LLXMLNodePtr root;
-	BOOL success  = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
-	
-	if (!success || root.isNull() || !root->hasName( "notification_visibility" ))
-	{
-		llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl;
-		return false;
-	}
-
 	LLNotificationVisibilityRule::Rules params;
-	LLXUIParser parser;
-	parser.readXUI(root, params, full_filename);
+	LLSimpleXUIParser parser;
+	parser.readXUI(full_filename, params);
 
 	if(!params.validateBlock())
 	{
@@ -1486,7 +1494,8 @@ bool LLNotifications::loadVisibilityRules()
 
 	mVisibilityRules.clear();
 
-	for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Params>::iterator it = params.rules.begin(), end_it = params.rules.end();
+	for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Rule>::iterator it = params.rules.begin(), 
+			end_it = params.rules.end();
 		it != end_it;
 		++it)
 	{
diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h
index 58a7eb6176e6e3c12311c2005f8b3f32d570a4f8..78bdec2a8f3ac80591a8acbb540164c2942a9e51 100644
--- a/indra/llui/llnotificationvisibilityrule.h
+++ b/indra/llui/llnotificationvisibilityrule.h
@@ -37,34 +37,51 @@
 // from the appropriate local language directory).
 struct LLNotificationVisibilityRule
 {
-	struct Params : public LLInitParam::Block<Params>
+	struct Filter : public LLInitParam::Block<Filter>
 	{
-		Mandatory<bool>	visible;
-		Optional<std::string> response;
-		Optional<std::string> type;
-		Optional<std::string> tag;
-		Optional<std::string> name;
-
-		Params()
-		:	visible("visible"),
-			response("response"),
-			type("type"),
+		Optional<std::string>	type,
+								tag,
+								name;
+
+		Filter()
+		:	type("type"),
 			tag("tag"),
 			name("name")
 		{}
 	};
 
+	struct Respond : public LLInitParam::Block<Respond, Filter>
+	{
+		Mandatory<std::string> response;
+
+		Respond()
+		:	response("response")
+		{}
+	};
+
+	struct Rule : public LLInitParam::Choice<Rule>
+	{
+		Alternative<Filter>		show;
+		Alternative<Filter>		hide;
+		Alternative<Respond>	respond;
+
+		Rule()
+		:	show("show"),
+			hide("hide"),
+			respond("respond")
+		{}
+	};
 
 	struct Rules : public LLInitParam::Block<Rules>
 	{
-		Multiple<Params>	rules;
+		Multiple<Rule>	rules;
 
 		Rules()
-		:	rules("rule")
+		:	rules("")
 		{}
 	};
 
-	LLNotificationVisibilityRule(const Params& p);
+	LLNotificationVisibilityRule(const Rule& p);
 	
     // If true, this rule makes matching notifications visible.  Otherwise, it makes them invisible.
     bool mVisible;
diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml
index cb36890fe624ed4c1fbee8de2fd285c91e5aa8d1..ea32a83b8363b6506c59ec6f5bdc9302d541c6e8 100644
--- a/indra/newview/skins/default/xui/en/notification_visibility.xml
+++ b/indra/newview/skins/default/xui/en/notification_visibility.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" ?>
 <notification_visibility>
-	<rule visible="true"/> 
+	<show/> 
 </notification_visibility>