diff --git a/SparkleShare/Common/HTML/meson.build b/SparkleShare/Common/HTML/meson.build
new file mode 100644
index 00000000..a01198de
--- /dev/null
+++ b/SparkleShare/Common/HTML/meson.build
@@ -0,0 +1,10 @@
+html_files = ['event-log.html',
+ 'day-entry.html',
+ 'event-entry.html',
+ 'jquery.js'
+]
+
+install_data(
+ sources: html_files,
+ install_dir: join_paths(install_dir, 'html'))
+
diff --git a/SparkleShare/Common/Images/meson.build b/SparkleShare/Common/Images/meson.build
new file mode 100644
index 00000000..226fb4c1
--- /dev/null
+++ b/SparkleShare/Common/Images/meson.build
@@ -0,0 +1,10 @@
+image_files = ['tutorial-slide-1.png',
+ 'tutorial-slide-2.png',
+ 'side-splash.png',
+ 'about.png',
+ 'text-balloon.png']
+
+install_data(
+ sources: image_files,
+ install_dir: join_paths(install_dir, 'pixmaps'))
+
diff --git a/SparkleShare/Common/Presets/meson.build b/SparkleShare/Common/Presets/meson.build
new file mode 100644
index 00000000..8885f44f
--- /dev/null
+++ b/SparkleShare/Common/Presets/meson.build
@@ -0,0 +1,11 @@
+preset_files = ['github.xml', 'github.png',
+ 'gitlab.xml', 'gitlab.png',
+ 'bitbucket.xml', 'bitbucket.png',
+ 'planio.xml', 'planio.png',
+ 'own-server.xml', 'own-server.png'
+]
+
+install_data(
+ sources: preset_files,
+ install_dir: join_paths(install_dir, 'presets'))
+
diff --git a/SparkleShare/Linux/Images/icons/meson.build b/SparkleShare/Linux/Images/icons/meson.build
new file mode 100644
index 00000000..6577887a
--- /dev/null
+++ b/SparkleShare/Linux/Images/icons/meson.build
@@ -0,0 +1,8 @@
+install_subdir(
+ 'hicolor',
+ install_dir: join_paths(install_dir, 'icons'))
+
+install_subdir(
+ 'hicolor',
+ install_dir: join_paths(install_dir, 'icons'))
+
diff --git a/SparkleShare/Linux/Images/meson.build b/SparkleShare/Linux/Images/meson.build
new file mode 100644
index 00000000..b0157076
--- /dev/null
+++ b/SparkleShare/Linux/Images/meson.build
@@ -0,0 +1,6 @@
+image_files = ['tutorial-slide-3.png']
+
+install_data(
+ sources: image_files,
+ install_dir: join_paths(install_dir, 'pixmaps'))
+
diff --git a/SparkleShare/Linux/meson.build b/SparkleShare/Linux/meson.build
new file mode 100644
index 00000000..5239f4de
--- /dev/null
+++ b/SparkleShare/Linux/meson.build
@@ -0,0 +1,55 @@
+sparkleshare_src = ['../Common/SparkleShare.cs',
+ '../Common/AboutController.cs',
+ '../Common/Avatars.cs',
+ '../Common/BubblesController.cs',
+ '../Common/BaseController.cs',
+ '../Common/EventLogController.cs',
+ '../Common/NoteController.cs',
+ '../Common/SetupController.cs',
+ '../Common/StatusIconController.cs',
+ 'About.cs',
+ 'Bubbles.cs',
+ 'Controller.cs',
+ 'EventLog.cs',
+ 'Note.cs',
+ 'Setup.cs',
+ 'SetupWindow.cs',
+ 'StatusIcon.cs',
+ 'UserInterface.cs',
+ 'UserInterfaceHelpers.cs']
+
+gtk = dependency('gtk-sharp-3.0')
+gdk = dependency('gdk-sharp-3.0')
+gio = dependency('gio-sharp-3.0')
+glib = dependency('glib-sharp-3.0')
+webkit = dependency('webkit2-sharp-4.0')
+notify = dependency('notify-sharp-3.0')
+
+sparkleshare = executable('SparkleShare',
+ dependencies: [gtk, gdk, gio, glib, webkit, notify],
+ link_with: [sparkles, sparkles_git],
+ cs_args: '-r:Mono.Posix',
+ sources: sparkleshare_src,
+ install: true,
+ install_dir: install_dir)
+
+# Install the startup script
+install_data(sources: 'sparkleshare', install_dir: '/bin')
+
+# Install .desktop and .appdata files
+install_data(sources: 'org.sparkleshare.SparkleShare.desktop', install_dir: join_paths('share', 'applications'))
+install_data(sources: 'org.sparkleshare.SparkleShare.Invites.desktop', install_dir: join_paths('share', 'applications'))
+install_data(sources: 'SparkleShare.Autostart.desktop', install_dir: join_paths('share', 'applications'))
+install_data(sources: 'org.sparkleshare.SparkleShare.appdata.xml', install_dir: join_paths('share', 'appdata'))
+
+subdir('Images')
+subdir('Images/icons')
+
+
+# TODO:
+# - preprocess startup script, and InstallationInfo.Directory.cs.in
+# - special Ubuntu icons. custom icons to right location
+# - preprocess InstallationInfo.Directory.cs.in
+# - Keep around bump version script
+# - update .desktop file database and icon cache
+
diff --git a/SparkleShare/meson.build b/SparkleShare/meson.build
new file mode 100644
index 00000000..836abb75
--- /dev/null
+++ b/SparkleShare/meson.build
@@ -0,0 +1,5 @@
+subdir('Linux')
+subdir('Common/Images')
+subdir('Common/HTML')
+subdir('Common/Presets')
+
diff --git a/Sparkles/Git/meson.build b/Sparkles/Git/meson.build
new file mode 100644
index 00000000..5022a4a4
--- /dev/null
+++ b/Sparkles/Git/meson.build
@@ -0,0 +1,10 @@
+sparkles_git_src = ['GitCommand.cs',
+ 'GitFetcher.cs',
+ 'GitRepository.cs']
+
+sparkles_git = library('Sparkles.Git',
+ link_with: sparkles,
+ sources: sparkles_git_src,
+ install: true,
+ install_dir: install_dir)
+
diff --git a/Sparkles/meson.build b/Sparkles/meson.build
new file mode 100644
index 00000000..42fa02ac
--- /dev/null
+++ b/Sparkles/meson.build
@@ -0,0 +1,31 @@
+sparkles_src = ['AuthenticationInfo.cs',
+ 'BaseFetcher.cs',
+ 'BaseListener.cs',
+ 'BaseRepository.cs',
+ 'ChangeSet.cs',
+ 'Command.cs',
+ 'Configuration.cs',
+ 'Extensions.cs',
+ 'InstallationInfo.cs',
+ 'InstallationInfo.Directory.cs',
+ 'Invite.cs',
+ 'ListenerFactory.cs',
+ 'Logger.cs',
+ 'Preset.cs',
+ 'SSHAuthenticationInfo.cs',
+ 'SSHCommand.cs',
+ 'SSHFetcher.cs',
+ 'TcpListener.cs',
+ 'User.cs',
+ 'Watcher.cs']
+
+# generator = custom_target('replace',
+# input: 'InstallationInfo.Directory.cs.in',
+# output: 'InstallationInfo.Directory.cs',
+# command: ['sed', 's/@VERSION@/2.0.1/g @INPUT@', '@OUTPUT@'])
+
+sparkles = library('Sparkles',
+ sources: sparkles_src,
+ install: true,
+ install_dir: install_dir)
+
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000..f6f0020b
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,8 @@
+project('SparkleShare', 'cs')
+
+install_dir = 'share/sparkleshare'
+
+subdir('Sparkles')
+subdir('Sparkles/Git')
+subdir('SparkleShare')
+