diff --git a/ATxCommon/Serializables/ServiceStatus.cs b/ATxCommon/Serializables/ServiceStatus.cs
index 3d5f9c118eae2b3d52a1780c64c054ea5f770598..66e8b8c43d9a5e54dc11ce347796b29504c1c0ab 100644
--- a/ATxCommon/Serializables/ServiceStatus.cs
+++ b/ATxCommon/Serializables/ServiceStatus.cs
@@ -29,6 +29,8 @@ namespace ATxCommon.Serializables
         private bool _cleanShutdown;
 
         private long _currentTransferSize;
+        private long _transferredBytesCompleted;
+        private long _transferredBytesCurrentFile;
 
 
         #region constructor, serializer and deserializer
@@ -40,6 +42,8 @@ namespace ATxCommon.Serializables
             _currentTransferSrc = "";
             _currentTargetTmp = "";
             _transferInProgress = false;
+            _transferredBytesCompleted = 0;
+            _transferredBytesCurrentFile = 0;
         }
 
         public void Serialize() {
@@ -226,6 +230,30 @@ namespace ATxCommon.Serializables
             }
         }
 
+        /// <summary>
+        /// Total size of files of the running transfer that are already fully transferred.
+        /// </summary>
+        public long TransferredBytesCompleted {
+            get { return _transferredBytesCompleted; }
+            set {
+                _transferredBytesCompleted = value;
+                Log.Trace("TransferredBytesCompleted was updated ({0}).", value);
+                Serialize();
+            }
+        }
+
+        /// <summary>
+        /// Total size of files of the running transfer that are already fully transferred.
+        /// </summary>
+        public long TransferredBytesCurrentFile {
+            get { return _transferredBytesCurrentFile; }
+            set {
+                _transferredBytesCurrentFile = value;
+                Log.Trace("TransferredBytesCurrentFile was updated ({0}).", value);
+                Serialize();
+            }
+        }
+
         #endregion getter / setter methods
         
 
diff --git a/ATxService/AutoTx.cs b/ATxService/AutoTx.cs
index 098f4fd71fc00b5f80e66c1248ff43de714dcd37..975fe7a3df6f3f6ee9aee557aa9aaeaf6831b0f5 100644
--- a/ATxService/AutoTx.cs
+++ b/ATxService/AutoTx.cs
@@ -31,7 +31,9 @@ namespace ATxService
 
         private readonly List<string> _transferredFiles = new List<string>();
 
-        private int _txProgress;
+        private RoboCommand _roboCommand;
+        private long _txCurFileSize;
+        private int _txCurFileProgress;
 
         private DateTime _lastUserDirCheck = DateTime.MinValue;
 
diff --git a/ATxService/RoboCommand.cs b/ATxService/RoboCommand.cs
index ecd8a927588dc0b283f9ae937dae9ebb50bf2994..3c6000058f519184320dd77a79d65e52604ffe3e 100644
--- a/ATxService/RoboCommand.cs
+++ b/ATxService/RoboCommand.cs
@@ -8,8 +8,6 @@ namespace ATxService
 {
     public partial class AutoTx
     {
-        private RoboCommand _roboCommand;
-
         /// <summary>
         /// Start transferring data from a given source directory to the destination
         /// location that is stored in CurrentTargetTmp. Requires CopyState to be in
@@ -75,7 +73,7 @@ namespace ATxService
                 _roboCommand.Start();
                 Log.Info("Transfer started, total size: {0}",
                     Conv.BytesToString(_status.CurrentTransferSize));
-                Log.Debug("RoboCopy command options: {0}", _roboCommand.CommandOptions);
+                Log.Trace("RoboCopy command options: {0}", _roboCommand.CommandOptions);
             }
             catch (ManagementException ex) {
                 Log.Error("Error in StartTransfer(): {0}", ex.Message);
@@ -132,6 +130,16 @@ namespace ATxService
                 if (processed.FileClass.ToLower().Equals("new file")) {
                     _transferredFiles.Add(string.Format("{0} ({1})", processed.Name,
                         Conv.BytesToString(processed.Size)));
+                    // reset the value for the amount of bytes transferred for the current file:
+                    _status.TransferredBytesCurrentFile = 0;
+                    // now add _txCurFileSize (containing either the size of the previously
+                    // transferred file or 0 in case this is the first file of a new transfer) to
+                    // the total amount of already transferred bytes:
+                    _status.TransferredBytesCompleted += _txCurFileSize;
+                    // finally we can now update the _txCurFileSize variable:
+                    _txCurFileSize = processed.Size;
+                    Log.Trace("++++ new file transfer started: size [{0}], already transferred [{1}] ++++",
+                        _txCurFileSize, _status.TransferredBytesCompleted);
                 }
             }
             catch (Exception ex) {
@@ -149,24 +157,36 @@ namespace ATxService
             _roboCommand.Stop();
             Log.Debug("Transfer stopped");
             _transferState = TxState.Stopped;
+            _status.TransferredBytesCompleted = 0;
+            _status.TransferredBytesCurrentFile = 0;
+            _txCurFileSize = 0;
+            _txCurFileProgress = 0;
             _roboCommand.Dispose();
             _roboCommand = new RoboCommand();
             _status.TransferInProgress = false;
         }
 
         /// <summary>
-        /// RoboSharp OnCopyProgressChanged callback handler.
+        /// RoboSharp OnCopyProgressChanged callback handler, triggered every time RoboCopy reports
+        /// a change in the copy progress.
         /// Print a log message if the progress has changed for more than 20%.
         /// </summary>
         private void RsProgressChanged(object sender, CopyProgressEventArgs e) {
             // e.CurrentFileProgress has the current progress in percent
             // report progress in steps of 20:
             var progress = ((int) e.CurrentFileProgress / 20) * 20;
-            if (progress == _txProgress)
+            if (progress == _txCurFileProgress)
                 return;
 
-            _txProgress = progress;
-            Log.Debug("Transfer progress {0}%", progress);
+            _txCurFileProgress = progress;
+            _status.TransferredBytesCurrentFile = (long) (_txCurFileSize * e.CurrentFileProgress / 100);
+            var overallProgress = ((double)(_status.TransferredBytesCompleted + _status.TransferredBytesCurrentFile) /
+                                   _status.CurrentTransferSize) * 100;
+            Log.Info("Current transfer at {0:0}%", overallProgress);
+            Log.Trace("Tx progress: complete [{0}] - current [{1}] - combined {2:0}%",
+                _status.TransferredBytesCompleted, _status.TransferredBytesCurrentFile,
+                overallProgress);
+            Log.Trace("Current file transfer progress {0}%", progress);
         }
 
         #endregion