def execute(self, timeSeries):
        """Creates a new TimeSeries containing the smoothed values.

        :return:    TimeSeries object containing the smoothed TimeSeries,
            including the forecasted values.
        :rtype:     TimeSeries

        :note: The first normalized value is chosen as the starting point.
        """
        # determine the number of values to forecast, if necessary
        self._calculate_values_to_forecast(timeSeries)

        # extract the required parameters, performance improvement
        alpha            = self._parameters["smoothingFactor"]
        beta             = self._parameters["trendSmoothingFactor"]

        # initialize some variables
        resultList  = []
        estimator   = None
        trend       = None
        lastT       = None

        # "It's always about performance!"
        append = resultList.append

        # smooth the existing TimeSeries data
        for idx in xrange(len(timeSeries)):
            # get the current to increase performance
            t = timeSeries[idx]

            # get the initial estimate
            if estimator is None:
                estimator = t[1]
                lastT     = t
                continue

            # add the first value to the resultList without any correction
            if 0 == len(resultList):
                append([t[0], estimator])
                trend         = t[1] - lastT[1]

                # store current values for next iteration
                lastT         = t
                lastEstimator = estimator
                continue

            # calculate the new estimator and trend, based on the last occured value, the error and the smoothingFactor
            estimator = alpha * t[1] + (1 - alpha) * (estimator + trend)
            trend     = beta * (estimator - lastEstimator) + (1 - beta) * trend

            # add an entry to the result
            append([t[0], estimator])

            # store current values for next iteration
            lastT         = t
            lastEstimator = estimator

        # forecast additional values if requested
        if self._parameters["valuesToForecast"] > 0:
            currentTime        = resultList[-1][0]
            normalizedTimeDiff = currentTime - resultList[-2][0]

            for idx in xrange(1, self._parameters["valuesToForecast"] + 1):
                currentTime += normalizedTimeDiff

                # reuse everything
                forecast = estimator + idx * trend

                # add a forecasted value
                append([currentTime, forecast])

        # return a TimeSeries, containing the result
        return TimeSeries.from_twodim_list(resultList)