diff --git a/mobile/lib/kdeclarativeapplication.cpp b/mobile/lib/kdeclarativeapplication.cpp
index eb8bbca..5e24edd 100644
--- a/mobile/lib/kdeclarativeapplication.cpp
+++ b/mobile/lib/kdeclarativeapplication.cpp
@@ -32,7 +32,7 @@ int staticInitKConfigGroupGui();
 #endif
 
 static inline bool runPreApplicationSetup( const KCmdLineOptions & opts ) {
-  Q_UNUSED( opts );
+
 #ifdef _WIN32_WCE
   QThread::currentThread()->setPriority(QThread::HighPriority);
 #endif
@@ -40,7 +40,7 @@ static inline bool runPreApplicationSetup( const KCmdLineOptions & opts ) {
   //This is needed to get KConfig working with QColor
   staticInitKConfigGroupGui();
 #endif
-    KDeclarativeApplicationBase::preApplicationSetup();
+    KDeclarativeApplicationBase::preApplicationSetup(opts);
     return true; // <-- default value of KApplication(bool) ctor
 }
 
diff --git a/mobile/lib/kdeclarativeapplication.h b/mobile/lib/kdeclarativeapplication.h
index 217dd4e..edeaffa 100644
--- a/mobile/lib/kdeclarativeapplication.h
+++ b/mobile/lib/kdeclarativeapplication.h
@@ -86,7 +86,7 @@ class KDeclarativeApplication : public KDeclarativeApplicationBase
       return 0;
     }
 
-  private:
+  protected:
     T* m_mainView;
 };
 
diff --git a/mobile/mail/kmailmobileoptions.h b/mobile/mail/kmailmobileoptions.h
new file mode 100644
index 0000000..2e1db92
--- /dev/null
+++ b/mobile/mail/kmailmobileoptions.h
@@ -0,0 +1,38 @@
+/*
+* Copyright 2011 Lamarque Souza <lamarque@kde.org>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version.
+*
+* This library 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
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+* 02110-1301  USA
+*/
+
+#ifndef KMAIL_MOBILE_OPTIONS_H
+#define KMAIL_MOBILE_OPTIONS_H
+
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static KCmdLineOptions kmailMobileOptions()
+{
+  KCmdLineOptions options;
+  options.add("t <address>",	ki18n("Send message to 'address'"));
+  options.add("s <subject>",	ki18n("Set subject of message"));
+  options.add("c <address>",	ki18n("Send CC: to 'address'"));
+  options.add("b <address>",	ki18n("Send BCC: to 'address'"));
+  options.add("B <text>",	ki18n("Set body of message"));
+  options.add("A <url>",	ki18n("Add an attachment to the mail. This can be repeated"));
+  return options;
+}
+
+#endif
diff --git a/mobile/mail/main.cpp b/mobile/mail/main.cpp
index df80253..9cb9707 100644
--- a/mobile/mail/main.cpp
+++ b/mobile/mail/main.cpp
@@ -20,9 +20,9 @@
 */
 
 #include "mainview.h"
+#include "kmailmobileoptions.h"
 
 #include <kaboutdata.h>
-#include <kcmdlineargs.h>
 #include <kdeclarativeapplication.h>
 
 #ifdef Q_OS_WINCE
@@ -45,6 +45,31 @@ Q_IMPORT_PLUGIN(akonadi_serializer_kcalcore)
 extern bool ___MailTransport____INIT();
 #endif
 
