diff --git a/modules/gui/macosx/views/VLCTimeField.h b/modules/gui/macosx/views/VLCTimeField.h
index 7b4b37464b7bf5539fed35e074e2e47e30df81c9..6236197ab7869bc2630103b96aed3274818e2dbc 100644
--- a/modules/gui/macosx/views/VLCTimeField.h
+++ b/modules/gui/macosx/views/VLCTimeField.h
@@ -2,6 +2,7 @@
  * VLCTimeField.h: NSTextField subclass for playback time fields
  *****************************************************************************
  * Copyright (C) 2003-2017 VLC authors and VideoLAN
+ * $Id$
  *
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
  *          Felix Paul Kühne <fkuehne at videolan dot org>
@@ -34,8 +35,7 @@ extern NSString *VLCTimeFieldDisplayTimeAsRemaining;
 
 @interface VLCTimeField : NSTextField
 
-@property (readonly) BOOL timeRemaining;
-
-- (void)setRemainingIdentifier:(NSString *)o_string;
+- (void)setRemainingIdentifier:(NSString *)identifier;
+- (void)setTime:(NSString *)time withRemainingTime:(NSString *)remainingTime;
 
 @end
diff --git a/modules/gui/macosx/views/VLCTimeField.m b/modules/gui/macosx/views/VLCTimeField.m
index 578cb9b6f7315a746a5ef118d609dd75aaa6e66e..fccd62ddccb9ecfcc962c0abc59f5baafa763c33 100644
--- a/modules/gui/macosx/views/VLCTimeField.m
+++ b/modules/gui/macosx/views/VLCTimeField.m
@@ -2,6 +2,7 @@
  * VLCTimeField.m: NSTextField subclass for playback time fields
  *****************************************************************************
  * Copyright (C) 2003-2017 VLC authors and VideoLAN
+ * $Id$
  *
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
  *          Felix Paul Kühne <fkuehne at videolan dot org>
@@ -31,8 +32,11 @@ NSString *VLCTimeFieldDisplayTimeAsRemaining = @"DisplayTimeAsTimeRemaining";
 
 @interface VLCTimeField ()
 {
-    NSString *o_remaining_identifier;
-    BOOL b_time_remaining;
+    NSString *_identifier;
+    BOOL _isTimeRemaining;
+
+    NSString *_cachedTime;
+    NSString *_remainingTime;
 }
 @end
 
@@ -48,10 +52,10 @@ NSString *VLCTimeFieldDisplayTimeAsRemaining = @"DisplayTimeAsTimeRemaining";
 }
 
 
-- (void)setRemainingIdentifier:(NSString *)o_string
+- (void)setRemainingIdentifier:(NSString *)identifier
 {
-    o_remaining_identifier = o_string;
-    b_time_remaining = [[NSUserDefaults standardUserDefaults] boolForKey:o_remaining_identifier];
+    _identifier = identifier;
+    _isTimeRemaining = [[NSUserDefaults standardUserDefaults] boolForKey:_identifier];
 }
 
 - (void)mouseDown: (NSEvent *)ourEvent
@@ -60,24 +64,54 @@ NSString *VLCTimeFieldDisplayTimeAsRemaining = @"DisplayTimeAsTimeRemaining";
         [[[VLCMain sharedInstance] mainMenu] goToSpecificTime: nil];
     else
     {
-        if (o_remaining_identifier) {
-            b_time_remaining = [[NSUserDefaults standardUserDefaults] boolForKey:o_remaining_identifier];
-            b_time_remaining = !b_time_remaining;
-            [[NSUserDefaults standardUserDefaults] setObject:(b_time_remaining ? @"YES" : @"NO") forKey:o_remaining_identifier];
+        if (_identifier) {
+            _isTimeRemaining = [[NSUserDefaults standardUserDefaults] boolForKey:_identifier];
+            _isTimeRemaining = !_isTimeRemaining;
+            [[NSUserDefaults standardUserDefaults] setObject:(_isTimeRemaining ? @"YES" : @"NO") forKey:_identifier];
         } else {
-            b_time_remaining = !b_time_remaining;
+            _isTimeRemaining = !_isTimeRemaining;
         }
+
+        [self updateTimeValue];
     }
 
     [[self nextResponder] mouseDown:ourEvent];
 }
 
+- (void)setTime:(NSString *)time withRemainingTime:(NSString *)remainingTime
+{
+    _cachedTime = time;
+    _remainingTime = remainingTime;
+
+    [self updateTimeValue];
+}
+
+- (void)updateTimeValue
+{
+    if (!_cachedTime || !_remainingTime)
+        return;
+
+    if ([self timeRemaining]) {
+        [super setStringValue:_remainingTime];
+    } else {
+        [super setStringValue:_cachedTime];
+    }
+}
+
+- (void)setStringValue:(NSString *)stringValue
+{
+    [super setStringValue:stringValue];
+
+    _cachedTime = nil;
+    _remainingTime = nil;
+}
+
 - (BOOL)timeRemaining
 {
-    if (o_remaining_identifier)
-        return [[NSUserDefaults standardUserDefaults] boolForKey:o_remaining_identifier];
+    if (_identifier)
+        return [[NSUserDefaults standardUserDefaults] boolForKey:_identifier];
     else
-        return b_time_remaining;
+        return _isTimeRemaining;
 }
 
 @end
diff --git a/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m b/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m
index bd2c1fa2ccc937299385c91e8d4c0741423c2310..997ba860d2719a5a4ca0dc4b8ccf93953ef2bcd4 100644
--- a/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m
+++ b/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m
@@ -295,10 +295,13 @@
         [self.timeSlider setEnabled:_playerController.seekable];
     }
 
-    NSString *time = [NSString stringWithDuration:duration
-                                      currentTime:_playerController.time
-                                         negative:self.timeField.timeRemaining];
-    [self.timeField setStringValue:time];
+    NSString *timeString = [NSString stringWithDuration:duration
+                                            currentTime:_playerController.time
+                                               negative:NO];
+    NSString *remainingTime = [NSString stringWithDuration:duration
+                                               currentTime:_playerController.time
+                                                  negative:YES];
+    [self.timeField setTime:timeString withRemainingTime:remainingTime];
     [self.timeField setNeedsDisplay:YES];
 }
 
diff --git a/modules/gui/macosx/windows/video/VLCFSPanelController.m b/modules/gui/macosx/windows/video/VLCFSPanelController.m
index 96bf8c8f3ed587c6bb295966f17bb113cfa974c8..3e32c679fed3f63fbb3d413082d4baeafb489cc0 100644
--- a/modules/gui/macosx/windows/video/VLCFSPanelController.m
+++ b/modules/gui/macosx/windows/video/VLCFSPanelController.m
@@ -335,8 +335,11 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect
     /* Update total duration (right field) */
     NSString *timeString = [NSString stringWithDuration:duration
                                             currentTime:time
-                                               negative:_remainingOrTotalTime.timeRemaining];
-    [_remainingOrTotalTime setStringValue:timeString];
+                                               negative:NO];
+    NSString *remainingTime = [NSString stringWithDuration:duration
+                                            currentTime:time
+                                               negative:YES];
+    [_remainingOrTotalTime setTime:timeString withRemainingTime:remainingTime];
     [_remainingOrTotalTime setNeedsDisplay:YES];
     [_remainingOrTotalTime setHidden:duration <= 0];