diff --git a/conf/explorer/lsb_codename b/conf/explorer/lsb_codename
index bc742cf7..22b6d51e 100755
--- a/conf/explorer/lsb_codename
+++ b/conf/explorer/lsb_codename
@@ -20,7 +20,14 @@
#
set +e
-lsb_release=$(which lsb_release 2>/dev/null)
-if [ -x "$lsb_release" ]; then
- $lsb_release --short --codename
-fi
+case "$($__explorer/os)" in
+ openwrt)
+ (. /etc/openwrt_release && echo "$DISTRIB_CODENAME")
+ ;;
+ *)
+ lsb_release=$(which lsb_release 2>/dev/null)
+ if [ -x "$lsb_release" ]; then
+ $lsb_release --short --codename
+ fi
+ ;;
+esac
diff --git a/conf/explorer/lsb_description b/conf/explorer/lsb_description
index f6c30322..48aff30d 100755
--- a/conf/explorer/lsb_description
+++ b/conf/explorer/lsb_description
@@ -20,7 +20,14 @@
#
set +e
-lsb_release=$(which lsb_release 2>/dev/null)
-if [ -x "$lsb_release" ]; then
- $lsb_release --short --description
-fi
+case "$($__explorer/os)" in
+ openwrt)
+ (. /etc/openwrt_release && echo "$DISTRIB_DESCRIPTION")
+ ;;
+ *)
+ lsb_release=$(which lsb_release 2>/dev/null)
+ if [ -x "$lsb_release" ]; then
+ $lsb_release --short --description
+ fi
+ ;;
+esac
diff --git a/conf/explorer/lsb_id b/conf/explorer/lsb_id
index 6cb2359b..0dd0f9f4 100755
--- a/conf/explorer/lsb_id
+++ b/conf/explorer/lsb_id
@@ -20,7 +20,14 @@
#
set +e
-lsb_release=$(which lsb_release 2>/dev/null)
-if [ -x "$lsb_release" ]; then
- $lsb_release --short --id
-fi
+case "$($__explorer/os)" in
+ openwrt)
+ (. /etc/openwrt_release && echo "$DISTRIB_ID")
+ ;;
+ *)
+ lsb_release=$(which lsb_release 2>/dev/null)
+ if [ -x "$lsb_release" ]; then
+ $lsb_release --short --id
+ fi
+ ;;
+esac
diff --git a/conf/explorer/lsb_release b/conf/explorer/lsb_release
index a96ac50b..8266171a 100755
--- a/conf/explorer/lsb_release
+++ b/conf/explorer/lsb_release
@@ -20,7 +20,14 @@
#
set +e
-lsb_release=$(which lsb_release 2>/dev/null)
-if [ -x "$lsb_release" ]; then
- $lsb_release --short --release
-fi
+case "$($__explorer/os)" in
+ openwrt)
+ (. /etc/openwrt_release && echo "$DISTRIB_RELEASE")
+ ;;
+ *)
+ lsb_release=$(which lsb_release 2>/dev/null)
+ if [ -x "$lsb_release" ]; then
+ $lsb_release --short --release
+ fi
+ ;;
+esac
diff --git a/conf/explorer/os b/conf/explorer/os
index 3f3ce266..e67d87ab 100755
--- a/conf/explorer/os
+++ b/conf/explorer/os
@@ -56,6 +56,11 @@ if [ -f /etc/gentoo-release ]; then
exit 0
fi
+if [ -f /etc/openwrt_version ]; then
+ echo openwrt
+ exit 0
+fi
+
if [ -f /etc/owl-release ]; then
echo owl
exit 0
diff --git a/conf/explorer/os_version b/conf/explorer/os_version
index 73d3ecd7..8e6d37d3 100755
--- a/conf/explorer/os_version
+++ b/conf/explorer/os_version
@@ -45,6 +45,9 @@ case "$($__explorer/os)" in
*bsd|solaris)
uname -r
;;
+ openwrt)
+ cat /etc/openwrt_version
+ ;;
owl)
cat /etc/owl-release
;;
diff --git a/conf/type/__package/manifest b/conf/type/__package/manifest
index 181da077..26c2cd39 100755
--- a/conf/type/__package/manifest
+++ b/conf/type/__package/manifest
@@ -34,6 +34,7 @@ else
debian|ubuntu) type="apt" ;;
gentoo) type="emerge" ;;
amazon|centos|fedora|redhat) type="yum" ;;
+ openwrt) type="opkg" ;;
*)
echo "Don't know how to manage packages on: $os" >&2
exit 1
diff --git a/conf/type/__package_opkg/explorer/pkg_status b/conf/type/__package_opkg/explorer/pkg_status
new file mode 100755
index 00000000..5da4f742
--- /dev/null
+++ b/conf/type/__package_opkg/explorer/pkg_status
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2012 Giel van Schijndel (giel plus cdist at mortis dot eu)
+#
+# 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 .
+#
+#
+# Retrieve the status of a package - parsed opkg output
+#
+
+if [ -f "$__object/parameter/name" ]; then
+ name="$(cat "$__object/parameter/name")"
+else
+ name="$__object_id"
+fi
+
+# Except dpkg failing, if package is not known / installed
+if opkg status "$name" 2>/dev/null | grep -q "^Status: install user installed$"; then
+ echo "present"
+ exit 0
+elif [ "$(opkg info "$name" 2> /dev/null | wc -l)" -eq 0 ]; then
+ echo "absent notpresent"
+ exit 0
+fi
+echo "absent"
diff --git a/conf/type/__package_opkg/gencode-remote b/conf/type/__package_opkg/gencode-remote
new file mode 100755
index 00000000..bd9a599b
--- /dev/null
+++ b/conf/type/__package_opkg/gencode-remote
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2012 Giel van Schijndel (giel plus cdist at mortis dot eu)
+#
+# 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 .
+#
+#
+# Manage packages on OpenWRT and co.
+#
+
+if [ -f "$__object/parameter/name" ]; then
+ name="$(cat "$__object/parameter/name")"
+else
+ name="$__object_id"
+fi
+
+state_should="$(cat "$__object/parameter/state")"
+state_is="$(cat "$__object/explorer/pkg_status")"
+case "$state_is" in
+ absent*)
+ present="$(echo "$state_is" | cut -d ' ' -f 2)"
+ state_is="absent"
+ ;;
+esac
+
+if [ "$state_is" != "$state_should" ]; then
+ case "$state_should" in
+ present)
+ if [ "$present" = "notpresent" ]; then
+ echo opkg --verbosity=0 update
+ fi
+ echo opkg --verbosity=0 install \"$name\"
+ ;;
+ absent)
+ echo opkg --verbosity=0 remove \"$name\"
+ ;;
+ *)
+ echo "Unknown state: $state" >&2
+ exit 1
+ ;;
+ esac
+fi
+
diff --git a/conf/type/__package_opkg/man.text b/conf/type/__package_opkg/man.text
new file mode 100644
index 00000000..19d26af6
--- /dev/null
+++ b/conf/type/__package_opkg/man.text
@@ -0,0 +1,49 @@
+cdist-type__package_opkg(7)
+==========================
+Giel van Schijndel
+
+
+NAME
+----
+cdist-type__package_opkg - Manage packages with opkg
+
+
+DESCRIPTION
+-----------
+opkg is usually used on OpenWRT to manage packages.
+
+
+REQUIRED PARAMETERS
+-------------------
+state::
+ The state the package should be in, either "present" or "absent"
+
+
+OPTIONAL PARAMETERS
+-------------------
+name::
+ If supplied, use the name and not the object id as the package name.
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Ensure lsof is installed
+__package_opkg lsof --state present
+
+# Remove obsolete package
+__package_opkg dnsmasq --state absent
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+- cdist-type__package(7)
+
+
+COPYING
+-------
+Copyright \(C) 2012 Giel van Schijndel. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__package_opkg/parameter/optional b/conf/type/__package_opkg/parameter/optional
new file mode 100644
index 00000000..f121bdbf
--- /dev/null
+++ b/conf/type/__package_opkg/parameter/optional
@@ -0,0 +1 @@
+name
diff --git a/conf/type/__package_opkg/parameter/required b/conf/type/__package_opkg/parameter/required
new file mode 100644
index 00000000..ff72b5c7
--- /dev/null
+++ b/conf/type/__package_opkg/parameter/required
@@ -0,0 +1 @@
+state