diff --git a/indra/llui/llvirtualtrackball.cpp b/indra/llui/llvirtualtrackball.cpp
index 15847a728244d6cf13e321e7502f0d96f34a1505..728e86af08f6e5b0f68d15815d5466b9897a19be 100644
--- a/indra/llui/llvirtualtrackball.cpp
+++ b/indra/llui/llvirtualtrackball.cpp
@@ -352,7 +352,6 @@ LLQuaternion LLVirtualTrackball::getRotation() const
 void LLVirtualTrackball::getAzimuthAndElevation(const LLQuaternion &quat, F32 &azimuth, F32 &elevation)
 {
     // LLQuaternion has own function to get azimuth, but it doesn't appear to return correct values (meant for 2d?)
-    const LLVector3 VectorZero(10000.0f, 0.0f, 0.0f);
     LLVector3 point = VectorZero * quat;
 
     if (!is_approx_zero(point.mV[VX]) || !is_approx_zero(point.mV[VY]))
@@ -371,19 +370,7 @@ void LLVirtualTrackball::getAzimuthAndElevation(const LLQuaternion &quat, F32 &a
         azimuth += F_PI * 2;
     }
 
-    if (abs(point.mV[VY]) > abs(point.mV[VX]) && !is_approx_zero(point.mV[VY])) // to avoid precision drop
-    {
-        elevation = atanl((F64)point.mV[VZ] / (F64)abs(point.mV[VY]));
-    }
-    else if (!is_approx_zero(point.mV[VX]))
-    {
-        elevation = atanl((F64)point.mV[VZ] / (F64)abs(point.mV[VX]));
-    }
-    else
-    {
-        // both VX and VY are near zero, VZ should be high
-        elevation = point.mV[VZ] > 0 ? F_PI_BY_TWO : -F_PI_BY_TWO;
-    }
+    elevation = asin(point.mV[VZ]); // because VectorZero is '1'
 }
 
 // static
diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp
index 4eb5e03603513202e1005a318ee29188329c66eb..95d6a2d65299a2623e2451739818cc83ae58d486 100644
--- a/indra/newview/llfloaterenvironmentadjust.cpp
+++ b/indra/newview/llfloaterenvironmentadjust.cpp
@@ -53,11 +53,15 @@ namespace
     const std::string FIELD_SKY_CLOUD_SCALE("cloud_scale");
     const std::string FIELD_SKY_SCENE_GAMMA("scene_gamma");
     const std::string FIELD_SKY_SUN_ROTATION("sun_rotation");
+    const std::string FIELD_SKY_SUN_AZIMUTH("sun_azimuth");
+    const std::string FIELD_SKY_SUN_ELEVATION("sun_elevation");
     const std::string FIELD_SKY_SUN_SCALE("sun_scale");
     const std::string FIELD_SKY_GLOW_FOCUS("glow_focus");
     const std::string FIELD_SKY_GLOW_SIZE("glow_size");
     const std::string FIELD_SKY_STAR_BRIGHTNESS("star_brightness");
     const std::string FIELD_SKY_MOON_ROTATION("moon_rotation");
+    const std::string FIELD_SKY_MOON_AZIMUTH("moon_azimuth");
+    const std::string FIELD_SKY_MOON_ELEVATION("moon_elevation");
     const std::string BTN_RESET("btn_reset");
 
     const F32 SLIDER_SCALE_SUN_AMBIENT(3.0f);
@@ -96,9 +100,13 @@ BOOL LLFloaterEnvironmentAdjust::postBuild()
     getChild<LLUICtrl>(FIELD_SKY_GLOW_SIZE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onGlowChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_STAR_BRIGHTNESS)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onStarBrightnessChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_SUN_ROTATION)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onSunRotationChanged(); });
+    getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onSunAzimElevChanged(); });
+    getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onSunAzimElevChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_SUN_SCALE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onSunScaleChanged(); });
 
     getChild<LLUICtrl>(FIELD_SKY_MOON_ROTATION)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoonRotationChanged(); });