+class KMailMobileApplication : public KDeclarativeApplication<MainView>
+{
+public:
+  KMailMobileApplication();
+  explicit KMailMobileApplication( const KCmdLineOptions &applicationOptions );
+  virtual int newInstance();
+};
+
+KMailMobileApplication::KMailMobileApplication(): KDeclarativeApplication<MainView>()
+{
+};
+
+KMailMobileApplication::KMailMobileApplication( const KCmdLineOptions &applicationOptions ): KDeclarativeApplication<MainView>( applicationOptions )
+{
+};
+
+int KMailMobileApplication::KMailMobileApplication::newInstance()
+{
+  KDeclarativeApplication<MainView>::newInstance();
+  if ( m_mainView ) {
+    m_mainView->handleCommandLine();
+  }
+  return 0;
+}
+
 int main( int argc, char **argv )
 {
   kWarning() << "Starting main function" << QDateTime::currentDateTime();
@@ -62,7 +87,11 @@ int main( int argc, char **argv )
   aboutData.setProductName( "KMail Mobile" ); //has to match the bugzilla product name
 
   KCmdLineArgs::init( argc, argv, &aboutData );
-  KDeclarativeApplication<MainView> app;
+  KMailMobileApplication app( kmailMobileOptions() );
+
+  if ( !KMailMobileApplication::start() ) {
+     return 0;
+  }
 
   KGlobal::locale()->insertCatalog( "libakonadi-kmime" );
   KGlobal::locale()->insertCatalog( "libmessagecore" );
diff --git a/mobile/mail/mainview.cpp b/mobile/mail/mainview.cpp
index b3ddfdf..427937e 100644
--- a/mobile/mail/mainview.cpp
+++ b/mobile/mail/mainview.cpp
@@ -86,11 +86,13 @@
 #include <kactioncollection.h>
 #include <kcmdlineargs.h>
 #include <kcmultidialog.h>
+#include <kcodecs.h>
 #include <kdebug.h>
 #include <klinkitemselectionmodel.h>
 #include <klocalizedstring.h>
 #include <kmessagebox.h>
 #include <kmime/kmime_message.h>
+#include <kmimetype.h>
 #include <kpimidentities/identity.h>
 #include <kpimidentities/identitymanager.h>
 #include <kselectionproxymodel.h>
@@ -180,6 +182,28 @@ MainView::~MainView()
   }
 }
 
