diff --git a/opentrafficshaper/utils.pm b/opentrafficshaper/utils.pm
index 0a0b338a2a75ba0235d3240c5791389f446aca2d..9252ae17beb877a4545f0bbe9f2f3300418921b4 100644
--- a/opentrafficshaper/utils.pm
+++ b/opentrafficshaper/utils.pm
@@ -92,10 +92,18 @@ sub parseFormContent
 	# Split information into name/value pairs
 	my @pairs = split(/&/, $data);
 	foreach my $pair (@pairs) {
+		# Spaces are represented by +'s
+		$pair =~ tr/+/ /;
+		# Split off name value pairs
 		my ($name, $value) = split(/=/, $pair);
-		$value =~ tr/+/ /;
-		$value =~ s/%(..)/pack("C", hex($1))/eg;
-		$res{$name} = $value;
+		# Unescape name value pair
+		$name =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+		$value =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+		# Cleanup...
+		$name =~ s/[^0-9A-Za-z\[\]\.]/_/g;
+		# Add to hash
+		$res{$name}->{'value'} = $value;
+		push(@{$res{$name}->{'values'}},$value);
 	}
 
 	return \%res;