diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index eee6339caf7b8f1e50b82f68901143e8f9043923..f5b64d58b08097f4ed688d9945db0c210d266c86 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -87,18 +87,27 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
 	}
 	mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);
 	mLabel->reshapeToFitText();
-	addChild(mLabel);
-
 	LLRect label_rect = mLabel->getRect();
+	if (mLabel->getLineCount() > 1)
+	{
+		// reshapeToFitText uses LLView::reshape() which always reshapes
+		// from bottom to top, but we want to extend the bottom
+		// Note: might be better idea to use getRect().mTop of LLCheckBoxCtrl (+pad) as top point of new rect
+		S32 delta = ll_round((F32)mLabel->getFont()->getLineHeight() * mLabel->getLineSpacingMult()) - label_rect.getHeight();
+		label_rect.translate(0, delta);
+		mLabel->setRect(label_rect);
+	}
+
+	addChild(mLabel);
 
 	// Button
-	// Note: button cover the label by extending all the way to the right.
+	// Note: button cover the label by extending all the way to the right and down.
 	LLRect btn_rect = p.check_button.rect();
 	btn_rect.setOriginAndSize(
 		btn_rect.mLeft,
-		btn_rect.mBottom,
+		llmin(btn_rect.mBottom, label_rect.mBottom),
 		llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft),
-		llmax( label_rect.getHeight(), btn_rect.mTop));
+		llmax(label_rect.getHeight(), btn_rect.mTop));
 	std::string active_true_id, active_false_id;
 	std::string inactive_true_id, inactive_false_id;
 
@@ -152,17 +161,26 @@ void LLCheckBoxCtrl::clear()
 
 void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
-
+	S32 label_top = mLabel->getRect().mTop;
 	mLabel->reshapeToFitText();
 
 	LLRect label_rect = mLabel->getRect();
+	if (label_top != label_rect.mTop)
+	{
+		// reshapeToFitText uses LLView::reshape() which always reshapes
+		// from bottom to top, but we want to extend the bottom so
+		// reposition control
+		S32 delta = label_top - label_rect.mTop;
+		label_rect.translate(0, delta);
+		mLabel->setRect(label_rect);
+	}
 
 	// Button
-	// Note: button cover the label by extending all the way to the right.
+	// Note: button cover the label by extending all the way to the right and down.
 	LLRect btn_rect = mButton->getRect();
 	btn_rect.setOriginAndSize(
 		btn_rect.mLeft,
-		btn_rect.mBottom,
+		llmin(btn_rect.mBottom, label_rect.mBottom),
 		llmax(btn_rect.getWidth(), label_rect.mRight - btn_rect.mLeft),
 		llmax(label_rect.mTop - btn_rect.mBottom, btn_rect.getHeight()));
 	mButton->setShape(btn_rect);
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 4239cdf43c52109c4c68974052bd03eede43d891..058b804714bc2fdc752e3bef32d1adc81f93f4d8 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -441,6 +441,8 @@ class LLTextBase
 
 	S32						getVPad() { return mVPad; }
 	S32						getHPad() { return mHPad; }
+	F32						getLineSpacingMult() { return mLineSpacingMult; }
+	S32						getLineSpacingPixels() { return mLineSpacingPixels; } // only for multiline
 
 	S32						getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line = true) const;
 	LLRect					getLocalRectFromDocIndex(S32 pos) const;
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index f8bdec38661efe5e91663a54259018f7e4aee212..281ebeca9c3134d174f1f317ae2315e19110ee63 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -148,9 +148,11 @@
     left="408"
     bottom_delta="0"
     label="Remember password"
+    label_text.word_wrap="true"
+    label_text.width="150"
     check_button.bottom="3"
     name="remember_check"
-    width="145" />
+    width="170" />
   <combo_box
     allow_text_entry="false"
     font="SansSerifTiny"