diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 1c9b42d03f4f585ad7f0eeba8f75b96066ed873d..d87ea83fe7ee0ae1010c4232cd49161fab239c2a 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -44,13 +44,11 @@
 #include "llinventorymodel.h"
 // newview
 #include "llagent.h"
-//#include "llflyoutcombobtnctrl.h" //Todo: get rid of this and LLSaveOutfitComboBtn, make a proper UI element/button/pannel instead
+#include "llflyoutcombobtn.h" //Todo: make a proper UI element/button/panel instead
 #include "llregioninfomodel.h"
 #include "llviewerregion.h"
 #include "llpaneleditwater.h"
 #include "llpaneleditsky.h"
-//#include "llsettingsvo.h"
-//#include "llinventorymodel.h"
 
 #include "llenvironment.h"
 #include "lltrans.h"
@@ -64,13 +62,14 @@ static const std::string track_tabs[] = {
 };
 
 // For flyout
-/*const std::string ACTION_SAVE("save_settings");
+const std::string XML_FLYOUTMENU_FILE("menu_save_settings.xml");
+// From menu_save_settings.xml, consider moving into flyout since it should be supported by flyout either way
+const std::string ACTION_SAVE("save_settings");
 const std::string ACTION_SAVEAS("save_as_new_settings");
 const std::string ACTION_APPLY_LOCAL("apply_local");
 const std::string ACTION_APPLY_PARCEL("apply_parcel");
 const std::string ACTION_APPLY_REGION("apply_region");
 
-const std::string XML_FLYOUTMENU_FILE("menu_save_settings.xml");*/
 
 //=========================================================================
 // **RIDER**
@@ -83,14 +82,12 @@ const std::string LLFloaterEditExtDayCycle::KEY_DAY_LENGTH("day_length");
 
 LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key):
     LLFloater(key),
-    mSaveButton(NULL),
+    mFlyoutControl(NULL),
     mCancelButton(NULL),
-    mUploadButton(NULL),
     mDayLength(0),
     mCurrentTrack(4),
     mTimeSlider(NULL),
     mFramesSlider(NULL),
-    //mFlyoutControl(NULL),
     mCurrentTimeLabel(NULL),
     // **RIDER**
     mInventoryId(),
@@ -109,28 +106,17 @@ LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key):
 
 LLFloaterEditExtDayCycle::~LLFloaterEditExtDayCycle()
 {
-    // Todo: consider remaking mFlyoutControl into class that initializes intself with floater,
-    // completes at postbuild, e t c...
-    // (make it into actual button?, In such case XML_FLYOUTMENU_FILE will be specified in xml)
-    //delete mFlyoutControl;
+    // Todo: consider remaking mFlyoutControl into full view class that initializes intself with floater,
+    // complete with postbuild, e t c...
+    delete mFlyoutControl;
 }
 
-// void LLFloaterEditExtDayCycle::openFloater(LLSettingsDay::ptr_t settings, S64Seconds daylength, S64Seconds dayoffset)
-// {
-//         mEditDay = settings->buildClone();
-//         mDayLength = daylength;
-//         mDayOffset = dayoffset;
-//         LLFloater::openFloater();
-// }
-
 // virtual
 BOOL LLFloaterEditExtDayCycle::postBuild()
 {
     getChild<LLLineEditor>("day_cycle_name")->setKeystrokeCallback(boost::bind(&LLFloaterEditExtDayCycle::onCommitName, this, _1, _2), NULL);
 
-    mSaveButton = getChild<LLButton>("save_btn", true);
     mCancelButton = getChild<LLButton>("cancel_btn", true);
-    mUploadButton = getChild<LLButton>("upload_btn", true);
     mAddFrameButton = getChild<LLButton>("add_frame", true);
     mDeleteFrameButton = getChild<LLButton>("delete_frame", true);
     mTimeSlider = getChild<LLMultiSliderCtrl>("WLTimeSlider");
@@ -139,12 +125,10 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
     mWaterTabLayoutContainer = getChild<LLView>("frame_settings_water", true);
     mCurrentTimeLabel = getChild<LLTextBox>("current_time", true);
 
-    //mFlyoutControl = new LLFlyoutComboBtnCtrl(this, "save_btn", "btn_flyout", XML_FLYOUTMENU_FILE);
-    //mFlyoutControl->setAction([this](LLUICtrl *ctrl, const LLSD &data) { onButtonApply(ctrl, data); });
+    mFlyoutControl = new LLFlyoutComboBtnCtrl(this, "save_btn", "btn_flyout", XML_FLYOUTMENU_FILE);
+    mFlyoutControl->setAction([this](LLUICtrl *ctrl, const LLSD &data) { onButtonApply(ctrl, data); });
 
-    mUploadButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnSave, this));
     mCancelButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnCancel, this));
