--- calamares-1.1.2.orig/src/modules/partition/gui/EraseDiskPage.cpp	2015-08-10 16:20:20.000000000 +0200
+++ calamares-1.1.2/src/modules/partition/gui/EraseDiskPage.cpp	2015-08-13 10:32:06.442017396 +0200
@@ -181,24 +181,35 @@
         m_core->createPartitionTable( dev, PartitionTable::msdos );
     }
 
+    qint64 suggestedRootSizeB =
+            ( Calamares::JobQueue::instance()->
+              globalStorage()->
+              value( "requiredStorageGB" ).toDouble() + 0.1 + 20.0 ) GiB;
+
     bool shouldCreateSwap = false;
     qint64 availableSpaceB = ( dev->totalSectors() - firstFreeSector ) * dev->logicalSectorSize();
     qint64 suggestedSwapSizeB = swapSuggestion( availableSpaceB );
-    qint64 requiredSpaceB =
-            ( Calamares::JobQueue::instance()->
-              globalStorage()->
-              value( "requiredStorageGB" ).toDouble() + 0.1 + 2.0 ) GiB +
-            suggestedSwapSizeB;
+    qint64 requiredSpaceB = suggestedRootSizeB + suggestedSwapSizeB;
 
     // If there is enough room for ESP + root + swap, create swap, otherwise don't.
     shouldCreateSwap = availableSpaceB > requiredSpaceB;
 
-    qint64 lastSectorForRoot = dev->totalSectors() - 1; //last sector of the device
-    if ( shouldCreateSwap )
-    {
-        lastSectorForRoot -= suggestedSwapSizeB / dev->logicalSectorSize() + 1;
+    bool shouldCreateHome = false;
+    if ( shouldCreateSwap ) {
+            availableSpaceB -= requiredSpaceB;
+            qint64 suggestedHomeSizeB = 30 GiB;
+            requiredSpaceB += suggestedHomeSizeB;
+
+            // If there is enough room for ESP + root + swap, create swap, otherwise don't.
+            shouldCreateHome = availableSpaceB > requiredSpaceB;
+            if ( !shouldCreateHome ) {
+                    suggestedRootSizeB = availableSpaceB - suggestedSwapSizeB;
+            }
+    } else {
+            suggestedRootSizeB = availableSpaceB;
     }
 
+    qint64 lastSectorForRoot = firstFreeSector + suggestedRootSizeB / dev->logicalSectorSize() - 1;
     Partition* rootPartition = PMUtils::createNewPartition(
         dev->partitionTable(),
         *dev,
@@ -210,21 +221,40 @@
     PartitionInfo::setFormat( rootPartition, true );
     PartitionInfo::setMountPoint( rootPartition, "/" );
     m_core->createPartition( dev, rootPartition );
+    firstFreeSector = firstFreeSector + suggestedRootSizeB / dev->logicalSectorSize();
 
     if ( shouldCreateSwap )
     {
+        qint64 lastSectorForSwap = firstFreeSector + suggestedSwapSizeB / dev->logicalSectorSize() - 1;
         Partition* swapPartition = PMUtils::createNewPartition(
             dev->partitionTable(),
             *dev,
             PartitionRole( PartitionRole::Primary ),
             FileSystem::LinuxSwap,
-            lastSectorForRoot + 1,
-            dev->totalSectors() - 1
+            firstFreeSector,
+            lastSectorForSwap
         );
         PartitionInfo::setFormat( swapPartition, true );
         m_core->createPartition( dev, swapPartition );
+        firstFreeSector = firstFreeSector + suggestedSwapSizeB / dev->logicalSectorSize();
     }
 
+    if ( shouldCreateHome )
+    {
+        Partition* homePartition = PMUtils::createNewPartition(
+            dev->partitionTable(),
+            *dev,
+            PartitionRole( PartitionRole::Primary ),
+            FileSystem::Ext4,
+            firstFreeSector,
+            dev->totalSectors() - 1
+        );
+        PartitionInfo::setFormat( homePartition, true );
+        m_core->createPartition( dev, homePartition );
+    }
+
+    m_core->setBootLoaderInstallPath( dev->deviceNode() );
+
     updatePreviews();
 
     m_core->dumpQueue();
