diff --git a/core/API/DataTablePostProcessor.php b/core/API/DataTablePostProcessor.php
index ddff42fd059e3dd4808a8d7e7e25d7c135c1ff90..3e6deae6b3ca18d824fbf06a19274748e8bab4df 100644
--- a/core/API/DataTablePostProcessor.php
+++ b/core/API/DataTablePostProcessor.php
@@ -195,12 +195,6 @@ class DataTablePostProcessor
         // after queued filters are run so processed metrics can be removed, too)
         $hideColumns = Common::getRequestVar('hideColumns', '', 'string', $this->request);
         $showColumns = Common::getRequestVar('showColumns', '', 'string', $this->request);
-        if (empty($showColumns)) {
-            // if 'columns' is used, we remove all temporary metrics by showing only the columns specified in
-            // 'columns'
-            $showColumns = Common::getRequestVar('columns', '', 'string', $this->request);
-        }
-
         if (!empty($hideColumns)
             || !empty($showColumns)
         ) {
diff --git a/plugins/Actions/API.php b/plugins/Actions/API.php
index 7fcde2f14461586a328ad3ee806363f6d3e5d84e..4b730c0c07b2a0e65116b7082e5393cbdb6ead8d 100644
--- a/plugins/Actions/API.php
+++ b/plugins/Actions/API.php
@@ -57,15 +57,15 @@ class API extends \Piwik\Plugin\API
         Piwik::checkUserHasViewAccess($idSite);
         $archive = Archive::build($idSite, $period, $date, $segment);
 
-        $columns = Piwik::getArrayFromApiParameter($columns);
-        $columns = Report::factory("Actions", "get")->getMetricsRequiredForReport($allColumns = null, $columns);
+        $requestedColumns = Piwik::getArrayFromApiParameter($columns);
+        $columns = Report::factory("Actions", "get")->getMetricsRequiredForReport($allColumns = null, $requestedColumns);
 
         $inDbColumnNames = array_map(function ($value) { return 'Actions_' . $value; }, $columns);
         $dataTable = $archive->getDataTableFromNumeric($inDbColumnNames);
+        $dataTable->deleteColumns(array_diff($requestedColumns, $columns));
 
         $newNameMapping = array_combine($inDbColumnNames, $columns);
         $dataTable->filter('ReplaceColumnNames', array($newNameMapping));
-
         return $dataTable;
     }
 
diff --git a/plugins/Goals/API.php b/plugins/Goals/API.php
index b807a024cefb9dd25861dac97f41a2dcfd41ec56..22bfcb5788e7aeb395b43b4427c0389dabdbe402 100644
--- a/plugins/Goals/API.php
+++ b/plugins/Goals/API.php
@@ -333,8 +333,8 @@ class API extends \Piwik\Plugin\API
 
         $allMetrics = Goals::getGoalColumns($idGoal);
 
-        $columns = Piwik::getArrayFromApiParameter($columns);
-        $columnsToGet = Report::factory("Goals", "get")->getMetricsRequiredForReport($allMetrics, $columns);
+        $requestedColumns = Piwik::getArrayFromApiParameter($columns);
+        $columnsToGet = Report::factory("Goals", "get")->getMetricsRequiredForReport($allMetrics, $requestedColumns);
 
         $inDbMetricNames = array_map(function ($value) use ($idGoal) { return Archiver::getRecordName($value, $idGoal); }, $columnsToGet);
         $dataTable = $archive->getDataTableFromNumeric($inDbMetricNames);
@@ -342,12 +342,15 @@ class API extends \Piwik\Plugin\API
         $newNameMapping = array_combine($inDbMetricNames, $columnsToGet);
         $dataTable->filter('ReplaceColumnNames', array($newNameMapping));
 
+        $dataTable->deleteColumns(array_diff($requestedColumns, $columnsToGet));
+
         // TODO: this should be in Goals/Get.php but it depends on idGoal parameter which isn't always in _GET (ie,
         //       it's not in ProcessedReport.php). more refactoring must be done to report class before this can be
         //       corrected.
-        if ((in_array('avg_order_revenue', $columns)
-             || empty($columns))
-            && $idGoal === GoalManager::IDGOAL_ORDER
+        if ((in_array('avg_order_revenue', $requestedColumns)
+             || empty($requestedColumns))
+            && ($idGoal === GoalManager::IDGOAL_ORDER
+            || $idGoal === GoalManager::IDGOAL_CART)
         ) {
             $dataTable->filter(function (DataTable $table) {
                 $extraProcessedMetrics = $table->getMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME);
diff --git a/plugins/VisitsSummary/API.php b/plugins/VisitsSummary/API.php
index 81fd49f8df7d9b92fb66eebd491dd62e2bf2b16b..0530fd7ae3a8107a07163056926116f8766559d1 100644
--- a/plugins/VisitsSummary/API.php
+++ b/plugins/VisitsSummary/API.php
@@ -28,12 +28,13 @@ class API extends \Piwik\Plugin\API
         Piwik::checkUserHasViewAccess($idSite);
         $archive = Archive::build($idSite, $period, $date, $segment);
 
-        $columns = Piwik::getArrayFromApiParameter($columns);
+        $requestedColumns = Piwik::getArrayFromApiParameter($columns);
 
         $report = Report::factory("VisitsSummary", "get");
-        $columns = $report->getMetricsRequiredForReport($this->getCoreColumns($period), $columns);
+        $columns = $report->getMetricsRequiredForReport($this->getCoreColumns($period), $requestedColumns);
 
         $dataTable = $archive->getDataTableFromNumeric($columns);
+        $dataTable->deleteColumns(array_diff($requestedColumns, $columns));
         return $dataTable;
     }
 
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_csv__API.get_month.csv b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_csv__API.get_month.csv
index 95ce6d8b142f94396d959d9568f9892c09e2d7a3..9ca1f08519c5d1c20ebcdf7ad4a884963a4c37a1 100644
Binary files a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_csv__API.get_month.csv and b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_csv__API.get_month.csv differ