-    mUploadButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnUpload, this));
     mTimeSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onTimeSliderMoved, this));
     mFramesSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onFrameSliderCallback, this));
     mAddFrameButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onAddTrack, this));
@@ -203,7 +187,6 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
         S32Hours hrs;
         S32Minutes minutes;
         S64Seconds total;
-        //LLDate date;
         LLUIString formatted_label = getString("time_label");
         for (int i = 0; i < max_elm; i++)
         {
@@ -211,19 +194,12 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
             hrs = total;
             minutes = total - hrs;
 
-            //date = LLDate(((mDayLength / (max_elm - 1)) * i) + mDayOffset);
-            //formatted_label.setArg("[TIME]", date.toHTTPDateString(std::string("%H:%M")));
-            //formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value()));
-
             formatted_label.setArg("[HH]", llformat("%d", hrs.value()));
             formatted_label.setArg("[MM]", llformat("%d", abs(minutes.value())));
             getChild<LLTextBox>("p" + llformat("%d", i), true)->setTextArg("[DSC]", formatted_label.getString());
         }
         hrs = mDayLength;
         minutes = mDayLength - hrs;
-        //formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value()));
-        //date = LLDate(mDayOffset);
-        //formatted_label.setArg("[TIME]", date.toHTTPDateString(std::string("%H:%M")));
         formatted_label.setArg("[HH]", llformat("%d", hrs.value()));
         formatted_label.setArg("[MM]", llformat("%d", abs(minutes.value())));
         mCurrentTimeLabel->setTextArg("[DSC]", formatted_label.getString());
@@ -240,12 +216,12 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
 
 void LLFloaterEditExtDayCycle::onClose(bool app_quitting)
 {
-	if (!app_quitting) // there's no point to change environment if we're quitting
-	{
-        /* TODO: don't restore this environment.  We may have gotten here from land or region. */
-        LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT);
-        LLEnvironment::instance().updateEnvironment();
-	}
+    // 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)
+    {
+        LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
+    }
 }
 
 void LLFloaterEditExtDayCycle::onVisibilityChange(BOOL new_visibility)
@@ -257,60 +233,64 @@ void LLFloaterEditExtDayCycle::onVisibilityChange(BOOL new_visibility)
     }
     else
     {
-        /* TODO: don't restore this environment.  We may have gotten here from land or region. */
         LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
     }
 }
 
-/*void LLFloaterEditExtDayCycle::onButtonApply(LLUICtrl *ctrl, const LLSD &data)
+void LLFloaterEditExtDayCycle::onButtonApply(LLUICtrl *ctrl, const LLSD &data)
 {
     std::string ctrl_action = ctrl->getName();
 
     if (ctrl_action == ACTION_SAVE)
     {
-        mSavedDay = mEditDay;
-        //doApplyUpdateInventory();
+//         if (mSavedDay.get() != mOriginalDay.get())
+//         {
+//             restoreSavedEnv();
+//         }
+//         else
+//         {
+//             S64Seconds day_length = mDayLength.value() > 0 ? mDayLength : LLSettingsDay::DEFAULT_DAYLENGTH;
+//             S64Seconds day_offset = mDayLength.value() > 0 ? mDayOffset : LLSettingsDay::DEFAULT_DAYOFFSET;
+//             LLEnvironment::instance().setEnvironment((LLEnvironment::EnvSelection_t)mSavedEnvironment, mEditDay, day_length, day_offset);
+//             LLEnvironment::instance().setSelectedEnvironment((LLEnvironment::EnvSelection_t)mSavedEnvironment);
+//             LLEnvironment::instance().updateEnvironment();
+//         }
+//         mOriginalDay = mEditDay; // to kill the pointer
+// 
+//         if (!mCommitSignal.empty())
+//             mCommitSignal(mEditDay);
     }
     else if (ctrl_action == ACTION_SAVEAS)
     {
-        //doApplyCreateNewInventory();
-        LLSettingsVOBase::createInventoryItem(mEditDay, NULL);
-    }
-    else if ((ctrl_action == ACTION_APPLY_LOCAL) ||
-        (ctrl_action == ACTION_APPLY_PARCEL) ||
-        (ctrl_action == ACTION_APPLY_REGION))
-    {
-        //doApplyEnvironment(ctrl_action);
-        // Shouldn't be supported?
+        LLSettingsVOBase::createInventoryItem(mEditDay);
     }
     else
     {
-        LL_WARNS("ENVIRONMENT") << "Unknown settings action '" << ctrl_action << "'" << LL_ENDL;
-    }
+        LLEnvironment::EnvSelection_t env(LLEnvironment::ENV_DEFAULT);
+        bool updateSimulator(ctrl_action != ACTION_APPLY_LOCAL);
 
-    if (!mCommitSignal.empty())
-        mCommitSignal(mEditDay);
-    closeFloater();
-    }*/
-
-void LLFloaterEditExtDayCycle::onBtnSave()
-{
-    //no longer needed?
-    if (!mCommitSignal.empty())
-        mCommitSignal(mEditDay);
+        if (ctrl_action == ACTION_APPLY_LOCAL)
+            env = LLEnvironment::ENV_LOCAL;
+        else if (ctrl_action == ACTION_APPLY_PARCEL)
+            env = LLEnvironment::ENV_PARCEL;
+        else if (ctrl_action == ACTION_APPLY_REGION)
+            env = LLEnvironment::ENV_REGION;
+        else
+        {
+            LL_WARNS("ENVIRONMENT") << "Unknown apply '" << ctrl_action << "'" << LL_ENDL;
+        }
 
-    closeFloater();
+        LLEnvironment::instance().setEnvironment(env, mEditDay);
+        if (updateSimulator)
+        {
+            LL_WARNS("ENVIRONMENT") << "Attempting to apply " << env << LL_ENDL;
+        }
+    }
 }
 
 void LLFloaterEditExtDayCycle::onBtnCancel()
 {
-    closeFloater();
-}
-
-void LLFloaterEditExtDayCycle::onBtnUpload()
-{
-    LLSettingsVOBase::createInventoryItem(mEditDay);
-    //closeFloater();
+    closeFloater(); // will restore env
 }
 
 void LLFloaterEditExtDayCycle::onAddTrack()
