diff --git a/indra/llinventory/llsettingsbase.h b/indra/llinventory/llsettingsbase.h
index 9e030528926825dba459f060e44add5a2a8b422c..45d2fa002743fb70eddfe5961ce7e08e8b2f251a 100644
--- a/indra/llinventory/llsettingsbase.h
+++ b/indra/llinventory/llsettingsbase.h
@@ -519,6 +519,7 @@ class LLSettingsBlenderTimeDelta : public LLSettingsBlender
     inline void setIgnoreTimeDeltaThreshold(bool val) { mIgnoreTimeDelta = val; }
     inline bool getIgnoreTimeDeltaThreshold() const { return mIgnoreTimeDelta; }
 
+    inline void setTimeSpent(LLSettingsBase::Seconds time) { mTimeSpent = time; }
 protected:
     LLSettingsBase::BlendFactor calculateBlend(const LLSettingsBase::TrackPosition& spanpos, const LLSettingsBase::TrackPosition& spanlen) const;
 
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index bf8cf4b552b96a9a12f143e29d3107ab24ef237b..fa583bdc9c893097bc0c34975884210811730335 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -170,6 +170,20 @@ namespace
         return llclamp(position, 0.0f, 1.0f);
     }
 
+    inline LLSettingsBase::BlendFactor convert_time_to_blend_factor(const LLSettingsBase::Seconds& time, const LLSettingsBase::Seconds& len, LLSettingsDay::CycleTrack_t &track)
+    {
+        LLSettingsBase::TrackPosition position = convert_time_to_position(time, len);
+        LLSettingsDay::TrackBound_t bounds(get_bounding_entries(track, position));
+
+        LLSettingsBase::TrackPosition spanlength(get_wrapping_distance((*bounds.first).first, (*bounds.second).first));
+        if (position < (*bounds.first).first)
+            position += 1.0;
+
+        LLSettingsBase::TrackPosition start = position - (*bounds.first).first;
+
+        return static_cast<LLSettingsBase::BlendFactor>(start / spanlength);
+    }
+
     //---------------------------------------------------------------------
     class LLTrackBlenderLoopingTime : public LLSettingsBlenderTimeDelta
     {
@@ -186,12 +200,14 @@ namespace
             // must happen prior to getBoundingEntries call...
             mTrackNo = selectTrackNumber(trackno);
 
-            LLSettingsDay::TrackBound_t initial = getBoundingEntries(getAdjustedNow());
+            LLSettingsBase::Seconds now(getAdjustedNow());
+            LLSettingsDay::TrackBound_t initial = getBoundingEntries(now);
 
             mInitial = (*initial.first).second;
             mFinal = (*initial.second).second;
             mBlendSpan = getSpanTime(initial);
 
+            initializeTarget(now);
             setOnFinished([this](const LLSettingsBlender::ptr_t &){ onFinishedSpan(); });
         }
 
@@ -248,6 +264,16 @@ namespace
             return bounds;
         }
 
+        void initializeTarget(LLSettingsBase::Seconds time)
+        {
+            LLSettingsBase::BlendFactor blendf(convert_time_to_blend_factor(time, mCycleLength, mDay->getCycleTrack(mTrackNo)));
+
+            blendf = llclamp(blendf, 0.0, 0.999);
+            setTimeSpent(LLSettingsBase::Seconds(blendf * mBlendSpan));
+
+            setBlendFactor(blendf);
+        }
+
         LLSettingsBase::Seconds getAdjustedNow() const
         {
             LLSettingsBase::Seconds now(LLDate::now().secondsSinceEpoch());