diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2070be7b42af38ca3337eaa78ffc5302e892363f..374a516f634847f6ad30cec17984fb9da6062496 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,9 +4,10 @@ variables:
 stages:
   - build
   - test
+  - publish
 
 build:
-  image: openjdk:8
+  image: openjdk:11
   stage: build
   before_script:
     - ls -lah *
@@ -14,10 +15,18 @@ build:
     - ./gradlew assemble
 
 test:
-  image: openjdk:8
+  image: openjdk:11
   stage: test
   script:
     - ./gradlew test
   artifacts:
     reports:
       junit: relast2uml.tests/build/test-results/test/TEST-*.xml
+
+publish:
+  image: openjdk:11
+  stage: publish
+  script:
+    - "./gradlew publish"
+  only:
+    - master
diff --git a/buildSrc/src/main/groovy/relast2uml.java-publishing-conventions.gradle b/buildSrc/src/main/groovy/relast2uml.java-publishing-conventions.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..a161f5222cd3c407c9bc5059cece73b2670eb407
--- /dev/null
+++ b/buildSrc/src/main/groovy/relast2uml.java-publishing-conventions.gradle
@@ -0,0 +1,54 @@
+plugins {
+  id 'java'
+  id 'idea'
+  id 'com.github.ben-manes.versions'
+  id 'maven-publish'
+}
+
+repositories {
+  mavenCentral()
+}
+
+dependencies {
+  testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${jupiter_version}"
+  testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.18.1'
+  testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupiter_version}"
+}
+
+tasks.named('test') {
+  useJUnitPlatform()
+}
+
+//679
+publishing {
+  publications {
+    maven(MavenPublication) {
+//      artifactId = 'dumpAst | dumpAstWithPlantuml | grammar2uml'
+      groupId = 'de.tudresden.inf.st'
+      from components.java
+//            artifact("build/libs/ragconnect-${version}.jar") {
+//                extension 'jar'
+//            }
+    }
+  }
+  repositories {
+    maven {
+      url "https://git-st.inf.tu-dresden.de/api/v4/projects/679/packages/maven"
+      // Uncomment the following lines to publish manually (and comment out the other credentials section)
+//            credentials(HttpHeaderCredentials) {
+//                name = "Private-Token"
+//                value = gitLabPrivateToken // the variable resides in ~/.gradle/gradle.properties
+//            }
+      credentials(HttpHeaderCredentials) {
+        name = 'Job-Token'
+        value = System.getenv("CI_JOB_TOKEN")
+      }
+      authentication {
+        header(HttpHeaderAuthentication)
+      }
+    }
+
+  }
+}
+
+publish.dependsOn jar
diff --git a/dumpAst/build.gradle b/dumpAst/build.gradle
index 8cff5d0cb3a95d7211bd77647a94c50d7dc089e9..fed51c24c2a36ce7a0b8ded6d3994039453aadc2 100644
--- a/dumpAst/build.gradle
+++ b/dumpAst/build.gradle
@@ -8,6 +8,7 @@ buildscript {
 
 plugins {
     id 'relast2uml.java-jastadd-conventions'
+    id 'relast2uml.java-publishing-conventions'
 }
 
 apply plugin: 'jastadd'
diff --git a/dumpAstWithPlantuml/build.gradle b/dumpAstWithPlantuml/build.gradle
index 3909caaf05428be30b6edb36131432b613b0037f..9105efcaeb2c6bc166a140f04a98e53d2c787063 100644
--- a/dumpAstWithPlantuml/build.gradle
+++ b/dumpAstWithPlantuml/build.gradle
@@ -8,6 +8,7 @@ buildscript {
 
 plugins {
     id 'relast2uml.java-jastadd-conventions'
+    id 'relast2uml.java-publishing-conventions'
 }
 
 apply plugin: 'jastadd'
diff --git a/grammar2uml/build.gradle b/grammar2uml/build.gradle
index 53af6fb58a5743d0cc7eb98086bfb282e8057e0b..c13cd21e8298b8963c07a7ce47201f481717dbfe 100644
--- a/grammar2uml/build.gradle
+++ b/grammar2uml/build.gradle
@@ -9,6 +9,7 @@ buildscript {
 plugins {
     id 'relast2uml.java-jastadd-conventions'
     id 'relast2uml.java-application-conventions'
+    id 'relast2uml.java-publishing-conventions'
 }
 
 apply plugin: 'jastadd'