+    getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoonAzimElevChanged(); });
+    getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoonAzimElevChanged(); });
     getChild<LLUICtrl>(BTN_RESET)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onButtonReset(); });
 
     getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudMapChanged(); });
@@ -169,10 +177,25 @@ void LLFloaterEnvironmentAdjust::refresh()
     getChild<LLUICtrl>(FIELD_SKY_GLOW_SIZE)->setValue(2.0 - (glow.mV[0] / SLIDER_SCALE_GLOW_R));
     getChild<LLUICtrl>(FIELD_SKY_GLOW_FOCUS)->setValue(glow.mV[2] / SLIDER_SCALE_GLOW_B);
     getChild<LLUICtrl>(FIELD_SKY_STAR_BRIGHTNESS)->setValue(mLiveSky->getStarBrightness());
-    getChild<LLVirtualTrackball>(FIELD_SKY_SUN_ROTATION)->setRotation(mLiveSky->getSunRotation());
     getChild<LLUICtrl>(FIELD_SKY_SUN_SCALE)->setValue(mLiveSky->getSunScale());
-    getChild<LLVirtualTrackball>(FIELD_SKY_MOON_ROTATION)->setRotation(mLiveSky->getMoonRotation());
 
+    // Sun rotation
+    LLQuaternion quat = mLiveSky->getSunRotation();
+    F32 azimuth;
+    F32 elevation;
+    LLVirtualTrackball::getAzimuthAndElevationDeg(quat, azimuth, elevation);
+
+    getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->setValue(azimuth);
+    getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->setValue(elevation);
+    getChild<LLVirtualTrackball>(FIELD_SKY_SUN_ROTATION)->setRotation(quat);
+
+    // Moon rotation
+    quat = mLiveSky->getMoonRotation();
+    LLVirtualTrackball::getAzimuthAndElevationDeg(quat, azimuth, elevation);
+
+    getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->setValue(azimuth);
+    getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->setValue(elevation);
+    getChild<LLVirtualTrackball>(FIELD_SKY_MOON_ROTATION)->setRotation(quat);
 }
 
 
@@ -325,10 +348,45 @@ void LLFloaterEnvironmentAdjust::onStarBrightnessChanged()
 
 void LLFloaterEnvironmentAdjust::onSunRotationChanged()
 {
-    if (!mLiveSky)
-        return;
-    mLiveSky->setSunRotation(getChild<LLVirtualTrackball>(FIELD_SKY_SUN_ROTATION)->getRotation());
-    mLiveSky->update();
+    LLQuaternion quat = getChild<LLVirtualTrackball>(FIELD_SKY_SUN_ROTATION)->getRotation();
+    F32 azimuth;
+    F32 elevation;
+    LLVirtualTrackball::getAzimuthAndElevationDeg(quat, azimuth, elevation);
+    getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->setValue(azimuth);
+    getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->setValue(elevation);
+    if (mLiveSky)
+    {
+        mLiveSky->setSunRotation(quat);
+        mLiveSky->update();
+    }
+}
+
+void LLFloaterEnvironmentAdjust::onSunAzimElevChanged()
+{
+    F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->getValue().asReal();
+    F32 elevation = getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->getValue().asReal();
+    LLQuaternion quat;
+
+    azimuth *= DEG_TO_RAD;
+    elevation *= DEG_TO_RAD;
+
+    if (is_approx_zero(elevation))
+    {
+        elevation = F_APPROXIMATELY_ZERO;
+    }
+
+    quat.setAngleAxis(-elevation, 0, 1, 0);
+    LLQuaternion az_quat;
+    az_quat.setAngleAxis(F_TWO_PI - azimuth, 0, 0, 1);
+    quat *= az_quat;
+
+    getChild<LLVirtualTrackball>(FIELD_SKY_SUN_ROTATION)->setRotation(quat);
+
+    if (mLiveSky)
+    {
+        mLiveSky->setSunRotation(quat);
+        mLiveSky->update();
+    }
 }
 
 void LLFloaterEnvironmentAdjust::onSunScaleChanged()
