diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 6a328b2e854810b9eb351cd1d071426d63b85b88..6abb6987857836ef3a7d1c310dc53446419ee4a2 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -137,7 +137,8 @@ LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key) :
     mWaterBlender(),
     mScratchSky(),
     mScratchWater(),
-    mIsPlaying(false)
+    mIsPlaying(false),
+    mIsDirty(false)
 {
 
     mCommitCallbackRegistrar.add(EVNT_DAYTRACK, [this](LLUICtrl *ctrl, const LLSD &data) { onTrackSelectionCallback(data); });
@@ -175,7 +176,7 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
     mFlyoutControl = new LLFlyoutComboBtnCtrl(this, BTN_SAVE, BTN_FLYOUT, XML_FLYOUTMENU_FILE);
     mFlyoutControl->setAction([this](LLUICtrl *ctrl, const LLSD &data) { onButtonApply(ctrl, data); });
 
-    getChild<LLButton>(BTN_CANCEL, true)->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onBtnCancel(); });
+    getChild<LLButton>(BTN_CANCEL, true)->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onClickCloseBtn(); });
     mTimeSlider->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onTimeSliderMoved(); });
     mAddFrameButton->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onAddTrack(); });
     mDeleteFrameButton->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onRemoveTrack(); });
@@ -189,6 +190,26 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
 
     mTimeSlider->addSlider(0);
 
+    LLTabContainer* tab_container = mSkyTabLayoutContainer->getChild<LLTabContainer>("sky_tabs"); 
+    S32 tab_count = tab_container->getTabCount();
+
+    for (S32 idx = 0; idx < tab_count; ++idx)
+    {
+        LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
+        if (panel)
+            panel->setOnDirtyFlagChanged([this](LLPanel *, bool val) { onPanelDirtyFlagChanged(val); });
+    }
+
+    tab_container = mWaterTabLayoutContainer->getChild<LLTabContainer>("water_tabs");
+    tab_count = tab_container->getTabCount();
+
+    for (S32 idx = 0; idx < tab_count; ++idx)
+    {
+        LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
+        if (panel)
+            panel->setOnDirtyFlagChanged([this](LLPanel *, bool val) { onPanelDirtyFlagChanged(val); });
+    }
+
     //getChild<LLButton>("sky1_track", true)->setToggleState(true);
 
 	return TRUE;
@@ -312,12 +333,12 @@ void LLFloaterEditExtDayCycle::onClose(bool app_quitting)
     doCloseInventoryFloater(app_quitting);
     // there's no point to change environment if we're quitting
     // or if we already restored environment
-    if (!app_quitting && LLEnvironment::instance().getSelectedEnvironment() == LLEnvironment::ENV_EDIT)
+    stopPlay();
+    if (!app_quitting)
     {
-        LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
+        LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_FAST);
         LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT);
     }
-    stopPlay();
 }
 
 void LLFloaterEditExtDayCycle::onFocusReceived()
@@ -355,7 +376,7 @@ void LLFloaterEditExtDayCycle::refresh()
     mFlyoutControl->setMenuItemVisible(ACTION_APPLY_PARCEL, show_apply);
     mFlyoutControl->setMenuItemVisible(ACTION_APPLY_REGION, show_apply);
 
-    mFlyoutControl->setMenuItemEnabled(ACTION_COMMIT, show_commit);
+    mFlyoutControl->setMenuItemEnabled(ACTION_COMMIT, show_commit && !mCommitSignal.empty());
     mFlyoutControl->setMenuItemEnabled(ACTION_SAVE, is_inventory_avail);
     mFlyoutControl->setMenuItemEnabled(ACTION_SAVEAS, is_inventory_avail);
     mFlyoutControl->setMenuItemEnabled(ACTION_APPLY_LOCAL, true);
@@ -445,14 +466,18 @@ void LLFloaterEditExtDayCycle::onButtonApply(LLUICtrl *ctrl, const LLSD &data)
     }
 }
 