@@ -414,14 +394,44 @@ void LLFloaterEditExtDayCycle::onFrameSliderCallback()
     }
 
     F32 new_frame = mFramesSlider->getCurSliderValue();
-    // todo: add safety checks, user shouldn't be capable of moving one frame over another or move missing frame
+    // todo: add safety 2.5% checks
     keymap_t::iterator iter = mSliderKeyMap.find(cur_sldr);
     if (iter != mSliderKeyMap.end() && mEditDay->getSettingsAtKeyframe(new_frame, mCurrentTrack).get() == NULL)
     {
-        LL_DEBUGS() << "Moving frame from " << iter->second.first << " to " << new_frame << LL_ENDL;
-        if (mEditDay->moveTrackKeyframe(mCurrentTrack, iter->second.first, new_frame))
+        if (gKeyboard->currentMask(TRUE) == MASK_SHIFT)
         {
-            iter->second.first = new_frame;
+            LL_DEBUGS() << "Copying frame from " << iter->second.mFrame << " to " << new_frame << LL_ENDL;
+            LLSettingsBase::ptr_t new_settings;
+
+            // mEditDay still remembers old position, add copy at new position
+            if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
+            {
+                LLSettingsWaterPtr_t water_ptr = std::dynamic_pointer_cast<LLSettingsWater>(iter->second.pSettings)->buildClone();
+                mEditDay->setWaterAtKeyframe(water_ptr, new_frame);
+                new_settings = water_ptr;
+            }
+            else
+            {
+                LLSettingsSkyPtr_t sky_ptr = std::dynamic_pointer_cast<LLSettingsSky>(iter->second.pSettings)->buildClone();
+                mEditDay->setSkyAtKeyframe(sky_ptr, new_frame, mCurrentTrack);
+                new_settings = sky_ptr;
+            }
+
+            // mSliderKeyMap still remembers old position, for simplicity, just move it to be identical to slider
+            F32 old_frame = iter->second.mFrame;
+            iter->second.mFrame = new_frame;
+            // slider already moved old frame, create new one in old place
+            addSliderFrame(old_frame, new_settings, false /*because we are going to reselect new one*/);
+            // reselect new frame
+            mFramesSlider->setCurSlider(iter->first);
+        }
+        else
+        {
+            LL_DEBUGS() << "Moving frame from " << iter->second.mFrame << " to " << new_frame << LL_ENDL;
+            if (mEditDay->moveTrackKeyframe(mCurrentTrack, iter->second.mFrame, new_frame))
+            {
+                iter->second.mFrame = new_frame;
+            }
         }
     }
 