@@ -341,10 +399,45 @@ void LLFloaterEnvironmentAdjust::onSunScaleChanged()
 
 void LLFloaterEnvironmentAdjust::onMoonRotationChanged()
 {
-    if (!mLiveSky)
-        return;
-    mLiveSky->setMoonRotation(getChild<LLVirtualTrackball>(FIELD_SKY_MOON_ROTATION)->getRotation());
-    mLiveSky->update();
+    LLQuaternion quat = getChild<LLVirtualTrackball>(FIELD_SKY_MOON_ROTATION)->getRotation();
+    F32 azimuth;
+    F32 elevation;
+    LLVirtualTrackball::getAzimuthAndElevationDeg(quat, azimuth, elevation);
+    getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->setValue(azimuth);
+    getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->setValue(elevation);
+    if (mLiveSky)
+    {
+        mLiveSky->setMoonRotation(quat);
+        mLiveSky->update();
+    }
+}
+
+void LLFloaterEnvironmentAdjust::onMoonAzimElevChanged()
+{
+    F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->getValue().asReal();
+    F32 elevation = getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->getValue().asReal();
+    LLQuaternion quat;
+
+    azimuth *= DEG_TO_RAD;
+    elevation *= DEG_TO_RAD;
+
+    if (is_approx_zero(elevation))
+    {
+        elevation = F_APPROXIMATELY_ZERO;
+    }
+
+    quat.setAngleAxis(-elevation, 0, 1, 0);
+    LLQuaternion az_quat;
+    az_quat.setAngleAxis(F_TWO_PI - azimuth, 0, 0, 1);
+    quat *= az_quat;
+
+    getChild<LLVirtualTrackball>(FIELD_SKY_MOON_ROTATION)->setRotation(quat);
+
+    if (mLiveSky)
+    {
+        mLiveSky->setMoonRotation(quat);
+        mLiveSky->update();
+    }
 }
 
 void LLFloaterEnvironmentAdjust::onCloudMapChanged()
diff --git a/indra/newview/llfloaterenvironmentadjust.h b/indra/newview/llfloaterenvironmentadjust.h
index cb38dbcfa80e3362e4b754b38669be734d0e6696..05ff011be5d14400c30d6a2306fe4ccb37640fc9 100644
--- a/indra/newview/llfloaterenvironmentadjust.h
+++ b/indra/newview/llfloaterenvironmentadjust.h
@@ -73,9 +73,11 @@ class LLFloaterEnvironmentAdjust : public LLFloater
     void                        onGlowChanged();
     void                        onStarBrightnessChanged();
     void                        onSunRotationChanged();
+    void                        onSunAzimElevChanged();
     void                        onSunScaleChanged();
 
     void                        onMoonRotationChanged();
+    void                        onMoonAzimElevChanged();
 
     void                        onCloudMapChanged();
     void                        onWaterMapChanged();
diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp
index 06e406e2ab46f2a67de81d0d25c2c434484e6a4d..a169712bd885804a03d1240ec1d81e38268f2dc9 100644
--- a/indra/newview/llpaneleditsky.cpp
+++ b/indra/newview/llpaneleditsky.cpp
@@ -625,7 +625,7 @@ void LLPanelSettingsSkySunMoonTab::onSunAzimElevChanged()
 {
     F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_SUN_AZIMUTH)->getValue().asReal();
     F32 elevation = getChild<LLUICtrl>(FIELD_SKY_SUN_ELEVATION)->getValue().asReal();
-    LLQuaternion quat = mSkySettings->getSunRotation();
+    LLQuaternion quat;
 
     azimuth *= DEG_TO_RAD;
     elevation *= DEG_TO_RAD;
