diff --git a/conf/type/__apt_ppa/explorer/state b/conf/type/__apt_ppa/explorer/state
new file mode 100755
index 00000000..c50af3f0
--- /dev/null
+++ b/conf/type/__apt_ppa/explorer/state
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+#
+# Get the current state of the ppa.
+#
+
+name="$__object_id"
+
+# FIXME: on first run check-apt-repository may not be installed
+check-apt-repository "$name" && echo enabled || echo disabled
+
diff --git a/conf/type/__apt_ppa/files/check-apt-repository b/conf/type/__apt_ppa/files/check-apt-repository
new file mode 100755
index 00000000..4f4252c1
--- /dev/null
+++ b/conf/type/__apt_ppa/files/check-apt-repository
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+#
+# Check if the given apt repository is installed or not.
+# Exit with:
+# 0: if it is installed
+# 1: if not
+# 2: on error
+#
+
+import sys
+from aptsources import distro, sourceslist
+from softwareproperties import ppa
+
+
+def is_repository_installed(repository):
+ #print 'repository:', repository
+ codename = distro.get_distro().codename
+ #print 'codename:', codename
+ (line, file) = ppa.expand_ppa_line(repository.strip(), codename)
+ #print 'line:', line
+ #print 'file:', file
+ sources_list = sourceslist.SourcesList()
+ source_entry = sourceslist.SourceEntry(line, file)
+
+ if source_entry in sources_list:
+ #print 'yes'
+ return True
+ else:
+ #print 'no'
+ return False
+
+if __name__ == '__main__':
+ if (len(sys.argv) != 2):
+ print 'Error: need a repository as argument'
+ sys.exit(2)
+ #repository = 'ppa:freenx-team'
+ repository = sys.argv[1]
+ if is_repository_installed(repository):
+ sys.exit(0)
+ else:
+ sys.exit(1)
+
diff --git a/conf/type/__apt_ppa/files/remove-apt-repository b/conf/type/__apt_ppa/files/remove-apt-repository
new file mode 100755
index 00000000..b57a07f6
--- /dev/null
+++ b/conf/type/__apt_ppa/files/remove-apt-repository
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+#
+# Remove the given apt repository.
+#
+# Exit with:
+# 0: if it worked
+# 1: if not
+# 2: on other error
+
+
+import sys
+from aptsources import distro, sourceslist
+from softwareproperties import ppa
+from softwareproperties.SoftwareProperties import SoftwareProperties
+
+
+def remove_repository(repository):
+ #print 'repository:', repository
+ codename = distro.get_distro().codename
+ #print 'codename:', codename
+ (line, file) = ppa.expand_ppa_line(repository.strip(), codename)
+ #print 'line:', line
+ #print 'file:', file
+ source_entry = sourceslist.SourceEntry(line, file)
+
+ try:
+ sp = SoftwareProperties()
+ sp.remove_source(source_entry)
+ return True
+ except ValueError:
+ print >> sys.stderr, "Error: '%s' doesn't exists in a sourcelist file" % line
+ return False
+
+if __name__ == '__main__':
+ if (len(sys.argv) != 2):
+ print >> sys.stderr, 'Error: need a repository as argument'
+ sys.exit(2)
+ repository = sys.argv[1]
+ if remove_repository(repository):
+ sys.exit(0)
+ else:
+ sys.exit(1)
diff --git a/conf/type/__apt_ppa/gencode-remote b/conf/type/__apt_ppa/gencode-remote
new file mode 100755
index 00000000..0e7fe163
--- /dev/null
+++ b/conf/type/__apt_ppa/gencode-remote
@@ -0,0 +1,35 @@
+#!/bin/sh
+#
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+
+name="$__object_id"
+state_should="$(cat "$__object/parameter/state")"
+state_is="$(cat "$__object/explorer/state")"
+
+if [ "$state_should" != "$state_is" ]; then
+ case "$state_should" in
+ enabled)
+ echo add-apt-repository \"$name\"
+ ;;
+ disabled)
+ echo remove-apt-repository \"$name\"
+ ;;
+ esac
+fi
+
diff --git a/conf/type/__apt_ppa/man.text b/conf/type/__apt_ppa/man.text
new file mode 100644
index 00000000..73fabc7f
--- /dev/null
+++ b/conf/type/__apt_ppa/man.text
@@ -0,0 +1,47 @@
+cdist-type__apt_ppa(7)
+==========================
+Steven Armstrong
+
+
+NAME
+----
+cdist-type__apt_ppa - Manage ppa repositories
+
+
+DESCRIPTION
+-----------
+This cdist type allows manage ubuntu ppa repositories.
+
+
+REQUIRED PARAMETERS
+-------------------
+state::
+ The state the ppa should be in, either "enabled" or "disabled".
+
+
+OPTIONAL PARAMETERS
+-------------------
+None.
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Enable a ppa repository
+__apt_ppa ppa:sans-intern/missing-bits --state enabled
+
+# Disable a ppa repository
+__apt_ppa ppa:sans-intern/missing-bits --state disabled
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+
+
+COPYING
+-------
+Copyright \(C) 2011 Steven Armstrong. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__apt_ppa/manifest b/conf/type/__apt_ppa/manifest
new file mode 100755
index 00000000..a97ced75
--- /dev/null
+++ b/conf/type/__apt_ppa/manifest
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+
+
+__package python-software-properties --state installed
+
+require="__package/python-software-properties" \
+ __file /usr/local/bin/check-apt-repository \
+ --source "$__type/files/check-apt-repository" \
+ --mode 0755
+
+require="__package/python-software-properties" \
+ __file /usr/local/bin/remove-apt-repository \
+ --source "$__type/files/remove-apt-repository" \
+ --mode 0755
+
diff --git a/conf/type/__apt_ppa/parameter/required b/conf/type/__apt_ppa/parameter/required
new file mode 100644
index 00000000..ff72b5c7
--- /dev/null
+++ b/conf/type/__apt_ppa/parameter/required
@@ -0,0 +1 @@
+state