diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 673f251da2260a35c2959fc0303ee8c144988e63..0c3de2826ff6c690da7c97e14ef9127b3c1cdb35 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -224,6 +224,7 @@ set(viewer_SOURCE_FILES
     llfloaterdeleteprefpreset.cpp
     llfloaterdestinations.cpp
     llfloatereditdaycycle.cpp
+    llfloatereditextdaycycle.cpp
     llfloatereditsky.cpp
     llfloatereditwater.cpp
     llfloaterenvironmentsettings.cpp
@@ -838,7 +839,7 @@ set(viewer_HEADER_FILES
     llfloaterconversationpreview.h
     llfloaterdeleteprefpreset.h
     llfloaterdestinations.h
-    llfloatereditdaycycle.h
+    llfloatereditextdaycycle.h
     llfloatereditsky.h
     llfloatereditwater.h
     llfloaterenvironmentsettings.h
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c62ef85b02eb9ed893582bffd61cb58764e25116
--- /dev/null
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -0,0 +1,872 @@
+/** 
+ * @file llfloatereditextdaycycle.cpp
+ * @brief Floater to create or edit a day cycle
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatereditextdaycycle.h"
+
+// libs
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llloadingindicator.h"
+#include "llmultisliderctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llspinctrl.h"
+#include "lltimectrl.h"
+
+// newview
+#include "llagent.h"
+#include "llregioninfomodel.h"
+#include "llviewerregion.h"
+
+#include "llenvironment.h"
+#include "lltrans.h"
+
+const F32 LLFloaterEditExtDayCycle::sHoursPerDay = 24.0f;
+
+LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key)
+:	LLFloater(key)
+,	mDayCycleNameEditor(NULL)
+,	mDayCyclesCombo(NULL)
+,	mTimeSlider(NULL)
+,	mKeysSlider(NULL)
+,	mSkyPresetsCombo(NULL)
+,	mTimeCtrl(NULL)
+,	mMakeDefaultCheckBox(NULL)
+,	mSaveButton(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEditExtDayCycle::postBuild()
+{
+	mDayCycleNameEditor = getChild<LLLineEditor>("day_cycle_name");
+	mDayCyclesCombo = getChild<LLComboBox>("day_cycle_combo");
+
+	mTimeSlider = getChild<LLMultiSliderCtrl>("WLTimeSlider");
+	mKeysSlider = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
+	mSkyPresetsCombo = getChild<LLComboBox>("WLSkyPresets");
+	mTimeCtrl = getChild<LLTimeCtrl>("time");
+	mSaveButton = getChild<LLButton>("save");
+	mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
+
+	initCallbacks();
+
+	// add the time slider
+	mTimeSlider->addSlider();
+
+	return TRUE;
+}
+
+// virtual
+void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
+{
+	bool new_day = isNewDay();
+	std::string param = key.asString();
+	std::string floater_title = getString(std::string("title_") + param);
+	std::string hint = getString(std::string("hint_" + param));
+
+	// Update floater title.
+	setTitle(floater_title);
+
+	// Update the hint at the top.
+	getChild<LLUICtrl>("hint")->setValue(hint);
+
+	// Hide the hint to the right of the combo if we're invoked to create a new preset.
+	getChildView("note")->setVisible(!new_day);
+
+	// Switch between the day cycle presets combobox and day cycle name input field.
+	mDayCyclesCombo->setVisible(!new_day);
+	mDayCycleNameEditor->setVisible(new_day);
+
+	// TODO: Make sure only one instance of the floater exists?
+
+	reset();
+}
+
+// virtual
+void LLFloaterEditExtDayCycle::onClose(bool app_quitting)
+{
+	if (!app_quitting) // there's no point to change environment if we're quitting
+	{
+        LLEnvironment::instance().applyChosenEnvironment();
+	}
+}
+
+// virtual
+void LLFloaterEditExtDayCycle::draw()
+{
+	syncTimeSlider();
+	LLFloater::draw();
+}
+
+void LLFloaterEditExtDayCycle::initCallbacks(void)
+{
+#if 0
+	mDayCycleNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleNameEdited, this), NULL);
+	mDayCyclesCombo->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleSelected, this));
+	mDayCyclesCombo->setTextEntryCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleNameEdited, this));
+	mTimeSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onTimeSliderMoved, this));
+	mKeysSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onKeyTimeMoved, this));
+	mTimeCtrl->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onKeyTimeChanged, this));
+	mSkyPresetsCombo->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onKeyPresetChanged, this));
+
+	getChild<LLButton>("WLAddKey")->setClickedCallback(boost::bind(&LLFloaterEditExtDayCycle::onAddKey, this));
+	getChild<LLButton>("WLDeleteKey")->setClickedCallback(boost::bind(&LLFloaterEditExtDayCycle::onDeleteKey, this));
+
+	mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnSave, this));
+	mSaveButton->setRightMouseDownCallback(boost::bind(&LLFloaterEditExtDayCycle::dumpTrack, this));
+	getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnCancel, this));
+
+	// Connect to env manager events.
+	LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+	env_mgr.setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionSettingsChange, this));
+	gAgent.addRegionChangedCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionChange, this));
+	env_mgr.setRegionSettingsAppliedCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionSettingsApplied, this, _1));
+	// Connect to day cycle manager events.
+	LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleListChange, this));
+
+	// Connect to sky preset list changes.
+	LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditExtDayCycle::onSkyPresetListChange, this));
+
+
+	// Connect to region info updates.
+	LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionInfoUpdate, this));
+#endif
+}
+
+void LLFloaterEditExtDayCycle::syncTimeSlider()
+{
+#if 0
+	// set time
+	mTimeSlider->setCurSliderValue((F32)LLWLParamManager::getInstance()->mAnimator.getDayTime() * sHoursPerDay);
+#endif
+}
+
+void LLFloaterEditExtDayCycle::loadTrack()
+{
+// 	// clear the slider
+// 	mKeysSlider->clear();
+// 	mSliderToKey.clear();
+// 
+// 	// add sliders
+// 
+// 	LL_DEBUGS() << "Adding " << LLWLParamManager::getInstance()->mDay.mTimeMap.size() << " keys to slider" << LL_ENDL;
+// 
+// 	LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay;
+// 	for (std::map<F32, LLWLParamKey>::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it)
+// 	{
+// 		addSliderKey(it->first * sHoursPerDay, it->second);
+// 	}
+// 
+// 	// set drop-down menu to match preset of currently-selected keyframe (one is automatically selected initially)
+// 	const std::string& cur_sldr = mKeysSlider->getCurSlider();
+// 	if (strlen(cur_sldr.c_str()) > 0)	// only do this if there is a curSldr, otherwise we put an invalid entry into the map
+// 	{
+// 		mSkyPresetsCombo->selectByValue(mSliderToKey[cur_sldr].keyframe.toStringVal());
+// 	}
+// 
+// 	syncTimeSlider();
+}
+
+void LLFloaterEditExtDayCycle::applyTrack()
+{
+#if 0
+	LL_DEBUGS() << "Applying track (" << mSliderToKey.size() << ")" << LL_ENDL;
+
+	// if no keys, do nothing
+	if (mSliderToKey.size() == 0)
+	{
+		LL_DEBUGS() << "No keys, not syncing" << LL_ENDL;
+		return;
+	}
+
+	llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+
+	// create a new animation track
+	LLWLParamManager::getInstance()->mDay.clearKeyframes();
+
+	// add the keys one by one
+	for (std::map<std::string, SliderKey>::iterator it = mSliderToKey.begin();
+		it != mSliderToKey.end(); ++it)
+	{
+		LLWLParamManager::getInstance()->mDay.addKeyframe(it->second.time / sHoursPerDay,
+			it->second.keyframe);
+	}
+
+	// set the param manager's track to the new one
+	LLWLParamManager::getInstance()->resetAnimator(
+		mTimeSlider->getCurSliderValue() / sHoursPerDay, false);
+
+	LLWLParamManager::getInstance()->mAnimator.update(
+		LLWLParamManager::getInstance()->mCurParams);
+#endif
+}
+
+void LLFloaterEditExtDayCycle::refreshSkyPresetsList()
+{
+#if 0
+	// Don't allow selecting region skies for a local day cycle,
+	// because thus we may end up with invalid day cycle.
+	bool include_region_skies = getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION;
+
+	mSkyPresetsCombo->removeall();
+
+	LLWLParamManager::preset_name_list_t region_presets;
+	LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+	LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+	if (include_region_skies)
+	{
+		// Add region presets.
+		for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+		{
+			std::string preset_name = *it;
+			std::string item_title = preset_name + " (" + getRegionName() + ")";
+			mSkyPresetsCombo->add(preset_name, LLWLParamKey(*it, LLEnvKey::SCOPE_REGION).toStringVal());
+		}
+
+		if (!region_presets.empty())
+		{
+			mSkyPresetsCombo->addSeparator();
+		}
+	}
+
+	// Add user presets.
+	for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+	{
+		mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+	}
+
+	if (!user_presets.empty())
+	{
+		mSkyPresetsCombo->addSeparator();
+	}
+
+	// Add system presets.
+	for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+	{
+		mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+	}
+
+	// set defaults on combo boxes
+	mSkyPresetsCombo->selectFirstItem();
+#endif
+}
+
+void LLFloaterEditExtDayCycle::refreshDayCyclesList()
+{
+#if 0
+	llassert(isNewDay() == false);
+
+	mDayCyclesCombo->removeall();
+
+#if 0 // Disable editing existing day cycle until the workflow is clear enough.
+	const LLSD& region_day = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+	if (region_day.size() > 0)
+	{
+		LLWLParamKey key(getRegionName(), LLEnvKey::SCOPE_REGION);
+		mDayCyclesCombo->add(key.name, key.toLLSD());
+		mDayCyclesCombo->addSeparator();
+	}
+#endif
+
+	LLDayCycleManager::preset_name_list_t user_days, sys_days;
+	LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+
+	// Add user days.
+	for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+	{
+		mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+	}
+
+	if (user_days.size() > 0)
+	{
+		mDayCyclesCombo->addSeparator();
+	}
+
+	// Add system days.
+	for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+	{
+		mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+	}
+
+	mDayCyclesCombo->setLabel(getString("combo_label"));
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onTimeSliderMoved()
+{
+#if 0
+	/// get the slider value
+	F32 val = mTimeSlider->getCurSliderValue() / sHoursPerDay;
+
+	// set the value, turn off animation
+	LLWLParamManager::getInstance()->mAnimator.setDayTime((F64)val);
+	LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+	// then call update once
+	LLWLParamManager::getInstance()->mAnimator.update(
+		LLWLParamManager::getInstance()->mCurParams);
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onKeyTimeMoved()
+{
+#if 0
+	if (mKeysSlider->getValue().size() == 0)
+	{
+		return;
+	}
+
+	// make sure we have a slider
+	const std::string& cur_sldr = mKeysSlider->getCurSlider();
+	if (cur_sldr == "")
+	{
+		return;
+	}
+
+	F32 time24 = mKeysSlider->getCurSliderValue();
+
+	// check to see if a key exists
+	LLWLParamKey key = mSliderToKey[cur_sldr].keyframe;
+	LL_DEBUGS() << "Setting key time: " << time24 << LL_ENDL;
+	mSliderToKey[cur_sldr].time = time24;
+
+	// if it exists, turn on check box
+	mSkyPresetsCombo->selectByValue(key.toStringVal());
+
+	mTimeCtrl->setTime24(time24);
+
+	applyTrack();
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onKeyTimeChanged()
+{
+#if 0
+	// if no keys, skipped
+	if (mSliderToKey.size() == 0)
+	{
+		return;
+	}
+
+	F32 time24 = mTimeCtrl->getTime24();
+
+	const std::string& cur_sldr = mKeysSlider->getCurSlider();
+	mKeysSlider->setCurSliderValue(time24, TRUE);
+	F32 time = mKeysSlider->getCurSliderValue() / sHoursPerDay;
+
+	// now set the key's time in the sliderToKey map
+	LL_DEBUGS() << "Setting key time: " << time << LL_ENDL;
+	mSliderToKey[cur_sldr].time = time;
+
+	applyTrack();
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onKeyPresetChanged()
+{
+#if 0
+	// do nothing if no sliders
+	if (mKeysSlider->getValue().size() == 0)
+	{
+		return;
+	}
+
+	// change the map
+
+	std::string stringVal = mSkyPresetsCombo->getSelectedValue().asString();
+	LLWLParamKey new_key(stringVal);
+	llassert(!new_key.name.empty());
+	const std::string& cur_sldr = mKeysSlider->getCurSlider();
+
+	// if null, don't use
+	if (cur_sldr == "")
+	{
+		return;
+	}
+
+	mSliderToKey[cur_sldr].keyframe = new_key;
+
+	// Apply changes to current day cycle.
+	applyTrack();
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onAddKey()
+{
+#if 0
+	llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+
+	S32 max_sliders;
+	LLEnvKey::EScope scope = LLEnvKey::SCOPE_LOCAL; // *TODO: editing region day cycle
+	switch (scope)
+	{
+		case LLEnvKey::SCOPE_LOCAL:
+			max_sliders = 20; // *HACK this should be LLWLPacketScrubber::MAX_LOCAL_KEY_FRAMES;
+			break;
+		case LLEnvKey::SCOPE_REGION:
+			max_sliders = 12; // *HACK this should be LLWLPacketScrubber::MAX_REGION_KEY_FRAMES;
+			break;
+		default:
+			max_sliders = (S32) mKeysSlider->getMaxValue();
+			break;
+	}
+
+#if 0
+	if ((S32)mSliderToKey.size() >= max_sliders)
+	{
+		LLSD args;
+		args["SCOPE"] = LLEnvManagerNew::getScopeString(scope);
+		args["MAX"] = max_sliders;
+		LLNotificationsUtil::add("DayCycleTooManyKeyframes", args, LLSD(), LLNotificationFunctorRegistry::instance().DONOTHING);
+		return;
+	}
+#endif
+
+	// add the slider key
+	std::string key_val = mSkyPresetsCombo->getSelectedValue().asString();
+	LLWLParamKey sky_params(key_val);
+	llassert(!sky_params.name.empty());
+
+	F32 time = mTimeSlider->getCurSliderValue();
+	addSliderKey(time, sky_params);
+
+	// apply the change to current day cycles
+	applyTrack();
+#endif
+}
+
+#if 0
+void LLFloaterEditExtDayCycle::addSliderKey(F32 time, LLWLParamKey keyframe)
+{
+	// make a slider
+	const std::string& sldr_name = mKeysSlider->addSlider(time);
+	if (sldr_name.empty())
+	{
+		return;
+	}
+
+	// set the key
+	SliderKey newKey(keyframe, mKeysSlider->getCurSliderValue());
+
+	llassert_always(sldr_name != LLStringUtil::null);
+
+	// add to map
+	mSliderToKey.insert(std::pair<std::string, SliderKey>(sldr_name, newKey));
+
+	llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+}
+#endif
+
+#if 0
+LLWLParamKey LLFloaterEditExtDayCycle::getSelectedDayCycle()
+{
+	LLWLParamKey dc_key;
+
+	if (mDayCycleNameEditor->getVisible())
+	{
+		dc_key.name = mDayCycleNameEditor->getText();
+		dc_key.scope = LLEnvKey::SCOPE_LOCAL;
+	}
+	else
+	{
+		LLSD combo_val = mDayCyclesCombo->getValue();
+
+		if (!combo_val.isArray()) // manually typed text
+		{
+			dc_key.name = combo_val.asString();
+			dc_key.scope = LLEnvKey::SCOPE_LOCAL;
+		}
+		else
+		{
+			dc_key.fromLLSD(combo_val);
+		}
+	}
+
+	return dc_key;
+}
+#endif
+
+bool LLFloaterEditExtDayCycle::isNewDay() const
+{
+	return mKey.asString() == "new";
+}
+
+void LLFloaterEditExtDayCycle::dumpTrack()
+{
+#if 0
+	LL_DEBUGS("Windlight") << "Dumping day cycle" << LL_ENDL;
+
+	LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay;
+	for (std::map<F32, LLWLParamKey>::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it)
+	{
+		F32 time = it->first * 24.0f;
+		S32 h = (S32) time;
+		S32 m = (S32) ((time - h) * 60.0f);
+		LL_DEBUGS("Windlight") << llformat("(%.3f) %02d:%02d", time, h, m) << " => " << it->second.name << LL_ENDL;
+	}
+#endif
+}
+
+void LLFloaterEditExtDayCycle::enableEditing(bool enable)
+{
+	mSkyPresetsCombo->setEnabled(enable);
+	mTimeCtrl->setEnabled(enable);
+	getChild<LLPanel>("day_cycle_slider_panel")->setCtrlsEnabled(enable);
+	mSaveButton->setEnabled(enable);
+	mMakeDefaultCheckBox->setEnabled(enable);
+}
+
+void LLFloaterEditExtDayCycle::reset()
+{
+#if 0
+	// clear the slider
+	mKeysSlider->clear();
+	mSliderToKey.clear();
+
+	refreshSkyPresetsList();
+
+	if (isNewDay())
+	{
+		mDayCycleNameEditor->setValue(LLSD());
+		F32 time = 0.5f * sHoursPerDay;
+		mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
+		mTimeSlider->setCurSliderValue(time);
+
+		addSliderKey(time, LLWLParamKey("Default", LLEnvKey::SCOPE_LOCAL));
+		onKeyTimeMoved(); // update the time control and sky sky combo
+
+		applyTrack();
+	}
+	else
+	{
+		refreshDayCyclesList();
+
+		// Disable controls until a day cycle  to edit is selected.
+		enableEditing(false);
+	}
+#endif
+}
+
+void LLFloaterEditExtDayCycle::saveRegionDayCycle()
+{
+#if 0
+	LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+	LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay; // the day cycle being edited
+
+	// Get current day cycle and the sky preset it references.
+	LLSD day_cycle = cur_dayp.asLLSD();
+	LLSD sky_map;
+	cur_dayp.getSkyMap(sky_map);
+
+	// Apply it to the region.
+	LLEnvironmentSettings new_region_settings;
+	new_region_settings.saveParams(day_cycle, sky_map, env_mgr.getRegionSettings().getWaterParams(), 0.0f);
+
+#if 1
+	LLEnvManagerNew::instance().setRegionSettings(new_region_settings);
+#else // Temporary disabled ability to upload new region settings from the Day Cycle Editor.
+	if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings))
+	{
+		LL_WARNS() << "Error applying region environment settings" << LL_ENDL;
+		return;
+	}
+
+	setApplyProgress(true);
+#endif
+#endif
+}
+
+void LLFloaterEditExtDayCycle::setApplyProgress(bool started)
+{
+	LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator");
+
+	indicator->setVisible(started);
+
+	if (started)
+	{
+		indicator->start();
+	}
+	else
+	{
+		indicator->stop();
+	}
+}
+
+bool LLFloaterEditExtDayCycle::getApplyProgress() const
+{
+	return getChild<LLLoadingIndicator>("progress_indicator")->getVisible();
+}
+
+void LLFloaterEditExtDayCycle::onDeleteKey()
+{
+#if 0
+	if (mSliderToKey.size() == 0)
+	{
+		return;
+	}
+	else if (mSliderToKey.size() == 1)
+	{
+		LLNotifications::instance().add("EnvCannotDeleteLastDayCycleKey", LLSD(), LLSD());
+		return;
+	}
+
+	// delete from map
+	const std::string& sldr_name = mKeysSlider->getCurSlider();
+	std::map<std::string, SliderKey>::iterator mIt = mSliderToKey.find(sldr_name);
+	mSliderToKey.erase(mIt);
+
+	mKeysSlider->deleteCurSlider();
+
+	if (mSliderToKey.size() == 0)
+	{
+		return;
+	}
+
+	const std::string& name = mKeysSlider->getCurSlider();
+	mSkyPresetsCombo->selectByValue(mSliderToKey[name].keyframe.toStringVal());
+	F32 time24 = mSliderToKey[name].time;
+
+	mTimeCtrl->setTime24(time24);
+
+	applyTrack();
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onRegionSettingsChange()
+{
+#if 0
+	LL_DEBUGS("Windlight") << "Region settings changed" << LL_ENDL;
+
+	if (getApplyProgress()) // our region settings have being applied
+	{
+		setApplyProgress(false);
+
+		// Change preference if requested.
+		if (mMakeDefaultCheckBox->getValue())
+		{
+			LL_DEBUGS("Windlight") << "Changed environment preference to region settings" << LL_ENDL;
+			LLEnvManagerNew::instance().setUseRegionSettings(true);
+		}
+
+		closeFloater();
+	}
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onRegionChange()
+{
+#if 0
+	LL_DEBUGS("Windlight") << "Region changed" << LL_ENDL;
+
+	// If we're editing the region day cycle
+	if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION)
+	{
+		reset(); // undoes all unsaved changes
+	}
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onRegionSettingsApplied(bool success)
+{
+	LL_DEBUGS("Windlight") << "Region settings applied: " << success << LL_ENDL;
+
+	if (!success)
+	{
+		// stop progress indicator
+		setApplyProgress(false);
+	}
+}
+
+void LLFloaterEditExtDayCycle::onRegionInfoUpdate()
+{
+#if 0
+	LL_DEBUGS("Windlight") << "Region info updated" << LL_ENDL;
+	bool can_edit = true;
+
+	// If we've selected the region day cycle for editing.
+	if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION)
+	{
+		// check whether we have the access
+		can_edit = LLEnvManagerNew::canEditRegionSettings();
+	}
+
+	enableEditing(can_edit);
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onDayCycleNameEdited()
+{
+#if 0
+	// Disable saving a day cycle having empty name.
+	LLWLParamKey key = getSelectedDayCycle();
+	mSaveButton->setEnabled(!key.name.empty());
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onDayCycleSelected()
+{
+#if 0
+
+	LLSD day_data;
+	LLWLParamKey dc_key = getSelectedDayCycle();
+	bool can_edit = true;
+
+	if (dc_key.scope == LLEnvKey::SCOPE_LOCAL)
+	{
+		if (!LLDayCycleManager::instance().getPreset(dc_key.name, day_data))
+		{
+			LL_WARNS() << "No day cycle named " << dc_key.name << LL_ENDL;
+			return;
+		}
+	}
+	else
+	{
+		day_data = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+		if (day_data.size() == 0)
+		{
+			LL_WARNS() << "Empty region day cycle" << LL_ENDL;
+			llassert(day_data.size() > 0);
+			return;
+		}
+
+		can_edit = LLEnvManagerNew::canEditRegionSettings();
+	}
+
+	// We may need to add or remove region skies from the list.
+	refreshSkyPresetsList();
+
+	F32 slider_time = mTimeSlider->getCurSliderValue() / sHoursPerDay;
+	LLWLParamManager::instance().applyDayCycleParams(day_data, dc_key.scope, slider_time);
+	loadTrack();
+#endif
+	enableEditing(false);
+}
+
+void LLFloaterEditExtDayCycle::onBtnSave()
+{
+#if 0
+	LLDayCycleManager& day_mgr = LLDayCycleManager::instance();
+	LLWLParamKey selected_day = getSelectedDayCycle();
+
+	if (selected_day.scope == LLEnvKey::SCOPE_REGION)
+	{
+		saveRegionDayCycle();
+		closeFloater();
+		return;
+	}
+
+	std::string name = selected_day.name;
+	if (name.empty())
+	{
+		// *TODO: show an alert
+		LL_WARNS() << "Empty day cycle name" << LL_ENDL;
+		return;
+	}
+
+	// Don't allow overwriting system presets.
+	if (day_mgr.isSystemPreset(name))
+	{
+		LLNotificationsUtil::add("WLNoEditDefault");
+		return;
+	}
+
+	// Save, ask for confirmation for overwriting an existing preset.
+	if (day_mgr.presetExists(name))
+	{
+		LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditExtDayCycle::onSaveAnswer, this, _1, _2));
+	}
+	else
+	{
+		// new preset, hence no confirmation needed
+		onSaveConfirmed();
+	}
+#endif
+}
+
+void LLFloaterEditExtDayCycle::onBtnCancel()
+{
+	closeFloater();
+}
+
+bool LLFloaterEditExtDayCycle::onSaveAnswer(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+	// If they choose save, do it.  Otherwise, don't do anything
+	if (option == 0)
+	{
+		onSaveConfirmed();
+	}
+
+	return false;
+}
+
+void LLFloaterEditExtDayCycle::onSaveConfirmed()
+{
+#if 0
+	std::string name = getSelectedDayCycle().name;
+
+	// Save preset.
+	LLSD data = LLWLParamManager::instance().mDay.asLLSD();
+	LL_DEBUGS("Windlight") << "Saving day cycle " << name << ": " << data << LL_ENDL;
+	LLDayCycleManager::instance().savePreset(name, data);
+
+	// Change preference if requested.
+	if (mMakeDefaultCheckBox->getValue())
+	{
+		LL_DEBUGS("Windlight") << name << " is now the new preferred day cycle" << LL_ENDL;
+		LLEnvManagerNew::instance().setUseDayCycle(name);
+	}
+#endif
+	closeFloater();
+}
+
+void LLFloaterEditExtDayCycle::onDayCycleListChange()
+{
+	if (!isNewDay())
+	{
+		refreshDayCyclesList();
+	}
+}
+
+void LLFloaterEditExtDayCycle::onSkyPresetListChange()
+{
+	refreshSkyPresetsList();
+
+	// Refresh sliders from the currently visible day cycle.
+	loadTrack();
+}
+
+// static
+std::string LLFloaterEditExtDayCycle::getRegionName()
+{
+	return gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+}
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
new file mode 100644
index 0000000000000000000000000000000000000000..bed5db14b209a20934214a43eb867c7ccd053990
--- /dev/null
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -0,0 +1,135 @@
+/** 
+ * @file llfloatereditextdaycycle.h
+ * @brief Floater to create or edit a day cycle
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREDITEXTDAYCYCLE_H
+#define LL_LLFLOATEREDITEXTDAYCYCLE_H
+
+#include "llfloater.h"
+
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+class LLMultiSliderCtrl;
+class LLTimeCtrl;
+
+/**
+ * Floater for creating or editing a day cycle.
+ */
+class LLFloaterEditExtDayCycle : public LLFloater
+{
+	LOG_CLASS(LLFloaterEditExtDayCycle);
+
+public:
+	LLFloaterEditExtDayCycle(const LLSD &key);
+
+	/*virtual*/	BOOL	postBuild();
+	/*virtual*/ void	onOpen(const LLSD& key);
+	/*virtual*/ void	onClose(bool app_quitting);
+	/*virtual*/ void	draw();
+
+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 refreshSkyPresetsList();
+
+	/// refresh the day cycle combobox
+	void refreshDayCyclesList();
+
+	/// add a slider to the track
+//	void addSliderKey(F32 time, LLWLParamKey keyframe);
+
+	void initCallbacks();
+//	LLWLParamKey getSelectedDayCycle();
+	bool isNewDay() const;
+	void dumpTrack();
+	void enableEditing(bool enable);
+	void reset();
+	void saveRegionDayCycle();
+
+	void setApplyProgress(bool started);
+	bool getApplyProgress() const;
+
+	void onTimeSliderMoved();	/// time slider moved
+	void onKeyTimeMoved();		/// a key frame moved
+	void onKeyTimeChanged();	/// a key frame's time changed
+	void onKeyPresetChanged();	/// sky preset selected
+	void onAddKey();			/// new key added on slider
+	void onDeleteKey();			/// a key frame deleted
+
+	void onRegionSettingsChange();
+	void onRegionChange();
+	void onRegionSettingsApplied(bool success);
+	void onRegionInfoUpdate();
+
+	void onDayCycleNameEdited();
+	void onDayCycleSelected();
+	void onBtnSave();
+	void onBtnCancel();
+
+	bool onSaveAnswer(const LLSD& notification, const LLSD& response);
+	void onSaveConfirmed();
+
+	void onDayCycleListChange();
+	void onSkyPresetListChange();
+
+	static std::string getRegionName();
+
+	/// convenience class for holding keyframes mapped to sliders
+// 	struct SliderKey
+// 	{
+// 	public:
+// 		SliderKey(LLWLParamKey kf, F32 t) : keyframe(kf), time(t) {}
+// 		SliderKey() : keyframe(), time(0.f) {} // Don't use this default constructor
+// 
+// 		LLWLParamKey keyframe;
+// 		F32 time;
+// 	};
+
+	static const F32 sHoursPerDay;
+
+	LLLineEditor*		mDayCycleNameEditor;
+	LLComboBox*			mDayCyclesCombo;
+	LLMultiSliderCtrl*	mTimeSlider;
+	LLMultiSliderCtrl*	mKeysSlider;
+	LLComboBox*			mSkyPresetsCombo;
+	LLTimeCtrl*			mTimeCtrl;
+	LLCheckBoxCtrl*		mMakeDefaultCheckBox;
+	LLButton*			mSaveButton;
+
+	// map of sliders to parameters
+//	std::map<std::string, SliderKey> mSliderToKey;
+};
+
+#endif // LL_LLFloaterEditExtDayCycle_H
diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b606e1de08c225edca8a488efd72b86aab07b0ae
--- /dev/null
+++ b/indra/newview/llpanelenvironment.cpp
@@ -0,0 +1,396 @@
+/** 
+ * @file llpanelenvironment.cpp
+ * @brief LLPanelExperiences class implementation
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+
+#include "llpanelprofile.h"
+#include "lluictrlfactory.h"
+#include "llexperiencecache.h"
+#include "llagent.h"
+
+#include "llviewerregion.h"
+#include "llpanelenvironment.h"
+#include "llslurl.h"
+#include "lllayoutstack.h"
+
+static LLPanelInjector<LLPanelEnvironmentInfo> register_environment_panel("environment_panel");
+
+LLPanelEnvironmentInfo::LLPanelEnvironmentInfo(): 
+    mEnableEditing(false),
+    mRegionSettingsRadioGroup(NULL),
+    mDayLengthSlider(NULL),
+    mDayOffsetSlider(NULL),
+    mAllowOverRide(NULL)
+{
+}
+
+// virtual
+BOOL LLPanelEnvironmentInfo::postBuild()
+{
+    mRegionSettingsRadioGroup = getChild<LLRadioGroup>("environment_select_radio_group");
+    mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchDefaultSelection, this));
+
+    mDayLengthSlider = getChild<LLSliderCtrl>("day_length_sld");
+    mDayOffsetSlider = getChild<LLSliderCtrl>("day_offset_sld");
+    mAllowOverRide = getChild<LLCheckBoxCtrl>("allow_override_chk");
+
+    childSetCommitCallback("edit_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnEdit, this), NULL);
+    childSetCommitCallback("apply_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnApply, this), NULL);
+    childSetCommitCallback("cancel_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnCancel, this), NULL);
+
+    return TRUE;
+}
+
+// virtual
+void LLPanelEnvironmentInfo::onOpen(const LLSD& key)
+{
+    LL_DEBUGS("Windlight") << "Panel opened, refreshing" << LL_ENDL;
+    refresh();
+}
+
+// virtual
+void LLPanelEnvironmentInfo::onVisibilityChange(BOOL new_visibility)
+{
+    // If hiding (user switched to another tab or closed the floater),
+    // display user's preferred environment.
+    // switching back and forth between agent's environment and the one being edited. 
+    // 
+}
+
+void LLPanelEnvironmentInfo::refresh()
+{
+#if 0
+    if (gDisconnected)
+    {
+        return;
+    }
+
+    populateWaterPresetsList();
+    populateSkyPresetsList();
+    populateDayCyclesList();
+
+    // Init radio groups.
+    const LLEnvironmentSettings& settings = LLEnvManagerNew::instance().getRegionSettings();
+    const LLSD& dc = settings.getWLDayCycle();
+    LLSD::Real first_frame_time = dc.size() > 0 ? dc[0][0].asReal() : 0.0f;
+    const bool use_fixed_sky = dc.size() == 1 && first_frame_time < 0;
+    mRegionSettingsRadioGroup->setSelectedIndex(settings.getSkyMap().size() == 0 ? 0 : 1);
+    mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1);
+
+    setControlsEnabled(mEnableEditing);
+
+    setDirty(false);
+#endif
+}
+
+void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled)
+{
+    mRegionSettingsRadioGroup->setEnabled(enabled);
+
+    mDayLengthSlider->setEnabled(false);
+    mDayOffsetSlider->setEnabled(false);
+    mAllowOverRide->setEnabled(enabled);
+
+    getChildView("edit_btn")->setEnabled(false);
+
+    getChildView("apply_btn")->setEnabled(enabled);
+    getChildView("cancel_btn")->setEnabled(enabled);
+
+    if (enabled)
+    {
+        // Enable/disable some controls based on currently selected radio buttons.
+        bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+        getChild<LLView>("edit_btn")->setEnabled(!use_defaults);
+
+        mDayLengthSlider->setEnabled(!use_defaults);
+        mDayOffsetSlider->setEnabled(!use_defaults);
+
+    }
+}
+
+void LLPanelEnvironmentInfo::setApplyProgress(bool started)
+{
+//     LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator");
+// 
+//     indicator->setVisible(started);
+// 
+//     if (started)
+//     {
+//         indicator->start();
+//     }
+//     else
+//     {
+//         indicator->stop();
+//     }
+}
+
+void LLPanelEnvironmentInfo::setDirty(bool dirty)
+{
+    getChildView("apply_btn")->setEnabled(dirty);
+    getChildView("cancel_btn")->setEnabled(dirty);
+}
+
+// void LLPanelEnvironmentInfo::sendRegionSunUpdate()
+// {
+// #if 0
+//     LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
+// 
+//     // If the region is being switched to fixed sky,
+//     // change the region's sun hour according to the (fixed) sun position.
+//     // This is needed for llGetSunDirection() LSL function to work properly (STORM-1330).
+//     const LLSD& sky_map = mNewRegionSettings.getSkyMap();
+//     bool region_use_fixed_sky = sky_map.size() == 1;
+//     if (region_use_fixed_sky)
+//     {
+//         LLWLParamSet param_set;
+//         llassert(sky_map.isMap());
+//         param_set.setAll(sky_map.beginMap()->second);
+//         F32 sun_angle = param_set.getSunAngle();
+// 
+//         LL_DEBUGS("Windlight Sync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL;
+//         // convert value range from 0..2pi to 6..30
+//         region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f;
+//     }
+// 
+//     region_info.setUseFixedSun(region_use_fixed_sky);
+//     region_info.mUseEstateSun = !region_use_fixed_sky;
+//     LL_DEBUGS("Windlight Sync") << "Sun hour: " << region_info.mSunHour << LL_ENDL;
+// 
+//     region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice());
+// #endif
+// }
+
+// void LLPanelEnvironmentInfo::fixEstateSun()
+// {
+//     // We don't support fixed sun estates anymore and need to fix
+//     // such estates for region day cycle to take effect.
+//     // *NOTE: Assuming that current estate settings have arrived already.
+//     LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+//     if (estate_info.getUseFixedSun())
+//     {
+//         LL_INFOS() << "Switching estate to global sun" << LL_ENDL;
+//         estate_info.setUseFixedSun(false);
+//         estate_info.sendEstateInfo();
+//     }
+// }
+
+// void LLPanelEnvironmentInfo::populateWaterPresetsList()
+// {
+// #if 0
+//     mWaterPresetCombo->removeall();
+// 
+//     // If the region already has water params, add them to the list.
+//     const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings();
+//     if (region_settings.getWaterParams().size() != 0)
+//     {
+//         const std::string& region_name = gAgent.getRegion()->getName();
+//         mWaterPresetCombo->add(region_name, LLWLParamKey(region_name, LLEnvKey::SCOPE_REGION).toLLSD());
+//         mWaterPresetCombo->addSeparator();
+//     }
+// 
+//     std::list<std::string> user_presets, system_presets;
+//     LLWaterParamManager::instance().getPresetNames(user_presets, system_presets);
+// 
+//     // Add local user presets first.
+//     for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+//     {
+//         mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+//     }
+// 
+//     if (user_presets.size() > 0)
+//     {
+//         mWaterPresetCombo->addSeparator();
+//     }
+// 
+//     // Add local system presets.
+//     for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it)
+//     {
+//         mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+//     }
+// 
+//     // There's no way to select current preset because its name is not stored on server.
+// #endif
+// }
+// 
+// void LLPanelEnvironmentInfo::populateSkyPresetsList()
+// {
+// #if 0
+//     mSkyPresetCombo->removeall();
+// 
+//     LLWLParamManager::preset_name_list_t region_presets;
+//     LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+//     LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+// 
+//     // Add region presets.
+//     std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+//     for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+//     {
+//         std::string preset_name = *it;
+//         std::string item_title = preset_name + " (" + region_name + ")";
+//         mSkyPresetCombo->add(item_title, LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal());
+//     }
+// 
+//     if (!region_presets.empty())
+//     {
+//         mSkyPresetCombo->addSeparator();
+//     }
+// 
+//     // Add user presets.
+//     for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+//     {
+//         mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+//     }
+// 
+//     if (!user_presets.empty())
+//     {
+//         mSkyPresetCombo->addSeparator();
+//     }
+// 
+//     // Add system presets.
+//     for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+//     {
+//         mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+//     }
+// 
+//     // Select current preset.
+//     LLSD sky_map = LLEnvManagerNew::instance().getRegionSettings().getSkyMap();
+//     if (sky_map.size() == 1) // if the region is set to fixed sky
+//     {
+//         std::string preset_name = sky_map.beginMap()->first;
+//         mSkyPresetCombo->selectByValue(LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal());
+//     }
+// #endif
+// }
+// 
+// void LLPanelEnvironmentInfo::populateDayCyclesList()
+// {
+// #if 0
+//     mDayCyclePresetCombo->removeall();
+// 
+//     // If the region already has env. settings, add its day cycle to the list.
+//     const LLSD& cur_region_dc = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+//     if (cur_region_dc.size() != 0)
+//     {
+//         LLViewerRegion* region = gAgent.getRegion();
+//         llassert(region != NULL);
+// 
+//         LLWLParamKey key(region->getName(), LLEnvKey::SCOPE_REGION);
+//         mDayCyclePresetCombo->add(region->getName(), key.toStringVal());
+//         mDayCyclePresetCombo->addSeparator();
+//     }
+// 
+//     // Add local user day cycles.
+//     LLDayCycleManager::preset_name_list_t user_days, sys_days;
+//     LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+//     for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+//     {
+//         mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+//     }
+// 
+//     if (user_days.size() > 0)
+//     {
+//         mDayCyclePresetCombo->addSeparator();
+//     }
+// 
+//     // Add local system day cycles.
+//     for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+//     {
+//         mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+//     }
+// 
+//     // Current day cycle is already selected.
+// #endif
+// }
+
+void LLPanelEnvironmentInfo::onSwitchDefaultSelection()
+{
+    bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+    getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults);
+
+    setDirty(true);
+}
+
+
+void LLPanelEnvironmentInfo::onBtnApply()
+{
+    doApply();
+}
+
+void LLPanelEnvironmentInfo::doApply()
+{
+}
+
+void LLPanelEnvironmentInfo::onBtnCancel()
+{
+    // Reload last saved region settings.
+    refresh();
+}
+
+void LLPanelEnvironmentInfo::onBtnEdit()
+{
+}
+
+
+// void LLPanelEnvironmentInfo::onRegionSettingschange()
+// {
+//     LL_DEBUGS("Windlight") << "Region settings changed, refreshing" << LL_ENDL;
+//     refresh();
+// 
+//     // Stop applying progress indicator (it may be running if it's us who initiated settings update).
+//     setApplyProgress(false);
+// }
+// 
+// void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)
+// {
+//     // If applying new settings has failed, stop the indicator right away.
+//     // Otherwise it will be stopped when we receive the updated settings from server.
+//     if (ok)
+//     {
+//         // Set the region sun phase/flags according to the chosen new preferences.
+//         //
+//         // If we do this earlier we may get jerky transition from fixed sky to a day cycle (STORM-1481).
+//         // That is caused by the simulator re-sending the region info, which in turn makes us
+//         // re-request and display old region environment settings while the new ones haven't been applied yet.
+//         sendRegionSunUpdate();
+// 
+//         // Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506).
+//         fixEstateSun();
+//     }
+//     else
+//     {
+//         setApplyProgress(false);
+// 
+//         // We need to re-request environment setting here,
+//         // otherwise our subsequent attempts to change region settings will fail with the following error:
+//         // "Unable to update environment settings because the last update your viewer saw was not the same
+//         // as the last update sent from the simulator.  Try sending your update again, and if this
+//         // does not work, try leaving and returning to the region."
+//         //		LLEnvManagerNew::instance().requestRegionSettings();
+//     }
+// }
+
+
diff --git a/indra/newview/llpanelenvironment.h b/indra/newview/llpanelenvironment.h
new file mode 100644
index 0000000000000000000000000000000000000000..8b5238d3e2ac5ff40309140b9d2ba14afa7d9992
--- /dev/null
+++ b/indra/newview/llpanelenvironment.h
@@ -0,0 +1,80 @@
+/** 
+ * @file llpanelenvironment.h
+ * @brief LLPanelExperiences class definition
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELENVIRONMENT_H
+#define LL_LLPANELENVIRONMENT_H
+
+#include "llaccordionctrltab.h"
+#include "llradiogroup.h"
+#include "llcheckboxctrl.h"
+#include "llsliderctrl.h"
+#include "llsettingsdaycycle.h"
+
+class LLViewerRegion;
+
+class LLPanelEnvironmentInfo : public LLPanel
+{
+    LOG_CLASS(LLPanelEnvironmentInfo);
+
+public:
+    LLPanelEnvironmentInfo();
+
+    // LLPanel
+    /*virtual*/ BOOL postBuild();
+    /*virtual*/ void onOpen(const LLSD& key);
+
+    // LLView
+    /*virtual*/ void onVisibilityChange(BOOL new_visibility);
+
+
+    virtual void refresh();
+
+protected:
+    void setControlsEnabled(bool enabled);
+    void setApplyProgress(bool started);
+    void setDirty(bool dirty);
+
+    void onSwitchDefaultSelection();
+
+    void onBtnApply();
+    void onBtnCancel();
+    void onBtnEdit();
+
+    virtual void doApply(); // = 0;
+
+    /// New environment settings that are being applied to the region.
+    //	LLEnvironmentSettings	mNewRegionSettings;
+
+    bool			mEnableEditing;
+
+    LLRadioGroup*	mRegionSettingsRadioGroup;
+    LLSliderCtrl*   mDayLengthSlider;
+    LLSliderCtrl*   mDayOffsetSlider;
+    LLCheckBoxCtrl* mAllowOverRide;
+
+    LLSettingsDay::ptr_t mEditingDayCycle;
+};
+#endif // LL_LLPANELEXPERIENCES_H
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index c0fed2fff5732369dd7cda8b89a6f10283007db6..e133ef22a1be08662a15f5f94b5d6b91caee0311 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -58,6 +58,7 @@
 #include "llfloaterdeleteprefpreset.h"
 #include "llfloaterdestinations.h"
 #include "llfloatereditdaycycle.h"
+#include "llfloatereditextdaycycle.h"
 #include "llfloatereditsky.h"
 #include "llfloatereditwater.h"
 #include "llfloaterenvironmentsettings.h"
@@ -225,6 +226,9 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("env_edit_water", "floater_edit_water_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditWater>);
 	LLFloaterReg::add("env_edit_day_cycle", "floater_edit_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditDayCycle>);
 
+    LLFloaterReg::add("env_edit_extdaycycle", "floater_edit_ext_daycycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditExtDayCycle>);
+
+
     LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
     LLFloaterReg::add("experiences", "floater_experiences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiences>);
 	LLFloaterReg::add("experience_profile", "floater_experienceprofile.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperienceProfile>);
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
new file mode 100644
index 0000000000000000000000000000000000000000..d9a3ad0c4b1af36f4ed671aee5ca02d0fb7e24a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="381"
+ layout="topleft"
+ name="Edit Day cycle"
+ help_topic="day_presets"
+ save_rect="true"
+ title="Edit Day Cycle"
+ width="705">
+
+    <string name="title_new">Create a New Day Cycle</string>
+    <string name="title_edit">Edit Day Cycle</string>
+    <string name="hint_new">Name your day cycle, adjust the controls to create it, and click "Save".</string>
+    <string name="hint_edit">To edit your day cycle, adjust the controls below and click "Save".</string>
+    <string name="combo_label">-Select a preset-</string>
+
+    <text
+     follows="top|left|right"
+     height="10"
+     layout="topleft"
+     left="10"
+     name="hint"
+     top="25"
+     width="685" />
+    <text
+     follows="top|left|right"
+     font="SansSerif"
+     height="10"
+     layout="topleft"
+     left="10"
+     name="label"
+     top_pad="25"
+     width="120">
+     Preset Name:
+    </text>
+    <combo_box
+     allow_text_entry="true"
+     follows="top|left"
+     layout="topleft"
+     left_pad="10"
+     max_chars="100"
+     name="day_cycle_combo"
+     top_delta="-5"
+     width="200" />
+    <line_editor
+     height="20"
+     left_delta="0"
+     name="day_cycle_name"
+     top_delta="0"
+     visible="true"
+     width="200" />
+    <text
+     follows="top|left|right"
+     height="95"
+     layout="topleft"
+     left_pad="10"
+     name="note"
+     top_delta="0"
+     width="345"
+     wrap="true">
+     Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed.
+    </text>
+ <!--======== Controls panel ========-->
+    <text
+     follows="left|top|right"
+     height="10"
+     layout="topleft"
+     left="10"    
+     name="hint_item1"
+     top="100"
+     width="300">
+     - Click on a tab to edit the specific sky settings and time.
+    </text>
+    <text
+     follows="left|top|right"
+     height="10"
+     layout="topleft"    
+     name="hint_item2"
+     top_pad="10"
+     width="300">
+     - Click and drag the tabs to set the transition times.
+    </text>
+    <text
+     follows="left|top|right"
+     height="10"
+     layout="topleft"
+     name="hint_item3"
+     top_pad="10"
+     width="300">
+     - Use the scrubber to preview your day cycle.
+    </text>
+    <panel
+     follows="top|left"
+     height="100"
+     name="day_cycle_slider_panel"
+     layout="topleft"
+     left_delta="25"
+     top_pad="15"
+     width="660">
+        <multi_slider
+         can_edit_text="true"
+         control_name="WLTimeSlider"
+         decimal_digits="0"
+         draw_track="false"
+         follows="bottom"
+         height="10"
+         increment="0.0833333"
+         initial_value="0"
+         layout="topleft"
+         left="20"
+         max_sliders="20"
+         max_val="24"
+         name="WLTimeSlider"
+         show_text="false"
+         top_pad="0"
+         use_triangle="true"
+         width="525" />
+        <multi_slider
+         can_edit_text="true"
+         control_name="WLDayCycleKeys"
+         decimal_digits="0"
+         follows="bottom"
+         height="10"
+         increment="0.0833333"
+         initial_value="0"
+         layout="topleft"
+         left_delta="0"
+         max_sliders="20"
+         max_val="24"
+         name="WLDayCycleKeys"
+         show_text="false"
+         top_pad="15"
+         width="525" />
+        <button
+         height="20"
+         label="Add Key"
+         label_selected="Add Key"
+         layout="topleft"
+         left_pad="20"
+         name="WLAddKey"
+         top_delta="-18"
+         width="96" />
+        <button
+         height="20"
+         label="Delete Key"
+         label_selected="Delete Key"
+         layout="topleft"
+         name="WLDeleteKey"
+         top_pad="5"
+         width="96" />
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left="8"
+         name="WL12am"
+         top="74"
+         width="55">
+         12am
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL3am"
+         top_delta="0"
+         width="55">
+            3am
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL6am"
+         top_delta="0"
+         width="55">
+            6am
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL9amHash"
+         top_delta="0"
+         width="55">
+            9am
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL12pmHash"
+         top_delta="0"
+         width="55">
+            12pm
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL3pm"
+         top_delta="0"
+         width="55">
+            3pm
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL6pm"
+         top_delta="0"
+         width="55">
+            6pm
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL9pm"
+         top_delta="0"
+         width="55">
+            9pm
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         height="16"
+         layout="topleft"
+         left_pad="10"
+         name="WL12am2"
+         top_delta="0"
+         width="55">
+            12am
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="14"
+         layout="topleft"
+         left="20"
+         name="WL12amHash"
+         top="54"
+         width="6">
+            |
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="11"
+         layout="topleft"
+         left_pad="59"
+         name="WL3amHash"
+         top_delta="3"
+         width="6">
+            I
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="14"
+         layout="topleft"
+         left_pad="59"
+         name="WL6amHash"
+         top_delta="-3"
+         width="6">
+            |
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="11"
+         layout="topleft"
+         left_pad="59"
+         name="WL9amHash2"
+         top_delta="3"
+         width="6">
+            I
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="14"
+         layout="topleft"
+         left_pad="59"
+         name="WL12pmHash2"
+         top_delta="-3"
+         width="6">
+            |
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="11"
+         layout="topleft"
+         left_pad="59"
+         name="WL3pmHash"
+         top_delta="3"
+         width="6">
+            I
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="14"
+         layout="topleft"
+         left_pad="59"
+         name="WL6pmHash"
+         top_delta="-3"
+         width="6">
+            |
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="11"
+         layout="topleft"
+         left_pad="59"
+         name="WL9pmHash"
+         top_delta="3"
+         width="6">
+            I
+        </text>
+        <text
+         type="string"
+         length="1"
+         border_visible="true"
+         follows="left|top|right"
+         font="SansSerif"
+         height="14"
+         layout="topleft"
+         left_pad="59"
+         name="WL12amHash2"
+         top_delta="-3"
+         width="6">
+         |
+        </text>
+    </panel>
+    <text
+     type="string"
+     length="1"
+     border_visible="true"
+     follows="left|top|right"
+     font="SansSerif"
+     height="16"
+     layout="topleft"
+     left_delta="192"
+     name="WLCurKeyPresetText"
+     top_pad="10"
+     width="80">
+        Sky Setting:
+    </text>
+    <combo_box
+     height="18"
+     label="Preset"
+     layout="topleft"
+     left_pad="5"
+     name="WLSkyPresets"
+     width="205" />
+        <text
+     type="string"
+     length="1"
+     border_visible="true"
+     follows="left|top|right"
+     font="SansSerif"
+     height="16"
+     layout="topleft"
+     left_delta="-40"
+     name="WLCurKeyTimeText"
+     top_pad="15"
+     width="35">
+        Time:
+    </text>
+    <time
+     follows="left|top"
+     height="16"
+     label_width="0"
+     layout="topleft"
+     left_pad="3"
+     name="time"
+     top_delta="-1"
+     value="6:00 AM"
+     width="75"/> 
+    <view_border
+     bevel_style="none"
+     follows="top|left"
+     height="0"
+     layout="topleft"
+     left="10"
+     name="horiz_separator"
+     top_pad="20"
+     width="685"/>
+    <loading_indicator
+     height="23"
+     layout="topleft"
+     left="25"
+     name="progress_indicator"
+     top="350"
+     visible="false"
+     width="23" />
+    <check_box
+     follows="top|left"
+     height="10"
+     label="Make this my new day cycle"
+     layout="topleft"
+     left="310"
+     name="make_default_cb"
+     top_delta="13"
+     width="230"/>
+    <button
+     follows="bottom|right"
+     height="23"
+     label="Save"
+     layout="topleft"
+     left_pad="0"
+     name="save"
+     top_delta="-13"
+     width="70"/>
+    <button
+     follows="bottom|right"
+     height="23"
+     label="Cancel"
+     layout="topleft"
+     left_pad="15"
+     name="cancel"
+     top_delta="0"
+     width="70"/>
+ </floater>