+void MainView::handleCommandLine()
+{
+  KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+  if ( args->isSet("A") ) {
+    QMetaObject::invokeMethod( this, "openComposerAndAttach", Qt::QueuedConnection,
+                               Q_ARG(QString, args->getOption("t")),
+                               Q_ARG(QString, args->getOption("c")),
+                               Q_ARG(QString, args->getOption("b")),
+                               Q_ARG(QString, args->getOption("s")),
+                               Q_ARG(QString, args->getOption("B")),
+                               Q_ARG(QStringList, QStringList() << args->getOptionList("A")) );
+  } else if ( args->isSet("t") ) {
+    QMetaObject::invokeMethod( this, "openComposer", Qt::QueuedConnection,
+                               Q_ARG(QString, args->getOption("t")),
+                               Q_ARG(QString, args->getOption("c")),
+                               Q_ARG(QString, args->getOption("b")),
+                               Q_ARG(QString, args->getOption("s")),
+                               Q_ARG(QString, args->getOption("B")) );
+  }
+}
+
 void MainView::setConfigWidget( ConfigWidget *configWidget )
 {
   Q_ASSERT( configWidget );
@@ -215,6 +239,86 @@ int MainView::openComposer( const QString &to, const QString &cc, const QString
   return 0;
 }
 
+int MainView::openComposerAndAttach( const QString &to, const QString &cc, const QString &bcc,
+                                     const QString &subject, const QString &body,
+                                     const QStringList &attachments )
+{
+  if (attachments.isEmpty()) {
+      return openComposer( to, cc, bcc, subject, body );
+  }
+
+  // Set the multipart message.
+  KMime::Message::Ptr message = KMime::Message::Ptr( new KMime::Message );
+  KMime::Headers::ContentType *ct = message->contentType();
+  ct->setMimeType( "multipart/mixed" );
+  ct->setBoundary( KMime::multiPartBoundary() );
+  ct->setCategory( KMime::Headers::CCcontainer );
+  message->contentTransferEncoding()->clear();
+
+  // Set the headers.
+  message->to()->fromUnicodeString( to, "utf-8" );
+  message->cc()->fromUnicodeString( cc, "utf-8" );
+  message->bcc()->fromUnicodeString( bcc, "utf-8" );
+  message->date()->setDateTime( KDateTime::currentLocalDateTime() );
+  message->subject()->fromUnicodeString( subject, "utf-8" );
+
+  // Set the first multipart, the body message.
+  KMime::Content *bodyMessage = new KMime::Content;
+  bodyMessage->contentType()->setMimeType( "text/plain" );
+  bodyMessage->setBody( body.toUtf8() + "\n\n" );
+  message->addContent( bodyMessage );
+
+  KUrl::List attachURLs = KUrl::List( attachments );
+  for ( KUrl::List::ConstIterator it = attachURLs.constBegin(); it != attachURLs.constEnd(); ++it ) {
+    message->addContent( createAttachment( (*it) ) );
+  }
+
+  message->assemble();
+
+  ComposerView *composer = new ComposerView;
+  composer->setMessage( message );
+  composer->show();
+  composer->setIdentity( currentFolderIdentity() );
+
+  return 0;
+}
+
+KMime::Content *MainView::createAttachment( const KUrl &url ) const
+{
+  KMimeType::Ptr mimeType = KMimeType::findByUrl(url, 0, true);
+  QString fileName = url.toLocalFile();
+  QFile file(fileName);
+
+  if ( !file.open(QIODevice::ReadOnly) ) {
+      kDebug() << "Error opening attachment file" << fileName;
+      return 0;
+  }
+
+  // TODO: abort in case of huge file.
+  qint64 size = file.size();
+  QByteArray contents = file.readAll();
+  file.close();
+
+  if ( contents.size() < size ) {
+      kDebug() << "Short read while attaching file" << fileName;
+  }
+
+  QByteArray coded = KCodecs::base64Encode( contents, true );
+  KMime::Headers::ContentDisposition *d = new KMime::Headers::ContentDisposition;
+  d->setDisposition( KMime::Headers::CDattachment );
+  d->setFilename( fileName.section('/', -1) );
+  d->setDisposition( KMime::Headers::CDattachment );
+
+  KMime::Content *a = new KMime::Content();
+  a->contentType()->fromUnicodeString( mimeType->name(), "utf-8" );
+  a->setHeader( d );
+  a->contentTransferEncoding()->setEncoding( KMime::Headers::CEbase64 );
+  a->contentTransferEncoding()->setDecoded( false );
+  a->setBody( coded + "\n\n" );
+
+  return a;
+}
+
 #define VIEW(model) {                        \
   QTreeView *view = new QTreeView( this );   \
   view->setWindowFlags( Qt::Window );        \
diff --git a/mobile/mail/mainview.h b/mobile/mail/mainview.h
index f137944..8c22527 100644
--- a/mobile/mail/mainview.h
+++ b/mobile/mail/mainview.h
@@ -70,6 +70,15 @@ class MainView : public KDeclarativeMainView
                "      <arg direction=\"in\" type=\"s\" name=\"subject\"/>\n"
                "      <arg direction=\"in\" type=\"s\" name=\"body\"/>\n"
                "    </method>\n"
+               "    <method name=\"openComposerAndAttach\">\n"
+               "      <arg direction=\"out\" type=\"i\"/>\n"
+               "      <arg direction=\"in\" type=\"s\" name=\"to\"/>\n"
+               "      <arg direction=\"in\" type=\"s\" name=\"cc\"/>\n"
+               "      <arg direction=\"in\" type=\"s\" name=\"bcc\"/>\n"
+               "      <arg direction=\"in\" type=\"s\" name=\"subject\"/>\n"
+               "      <arg direction=\"in\" type=\"s\" name=\"body\"/>\n"
+               "      <arg direction=\"in\" type=\"as\" name=\"attachments\"/>\n"
+               "    </method>\n"
                "  </interface>\n"
                        "")
 
@@ -80,6 +89,8 @@ class MainView : public KDeclarativeMainView
 
     ~MainView();
 
+    void handleCommandLine();
+
     enum ForwardMode {
       InLine = 0,
       AsAttachment,
@@ -120,6 +131,13 @@ class MainView : public KDeclarativeMainView
                                    const QString & bcc,
                                    const QString & subject,
                                    const QString & body );
+
+    Q_SCRIPTABLE int openComposerAndAttach( const QString & to,
+                                            const QString & cc,
+                                            const QString & bcc,
+                                            const QString & subject,
+                                            const QString & body,
+                                            const QStringList & attachments );
     void mailActionStateUpdated();
 
   Q_SIGNALS:
@@ -202,6 +220,7 @@ class MainView : public KDeclarativeMainView
     MessageViewer::MessageViewItem *messageViewerItem();
     uint currentFolderIdentity() const;
     QString itemStorageCollectionAsPath( const Akonadi::Item& ) const;
+    KMime::Content *createAttachment( const KUrl &url ) const;
 
     bool mAskingToGoOnline;
     QWidget *mTransportDialog;