@@ -450,7 +460,7 @@ void LLFloaterEditExtDayCycle::onTimeSliderMoved()
     F32 frame = mTimeSlider->getCurSliderValue();
     while (iter != end_iter)
     {
-        if (iter->second.first == frame)
+        if (iter->second.mFrame == frame)
         {
             mFramesSlider->setCurSlider(iter->first);
             break;
@@ -458,14 +468,14 @@ void LLFloaterEditExtDayCycle::onTimeSliderMoved()
         iter++;
     }
 
-    // Todo: safety checks
+    // block or update tabs according to new selection
     updateTabs();
-    //Todo: update something related to time/play/blending?
+
+    // blending:
 }
 
 void LLFloaterEditExtDayCycle::selectTrack(U32 track_index)
 {
-    // todo: safety checks
     mCurrentTrack = track_index;
     LLButton* button = getChild<LLButton>(track_tabs[track_index], true);
     if (button->getToggleState())
@@ -488,7 +498,7 @@ void LLFloaterEditExtDayCycle::selectTrack(U32 track_index)
 
 void LLFloaterEditExtDayCycle::clearTabs()
 {
-    // todo: instead init with defaults?
+    // Note: If this doesn't look good, init panels with default settings. It might be better looking
     if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
     {
         const LLSettingsWaterPtr_t p_water = LLSettingsWaterPtr_t(NULL);
@@ -505,12 +515,12 @@ void LLFloaterEditExtDayCycle::clearTabs()
 
 void LLFloaterEditExtDayCycle::updateTabs()
 {
-//     // TODO: either prevent user from editing existing settings or clone them to not affect saved frames
 //     std::string sldr = mFramesSlider->getCurSlider();
 //     if (sldr.empty())
 //     {
-//         // keep old settings for duplicating if there are any
-//         // TODO: disable tabs to prevent editing without nulling settings
+//        // keep old settings for duplicating if there are any
+//        setWaterTabsEnabled(FALSE);
+//        setSkyTabsEnabled(FALSE);
 //     }
 //     else if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
 //     {
@@ -562,6 +572,42 @@ void LLFloaterEditExtDayCycle::updateSkyTabs(const LLSettingsSkyPtr_t &p_sky)
     }
 }
 
+void LLFloaterEditExtDayCycle::setWaterTabsEnabled(BOOL enable)
+{
+    LLView* tab_container = mWaterTabLayoutContainer->getChild<LLView>("water_tabs"); //can't extract panels directly, since it is in 'tuple'
+    LLPanelSettingsWaterMainTab* panel = dynamic_cast<LLPanelSettingsWaterMainTab*>(tab_container->getChildView("water_panel"));
+    if (panel)
+    {
+        panel->setEnabled(enable);
+        panel->setAllChildrenEnabled(enable);
+    }
+}
+
+void LLFloaterEditExtDayCycle::setSkyTabsEnabled(BOOL enable)
+{
+    LLView* tab_container = mSkyTabLayoutContainer->getChild<LLView>("sky_tabs"); //can't extract panels directly, since they are in 'tuple'
+
+    LLPanelSettingsSky* panel;
+    panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("atmosphere_panel"));
+    if (panel)
+    {
+        panel->setEnabled(enable);
+        panel->setAllChildrenEnabled(enable);
+    }
+    panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("clouds_panel"));
+    if (panel)
+    {
+        panel->setEnabled(enable);
+        panel->setAllChildrenEnabled(enable);
+    }
+    panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("moon_panel"));
+    if (panel)
+    {
+        panel->setEnabled(enable);
+        panel->setAllChildrenEnabled(enable);
+    }
+}
+
 void LLFloaterEditExtDayCycle::updateButtons()
 {
     F32 frame = mTimeSlider->getCurSliderValue();
@@ -575,29 +621,24 @@ void LLFloaterEditExtDayCycle::updateSlider()
     mFramesSlider->clear();
     mSliderKeyMap.clear();
 
-    std::string new_slider;
-    F32 frame = 0;
     LLSettingsDay::CycleTrack_t track = mEditDay->getCycleTrack(mCurrentTrack);
     for (auto &track_frame : track)
     {
-        // multi slider distinguishes elements by key/name in string format
-        // store names to map to be able to recall dependencies
-        frame = track_frame.first;
-        new_slider = mFramesSlider->addSlider(frame);
-        mSliderKeyMap[new_slider] = framedata_t(frame, track_frame.second);
+        addSliderFrame(track_frame.first, track_frame.second, false);
     }
 
-    mLastFrameSlider = new_slider;
-
     if (mSliderKeyMap.size() > 0)
     {
-        mTimeSlider->setCurSliderValue(frame);
+        // update positions
+        mLastFrameSlider = mFramesSlider->getCurSlider();
+        mTimeSlider->setCurSliderValue(mFramesSlider->getCurSliderValue());
         updateTabs();
     }
     else
     {
         // disable panels
         clearTabs();
+        mLastFrameSlider.clear();
     }
 }
 
@@ -609,11 +650,6 @@ void LLFloaterEditExtDayCycle::updateTimeAndLabel()
     {
         LLUIString formatted_label = getString("time_label");
 
-        //F32Hours hrs = (mDayLength  * time) + mDayOffset;
-        //LLDate date((mDayLength  * time) + mDayOffset);
-        //formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value()));
-        //formatted_label.setArg("[TIME]", date.toHTTPDateString(std::string("%H:%M")));
-
         S64Seconds total = (mDayLength  * time); 
         S32Hours hrs = total;
         S32Minutes minutes = total - hrs;
@@ -630,16 +666,19 @@ void LLFloaterEditExtDayCycle::updateTimeAndLabel()
     // Update blender here:
 }
 
