diff --git a/opmlexport/README.md b/opmlexport/README.md
new file mode 100644
index 00000000..6d944de9
--- /dev/null
+++ b/opmlexport/README.md
@@ -0,0 +1,5 @@
+# OPML Export
+
+Export user's active RSS/Atom contacts as OPML.
+
+Launch from `Settings` -> `Addons` -> `OPML Export`
\ No newline at end of file
diff --git a/opmlexport/opmlexport.php b/opmlexport/opmlexport.php
new file mode 100644
index 00000000..ca65cbaa
--- /dev/null
+++ b/opmlexport/opmlexport.php
@@ -0,0 +1,89 @@
+
+ * License: 3-clause BSD license
+ */
+
+use Friendica\DI;
+use Friendica\App;
+use Friendica\Core\Hook;
+use Friendica\Core\Logger;
+use Friendica\Network\HTTPException;
+use Friendica\Database\DBA;
+use Friendica\Core\Renderer;
+use Friendica\Core\Protocol;
+use Friendica\Model\Contact;
+
+function opmlexport_install()
+{
+ Hook::register('addon_settings', __FILE__, 'opmlexport_addon_settings');
+ Hook::register('addon_settings_post', __FILE__, 'opmlexport_addon_settings_post');
+ Logger::log('installed opmlexport Addon');
+}
+
+
+function opmlexport(App $a)
+{
+ $condition = [
+ 'uid' => local_user(),
+ 'self' => false,
+ 'deleted' => false,
+ 'archive' => false,
+ 'blocked' => false,
+ 'pending' => false,
+ 'network' => Protocol::FEED
+ ];
+ $data = Contact::selectToArray([], $condition, ['order' => ['name']]);
+
+ $xml = new \DOMDocument( '1.0', 'utf-8' );
+ $opml = $xml->createElement('opml');
+ $head = $xml->createElement('head');
+ $body = $xml->createElement('body');
+ $outline = $xml->createElement('outline');
+ $outline->setAttribute('title', $a->user['username'] . '\'s RSS/Atom contacts');
+ $outline->setAttribute('text', $a->user['username'] . '\'s RSS/Atom contacts');
+
+ foreach($data as $c) {
+ $entry = $xml->createElement('outline');
+ $entry->setAttribute('title', $c['name']);
+ $entry->setAttribute('text', $c['name']);
+ $entry->setAttribute('xmlUrl', $c['url']);
+ $outline->appendChild($entry);
+ }
+
+ $body->appendChild($outline);
+ $opml->appendChild($head);
+ $opml->appendChild($body);
+ $xml->appendChild($opml);
+ header('Content-Type: text/x-opml');
+ header('Content-Disposition: attachment; filename=feeds.opml');
+ $xml->formatOutput = true;
+ echo $xml->saveXML();
+ die();
+}
+
+
+function opmlexport_addon_settings(App $a, &$s)
+{
+ if (!local_user()) {
+ return;
+ }
+
+ $t = Renderer::getMarkupTemplate('settings.tpl', 'addon/opmlexport/');
+ $s .= Renderer::replaceMacros($t, [
+ '$title' => DI::l10n()->t('OPML Export'),
+ '$submit' => DI::l10n()->t('Export RSS/Atom contacts'),
+ ]);
+}
+
+
+function opmlexport_addon_settings_post(App $a, &$b)
+{
+ if (!local_user() || empty($_POST['opmlexport-submit'])) {
+ return;
+ }
+ opmlexport($a);
+}
diff --git a/opmlexport/templates/settings.tpl b/opmlexport/templates/settings.tpl
new file mode 100644
index 00000000..9f26c512
--- /dev/null
+++ b/opmlexport/templates/settings.tpl
@@ -0,0 +1,12 @@
+
+ {{$title}}
+
+