diff --git a/lib/puppet/type/nova_aggregate.rb b/lib/puppet/type/nova_aggregate.rb
index f24a1ca52..0b3ac8685 100644
--- a/lib/puppet/type/nova_aggregate.rb
+++ b/lib/puppet/type/nova_aggregate.rb
@@ -33,7 +33,7 @@
 #    Optional
 #
 #  [*metadata*]
-#    String with key/value pairs. ie "key=value,key=value"
+#    A key => value hash used to set the metadata for the aggregate.
 #    Optional
 #
 #  [*hosts*]
@@ -89,28 +89,12 @@ Puppet::Type.newtype(:nova_aggregate) do
 
   newproperty(:metadata) do
     desc 'The metadata of the aggregate'
-    #convert DSL/string form to internal form which is a single hash
-    munge do |value|
-      if value.is_a?(Hash)
-        return value
-      end
-      internal = Hash.new
-      value.split(",").map{|el| el.strip()}.each do |pair|
-        key, value = pair.split("=", 2)
-        internal[key.strip()] = value.strip()
-      end
-      return internal
-    end
 
     validate do |value|
       if value.is_a?(Hash)
         return true
-      elsif value.is_a?(String)
-        value.split(",").each do |kv|
-          raise ArgumentError, "Key/value pairs must be separated by an =" unless value.include?("=")
-        end
       else
-        raise ArgumentError, "Invalid metadata #{value}. Requires a String or a Hash, not a #{value.class}"
+        raise ArgumentError, "Invalid metadata #{value}. Requires a Hash, not a #{value.class}"
       end
     end
   end
diff --git a/lib/puppet/type/nova_flavor.rb b/lib/puppet/type/nova_flavor.rb
index dd8419f95..5155d5bac 100644
--- a/lib/puppet/type/nova_flavor.rb
+++ b/lib/puppet/type/nova_flavor.rb
@@ -140,23 +140,11 @@ Puppet::Type.newtype(:nova_flavor) do
   newproperty(:properties) do
     desc "The set of flavor properties"
 
-    munge do |value|
-      return value if value.is_a? Hash
-
-      # wrap property value in commas
-      value.gsub!(/=(\w+)/, '=\'\1\'')
-      Hash[value.scan(/(\S+)='([^']*)'/)]
-    end
-
     validate do |value|
       if value.is_a?(Hash)
         return true
-      elsif value.is_a?(String)
-        value.split(',').each do |property|
-          raise ArgumentError, "Key/value pairs should be separated by an =" unless property.include?('=')
-        end
       else
-        raise ArgumentError, "Invalid properties #{value}. Requires a String or a Hash, not a #{value.class}"
+        raise ArgumentError, "Invalid properties #{value}. Requires a Hash, not a #{value.class}"
       end
     end
   end
diff --git a/releasenotes/notes/properties-hash-1d78c19fa202742b.yaml b/releasenotes/notes/properties-hash-1d78c19fa202742b.yaml
new file mode 100644
index 000000000..145b7d6cc
--- /dev/null
+++ b/releasenotes/notes/properties-hash-1d78c19fa202742b.yaml
@@ -0,0 +1,6 @@
+---
+upgrade:
+  - |
+    The ``properties`` property of ``nova_flavor`` resource and
+    the ``metadata`` property of ``nova_aggregate`` resource now accept only
+    Hash values.
diff --git a/spec/acceptance/10_nova_wsgi_apache_spec.rb b/spec/acceptance/10_nova_wsgi_apache_spec.rb
index 7d45d0d0e..d86078bc6 100644
--- a/spec/acceptance/10_nova_wsgi_apache_spec.rb
+++ b/spec/acceptance/10_nova_wsgi_apache_spec.rb
@@ -20,7 +20,7 @@ describe 'basic nova' do
       nova_aggregate { 'test_aggregate':
         ensure            => present,
         availability_zone => 'zone1',
-        metadata          => 'test=property',
+        metadata          => {'test' => 'property'},
         require           => Class['nova::api'],
       }
 
diff --git a/spec/unit/provider/nova_aggregate/openstack_spec.rb b/spec/unit/provider/nova_aggregate/openstack_spec.rb
index 1aa4e4680..d8e967259 100644
--- a/spec/unit/provider/nova_aggregate/openstack_spec.rb
+++ b/spec/unit/provider/nova_aggregate/openstack_spec.rb
@@ -19,7 +19,7 @@ describe Puppet::Type.type(:nova_aggregate).provider(:openstack) do
          :availability_zone => 'simple',
          :hosts             => ['example'],
          :ensure            => 'present',
-         :metadata          => 'nice=cookie',
+         :metadata          => {'nice' => 'cookie'},
       }
     end
 
@@ -105,7 +105,7 @@ hosts="[\'example\']"
          :availability_zone => 'simple',
          :hosts             => ['known'],
          :ensure            => 'present',
-         :metadata          => 'nice=cookie',
+         :metadata          => {'nice' => 'cookie'},
          :filter_hosts      => 'true'
       }
     end
diff --git a/spec/unit/type/nova_aggregate_spec.rb b/spec/unit/type/nova_aggregate_spec.rb
index 06ea6a992..758c5acdd 100644
--- a/spec/unit/type/nova_aggregate_spec.rb
+++ b/spec/unit/type/nova_aggregate_spec.rb
@@ -20,7 +20,7 @@ describe Puppet::Type.type(:nova_aggregate) do
       :name     => 'new_aggr',
       :metadata => 'some_id,sd'
     }
-    expect { Puppet::Type.type(:nova_aggregate).new(incorrect_input) }.to raise_error(Puppet::ResourceError, /Key\/value pairs must be separated by an =/)
+    expect { Puppet::Type.type(:nova_aggregate).new(incorrect_input) }.to raise_error(Puppet::ResourceError, /Invalid metadata/)
   end
 
   it 'should raise error if wrong type for availability zone' do