diff --git a/cmd/api.go b/cmd/api.go
index 01ed2c3..022140a 100644
--- a/cmd/api.go
+++ b/cmd/api.go
@@ -88,7 +88,11 @@
 			var filterKeys []string
 			for _, arg := range apiArgs {
 				if strings.HasPrefix(arg, "filter=") {
-					filterKeys = strings.Split(strings.Split(arg, "=")[1], ",")
+					for _, filterKey := range strings.Split(strings.Split(arg, "=")[1], ",") {
+						if len(strings.TrimSpace(filterKey)) > 0 {
+							filterKeys = append(filterKeys, strings.TrimSpace(filterKey))
+						}
+					}
 				}
 			}
 
diff --git a/cmd/output.go b/cmd/output.go
index 91c434d..e3815e4 100644
--- a/cmd/output.go
+++ b/cmd/output.go
@@ -31,6 +31,9 @@
 )
 
 func jsonify(value interface{}) string {
+	if value == nil {
+		return ""
+	}
 	if reflect.TypeOf(value).Kind() == reflect.Map || reflect.TypeOf(value).Kind() == reflect.Slice {
 		jsonStr, err := json.Marshal(value)
 		if err == nil {
@@ -47,43 +50,6 @@
 	enc.Encode(response)
 }
 
-func printTable(response map[string]interface{}) {
-	table := tablewriter.NewWriter(os.Stdout)
-	for k, v := range response {
-		valueType := reflect.TypeOf(v)
-		if valueType.Kind() == reflect.Slice {
-			items, ok := v.([]interface{})
-			if !ok {
-				continue
-			}
-			fmt.Printf("%v:\n", k)
-			var header []string
-			for _, item := range items {
-				row, ok := item.(map[string]interface{})
-				if !ok || len(row) < 1 {
-					continue
-				}
-
-				if len(header) == 0 {
-					for field := range row {
-						header = append(header, field)
-					}
-					sort.Strings(header)
-					table.SetHeader(header)
-				}
-				var rowArray []string
-				for _, field := range header {
-					rowArray = append(rowArray, jsonify(row[field]))
-				}
-				table.Append(rowArray)
-			}
-		} else {
-			fmt.Printf("%v = %v\n", k, v)
-		}
-	}
-	table.Render()
-}
-
 func printText(response map[string]interface{}) {
 	for k, v := range response {
 		valueType := reflect.TypeOf(v)
@@ -108,7 +74,47 @@
 	}
 }
 
-func printColumn(response map[string]interface{}) {
+func printTable(response map[string]interface{}, filter []string) {
+	table := tablewriter.NewWriter(os.Stdout)
+	for k, v := range response {
+		valueType := reflect.TypeOf(v)
+		if valueType.Kind() == reflect.Slice {
+			items, ok := v.([]interface{})
+			if !ok {
+				continue
+			}
+			fmt.Printf("%v:\n", k)
+			var header []string
+			for _, item := range items {
+				row, ok := item.(map[string]interface{})
+				if !ok || len(row) < 1 {
+					continue
+				}
+				if len(header) == 0 {
+					if len(filter) > 0 {
+						header = filter
+					} else {
+						for field := range row {
+							header = append(header, field)
+						}
+						sort.Strings(header)
+					}
+					table.SetHeader(header)
+				}
+				var rowArray []string
+				for _, field := range header {
+					rowArray = append(rowArray, jsonify(row[field]))
+				}
+				table.Append(rowArray)
+			}
+		} else {
+			fmt.Printf("%v = %v\n", k, v)
+		}
+	}
+	table.Render()
+}
+
+func printColumn(response map[string]interface{}, filter []string) {
 	w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', tabwriter.DiscardEmptyColumns)
 	for _, v := range response {
 		valueType := reflect.TypeOf(v)
@@ -125,10 +131,14 @@
 				}
 
 				if idx == 0 {
-					for rk := range row {
-						header = append(header, strings.ToUpper(rk))
+					if len(filter) > 0 {
+						header = filter
+					} else {
+						for rk := range row {
+							header = append(header, strings.ToUpper(rk))
+						}
+						sort.Strings(header)
 					}
-					sort.Strings(header)
 					fmt.Fprintln(w, strings.Join(header, "\t"))
 				}
 				var values []string
@@ -142,7 +152,7 @@
 	w.Flush()
 }
 
-func printCsv(response map[string]interface{}) {
+func printCsv(response map[string]interface{}, filter []string) {
 	for _, v := range response {
 		valueType := reflect.TypeOf(v)
 		if valueType.Kind() == reflect.Slice || valueType.Kind() == reflect.Map {
@@ -158,10 +168,14 @@
 				}
 
 				if idx == 0 {
-					for rk := range row {
-						header = append(header, rk)
+					if len(filter) > 0 {
+						header = filter
+					} else {
+						for rk := range row {
+							header = append(header, rk)
+						}
+						sort.Strings(header)
 					}
-					sort.Strings(header)
 					fmt.Println(strings.Join(header, ","))
 				}
 				var values []string
@@ -170,7 +184,6 @@
 				}
 				fmt.Println(strings.Join(values, ","))
 			}
-
 		}
 	}
 }
@@ -195,9 +208,6 @@
 				}
 				filteredRow := make(map[string]interface{})
 				for _, filterKey := range filter {
-					if len(strings.TrimSpace(filterKey)) == 0 {
-						continue
-					}
 					for field := range row {
 						if filterKey == field {
 							filteredRow[field] = row[field]
@@ -226,14 +236,14 @@
 	switch outputType {
 	case config.JSON:
 		printJSON(response)
-	case config.TABLE:
-		printTable(response)
 	case config.TEXT:
 		printText(response)
 	case config.COLUMN:
-		printColumn(response)
+		printColumn(response, filter)
 	case config.CSV:
-		printCsv(response)
+		printCsv(response, filter)
+	case config.TABLE:
+		printTable(response, filter)
 	default:
 		fmt.Println("Invalid output type configured, please fix that!")
 	}
