diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.cpp
index 99e4e4b630337bef4e6ea966db3025d2e9163f28..ccb8f868f70c5d644cfb2cd801c49f1e9b5f6312 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.cpp
@@ -31,13 +31,22 @@
 
 #include "maemopackagecreationstep.h"
 
+namespace {
+    const char * const MODIFIED_KEY =
+        "Qt4ProjectManager.BuildStep.MaemoPackage.Modified";
+    const char * const LOCAL_FILES_KEY
+        = "Qt4ProjectManager.BuildStep.MaemoPackage.LocalFiles";
+    const char * const REMOTE_FILES_KEY
+        = "Qt4ProjectManager.BuildStep.MaemoPackage.RemoteFiles";
+}
+
 namespace Qt4ProjectManager {
 namespace Internal {
 
 MaemoPackageContents::MaemoPackageContents(MaemoPackageCreationStep *packageStep)
     : QAbstractTableModel(packageStep),
       m_packageStep(packageStep),
-      m_modified(true) // TODO: Has to come from settings
+      m_modified(true)
 {
 }
 
@@ -99,5 +108,32 @@ QVariant MaemoPackageContents::headerData(int section,
     return section == 0 ? tr("Local File Path") : tr("Remote File Path");
 }
 
+QVariantMap MaemoPackageContents::toMap() const
+{
+    QVariantMap map;
+    map.insert(MODIFIED_KEY, m_modified);
+    QStringList localFiles;
+    QStringList remoteFiles;
+    foreach (const Deployable &p, m_deployables) {
+        localFiles << p.localFilePath;
+        remoteFiles << p.remoteFilePath;
+    }
+    map.insert(LOCAL_FILES_KEY, localFiles);
+    map.insert(REMOTE_FILES_KEY, remoteFiles);
+    return map;
+}
+
+void MaemoPackageContents::fromMap(const QVariantMap &map)
+{
+    m_modified = map.value(MODIFIED_KEY).toBool();
+    const QStringList localFiles = map.value(LOCAL_FILES_KEY).toStringList();
+    const QStringList remoteFiles = map.value(REMOTE_FILES_KEY).toStringList();
+    if (localFiles.count() != remoteFiles.count())
+        qWarning("%s: serialized data inconsistent", Q_FUNC_INFO);
+    const int count = qMin(localFiles.count(), remoteFiles.count());
+    for (int i = 0; i < count; ++i)
+        m_deployables << Deployable(localFiles.at(i), remoteFiles.at(i));
+}
+
 } // namespace Qt4ProjectManager
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.h b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.h
index 8dd0728e6ceb7dc74ee425d84fdf68aebf934ffe..8708d3a8fd2daccf8fc2df4cfbe5bd509364e214 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecontents.h
@@ -33,6 +33,7 @@
 #include <QtCore/QAbstractTableModel>
 #include <QtCore/QList>
 #include <QtCore/QString>
+#include <QtCore/QVariantMap>
 
 namespace Qt4ProjectManager {
 namespace Internal {
@@ -62,14 +63,15 @@ public:
 
     virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
 
+    QVariantMap toMap() const;
+    void fromMap(const QVariantMap &map);
+
     Deployable deployableAt(int row) const;
     bool addDeployable(const Deployable &deployable);
     void removeDeployableAt(int row);
     bool isModified() const { return m_modified; }
     void setUnModified() { m_modified = false; }
 
-    // TODO: to/from map
-
 private:
     virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
     virtual QVariant data(const QModelIndex &index,
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp
index ab031f1b3f227d8d4ed99e6c08cff14b48412d99..9969d79711d7ffe149faaa9954e51820e9f91c08 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp
@@ -94,7 +94,13 @@ BuildStep *MaemoPackageCreationFactory::restore(BuildConfiguration *parent,
                StepType type, const QVariantMap &map)
 {
     Q_ASSERT(canRestore(parent, type, map));
-    return new MaemoPackageCreationStep(parent);
+    MaemoPackageCreationStep * const step
+        = new MaemoPackageCreationStep(parent);
+    if (!step->fromMap(map)) {
+        delete step;
+        return 0;
+    }
+    return step;
 }
 
 bool MaemoPackageCreationFactory::canClone(BuildConfiguration *parent,
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp
index e99a708e644f0a5d1676a67f4279673205829509..9916b4d2c0c5b30718e90452ade3d586051fcffa 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp
@@ -87,6 +87,18 @@ bool MaemoPackageCreationStep::init()
     return true;
 }
 
+QVariantMap MaemoPackageCreationStep::toMap() const
+{
+    QVariantMap map(ProjectExplorer::BuildStep::toMap());
+    return map.unite(m_packageContents->toMap());
+}
+
+bool MaemoPackageCreationStep::fromMap(const QVariantMap &map)
+{
+    m_packageContents->fromMap(map);
+    return ProjectExplorer::BuildStep::fromMap(map);
+}
+
 void MaemoPackageCreationStep::run(QFutureInterface<bool> &fi)
 {
     fi.reportResult(createPackage());
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h
index 18b1cca983e3926f05e931310c122bd7bd868024..02f50c1a75201e8605b8d7126d98a7e1a108294d 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h
@@ -76,6 +76,8 @@ private:
     virtual void run(QFutureInterface<bool> &fi);
     virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
     virtual bool immutable() const { return true; }
+    virtual QVariantMap toMap() const;
+    virtual bool fromMap(const QVariantMap &map);
 
     bool createPackage();
     bool runCommand(QProcess &proc, const QString &command);