diff --git a/models/db.js b/models/db.js
index 48746476cd25f4511ed51c83b714d89d9c3ac865..cda2c32064dc548ef4e0379f65e07afb1d4c5eb2 100644
--- a/models/db.js
+++ b/models/db.js
@@ -1,7 +1,4 @@
-//'use strict';
-
-//var mongoose = require('mongoose');
-//const sqlite3 = require('sqlite3').verbose();
+const Umzug = require('umzug');
 
 function sequel_log(a,b,c) {
   console.log(a);
@@ -81,13 +78,13 @@ module.exports = {
     height: Sequelize.INTEGER,
     background_color: Sequelize.STRING,
     background_uri: Sequelize.STRING,
-    
+
     created_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW},
     updated_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW},
     thumbnail_url: Sequelize.STRING,
     thumbnail_updated_at: {type: Sequelize.DATE}
   }),
-  
+
   Membership: sequelize.define('membership', {
     _id: {type: Sequelize.STRING, primaryKey: true},
     space_id: Sequelize.STRING,
@@ -98,7 +95,7 @@ module.exports = {
     created_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW},
     updated_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW}
   }),
-  
+
   Message: sequelize.define('message', {
     _id: {type: Sequelize.STRING, primaryKey: true},
     space_id: Sequelize.STRING,
@@ -108,7 +105,7 @@ module.exports = {
     created_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW},
     updated_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW}
   }),