-void LLFloaterEditExtDayCycle::onBtnCancel()
+
+void LLFloaterEditExtDayCycle::onClickCloseBtn(bool app_quitting /*= false*/)
 {
-    closeFloater(); // will restore env
+    if (!app_quitting)
+        checkAndConfirmSettingsLoss([this](){ closeFloater(); });
+    else
+        closeFloater();
 }
 
 void LLFloaterEditExtDayCycle::onButtonImport()
 {
-    doImportFromDisk();
+    checkAndConfirmSettingsLoss([this]() { doImportFromDisk(); });
 }
 
 void LLFloaterEditExtDayCycle::onButtonLoadFrame()
@@ -657,6 +682,35 @@ void LLFloaterEditExtDayCycle::onFrameSliderMouseUp(S32 x, S32 y, MASK mask)
     selectFrame(sliderpos, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
 }
 
+
+void LLFloaterEditExtDayCycle::onPanelDirtyFlagChanged(bool value)
+{
+    if (value)
+        setDirtyFlag();
+}
+
+void LLFloaterEditExtDayCycle::checkAndConfirmSettingsLoss(on_confirm_fn cb)
+{
+    if (isDirty())
+    {
+        LLSD args(LLSDMap("TYPE", mEditDay->getSettingsType())
+            ("NAME", mEditDay->getName()));
+
+        // create and show confirmation textbox
+        LLNotificationsUtil::add("SettingsConfirmLoss", args, LLSD(),
+            [this, cb](const LLSD&notif, const LLSD&resp)
+            {
+                S32 opt = LLNotificationsUtil::getSelectedOption(notif, resp);
+                if (opt == 0)
+                    cb();
+            });
+    }
+    else if (cb)
+    {
+        cb();
+    }
+}
+
 void LLFloaterEditExtDayCycle::onTimeSliderMoved()
 {
     selectFrame(mTimeSlider->getCurSliderValue(), LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
@@ -1165,6 +1219,7 @@ void LLFloaterEditExtDayCycle::onInventoryCreated(LLUUID asset_id, LLUUID invent
         return;
     }
 
+    clearDirtyFlag();
     setFocus(TRUE);                 // Call back the focus...
     loadInventoryItem(inventory_id);
 }
@@ -1173,6 +1228,7 @@ void LLFloaterEditExtDayCycle::onInventoryUpdated(LLUUID asset_id, LLUUID invent
 {
     LL_WARNS("ENVDAYEDIT") << "Inventory item " << inventory_id << " has been updated with asset " << asset_id << " results are:" << results << LL_ENDL;
 
+    clearDirtyFlag();
     if (inventory_id != mInventoryId)
     {
         loadInventoryItem(inventory_id);
@@ -1198,6 +1254,7 @@ void LLFloaterEditExtDayCycle::doImportFromDisk()
         }
 
         mCurrentTrack = 1;
+        setDirtyFlag();
         setEditDayCycle(legacyday);
     }
 }
@@ -1274,6 +1331,33 @@ void LLFloaterEditExtDayCycle::onIdlePlay(void* user_data)
 
 }
 
