diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 76f07373b4413261fb0ce35c89b4bfa33428c6b2..caf04339c294cd9f280f1fa3fbadd8a64013d4a8 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1894,7 +1894,9 @@ namespace LLInitParam
 		blue("blue"),
 		alpha("alpha"),
 		control("")
-	{}
+	{
+		setBlockFromValue();
+	}
 
 	void TypedParam<LLUIColor>::setValueFromBlock() const
 	{
@@ -1939,6 +1941,7 @@ namespace LLInitParam
 		size("size"),
 		style("style")
 	{
+		setBlockFromValue();
 		addSynonym(name, "");
 	}
 
@@ -1979,7 +1982,9 @@ namespace LLInitParam
 		bottom("bottom"),
 		width("width"),
 		height("height")
-	{}
+	{
+		setBlockFromValue();
+	}
 
 	void TypedParam<LLRect>::setValueFromBlock() const
 	{
@@ -2064,6 +2069,7 @@ namespace LLInitParam
 		x("x"),
 		y("y")
 	{
+		setBlockFromValue();
 	}
 
 	void TypedParam<LLCoordGL>::setValueFromBlock() const
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 5840e76f5c7c2eeb9ee199d2493e3aee80ff21df..af8d4ea03b3b12e98961cad1b956b338da553090 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -426,8 +426,8 @@ namespace LLInitParam
 	{
         typedef BlockValue<const LLFontGL*> super_t;
 	public:
-		Mandatory<std::string>	name;
-		Optional<std::string>	size,
+		Optional<std::string>	name,
+								size,
 								style;
 
 		TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h
index bdfc44262d6000de64d668cbd52498c08a68447e..4ea07380268fb5cb7ef1b6e8af159189bf60ee98 100644
--- a/indra/llui/lluiimage.h
+++ b/indra/llui/lluiimage.h
@@ -109,6 +109,7 @@ namespace LLInitParam
 		TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
 		:	super_t(descriptor, name, value, func, min_count, max_count)
 		{
+			setBlockFromValue();
 		}
 
 		void setValueFromBlock() const;
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index fb0a04dc587a990925bf72a07633b4019df32ec5..2ead5a4a57b074c1d354c28e8d80d9eb9a3852d8 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -137,7 +137,7 @@ namespace LLInitParam
 	}
 
 
-	bool BaseBlock::validateBlock(bool silent) const
+	bool BaseBlock::validateBlock(bool emit_errors) const
 	{
 		const BlockDescriptor& block_data = getBlockDescriptor();
 		for (BlockDescriptor::param_validation_list_t::const_iterator it = block_data.mValidationList.begin(); it != block_data.mValidationList.end(); ++it)
@@ -145,7 +145,7 @@ namespace LLInitParam
 			const Param* param = getParamFromHandle(it->first);
 			if (!it->second(param))
 			{
-				if (!silent)
+				if (emit_errors)
 				{
 					llwarns << "Invalid param \"" << getParamName(block_data, param) << "\"" << llendl;
 				}
@@ -458,7 +458,7 @@ namespace LLInitParam
 
 	// take all provided params from other and apply to self
 	// NOTE: this requires that "other" is of the same derived type as this
-	bool BaseBlock::overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other)
+	bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
 	{
 		bool param_changed = false;
 		BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
@@ -471,27 +471,7 @@ namespace LLInitParam
 			if (merge_func)
 			{
 				Param* paramp = getParamFromHandle(it->mParamHandle);
-				param_changed |= merge_func(*paramp, *other_paramp, true);
-			}
-		}
-		return param_changed;
-	}
-
-	// take all provided params that are not already provided, and apply to self
-	bool BaseBlock::fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other)
-	{
-		bool param_changed = false;
-		BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
-		for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin();
-			it != end_it;
-			++it)
-		{
-			const Param* other_paramp = other.getParamFromHandle(it->mParamHandle);
-			ParamDescriptor::merge_func_t merge_func = it->mMergeFunc;
-			if (merge_func)
-			{
-				Param* paramp = getParamFromHandle(it->mParamHandle);
-				param_changed |= merge_func(*paramp, *other_paramp, false);
+				param_changed |= merge_func(*paramp, *other_paramp, overwrite);
 			}
 		}
 		return param_changed;
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index d264cea3b2554813416c4f621fa9f907acccc024..c9c1d4af90c6d8af9e1e54cad7b382921b500506 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -407,7 +407,7 @@ namespace LLInitParam
 	class BaseBlock
 	{
 	public:
-		// "Multiple" constraint types
+		// "Multiple" constraint types, put here in root class to avoid ambiguity during use
 		struct AnyAmount
 		{
 			static U32 minCount() { return 0; }
@@ -452,7 +452,7 @@ namespace LLInitParam
 		bool submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent=false);
 
 		param_handle_t getHandleFromParam(const Param* param) const;
-		bool validateBlock(bool silent = false) const;
+		bool validateBlock(bool emit_errors = true) const;
 
 		Param* getParamFromHandle(const param_handle_t param_handle)
 		{
@@ -500,10 +500,7 @@ namespace LLInitParam
 
 
 		// take all provided params from other and apply to self
-		bool overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other);
-
-		// take all provided params that are not already provided, and apply to self
-		bool fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other);
+		bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
 
 		// can be updated in getters
 		mutable S32				mChangeVersion;
@@ -805,7 +802,7 @@ namespace LLInitParam
 			if (Param::getProvided() && mData.mValidatedVersion < T::getLastChangeVersion())
 			{
 				// a sub-block is "provided" when it has been filled in enough to be valid
-				mData.mValidated = T::validateBlock(true);
+				mData.mValidated = T::validateBlock(false);
 				mData.mValidatedVersion = T::getLastChangeVersion();
 			}
 			return Param::getProvided() && mData.mValidated;
@@ -1236,7 +1233,7 @@ namespace LLInitParam
 				it != mValues.end();
 				++it)
 			{
-				if(it->validateBlock(true)) count++;
+				if(it->validateBlock(false)) count++;
 			}
 			return count;
 		}