-void LLFloaterEditExtDayCycle::addSliderFrame(const F32 frame, LLSettingsBase::ptr_t setting)
+void LLFloaterEditExtDayCycle::addSliderFrame(const F32 frame, LLSettingsBase::ptr_t &setting, bool update_ui)
 {
     // multi slider distinguishes elements by key/name in string format
     // store names to map to be able to recall dependencies
     std::string new_slider = mFramesSlider->addSlider(frame);
-    mSliderKeyMap[new_slider] = framedata_t(frame, setting);
-    mLastFrameSlider = new_slider;
+    mSliderKeyMap[new_slider] = FrameData(frame, setting);
 
-    mTimeSlider->setCurSliderValue(frame);
-    updateTabs();
+    if (update_ui)
+    {
+        mLastFrameSlider = new_slider;
+        mTimeSlider->setCurSliderValue(frame);
+        updateTabs();
+    }
 }
 
 void LLFloaterEditExtDayCycle::removeCurrentSliderFrame()
@@ -653,9 +692,9 @@ void LLFloaterEditExtDayCycle::removeCurrentSliderFrame()
     keymap_t::iterator iter = mSliderKeyMap.find(sldr);
     if (iter != mSliderKeyMap.end())
     {
-        LL_DEBUGS() << "Removing frame from " << iter->second.first << LL_ENDL;
+        LL_DEBUGS() << "Removing frame from " << iter->second.mFrame << LL_ENDL;
         mSliderKeyMap.erase(iter);
-        mEditDay->removeTrackKeyframe(mCurrentTrack, iter->second.first);
+        mEditDay->removeTrackKeyframe(mCurrentTrack, iter->second.mFrame);
     }
 
     mLastFrameSlider = mFramesSlider->getCurSlider();
