diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 92e958b32de901891afb156bce19b5d79e2d86d5..764aff68c9156b94140af6329e729a953ff3475c 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -215,17 +215,38 @@ void LLFloaterCamera::onOpen(const LLSD& key)
 		getDockTongue(), LLDockControl::TOP));
 
 	mZoom->onOpen(key);
+
+	// Returns to previous mode, see EXT-2727(View tool should remember state).
+	// In case floater was just hidden and it isn't reset the mode
+	// just update state to current one. Else go to previous.
+	if ( !mClosed )
+		updateState();
+	else
+		toPrevMode();
+	mClosed = FALSE;
 }
 
 void LLFloaterCamera::onClose(bool app_quitting)
 {
 	//We don't care of camera mode if app is quitting
-	if(!app_quitting)
-		switchMode(CAMERA_CTRL_MODE_ORBIT);
+	if(app_quitting)
+		return;
+	// When mCurrMode is in CAMERA_CTRL_MODE_ORBIT
+	// switchMode won't modify mPrevMode, so force it here.
+	// It is needed to correctly return to previous mode on open, see EXT-2727.
+	if (mCurrMode == CAMERA_CTRL_MODE_ORBIT)
+		mPrevMode = CAMERA_CTRL_MODE_ORBIT;
+
+	// HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
+	if ( !isDocked() )
+		setDocked(true);
+	switchMode(CAMERA_CTRL_MODE_ORBIT);
+	mClosed = TRUE;
 }
 
 LLFloaterCamera::LLFloaterCamera(const LLSD& val)
 :	LLTransientDockableFloater(NULL, true, val),
+	mClosed(FALSE),
 	mCurrMode(CAMERA_CTRL_MODE_ORBIT),
 	mPrevMode(CAMERA_CTRL_MODE_ORBIT)
 {
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 4873a34e00ba9672d7407cb71d6e2defffcecf8a..5d44b4944d0ac91ea768bb4c5e9e5744144a5fbd 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -109,6 +109,7 @@ class LLFloaterCamera
 	void assignButton2Mode(ECameraControlMode mode, const std::string& button_name);
 	
 
+	BOOL mClosed;
 	ECameraControlMode mPrevMode;
 	ECameraControlMode mCurrMode;
 	std::map<ECameraControlMode, LLButton*> mMode2Button;
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 69f9f6a2f874df5642d0095cd3ff21b4e8751f9d..d378b427f13adb53b945cd8261a8a2404bc46103 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -12,6 +12,7 @@
  help_topic="camera_floater"
  save_rect="true"
  save_visibility="true"
+ single_instance="true"
  width="150">
     <floater.string
      name="rotate_tooltip">