@@ -1286,7 +1283,7 @@ namespace LLInitParam
 		bool overwriteFrom(const self_t& other)
 		{
 			mCurChoice = other.mCurChoice;
-			return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
+			return BaseBlock::merge(blockDescriptor(), other, true);
 		}
 
 		// take all provided params that are not already provided, and apply to self
@@ -1413,13 +1410,13 @@ namespace LLInitParam
 		// take all provided params from other and apply to self
 		bool overwriteFrom(const self_t& other)
 		{
-			return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
+			return BaseBlock::merge(blockDescriptor(), other, true);
 		}
 
 		// take all provided params that are not already provided, and apply to self
 		bool fillFrom(const self_t& other)
 		{
-			return BaseBlock::fillFromImpl(blockDescriptor(), other);
+			return BaseBlock::merge(blockDescriptor(), other, false);
 		}
 	protected:
 		Block()
@@ -1710,7 +1707,7 @@ namespace LLInitParam
 			// if cached value is stale, regenerate from params
 			if (Param::getProvided() && mData.mLastParamVersion < BaseBlock::getLastChangeVersion())
 			{
-				if (block_t::validateBlock(true))
+				if (block_t::validateBlock(false))
 				{
 					static_cast<const DERIVED*>(this)->setValueFromBlock();
 					// clear stale keyword associated with old value
@@ -1769,7 +1766,7 @@ namespace LLInitParam
 			if (Param::getProvided() && (mData.mLastParamVersion < BaseBlock::getLastChangeVersion()))
 			{
 				// go ahead and issue warnings at this point if any param is invalid
-				if(block_t::validateBlock(false))
+				if(block_t::validateBlock(true))
 				{
 					static_cast<const DERIVED*>(this)->setValueFromBlock();
 					mData.clearKey();
@@ -1797,25 +1794,23 @@ namespace LLInitParam
 	private:
 		static bool mergeWith(Param& dst, const Param& src, bool overwrite)
 		{
-			const self_t& src_param = static_cast<const self_t&>(src);
+			const self_t& src_typed_param = static_cast<const self_t&>(src);
 			self_t& dst_typed_param = static_cast<self_t&>(dst);
 
-			if (src_param.isProvided()
+			if (src_typed_param.isProvided()
 				&& (overwrite || !dst_typed_param.isProvided()))
 			{
 				// assign individual parameters
-				if (overwrite)
-				{
-					dst_typed_param.BaseBlock::overwriteFromImpl(block_t::blockDescriptor(), src_param);
-				}
-				else
-				{
-					dst_typed_param.BaseBlock::fillFromImpl(block_t::blockDescriptor(), src_param);
-				}
+				dst_typed_param.BaseBlock::merge(block_t::blockDescriptor(), src_typed_param, overwrite);
+
 				// then copy actual value
-				dst_typed_param.mData.mValue = src_param.get();
+				dst_typed_param.mData.mValue = src_typed_param.get();
 				dst_typed_param.mData.clearKey();
 				dst_typed_param.setProvided(true);
+
+				// Propagate value back to block params since the value was updated during this merge.
+				// This will result in mData.mValue and the block params being in sync.
+				static_cast<DERIVED&>(dst_typed_param).setBlockFromValue();
 				return true;
 			}
 			return false;