-  
+
   Artifact: sequelize.define('artifact', {
     _id: {type: Sequelize.STRING, primaryKey: true},
     space_id: Sequelize.STRING,
@@ -121,7 +118,7 @@ module.exports = {
     last_update_editor_name: Sequelize.STRING,
     description: Sequelize.TEXT,
     state: {type: Sequelize.STRING, default: "idle"},
-    
+
     //linked_to: Sequelize.STRING,
     title: Sequelize.STRING,
     tags: Sequelize.TEXT,
@@ -142,16 +139,16 @@ module.exports = {
     //}],
 
     control_points: Sequelize.TEXT,
-    
+
     group: Sequelize.STRING,
     locked: {type: Sequelize.BOOLEAN, default: false},
-    
+
     payload_uri: Sequelize.STRING,
     payload_thumbnail_web_uri: Sequelize.STRING,
     payload_thumbnail_medium_uri: Sequelize.STRING,
     payload_thumbnail_big_uri: Sequelize.STRING,
     payload_size: Sequelize.INTEGER, // file size in bytes
-    
+
     fill_color: {type: Sequelize.STRING, default: "transparent"},
     stroke_color: {type: Sequelize.STRING, default: "#000000"},
     text_color: Sequelize.STRING,
@@ -176,7 +173,7 @@ module.exports = {
     border_radius: Sequelize.INTEGER,
     align: {type: Sequelize.STRING, default: "left"},
     valign: {type: Sequelize.STRING, default: "top"},
-    
+
     brightness: Sequelize.DECIMAL,
     contrast: Sequelize.DECIMAL,
     saturation: Sequelize.DECIMAL,
@@ -185,7 +182,7 @@ module.exports = {
     opacity: Sequelize.DECIMAL,
 
     payload_alternatives: Sequelize.TEXT,
-    
+
     /*payload_alternatives: [{
       mime: String,
       payload_uri: String,
@@ -194,12 +191,12 @@ module.exports = {
       payload_thumbnail_big_uri: String,
       payload_size: Number
     }],*/
-    
+
     created_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW},
     updated_at: {type: Sequelize.DATE, defaultValue: Sequelize.NOW}
   }),
-    
-  init: function() {
+
+  init: async function() {
     User = this.User;
     Session = this.Session;
     Space = this.Space;
@@ -220,49 +217,69 @@ module.exports = {
       },
       as: 'user'
     });
-    
+
     Membership.belongsTo(Space, {
       foreignKey: {
         name: 'space_id'
       },
       as: 'space'
     });
-    
+
     Artifact.belongsTo(User, {
       foreignKey: {
         name: 'user_id'
       },
       as: 'user'
     });
-    
+
     Artifact.belongsTo(Space, {
       foreignKey: {
         name: 'space_id'
       },
       as: 'space'
     });
-    
+
     Message.belongsTo(User, {
       foreignKey: {
         name: 'user_id'
       },
       as: 'user'
     });
-    
+
     Message.belongsTo(Space, {
       foreignKey: {
         name: 'space_id'
       },
       as: 'space'
     });
-    
-    sequelize.sync();
+
+    await sequelize.sync();
+
+    var umzug = new Umzug({
+        storage: 'sequelize',
+        storageOptions: {
+            sequelize: sequelize
+        },
+        migrations: {
+            params: [
+                sequelize.getQueryInterface(),
+                Sequelize
+            ],
+            path: './models/migrations',
+            pattern: /\.js$/
+        }
+    });
+
+    umzug.up().then(function(migrations)  {
+      console.log('Migration complete up!');
+    });
+
   },
 
   getUserRoleInSpace: (originalSpace, user, cb) => {
     originalSpace.path = [];
     console.log("getUserRoleInSpace",originalSpace._id,user._id,user.home_folder_id);
-    
+
     if (originalSpace._id == user.home_folder_id || (originalSpace.creator_id && originalSpace.creator_id == user._id)) {
       cb("admin");
     } else {
diff --git a/models/migrations/01-spaces-delete-cascade.js b/models/migrations/01-spaces-delete-cascade.js
new file mode 100644
index 0000000000000000000000000000000000000000..a1c2f4624edbfff666445a88d7d71f32da1e31db
--- /dev/null
+++ b/models/migrations/01-spaces-delete-cascade.js
@@ -0,0 +1,80 @@
+'use strict';
+
+module.exports = {
+  up: function(migration, DataTypes) {
+    return [
+      migration.changeColumn('memberships', 'space_id',
+        {
+          type: DataTypes.STRING,
+          references: {
+            model: 'spaces',
+            key: '_id'
+          },
+          onDelete: 'CASCADE',
+          onUpdate: 'CASCADE'
+        }
+      ),
+      migration.changeColumn('artifacts', 'space_id',
+        {
+          type: DataTypes.STRING,
+          references: {
+            model: 'spaces',
+            key: '_id'
+          },
+          onDelete: 'CASCADE',
+          onUpdate: 'CASCADE'
+        }
+      ),
+      migration.changeColumn('messages', 'space_id',
+        {
+          type: DataTypes.STRING,
+          references: {
+            model: 'spaces',
+            key: '_id'
+          },
+          onDelete: 'CASCADE',
+          onUpdate: 'CASCADE'
+        }
+      )
+    ]
+  },
+
+  down: function(migration, DataTypes) {
+    return [
+      migration.changeColumn('memberships', 'space_id',
+        {
+          type: DataTypes.STRING,
+          references: {
+            model: 'spaces',
+            key: '_id'
+          },
+          onDelete: 'CASCADE',
+          onUpdate: 'NO ACTION'
+        }
+      ),
+      ,
+      migration.changeColumn('artifacts', 'space_id',
+        {
+          type: DataTypes.STRING,
+          references: {
+            model: 'spaces',
+            key: '_id'
+          },
+          onDelete: 'CASCADE',
+          onUpdate: 'NO ACTION'
+        }
+      ),
+      migration.changeColumn('messages', 'space_id',
+        {
+          type: DataTypes.STRING,
+          references: {
+            model: 'spaces',
+            key: '_id'
+          },
+          onDelete: 'CASCADE',
+          onUpdate: 'NO ACTION'
+        }
+      )
+    ]
+  }
+};
diff --git a/package.json b/package.json
index 2dae5c8e7d2d42059b807f24043020f145fd3738..e77faba46f911af133fca1c2d23b72c7875ca4bc 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
     "slug": "0.9.1",
     "sqlite3": "^4.0.0",
     "swig": "1.4.2",
+    "umzug": "^2.1.0",
     "underscore": "1.8.3",
     "uuid": "^3.2.1",
     "validator": "7.0.0",