@@ -687,7 +687,7 @@ void LLPanelSettingsSkySunMoonTab::onMoonAzimElevChanged()
 {
     F32 azimuth = getChild<LLUICtrl>(FIELD_SKY_MOON_AZIMUTH)->getValue().asReal();
     F32 elevation = getChild<LLUICtrl>(FIELD_SKY_MOON_ELEVATION)->getValue().asReal();
-    LLQuaternion quat = mSkySettings->getMoonRotation();
+    LLQuaternion quat;
 
     azimuth *= DEG_TO_RAD;
     elevation *= DEG_TO_RAD;
diff --git a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
index 59589e3665e10cfa54a0f5cac7048e6a6a6ae8fe..f4a686bae1406c41625402d915b80dd8f25c4dd0 100644
--- a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
+++ b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
@@ -5,14 +5,14 @@
          save_rect="false"
          title="Personal Lighting"
          width="845"
-         height="240"
+         height="280"
          min_width="500"
-         min_height="235"
+         min_height="275"
          single_instance="true"
          can_resize="false">
     <layout_stack name="outer_stack"
                   width="845"
-                  height="230"
+                  height="275"
                   follows="all"
                   animate="false"
                   top="0"
@@ -276,19 +276,57 @@
                                         height="150"
                                         width="150"
                                         thumb_mode="sun"/>
+                  <text follows="left|top"
+                        height="10"
+                        layout="topleft"
+                        left_delta="0"
+                        top_pad="5"
+                        width="200">Azimuth:</text>
+                  <slider decimal_digits="2"
+                          follows="left|top"
+                          height="16"
+                          increment="0.01"
+                          initial_value="0"
+                          layout="topleft"
+                          left_delta="5"
+                          min_val="0"
+                          max_val="359.99"
+                          name="sun_azimuth"
+                          top_pad="5"
+                          width="130"
+                          can_edit_text="true"/>
+                  <text follows="left|top"
+                        height="10"
+                        layout="topleft"
+                        left_delta="-5"
+                        top_pad="5"
+                        width="200">Elevation:</text>
+                  <slider decimal_digits="2"
+                          follows="left|top"
+                          height="16"
+                          increment="0.01"
+                          initial_value="0"
+                          layout="topleft"
+                          left_delta="5"
+                          min_val="-90"
+                          max_val="90"
+                          name="sun_elevation"
+                          top_pad="5"
+                          width="130"
+                          can_edit_text="true"/>
                     <check_box control_name="sunbeacon"
                                width="60"
                                height="16"
                                label="Show Beacon"
                                layout="topleft"
                                name="sunbeacon"
-                               left_delta="55"
-                               bottom="-20"
-                               follows="bottom|right"/>
+                               left_delta="-5"
+                               top_pad="8"
+                               follows="left|top"/>
                     <text follows="left|top"
                           height="10"
                           layout="topleft"
-                          left_pad="40"
+                          left_pad="95"
                           top="25"
                           width="80">Scale:</text>
                     <slider decimal_digits="2"
@@ -385,15 +423,53 @@
                                         height="150"
                                         width="150"
                                         thumb_mode="moon"/>
+                  <text follows="left|top"
+                        height="10"
+                        layout="topleft"
+                        left_delta="0"
+                        top_pad="5"
+                        width="200">Azimuth:</text>
+                  <slider decimal_digits="2"
+                          follows="left|top"
+                          height="16"
+                          increment="0.01"
+                          initial_value="0"
+                          layout="topleft"
+                          left_delta="5"
+                          min_val="0"
+                          max_val="359.99"
+                          name="moon_azimuth"
+                          top_pad="5"
+                          width="130"
+                          can_edit_text="true"/>
+                  <text follows="left|top"
+                        height="10"
+                        layout="topleft"
+                        left_delta="-5"
+                        top_pad="5"
+                        width="200">Elevation:</text>
+                  <slider decimal_digits="2"
+                          follows="left|top"
+                          height="16"
+                          increment="0.01"
+                          initial_value="0"
+                          layout="topleft"
+                          left_delta="5"
+                          min_val="-90"
+                          max_val="90"
+                          name="moon_elevation"
+                          top_pad="5"
+                          width="130"
+                          can_edit_text="true"/>
                     <check_box control_name="moonbeacon"
+                               follows="left|top"
                                width="60"
                                height="16"
                                label="Show Beacon"
                                layout="topleft"
                                name="moonbeacon"
-                               right="-50"
-                               bottom="-20"
-                               follows="bottom|right"/>
+                               left_delta="0"
+                               top_pad="8"/>
                 </layout_panel>
             </layout_stack>
         </layout_panel>