diff --git a/apps/external/ajax/seturls.php b/apps/external/ajax/seturls.php
new file mode 100644
index 0000000000..c8e9775454
--- /dev/null
+++ b/apps/external/ajax/seturls.php
@@ -0,0 +1,24 @@
+
+ * This file is licensed under the Affero General Public License version 3 or later.
+ * See the COPYING-README file.
+ */
+
+require_once('../../../lib/base.php');
+OC_Util::checkAdminUser();
+
+if(isset($_POST['s1name'])) OC_Config::setValue( 'external-site1name', $_POST['s1name'] );
+if(isset($_POST['s1url'])) OC_Config::setValue( 'external-site1url', $_POST['s1url'] );
+if(isset($_POST['s2name'])) OC_Config::setValue( 'external-site2name', $_POST['s2name'] );
+if(isset($_POST['s2url'])) OC_Config::setValue( 'external-site2url', $_POST['s2url'] );
+if(isset($_POST['s3name'])) OC_Config::setValue( 'external-site3name', $_POST['s3name'] );
+if(isset($_POST['s3url'])) OC_Config::setValue( 'external-site3url', $_POST['s3url'] );
+if(isset($_POST['s4name'])) OC_Config::setValue( 'external-site4name', $_POST['s4name'] );
+if(isset($_POST['s4url'])) OC_Config::setValue( 'external-site4url', $_POST['s4url'] );
+if(isset($_POST['s5name'])) OC_Config::setValue( 'external-site5name', $_POST['s5name'] );
+if(isset($_POST['s5url'])) OC_Config::setValue( 'external-site5url', $_POST['s5url'] );
+
+echo 'true';
+
+?>
diff --git a/apps/external/appinfo/app.php b/apps/external/appinfo/app.php
new file mode 100644
index 0000000000..df14954d86
--- /dev/null
+++ b/apps/external/appinfo/app.php
@@ -0,0 +1,37 @@
+.
+*
+*/
+
+OC_APP::registerAdmin('external','settings');
+
+OC_App::register( array( 'order' => 70, 'id' => 'external', 'name' => 'External' ));
+
+if(OC_Config::getValue( "external-site1name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index1', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=1', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Config::getValue( "external-site1name", '' )));
+
+if(OC_Config::getValue( "external-site2name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index2', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=2', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Config::getValue( "external-site2name", '' )));
+
+if(OC_Config::getValue( "external-site3name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index3', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=3', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Config::getValue( "external-site3name", '' )));
+
+if(OC_Config::getValue( "external-site4name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index4', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=4', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Config::getValue( "external-site4name", '' )));
+
+if(OC_Config::getValue( "external-site5name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index5', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=5', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Config::getValue( "external-site5name", '' )));
+
diff --git a/apps/external/appinfo/info.xml b/apps/external/appinfo/info.xml
new file mode 100644
index 0000000000..05f5709916
--- /dev/null
+++ b/apps/external/appinfo/info.xml
@@ -0,0 +1,10 @@
+
+
+ external
+ External
+ Show external Application in the ownCloud menu
+ 1.0
+ AGPL
+ Frank Karlitschek
+ 2
+
diff --git a/apps/external/img/external.png b/apps/external/img/external.png
new file mode 100644
index 0000000000..75d1366326
Binary files /dev/null and b/apps/external/img/external.png differ
diff --git a/apps/external/img/external.svg b/apps/external/img/external.svg
new file mode 100644
index 0000000000..b47305fbd0
--- /dev/null
+++ b/apps/external/img/external.svg
@@ -0,0 +1,292 @@
+
+
+
+
diff --git a/apps/external/index.php b/apps/external/index.php
new file mode 100644
index 0000000000..116e16d909
--- /dev/null
+++ b/apps/external/index.php
@@ -0,0 +1,47 @@
+.
+*
+*/
+
+require_once('../../lib/base.php');
+
+// Check if we are a user
+if( !OC_User::isLoggedIn()){
+ header( "Location: ".OC_Helper::linkTo( '', 'index.php' ));
+ exit();
+}
+
+
+if(isset($_GET['id'])){
+
+ $id=$_GET['id'];
+ $id = (int) $id;
+
+ $url=OC_Config::getValue( "external-site".$id."url", '' );
+ OC_App::setActiveNavigationEntry( 'external_index'.$id );
+
+ $tmpl = new OC_Template( 'external', 'frame', 'user' );
+ $tmpl->assign('url',$url);
+ $tmpl->printPage();
+
+}
+
+?>
diff --git a/apps/external/js/admin.js b/apps/external/js/admin.js
new file mode 100644
index 0000000000..6b9b6c6773
--- /dev/null
+++ b/apps/external/js/admin.js
@@ -0,0 +1,68 @@
+$(document).ready(function(){
+
+
+
+ $('#s1name').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s1name" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s1name .msg', data); });
+ });
+
+ $('#s2name').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s2name" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s2name .msg', data); });
+ });
+
+ $('#s3name').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s3name" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s3name .msg', data); });
+ });
+
+ $('#s4name').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s4name" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s4name .msg', data); });
+ });
+
+ $('#s5name').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s5name" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s5name .msg', data); });
+ });
+
+ $('#s1url').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s1url" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s1url .msg', data); });
+ });
+
+ $('#s2url').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s2url" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s2url .msg', data); });
+ });
+
+ $('#s3url').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s3url" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s3url .msg', data); });
+ });
+
+ $('#s4url').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s4url" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s4url .msg', data); });
+ });
+
+ $('#s5url').blur(function(event){
+ event.preventDefault();
+ var post = $( "#s5url" ).serialize();
+ $.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s5url .msg', data); });
+ });
+
+
+});
+
+
diff --git a/apps/external/settings.php b/apps/external/settings.php
new file mode 100644
index 0000000000..ad33c16e1b
--- /dev/null
+++ b/apps/external/settings.php
@@ -0,0 +1,22 @@
+assign('s1name',OC_Config::getValue( "external-site1name", '' ));
+ $tmpl->assign('s2name',OC_Config::getValue( "external-site2name", '' ));
+ $tmpl->assign('s3name',OC_Config::getValue( "external-site3name", '' ));
+ $tmpl->assign('s4name',OC_Config::getValue( "external-site4name", '' ));
+ $tmpl->assign('s5name',OC_Config::getValue( "external-site5name", '' ));
+
+ $tmpl->assign('s1url',OC_Config::getValue( "external-site1url", '' ));
+ $tmpl->assign('s2url',OC_Config::getValue( "external-site2url", '' ));
+ $tmpl->assign('s3url',OC_Config::getValue( "external-site3url", '' ));
+ $tmpl->assign('s4url',OC_Config::getValue( "external-site4url", '' ));
+ $tmpl->assign('s5url',OC_Config::getValue( "external-site5url", '' ));
+
+return $tmpl->fetchPage();
+?>
diff --git a/apps/external/templates/frame.php b/apps/external/templates/frame.php
new file mode 100644
index 0000000000..38b4008353
--- /dev/null
+++ b/apps/external/templates/frame.php
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
diff --git a/apps/external/templates/settings.php b/apps/external/templates/settings.php
new file mode 100644
index 0000000000..a72327d35c
--- /dev/null
+++ b/apps/external/templates/settings.php
@@ -0,0 +1,23 @@
+