@@ -699,6 +738,7 @@ void LLFloaterEditExtDayCycle::loadInventoryItem(const LLUUID  &inventoryId)
 void LLFloaterEditExtDayCycle::onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status)
 {
     mEditDay = std::dynamic_pointer_cast<LLSettingsDay>(settings);
+    mOriginalDay = mEditDay->buildClone();
     updateEditEnvironment();
     syncronizeTabs();
     refresh();
@@ -713,6 +753,7 @@ void LLFloaterEditExtDayCycle::loadLiveEnvironment(LLEnvironment::EnvSelection_t
 
         if (day)
         {
+            mOriginalDay = day;
             mEditDay = day->buildClone();
             break;
         }
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index 80e5850558c1d149ecf300924c84048fc8e8899c..287d2fe2dc0d30339ec43cad3e1fef5ea0ad80d4 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -35,11 +35,11 @@
 
 class LLCheckBoxCtrl;
 class LLComboBox;
+class LLFlyoutComboBtnCtrl;
 class LLLineEditor;
 class LLMultiSliderCtrl;
 class LLTextBox;
 class LLTimeCtrl;
-//class LLFlyoutComboBtnCtrl;
 
 class LLInventoryItem;
 
@@ -62,53 +62,44 @@ class LLFloaterEditExtDayCycle : public LLFloater
     typedef boost::signals2::signal<void(LLSettingsDay::ptr_t)>            edit_commit_signal_t;
     typedef boost::signals2::connection     connection_t;
 
-	LLFloaterEditExtDayCycle(const LLSD &key);
+    LLFloaterEditExtDayCycle(const LLSD &key);
     ~LLFloaterEditExtDayCycle();
 
     //void openFloater(LLSettingsDay::ptr_t settings, S64Seconds daylength = S64Seconds(0), S64Seconds dayoffset = S64Seconds(0));
 
     BOOL	postBuild();
     void	onOpen(const LLSD& key);
- 	void	onClose(bool app_quitting);
+    void	onClose(bool app_quitting);
 
     void    onVisibilityChange(BOOL new_visibility);
 
-// 	/*virtual*/ void	draw();
     connection_t setEditCommitSignal(edit_commit_signal_t::slot_type cb);
 
 private:
 
-// 	/// sync the time slider with day cycle structure
-// 	void syncTimeSlider();
-// 
-// 	// 	makes sure key slider has what's in day cycle
-// 	void loadTrack();
-// 
-// 	/// makes sure day cycle data structure has what's in menu
-// 	void applyTrack();
-// 
-// 	/// refresh the sky presets combobox
-
-//    void onButtonApply(LLUICtrl *ctrl, const LLSD &data);
-	void onBtnSave();
+	// flyout response/click
+	void onButtonApply(LLUICtrl *ctrl, const LLSD &data);
 	void onBtnCancel();
-	void onBtnUpload();
 	void onAddTrack();
 	void onRemoveTrack();
 	void onCommitName(class LLLineEditor* caller, void* user_data);
 	void onTrackSelectionCallback(const LLSD& user_data);
-	void onTimeSliderMoved();	/// time slider moved
-	void onFrameSliderCallback();		/// a frame moved or frame selection changed
+	// time slider moved
+	void onTimeSliderMoved();
+	// a frame moved or frame selection changed
+	void onFrameSliderCallback();
 
 	void selectTrack(U32 track_index);
 	void clearTabs();
 	void updateTabs();
 	void updateWaterTabs(const LLSettingsWaterPtr_t &p_water);
 	void updateSkyTabs(const LLSettingsSkyPtr_t &p_sky);
+	void setWaterTabsEnabled(BOOL enable);
+	void setSkyTabsEnabled(BOOL enable);
 	void updateButtons();
 	void updateSlider(); //track to slider
 	void updateTimeAndLabel();
-	void addSliderFrame(const F32 frame, LLSettingsBase::ptr_t setting);
+	void addSliderFrame(const F32 frame, LLSettingsBase::ptr_t &setting, bool update_ui = true);
 	void removeCurrentSliderFrame();
 
     // **RIDER**
@@ -120,15 +111,18 @@ class LLFloaterEditExtDayCycle : public LLFloater
     void syncronizeTabs();
     void reblendSettings();
     // **RIDER**
+	
+    // data for restoring previous displayed environment
 
-    LLSettingsDay::ptr_t    mEditDay;
+    S32                     mSavedEnvironment;
+
+    LLSettingsDay::ptr_t    mEditDay; // edited copy
+    LLSettingsDay::ptr_t    mOriginalDay; // the one we are editing
     S64Seconds              mDayLength;
     U32                     mCurrentTrack;
     std::string             mLastFrameSlider;
 
-    LLButton*			mSaveButton;
     LLButton*			mCancelButton;
-    LLButton*               mUploadButton;
     LLButton*           mAddFrameButton;
     LLButton*           mDeleteFrameButton;
 
@@ -148,14 +142,21 @@ class LLFloaterEditExtDayCycle : public LLFloater
     LLSettingsWater::ptr_t  mScratchWater;
     // **RIDER**
 
-//    LLFlyoutComboBtnCtrl *      mFlyoutControl; // not a View!
+    LLFlyoutComboBtnCtrl *      mFlyoutControl;
 
     edit_commit_signal_t    mCommitSignal;
 
-    // map of sliders to parameters
-    typedef std::pair<F32, LLSettingsBase::ptr_t> framedata_t;
-    typedef std::map<std::string, framedata_t> keymap_t;
-    keymap_t mSliderKeyMap; //slider keys[old_frames], shadows mFramesSlider
+    // For map of sliders to parameters
+    class FrameData
+    {
+    public:
+        FrameData() : mFrame(0) {};
+        FrameData(F32 frame, LLSettingsBase::ptr_t settings) : mFrame(frame), pSettings(settings) {};
+        F32 mFrame;
+        LLSettingsBase::ptr_t pSettings;
+    };
+    typedef std::map<std::string, FrameData> keymap_t;
+    keymap_t mSliderKeyMap; //slider's keys vs old_frames&settings, shadows mFramesSlider
 };
 
 #endif // LL_LLFloaterEditExtDayCycle_H
diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index 83653111793d40722e2ba063d594c29cb2e86957..d5fc34a04b49ab4f766bd2453b00d8da45c91f2d 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -103,7 +103,7 @@ BOOL LLFloaterFixedEnvironment::postBuild()
     getChild<LLButton>(BUTTON_NAME_IMPORT)->setClickedCallback([this](LLUICtrl *, const LLSD &) { onButtonImport(); });
     getChild<LLButton>(BUTTON_NAME_CANCEL)->setClickedCallback([this](LLUICtrl *, const LLSD &) { onButtonCancel(); });
 
-    mFlyoutControl = new LLFlyoutComboBtn(this, BUTTON_NAME_COMMIT, BUTTON_NAME_FLYOUT, XML_FLYOUTMENU_FILE);
+    mFlyoutControl = new LLFlyoutComboBtnCtrl(this, BUTTON_NAME_COMMIT, BUTTON_NAME_FLYOUT, XML_FLYOUTMENU_FILE);
     mFlyoutControl->setAction([this](LLUICtrl *ctrl, const LLSD &data) { onButtonApply(ctrl, data); });
 
     return TRUE;
diff --git a/indra/newview/llfloaterfixedenvironment.h b/indra/newview/llfloaterfixedenvironment.h
index 6f1030e6ed4073ae61ac0073e41bacea6a1f4b0c..ef47941555320ccafe3ac95c3b2a387c611601e5 100644
--- a/indra/newview/llfloaterfixedenvironment.h
+++ b/indra/newview/llfloaterfixedenvironment.h
@@ -80,7 +80,7 @@ class LLFloaterFixedEnvironment : public LLFloater
     bool                    canApplyRegion() const;
     bool                    canApplyParcel() const;
 
-    LLFlyoutComboBtn *      mFlyoutControl;
+    LLFlyoutComboBtnCtrl *      mFlyoutControl;
 
     LLUUID                  mInventoryId;
     LLInventoryItem *       mInventoryItem;
diff --git a/indra/newview/llflyoutcombobtn.cpp b/indra/newview/llflyoutcombobtn.cpp
index efe76b5653f6383fe490d8ad17aef15264149c01..a736fcafa34e62feba8430f5bdb3d800626d57a2 100644
--- a/indra/newview/llflyoutcombobtn.cpp
+++ b/indra/newview/llflyoutcombobtn.cpp
@@ -1,5 +1,5 @@
 /** 
- * @file llsaveoutfitcombobtn.cpp
+ * @file llflyoutcombobtn.cpp
  * @brief Represents outfit save/save as combo button.
  *
  * $LicenseInfo:firstyear=2010&license=viewerlgpl$
@@ -29,7 +29,7 @@
 #include "llflyoutcombobtn.h"
 #include "llviewermenu.h"
 
-LLFlyoutComboBtn::LLFlyoutComboBtn(LLPanel* parent, const std::string &action_button, const std::string &flyout_button, const std::string &menu_file) :
+LLFlyoutComboBtnCtrl::LLFlyoutComboBtnCtrl(LLPanel* parent, const std::string &action_button, const std::string &flyout_button, const std::string &menu_file) :
 	mParent(parent),
     mActionButton(action_button),
     mFlyoutButton(flyout_button)
@@ -48,30 +48,30 @@ LLFlyoutComboBtn::LLFlyoutComboBtn(LLPanel* parent, const std::string &action_bu
     setSelectedItem(0);
 }
 
-void LLFlyoutComboBtn::setAction(LLUICtrl::commit_callback_t cb)
+void LLFlyoutComboBtnCtrl::setAction(LLUICtrl::commit_callback_t cb)
 {
     mActionSignal.connect(cb);
 }
 
 
-U32 LLFlyoutComboBtn::getItemCount()
+U32 LLFlyoutComboBtnCtrl::getItemCount()
 {
     return mFlyoutMenu->getItemCount();
 }
 
-void LLFlyoutComboBtn::setSelectedItem(S32 itemno)
+void LLFlyoutComboBtnCtrl::setSelectedItem(S32 itemno)
 {
     LLMenuItemGL *pitem = mFlyoutMenu->getItem(itemno);
     setSelectedItem(pitem);
 }
 
-void LLFlyoutComboBtn::setSelectedItem(const std::string &item)
+void LLFlyoutComboBtnCtrl::setSelectedItem(const std::string &item)
 {
     LLMenuItemGL *pitem = mFlyoutMenu->getChild<LLMenuItemGL>(item, false);
     setSelectedItem(pitem);
 }
 
-void LLFlyoutComboBtn::setSelectedItem(LLMenuItemGL *pitem)
+void LLFlyoutComboBtnCtrl::setSelectedItem(LLMenuItemGL *pitem)
 {
     if (!pitem)
     {
@@ -86,7 +86,7 @@ void LLFlyoutComboBtn::setSelectedItem(LLMenuItemGL *pitem)
     action_button->setLabel(pitem->getLabel());
 }
 
-void LLFlyoutComboBtn::setMenuItemEnabled(const std::string& item, bool enabled)
+void LLFlyoutComboBtnCtrl::setMenuItemEnabled(const std::string& item, bool enabled)
 {
     mFlyoutMenu->setItemEnabled(item, enabled);
     if (item == mSelectedName)
@@ -95,12 +95,12 @@ void LLFlyoutComboBtn::setMenuItemEnabled(const std::string& item, bool enabled)
     }
 }
 
-void LLFlyoutComboBtn::setShownBtnEnabled(bool enabled)
+void LLFlyoutComboBtnCtrl::setShownBtnEnabled(bool enabled)
 {
     mParent->getChildView(mActionButton)->setEnabled(enabled);
 }
 
-void LLFlyoutComboBtn::onFlyoutButton(LLUICtrl *ctrl, const LLSD &data)
+void LLFlyoutComboBtnCtrl::onFlyoutButton(LLUICtrl *ctrl, const LLSD &data)
 {
 	S32 x, y;
 	LLUI::getMousePositionLocal(mParent, &x, &y);
@@ -109,7 +109,7 @@ void LLFlyoutComboBtn::onFlyoutButton(LLUICtrl *ctrl, const LLSD &data)
 	LLMenuGL::showPopup(mParent, mFlyoutMenu, x, y);
 }
 
-void LLFlyoutComboBtn::onFlyoutItemSelected(LLUICtrl *ctrl, const LLSD &data)
+void LLFlyoutComboBtnCtrl::onFlyoutItemSelected(LLUICtrl *ctrl, const LLSD &data)
 {
     LLMenuItemGL *pmenuitem = static_cast<LLMenuItemGL*>(ctrl);
     setSelectedItem(pmenuitem);
@@ -117,7 +117,7 @@ void LLFlyoutComboBtn::onFlyoutItemSelected(LLUICtrl *ctrl, const LLSD &data)
     onFlyoutAction(pmenuitem, data);
 }
 
-void LLFlyoutComboBtn::onFlyoutAction(LLUICtrl *ctrl, const LLSD &data)
+void LLFlyoutComboBtnCtrl::onFlyoutAction(LLUICtrl *ctrl, const LLSD &data)
 {
     LLMenuItemGL *pmenuitem = mFlyoutMenu->getChild<LLMenuItemGL>(mSelectedName);
 
diff --git a/indra/newview/llflyoutcombobtn.h b/indra/newview/llflyoutcombobtn.h
index ebf75644226df4e9acefb7c1099ada22527247c4..517752d8db4ecf66246ef11922a360e4f4ba5f7f 100644
--- a/indra/newview/llflyoutcombobtn.h
+++ b/indra/newview/llflyoutcombobtn.h
@@ -24,8 +24,8 @@
  * $/LicenseInfo$
  */
 
-#ifndef LL_LLSAVECOMBOBTN_H
-#define LL_LLSAVECOMBOBTN_H
+#ifndef LL_LLFLYOUTCOMBOBTN_H
+#define LL_LLFLYOUTCOMBOBTN_H
 
 /*TODO: Make this button generic */
 
@@ -33,14 +33,11 @@ class LLButton;
 
 #include "lltoggleablemenu.h"
 
-/**
- * Represents outfit Save/Save As combo button.
- */
-class LLFlyoutComboBtn
+class LLFlyoutComboBtnCtrl
 {
-    LOG_CLASS(LLFlyoutComboBtn);
+    LOG_CLASS(LLFlyoutComboBtnCtrl);
 public:
-    LLFlyoutComboBtn(LLPanel* parent, const std::string &action_button, const std::string &flyout_button, const std::string &menu_file);
+    LLFlyoutComboBtnCtrl(LLPanel* parent, const std::string &action_button, const std::string &flyout_button, const std::string &menu_file);
 
 	void setMenuItemEnabled(const std::string &item, bool enabled);
 	void setShownBtnEnabled(bool enabled);
@@ -68,4 +65,4 @@ class LLFlyoutComboBtn
 
     LLUICtrl::commit_signal_t   mActionSignal;
 };
-#endif // LL_LLSAVEOUTFITCOMBOBTN_H
+#endif // LL_LLFLYOUTCOMBOBTN_H
diff --git a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
index 3a3779e753a2879f776e3f2bce731c5f1678ee9b..ba4e15e7db80824da09bf59fb54090c5577e897b 100644
--- a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
+++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
@@ -470,6 +470,22 @@
                     top_pad="0"
                     name="save_btn"
                     width="100" />
+
+            <button
+                    follows="top|left"
+                    height="23"
+                    name="btn_flyout"
+                    label=""
+                    layout="topleft"
+                    left_pad="-20"
+                    top="0"
+                    image_selected="SegmentedBtn_Right_Selected_Press"
+                    image_unselected="SegmentedBtn_Right_Off"
+                    image_pressed="SegmentedBtn_Right_Press"
+                    image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+                    image_overlay="Arrow_Small_Up"
+                    width="20"/>
+
             <button
                     follows="top|left"
                     height="23"
@@ -479,29 +495,14 @@
                     name="cancel_btn"
                     width="100" /> 
 
-            <button
+            <!--<button
                     follows="top|left"
                     height="23"
                     label="Upload"
                     layout="topleft"
                     left_pad="10"
                     name="upload_btn"
-                    width="100" />
-            
-            <!--<button
-                    follows="top|left"
-                    height="23"
-                    name="btn_flyout"
-                    label=""
-                    layout="topleft"
-                    left_pad="-20"
-                    top="0"
-                    image_selected="SegmentedBtn_Right_Selected_Press"
-                    image_unselected="SegmentedBtn_Right_Off"
-                    image_pressed="SegmentedBtn_Right_Press"
-                    image_pressed_selected="SegmentedBtn_Right_Selected_Press"
-                    image_overlay="Arrow_Small_Up"
-                    width="20"/>-->
+                    width="100" />-->
 
         </layout_panel>
     </layout_stack>