+
+void LLFloaterEditExtDayCycle::clearDirtyFlag()
+{
+    mIsDirty = false;
+
+    LLTabContainer* tab_container = mSkyTabLayoutContainer->getChild<LLTabContainer>("sky_tabs");
+    S32 tab_count = tab_container->getTabCount();
+
+    for (S32 idx = 0; idx < tab_count; ++idx)
+    {
+        LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
+        if (panel)
+            panel->clearIsDirty();
+    }
+
+    tab_container = mWaterTabLayoutContainer->getChild<LLTabContainer>("water_tabs");
+    tab_count = tab_container->getTabCount();
+
+    for (S32 idx = 0; idx < tab_count; ++idx)
+    {
+        LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
+        if (panel)
+            panel->clearIsDirty();
+    }
+
+}
+
 void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e type, LLUUID currasset)
 {
 //  LLUI::sWindow->setCursor(UI_CURSOR_WAIT);
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index 7d0489f0bcd7f89aab070aa15f28c719371ead05..ba269dd5385a825a59982404b4b9a45350f53608 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -91,13 +91,15 @@ class LLFloaterEditExtDayCycle : public LLFloater
 
     BOOL			            handleKeyUp(KEY key, MASK mask, BOOL called_from_parent) override;
 
-private:
+    BOOL                        isDirty() const override { return getIsDirty(); } 
 
+private:
+    typedef std::function<void()> on_confirm_fn;
     F32 getCurrentFrame() const;
 
 	// flyout response/click
 	void                        onButtonApply(LLUICtrl *ctrl, const LLSD &data);
-	void                        onBtnCancel();
+    virtual void                onClickCloseBtn(bool app_quitting = false) override;
     void                        onButtonImport();
     void                        onButtonLoadFrame();
     void                        onAddTrack();
@@ -113,6 +115,10 @@ class LLFloaterEditExtDayCycle : public LLFloater
     void                        onFrameSliderMouseDown(S32 x, S32 y, MASK mask);
     void                        onFrameSliderMouseUp(S32 x, S32 y, MASK mask);
 
+    void                        onPanelDirtyFlagChanged(bool);
+
+    void                        checkAndConfirmSettingsLoss(on_confirm_fn cb);
+
 	void                        selectTrack(U32 track_index, bool force = false);
 	void                        selectFrame(F32 frame, F32 slop_factor);
 	void                        clearTabs();
@@ -158,6 +164,10 @@ class LLFloaterEditExtDayCycle : public LLFloater
     void                        stopPlay();
     static void                 onIdlePlay(void *);
 
+    bool                        getIsDirty() const  { return mIsDirty; }
+    void                        setDirtyFlag()      { mIsDirty = true; }
+    virtual void                clearDirtyFlag();
+
     LLSettingsDay::ptr_t        mEditDay; // edited copy
     LLSettingsDay::Seconds      mDayLength;
     U32                         mCurrentTrack;
@@ -190,6 +200,7 @@ class LLFloaterEditExtDayCycle : public LLFloater
     LLFrameTimer                mPlayTimer;
     F32                         mPlayStartFrame; // an env frame
     bool                        mIsPlaying;
+    bool                        mIsDirty;
 
     edit_commit_signal_t        mCommitSignal;
 
diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index cbc41f724e162b631b314991274e63bad28140b6..ece48989354f4537fa120a6b89c0b02f7059ee83 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -273,7 +273,6 @@ void LLFloaterFixedEnvironment::checkAndConfirmSettingsLoss(LLFloaterFixedEnviro
     {
         cb();
     }
-
 }
 
 void LLFloaterFixedEnvironment::onPickerCommitSetting(LLUUID asset_id)
diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
index d91f9110e032c8006f596bc97d56bb6053afd655..51b2fa380f1c3072ce47ca7f704ea4209f0b3fb5 100644
--- a/indra/newview/llpanelenvironment.cpp
+++ b/indra/newview/llpanelenvironment.cpp
@@ -119,7 +119,19 @@ void LLPanelEnvironmentInfo::onVisibilityChange(BOOL new_visibility)
     if (new_visibility)
         gIdleCallbacks.addFunction(onIdlePlay, this);
     else
+    {
         gIdleCallbacks.deleteFunction(onIdlePlay, this);
+        LLFloaterEditExtDayCycle *dayeditor = getEditFloater();
+        if (mCommitConnection.connected())
+            mCommitConnection.disconnect();
+        if (dayeditor)
+        {
+            if (dayeditor->isDirty())
+                dayeditor->refresh();
+            else
+                dayeditor->closeFloater();
+        }
+    }
 
 }
 
@@ -213,13 +225,13 @@ LLFloaterSettingsPicker *LLPanelEnvironmentInfo::getSettingsPicker()
     return picker;
 }
 
-LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater()
+LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater(bool create)
 {
     static const S32 FOURHOURS(4 * 60 * 60);
     LLFloaterEditExtDayCycle *editor = static_cast<LLFloaterEditExtDayCycle *>(mEditFloater.get());
 
     // Show the dialog
-    if (!editor)
+    if (!editor && create)
     {
         LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, (mCurrentParcelId == INVALID_PARCEL_ID) ? LLFloaterEditExtDayCycle::CONTEXT_REGION : LLFloaterEditExtDayCycle::CONTEXT_PARCEL)
             (LLFloaterEditExtDayCycle::KEY_DAY_LENGTH, mCurrentEnvironment ? (S32)(mCurrentEnvironment->mDayLength.value()) : FOURHOURS));
@@ -228,9 +240,11 @@ LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater()
 
         if (!editor)
             return nullptr;
-        editor->setEditCommitSignal([this](LLSettingsDay::ptr_t pday) { onEditCommited(pday); });
     }
 
+    if (editor && !mCommitConnection.connected())
+        mCommitConnection = editor->setEditCommitSignal([this](LLSettingsDay::ptr_t pday) { onEditCommited(pday); });
+
     return editor;
 }
 
diff --git a/indra/newview/llpanelenvironment.h b/indra/newview/llpanelenvironment.h
index 6a0c78470839a7aa2860fc7e027870293473c5ac..b867a7b61d7e351f4b6b51917fba21a197fa3f9b 100644
--- a/indra/newview/llpanelenvironment.h
+++ b/indra/newview/llpanelenvironment.h
@@ -120,15 +120,19 @@ class LLPanelEnvironmentInfo : public LLPanel
     std::string                 getInventoryNameForAssetId(LLUUID asset_id);
 
     LLFloaterSettingsPicker *   getSettingsPicker();
-    LLFloaterEditExtDayCycle *  getEditFloater();
+    LLFloaterEditExtDayCycle *  getEditFloater(bool create = true);
 
     LLEnvironment::EnvironmentInfo::ptr_t   mCurrentEnvironment;
     S32                                     mCurrentParcelId;
 
 
+
 private:
     static void                 onIdlePlay(void *);
 
+    typedef boost::signals2::connection connection_t;
+
+    connection_t                mCommitConnection;
     LLHandle<LLFloater>         mSettingsFloater;
     LLHandle<LLFloater>         mEditFloater;
     S32                         mDirtyFlag;
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 84c640fcf9fe183db1d53be42542a8ca8effe855..374322ac10a2e6f0e5f10ad40b053040bb26c7ec 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -133,7 +133,7 @@ void LLGridManager::initialize(const std::string& grid_file)
 	addSystemGrid(LLTrans::getString("AditiGridLabel"),
 				  "util.aditi.lindenlab.com",
 				  "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
-				  "https://aditi-secondlife.webdev.lindenlab.com/helpers/",
+				  "https://secondlife.aditi.lindenlab.com/helpers/",
 				  DEFAULT_LOGIN_PAGE,
 				  SL_UPDATE_QUERY_URL,
 				  "https://my.aditi.lindenlab.com/",
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index 22b576eb224e9d361b3dbc0e6d396b96ebdbd776..fe81fd63ea17cc5ecd72660d879d2ad9e234610a 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -258,7 +258,7 @@ namespace tut
 					  std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
 		ensure_equals("Aditi helper uri",
 					  LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
-					  std::string("https://aditi-secondlife.webdev.lindenlab.com/helpers/"));
+                      std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
 		ensure_equals("Aditi login page",
 					  LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
 					  std::string("https://viewer-splash.secondlife.com/"));
@@ -330,7 +330,7 @@ namespace tut
 					  std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
 		ensure_equals("Aditi helper uri",
 					  LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
-					  std::string("https://aditi-secondlife.webdev.lindenlab.com/helpers/"));
+                      std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
 		ensure_equals("Aditi login page",
 					  LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
 					  std::string("https://viewer-splash.secondlife.com/"));