     
     ///
     public func qualityOfServiceTest(test: QualityOfServiceTest, didFetchTestTypes testTypes: [QOSTestType]) {
-
+        //logger.debug("QOS: DID FETCH TYPES: \(time)")
     }
     
     ///
     public func qualityOfServiceTest(test: QualityOfServiceTest, didFinishTestType testType: QOSTestType) {
-
-    }
-    
-    ///
-    public func qualityOfServiceTest(test: QualityOfServiceTest, didProgressToValue: Float) {
-
-    }
-    
-}
+        //logger.debug("QOS: DID FINISH TYPE: \(time)")
+    }
+    
+    ///
+    public func qualityOfServiceTest(test: QualityOfServiceTest, didProgressToValue progress: Float) {
+        delegate?.qosMeasurementDidUpdateProgress(self, progress: progress)
+    }
+    
+}

    
    ///
    public func testRunnerDidDetectConnectivity(connectivity: RMBTConnectivity) {
        //logger.debug("TESTRUNNER: CONNECTIVITY")
    }
    
    ///

    
    ///
    public func testRunnerDidMeasureThroughputs(throughputs: NSArray, inPhase phase: RMBTTestRunnerPhase) {
        // TODO: use same logic as in android app? (RMBTClient.java:646)
        
        if let throughputs = throughputs as? [RMBTThroughput], throughput = throughputs.last { // last?
            let kbps = throughput.kilobitsPerSecond()
            delegate?.speedMeasurementDidMeasureSpeed(Int(kbps), inPhase: SpeedMeasurementPhase.mapFromRmbtRunnerPhase(phase))
        }
    }
    
    ///
    public func testRunnerDidCompleteWithResult(result: RMBTHistoryResult) {
        stopHardwareUsageTimer() // stop cpu and memory usage timer
        
        startQosMeasurement() // continue with qos measurement
    }
    
    ///
    public func testRunnerDidCancelTestWithReason(cancelReason: RMBTTestRunnerCancelReason) {
        stopHardwareUsageTimer() // stop cpu and memory usage timer
        
        let reason = RMBTClientCancelReason.mapFromSpeedMesurementCancelReason(cancelReason)
        
