diff --git a/build.gradle b/build.gradle
index 5337a644f1379b8302fe38f5da553b8aba001c6d..4a40cb65ebf8284207b9cdd76568656a02028827 100644
--- a/build.gradle
+++ b/build.gradle
@@ -107,6 +107,25 @@ def getDate() {
 	return formattedDate
 }
 
+def readGitTags() {
+	def tags = []
+	def proc = "git tag".execute()
+	proc.in.eachLine { line -> tags += line}
+	Collections.reverse( tags )
+
+	tags
+}
+
+ def readGitMessages(String tag, String prevTag) {
+	def message = []
+	def range = (prevTag == null || prevTag == "") ? "$tag" : "$prevTag..$tag"
+	def proc = "git log $range --oneline --no-merges".execute()
+	proc.in.eachLine { line -> message += line }
+	proc.err.eachLine { line -> println line }
+
+	message
+}
+
 // Detailled settings (dependencies, tasks, task configuration, ...)
 
 repositories {
@@ -276,6 +295,25 @@ vagrantDestroy.doFirst {
 
 // Custom task definitions
 
+task changelog << {
+	def fileChangelog = new File('CHANGELOG.md')
+	def tags = ["HEAD"] + readGitTags()
+	def numTags = tags.size();
+	def prevTag
+	def tag
+
+	fileChangelog.delete()
+	for (int i = 0; i < numTags; i++) {
+		tag = tags[i];
+		prevTag = tags[i+1]
+
+		fileChangelog << "- Version ${tag}:\n".replaceAll("Version HEAD", "Upcoming version")
+		def message = readGitMessages(tag, prevTag)
+		message.each{fileChangelog << "  - $it\n"}
+		fileChangelog << "\n"
+	}
+}
+
 task cleanAfterDaily(type: Delete) {
 	delete "$buildDir/dependency-cache"
 	delete "$buildDir/tmp"
@@ -371,7 +409,7 @@ task vagrantPrepare << {
 
 task jarAll(dependsOn: [jar, javadocJar, sourcesJar, staticJar, testJar])
 task buildAll(dependsOn: [jarAll, build])
-task daily(dependsOn: [clean, asciidoctor, check, javadoc, jarAll])
+task daily(dependsOn: [clean, asciidoctor, changelog, check, javadoc, jarAll])
 task release
 
 // task dependencies