diff --git a/manifests/db.pp b/manifests/db.pp
index 71e9e493..9a139790 100644
--- a/manifests/db.pp
+++ b/manifests/db.pp
@@ -61,13 +61,17 @@ class ceilometer::db (
   Package<| title == 'ceilometer-common' |> -> Class['ceilometer::db']
 
   validate_re($database_connection,
-    '(sqlite|mysql|postgresql|mongodb):\/\/(\S+:\S+@\S+\/\S+)?')
+    '^(sqlite|mysql(\+pymysql)?|postgresql|mongodb):\/\/(\S+:\S+@\S+\/\S+)?')
 
   case $database_connection {
-    /^mysql:\/\//: {
-      $backend_package = false
+    /^mysql(\+pymysql)?:\/\//: {
       require 'mysql::bindings'
       require 'mysql::bindings::python'
+      if $database_connection =~ /^mysql\+pymysql/ {
+        $backend_package = $::ceilometer::params::pymysql_package_name
+      } else {
+        $backend_package = false
+      }
     }
     /^postgresql:\/\//: {
       $backend_package = false
diff --git a/manifests/params.pp b/manifests/params.pp
index 61bba122..b209a5e4 100644
--- a/manifests/params.pp
+++ b/manifests/params.pp
@@ -31,6 +31,7 @@ class ceilometer::params {
       $ceilometer_wsgi_script_path     = '/var/www/cgi-bin/ceilometer'
       $ceilometer_wsgi_script_source   = '/usr/lib/python2.7/site-packages/ceilometer/api/app.wsgi'
       $sqlite_package_name             = undef
+      $pymysql_package_name            = undef
     }
     'Debian': {
       # package names
@@ -55,6 +56,7 @@ class ceilometer::params {
       # db packages
       $pymongo_package_name            = 'python-pymongo'
       $sqlite_package_name             = 'python-pysqlite2'
+      $pymysql_package_name            = 'python-pymysql'
 
       # Operating system specific
       case $::operatingsystem {
diff --git a/spec/acceptance/ceilometer_with_mysql_spec.rb b/spec/acceptance/ceilometer_with_mysql_spec.rb
index 27ce7974..70fa9ce3 100644
--- a/spec/acceptance/ceilometer_with_mysql_spec.rb
+++ b/spec/acceptance/ceilometer_with_mysql_spec.rb
@@ -40,7 +40,7 @@ describe 'ceilometer with mysql' do
       class { '::keystone':
         verbose             => true,
         debug               => true,
-        database_connection => 'mysql://keystone:keystone@127.0.0.1/keystone',
+        database_connection => 'mysql+pymysql://keystone:keystone@127.0.0.1/keystone',
         admin_token         => 'admin_token',
         enabled             => true,
       }
@@ -66,7 +66,7 @@ describe 'ceilometer with mysql' do
         password => 'a_big_secret',
       }
       class { '::ceilometer::db':
-        database_connection => 'mysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8',
+        database_connection => 'mysql+pymysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8',
       }
       class { '::ceilometer::keystone::auth':
         password => 'a_big_secret',
diff --git a/spec/acceptance/ceilometer_wsgi_apache_spec.rb b/spec/acceptance/ceilometer_wsgi_apache_spec.rb
index 16e000ac..d2ba7c26 100644
--- a/spec/acceptance/ceilometer_wsgi_apache_spec.rb
+++ b/spec/acceptance/ceilometer_wsgi_apache_spec.rb
@@ -38,7 +38,7 @@ describe 'ceilometer with mysql' do
         password => 'a_big_secret',
       }
       class { '::ceilometer::db':
-        database_connection => 'mysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8',
+        database_connection => 'mysql+pymysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8',
       }
       class { '::ceilometer::keystone::auth':
         password => 'a_big_secret',
diff --git a/spec/classes/ceilometer_db_spec.rb b/spec/classes/ceilometer_db_spec.rb
index f8242164..58dee2e4 100644
--- a/spec/classes/ceilometer_db_spec.rb
+++ b/spec/classes/ceilometer_db_spec.rb
@@ -38,6 +38,16 @@ describe 'ceilometer::db' do
 
     end
 
+    context 'with pymysql connection' do
+      let :params do
+        { :database_connection     => 'mysql+pymysql://ceilometer:ceilometer@localhost/ceilometer' }
+      end
+
+      it { is_expected.to contain_class('ceilometer::params') }
+      it { is_expected.to contain_class('ceilometer::db::sync') }
+      it { is_expected.to contain_ceilometer_config('database/connection').with_value('mysql+pymysql://ceilometer:ceilometer@localhost/ceilometer').with_secret(true) }
+    end
+
     context 'with mongodb backend and replica set' do
       let :params do
         { :database_connection     => 'mongodb://localhost:1234/ceilometer',
@@ -75,6 +85,14 @@ describe 'ceilometer::db' do
       end
     end
 
+    context 'with incorrect pymysql database_connection string' do
+      let :params do
+        { :database_connection     => 'foo+pymysql://ceilometer:ceilometer@localhost/ceilometer', }
+      end
+
+      it_raises 'a Puppet::Error', /validate_re/
+    end
+
   end
 
   context 'on Debian platforms' do
@@ -87,6 +105,20 @@ describe 'ceilometer::db' do
 
     it_configures 'ceilometer::db'
 
+    context 'using pymysql driver' do
+      let :params do
+        { :database_connection     => 'mysql+pymysql:///ceilometer:ceilometer@localhost/ceilometer', }
+      end
+
+      it 'install the proper backend package' do
+        is_expected.to contain_package('ceilometer-backend-package').with(
+          :ensure => 'present',
+          :name   => 'python-pymysql',
+          :tag    => 'openstack'
+        )
+      end
+    end
+
     context 'with sqlite backend' do
       let :params do
         { :database_connection     => 'sqlite:///var/lib/ceilometer.db', }
@@ -111,6 +143,14 @@ describe 'ceilometer::db' do
     end
 
     it_configures 'ceilometer::db'
+
+    context 'using pymysql driver' do
+      let :params do
+        { :database_connection     => 'mysql+pymysql:///ceilometer:ceilometer@localhost/ceilometer', }
+      end
+
+      it { is_expected.not_to contain_package('ceilometer-backend-package') }
+    end
   end
 
 end