diff --git a/gui/input.cpp b/gui/input.cpp
index 4bf01ad..ec370ab 100644
--- a/gui/input.cpp
+++ b/gui/input.cpp
@@ -71,6 +71,7 @@
 	CursorWidth = 3;
 	ConvertStrToColor("black", &mBackgroundColor);
 	ConvertStrToColor("white", &mCursorColor);
+	mValue = "";
 	displayValue = "";
 
 	if (!node)
@@ -124,10 +125,6 @@
 		mFontHeight = mFont->GetHeight();
 	}
 
-	child = FindNode(node, "text");
-	if (child)  mText = child->value();
-	mLastValue = gui_parse_text(mText);
-
 	child = FindNode(node, "data");
 	if (child)
 	{
@@ -196,7 +193,7 @@
 	lastX = x;
 }
 
-void GUIInput::UpdateTextWidth() {
+void GUIInput::UpdateDisplayText() {
 	void* fontResource = NULL;
 
 	if (mFont) {
@@ -206,14 +203,17 @@
 		return;
 	}
 
-	DataManager::GetValue(mVariable, displayValue);
+	DataManager::GetValue(mVariable, mValue);
 	if (HasMask) {
-		int index, string_size = displayValue.size();
+		int index, string_size = mValue.size();
 		string maskedValue;
 		for (index=0; index<string_size; index++)
 			maskedValue += mMask;
 		displayValue = maskedValue;
+	} else {
+		displayValue = mValue;
 	}
+
 	textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource);
 }
 
@@ -274,19 +274,19 @@
 		return;
 	}
 
-	int cursorWidth = textWidth;
+	int cursorTextWidth = textWidth; // width of text to the left of the cursor
 
 	if (mCursorLocation != -1) {
 		string cursorDisplay = displayValue;
 		cursorDisplay.resize(mCursorLocation);
-		cursorWidth = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource);
+		cursorTextWidth = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource);
 	}
-	cursorX = mRenderX + cursorWidth + scrollingX;
+	cursorX = mRenderX + cursorTextWidth + scrollingX;
 	if (cursorX >= mRenderX + mRenderW) {
-		scrollingX = mRenderW - cursorWidth;
+		scrollingX = mRenderW - cursorTextWidth;
 		cursorX = mRenderX + mRenderW - CursorWidth;
 	} else if (cursorX < mRenderX) {
-		scrollingX = cursorWidth * -1;
+		scrollingX = cursorTextWidth * -1;
 		cursorX = mRenderX;
 	}
 }
@@ -425,14 +425,14 @@
 
 	if (varName == mVariable) {
 		if (!isLocalChange) {
-			UpdateTextWidth();
+			UpdateDisplayText();
 			HandleTextLocation(TW_INPUT_NO_UPDATE);
 		} else
 			isLocalChange = false;
 		return 0;
 	}
 	if (varName.empty()) {
-		UpdateTextWidth();
+		UpdateDisplayText();
 		HandleTextLocation(TW_INPUT_NO_UPDATE);
 		HandleCursorByText();
 	}
@@ -497,16 +497,16 @@
 	if (HasInputFocus) {
 		if (key == KEYBOARD_BACKSPACE) {
 			//Backspace
-			if (displayValue.size() > 0 && mCursorLocation != 0) {
+			if (mValue.size() > 0 && mCursorLocation != 0) {
 				if (mCursorLocation == -1) {
-					displayValue.resize(displayValue.size() - 1);
+					mValue.resize(mValue.size() - 1);
 				} else {
-					displayValue.erase(mCursorLocation - 1, 1);
+					mValue.erase(mCursorLocation - 1, 1);
 					mCursorLocation--;
 				}
 				isLocalChange = true;
-				DataManager::SetValue(mVariable, displayValue);
-				UpdateTextWidth();
+				DataManager::SetValue(mVariable, mValue);
+				UpdateDisplayText();
 				HandleTextLocation(TW_INPUT_NO_UPDATE);
 				HandleCursorByText();
 			}
@@ -515,15 +515,15 @@
 			isLocalChange = true;
 			if (mCursorLocation == -1) {
 				DataManager::SetValue (mVariable, "");
-				displayValue = "";
+				mValue = "";
 				textWidth = 0;
 				mCursorLocation = -1;
 			} else {
-				displayValue.erase(0, mCursorLocation);
-				DataManager::SetValue(mVariable, displayValue);
-				UpdateTextWidth();
+				mValue.erase(0, mCursorLocation);
+				DataManager::SetValue(mVariable, mValue);
 				mCursorLocation = 0;
 			}
+			UpdateDisplayText();
 			cursorX = mRenderX;
 			scrollingX = 0;
 			mRendered = false;
@@ -536,24 +536,24 @@
 			if (HasDisabled && DisabledList.find((char)key) != string::npos) {
 				return 0;
 			}
-			if (MaxLen != 0 && displayValue.size() >= MaxLen) {
+			if (MaxLen != 0 && mValue.size() >= MaxLen) {
 				return 0;
 			}
 			if (mCursorLocation == -1) {
-				displayValue += key;
+				mValue += key;
 			} else {
-				displayValue.insert(mCursorLocation, 1, key);
+				mValue.insert(mCursorLocation, 1, key);
 				mCursorLocation++;
 			}
 			isLocalChange = true;
-			DataManager::SetValue(mVariable, displayValue);
-			UpdateTextWidth();
+			DataManager::SetValue(mVariable, mValue);
+			UpdateDisplayText();
 			HandleTextLocation(TW_INPUT_NO_UPDATE);
 			HandleCursorByText();
 		} else if (key == KEYBOARD_ACTION) {
 			// Action
 			if (mAction) {
-				unsigned inputLen = displayValue.length();
+				unsigned inputLen = mValue.length();
 				if (inputLen < MinLen)
 					return 0;
 				else if (MaxLen != 0 && inputLen > MaxLen)
diff --git a/gui/objects.hpp b/gui/objects.hpp
index 7913b36..84a9e5e 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -1000,7 +1000,7 @@
 
 	// Handles displaying the text properly when chars are added, deleted, or for scrolling
 	void HandleTextLocation(int x);
-	void UpdateTextWidth();
+	void UpdateDisplayText();
 	void HandleCursorByTouch(int x);
 	void HandleCursorByText();
 
@@ -1010,15 +1010,14 @@
 	ImageResource* mBackground;
 	ImageResource* mCursor;
 	FontResource* mFont;
-	std::string mText;
-	std::string mLastValue;
 	std::string mVariable;
 	std::string mMask;
+	std::string mValue;
 	std::string displayValue;
 	COLOR mBackgroundColor;
 	COLOR mCursorColor;
 	int scrollingX;
-	int cursorX;
+	int cursorX;     // actual x axis location of the cursor
 	int lastX;
 	int mCursorLocation;
 	int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
