diff --git a/package.json b/package.json
index 7c31e6f5c528f9954b34b41bd3292a517f2d559f..ed6398c0f68850d5a0a8252b2b4969e76e65c210 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,7 @@
     "lodash": "4.17.10",
     "lodash-es": "4.17.10",
     "markdown-it": "8.4.2",
+    "markdown-it-container": "3.0.0",
     "markdown-it-mathjax": "2.0.0",
     "mathjax": "2.7.x",
     "moment": "2.22.2",
diff --git a/src/components/renderContentComponents/markdownRenderer.tsx b/src/components/renderContentComponents/markdownRenderer.tsx
index b116c76830c1c053a16a787cc141c5439aeeb178..bf875c58b97f3d5678b9498848424375814f259e 100644
--- a/src/components/renderContentComponents/markdownRenderer.tsx
+++ b/src/components/renderContentComponents/markdownRenderer.tsx
@@ -14,6 +14,7 @@ import Logger from "../../helpers/logger";
 
 //because we need mathjax support support in markdown we changed the parser a bit...
 import markdown from '../../helpers/markdownHelper'
+import { markdownPLangBlockDataLangAttribute, markdownPLangBlocksClass } from "../../constants";
 
 //const css = require('./styles.styl');
 
@@ -23,7 +24,8 @@ const mapStateToProps = (rootState: RootState , props: MyProps) => {
   return {
     //test0: rootState...
     //test: props.test
-    ...props
+    ...props,
+    pLangs: rootState.pLangsState.pLangs,
   }
 }
 
@@ -54,6 +56,7 @@ class markdownRenderer extends React.Component<Props, any> {
       //this can happen if the user opens a dialog --> this will be unmounted
       //but dummy won't change anymore (only set to false once when everything is loaded & assets created)
       this.refreshMath();
+      this.removeBlocksForWrongPLang();
     }
 
   }
@@ -62,6 +65,7 @@ class markdownRenderer extends React.Component<Props, any> {
     //see componentDidMount for explanation
     if (this.props.content && this.props.dummy === false) {
       this.refreshMath()
+      this.removeBlocksForWrongPLang();
     }
   }
 
@@ -74,6 +78,36 @@ class markdownRenderer extends React.Component<Props, any> {
     }
   }
 
+  removeBlocksForWrongPLang(): void {
+
+    const plang = this.props.pLangs.find(p => p.id === this.props.plangId)
+
+    const allPLangBlocks = Array.from(document.querySelectorAll(`.${markdownPLangBlocksClass}[${markdownPLangBlockDataLangAttribute}]`))
+
+    for (let i = 0; i < allPLangBlocks.length; i++) {
+      const divBlock = allPLangBlocks[i];
+
+      const langAttribute = divBlock.getAttribute(`${markdownPLangBlockDataLangAttribute}`)
+
+      if (!langAttribute) {
+        divBlock.remove()
+
+      } else {
+        //we have an attribute, check if the block is for the specified lang
+        
+        //no filter or correct lang
+        if (!plang || plang.displayName.trim() === langAttribute.trim()) {
+          //ok
+          continue
+        }
+
+        //else remove
+        divBlock.remove()
+      }
+    }
+
+  }
+
   render(): JSX.Element {
 
 
diff --git a/src/components/renderContentComponents/renderWrapper.tsx b/src/components/renderContentComponents/renderWrapper.tsx
index b8b5a31e5a631236d61d05abb7566dda8a708687..61b4e3ab06e668e0e28d20f1a9873ce63f42d76e 100644
--- a/src/components/renderContentComponents/renderWrapper.tsx
+++ b/src/components/renderContentComponents/renderWrapper.tsx
@@ -33,6 +33,12 @@ export interface MyProps {
    * id used for printing
    */
   readonly printId: string
+
+  /**
+   * some (markdown) blocks might be only for specific languages,
+   * use null to show them all
+   */
+  readonly plangId: number | null
 }
 
 const mapStateToProps = (rootState: RootState, props: MyProps) => {
diff --git a/src/components/sites/doExerciseSite/doExerciseSite.tsx b/src/components/sites/doExerciseSite/doExerciseSite.tsx
index fa54260bcda51e44518167082c3d7f71bc1c7767..c0d4afaab5af74cb5df349aa0788d6615200a975 100644
--- a/src/components/sites/doExerciseSite/doExerciseSite.tsx
+++ b/src/components/sites/doExerciseSite/doExerciseSite.tsx
@@ -1185,6 +1185,7 @@ class doExerciseSite extends React.Component<Props & RouteComponentProps<Matched
                                     assets={this.props.doExercise.exerciseDescription.assets}
                                     dummy={this.props.dummy}
                                     fontSizeInPx={this.props.taskDescriptionFontSizeInPx}
+                                    plangId={this.props.solutionPLangId}
                   />
                 </TabContentHost>
 
@@ -1207,6 +1208,7 @@ class doExerciseSite extends React.Component<Props & RouteComponentProps<Matched
                       contentType={QuestionType.markdown}
                       dummy={this.props.dummy}
                       fontSizeInPx={this.props.taskDescriptionFontSizeInPx}
+                      plangId={null}
                     />
                   </TabContentHost>
                 }
diff --git a/src/components/sites/editCustomProjectSite/editCustomProjectSite.tsx b/src/components/sites/editCustomProjectSite/editCustomProjectSite.tsx
index 6e803761cf33a7f2dee62a3c9cb43ac9ffc82aea..20bbaeb6a6c73067c76910a1aacf74f5e56a5a30 100644
--- a/src/components/sites/editCustomProjectSite/editCustomProjectSite.tsx
+++ b/src/components/sites/editCustomProjectSite/editCustomProjectSite.tsx
@@ -534,6 +534,7 @@ class editCustomProjectSite extends React.Component<Props & RouteComponentProps<
                                     assets={this.props.customProjectDescription.assets}
                                     dummy={false /*not needed because we have tabs that will re render if tab index changed*/}
                                     fontSizeInPx={this.props.taskDescriptionFontSizeInPx}
+                                    plangId={null}
                   />
                 </TabContentHost>
 
diff --git a/src/components/sites/exerciseEditorSite/exerciseEditorSite.tsx b/src/components/sites/exerciseEditorSite/exerciseEditorSite.tsx
index 377627e4c99451f41c7d154ca8afb3b308fc0641..b8215d48ce4d3a87ef0e6ca95875dcffc99eea17 100644
--- a/src/components/sites/exerciseEditorSite/exerciseEditorSite.tsx
+++ b/src/components/sites/exerciseEditorSite/exerciseEditorSite.tsx
@@ -495,6 +495,7 @@ class exerciseEditorSite extends React.Component<Props & RouteComponentProps<Mat
                                     assets={this.props.editorExercise.exerciseDescription.assets}
                                     dummy={false /*not needed because we have tabs that will re render if tab index changed*/}
                                     fontSizeInPx={this.props.taskDescriptionFontSizeInPx}
+                                    plangId={null}
                   />
                 </TabContentHost>
 
diff --git a/src/components/sites/exerciseEditorSite/exerciseSyntaxHelpPanel/exerciseSyntaxHelpPanelView.tsx b/src/components/sites/exerciseEditorSite/exerciseSyntaxHelpPanel/exerciseSyntaxHelpPanelView.tsx
index 58ebafe5c75e45eee7d399b7066e9c95a062096d..7385d91d57827be4d4389f6ecde8314f0e014afc 100644
--- a/src/components/sites/exerciseEditorSite/exerciseSyntaxHelpPanel/exerciseSyntaxHelpPanelView.tsx
+++ b/src/components/sites/exerciseEditorSite/exerciseSyntaxHelpPanel/exerciseSyntaxHelpPanelView.tsx
@@ -43,7 +43,7 @@ class exerciseSyntaxHelpPanelView extends React.Component<Props, any> {
     }
 
     return (
-      <div className="fh">
+      <div className="fh markdown-guide">
         <div dangerouslySetInnerHTML={content}>
 
         </div>
diff --git a/src/components/sites/exerciseEditorSite/previewPanel/previewPanelView.tsx b/src/components/sites/exerciseEditorSite/previewPanel/previewPanelView.tsx
index 5cd85a4fe0e362909c5dc91e2cfdeb2308796261..56a785cd51bde51603804df3952d48367b6fe45d 100644
--- a/src/components/sites/exerciseEditorSite/previewPanel/previewPanelView.tsx
+++ b/src/components/sites/exerciseEditorSite/previewPanel/previewPanelView.tsx
@@ -29,6 +29,12 @@ export interface MyProps {
   readonly fontSizeInPx: number
 
   readonly printId: string
+
+  /**
+   * some (markdown) blocks might be only for specific languages,
+   * use null to show them all
+   */
+  readonly plangId: number | null
 }
 
 const mapStateToProps = (rootState: RootState, props: MyProps) => {
@@ -87,6 +93,7 @@ class PreviewPanelView extends React.Component<Props, any> {
             assets={this.props.assets}
             dummy={this.props.dummy}
             fontSizeInPx={this.props.fontSizeInPx}
+            plangId={this.props.plangId}
           />
         }
 
diff --git a/src/components/sites/manageOwnOrGroupExerciseComponents/releasesSite/listView.tsx b/src/components/sites/manageOwnOrGroupExerciseComponents/releasesSite/listView.tsx
index b6cf376f55688f2051fa15f67674a5709cd64177..b8dc7c2b14a46267a3a5637c1704a4ec1e37ef9d 100644
--- a/src/components/sites/manageOwnOrGroupExerciseComponents/releasesSite/listView.tsx
+++ b/src/components/sites/manageOwnOrGroupExerciseComponents/releasesSite/listView.tsx
@@ -29,6 +29,7 @@ import {MyPopup} from "../../../helpers/myPopup";
 import {getI18n} from "../../../../../i18n/i18nRoot";
 import PaginationTableFooter from '../../../helpers/paginationTableFooter'
 import {ReleaseDurationType} from '../../../../types/ReleaseDurationType'
+import {ExercisePreviewFromBackend} from '../../../../types/exercisePreview'
 
 //const css = require('./styles.styl');
 
@@ -50,7 +51,8 @@ const mapStateToProps = (rootState: RootState /*, props: MyProps*/) => {
     pagination: rootState.releaseSiteState.pagination,
 
     groupRole: rootState.releaseSiteState.groupRole,
-    langId: rootState.i18nState.langId
+    langId: rootState.i18nState.langId,
+    pLangs: rootState.pLangsState.pLangs,
   }
 }
 
@@ -217,7 +219,24 @@ class ListView extends React.Component<Props, any> {
               </Table.HeaderCell>
 
               <Table.HeaderCell>
+                <span className="clickable"
+                      onClick={() => {
+                        this.props.setSortByKey('pLangId',
+                          rotateSorting<ExerciseReleaseFromBackend>(this.props.sortDirection,
+                            this.props.sortByKey,
+                            'pLangId',
+                          )
+                        )
+                      }}
+                >
+                  {
+                    <HelpPopup icon="puzzle piece"
+                               defaultText={getI18n(this.props.langId,'Programming language')}/>
+                  }
+                </span>
+              </Table.HeaderCell>
 
+              <Table.HeaderCell>
                 <span>
                   {
                     getI18n(this.props.langId, 'Miscellaneous')
@@ -291,6 +310,7 @@ class ListView extends React.Component<Props, any> {
             {
               list.map((exerciseRelease, index) => {
 
+                let programmingLanguageForRelease = this.props.pLangs.find(p => p.id === exerciseRelease.pLangId)
 
                 // tslint:disable-next-line
                 let editNode = null
@@ -445,6 +465,15 @@ class ListView extends React.Component<Props, any> {
 
                     </Table.Cell>
 
+                    <Table.Cell>
+                      {
+                        programmingLanguageForRelease &&
+                        <span>
+                          { programmingLanguageForRelease.displayName }
+                        </span>
+                      }
+                    </Table.Cell>
+
                     <Table.Cell>
 
                       <div>
diff --git a/src/components/sites/tutorViewSite/tutorViewSite.tsx b/src/components/sites/tutorViewSite/tutorViewSite.tsx
index 741556a44bdb7d928787f03d6d96118ad6de96aa..8cb9c0009aef7b70770ff56109229cce4b80192d 100644
--- a/src/components/sites/tutorViewSite/tutorViewSite.tsx
+++ b/src/components/sites/tutorViewSite/tutorViewSite.tsx
@@ -451,6 +451,7 @@ class tutorViewSite extends React.Component<Props & RouteComponentProps<MatchedP
                                     assets={this.props.exercise.exerciseDescription.assets}
                                     dummy={this.props.dummy}
                                     fontSizeInPx={this.props.taskDescriptionFontSizeInPx}
+                                    plangId={null}
                   />
 
                 </TabContentHost>
@@ -497,6 +498,7 @@ class tutorViewSite extends React.Component<Props & RouteComponentProps<MatchedP
                         contentType={QuestionType.markdown}
                         dummy={this.props.dummy}
                         fontSizeInPx={this.props.taskDescriptionFontSizeInPx}
+                        plangId={null}
                       />
                     </div>
                   }
diff --git a/src/constants.ts b/src/constants.ts
index 30d523434defa68bc8eee95d193dd05b0841fcc7..fa0a7369840eb55d4f206b4ff4c52264ed2ddcd3 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -13,7 +13,7 @@ import Logger from './helpers/logger'
  * y - breaking changes / new features
  * z - fixes, small changes
  */
-export const versionString = '2.18.0'
+export const versionString = '2.18.1'
 
 
 export const supportMail = 'yapex@informatik.uni-halle.de'
@@ -404,3 +404,6 @@ export const dashboardRefreshIntervalInS = 5
 
 //used for all tests
 export const compileTimeoutDefaultsInMs = 3000
+
+export const markdownPLangBlocksClass = `plang-part`
+export const markdownPLangBlockDataLangAttribute = `data-programming-lang`
\ No newline at end of file
diff --git a/src/helpers/markdownHelper.ts b/src/helpers/markdownHelper.ts
index bbb50f1d3d63f987e35fbb9f6240bada7748240f..395ac2721462bb7fa4ae7abc652226ea423d5a3a 100644
--- a/src/helpers/markdownHelper.ts
+++ b/src/helpers/markdownHelper.ts
@@ -2,6 +2,7 @@ import * as markdownIt from 'markdown-it'
 import {insertLineNumbers} from './stringHelper'
 import Logger from './logger'
 import {copyToClipboard} from './clipboard'
+import { markdownPLangBlockDataLangAttribute, markdownPLangBlocksClass } from '../constants'
 
 const hljs = require('highlight.js/lib/highlight')
 
@@ -257,6 +258,24 @@ const mdRenderer = markdownIt({
                                 }
                               })
   .use(require('markdown-it-mathjax')())
+  .use(require('markdown-it-container'), 'exercise-lang-block', { //by default div class="exercise-lang-block" is rendered
+    validate: (params: string) => {
+      return params.trim().match(/lang\s+[\w ]+/)
+    },
+    render: (tokens: ReadonlyArray<any>, idx: number) => {
+      let m = tokens[idx].info.trim().substr(`lang`.length).trim().match(/^[\w ]+$/);
+
+      if (tokens[idx].nesting === 1) {
+        // opening tag
+        
+        //div class="..." with data attribute to identify lang
+        return `<div class="${markdownPLangBlocksClass}" ${markdownPLangBlockDataLangAttribute}="${mdRenderer.utils.escapeHtml(m[0])}">\n`;
+      } else {
+        // closing tag
+        return '</div>\n';
+      }
+    }
+  })
 
 //https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md
 const oldLinkRule = function (tokens: any, idx: any, options: any, env: any, self: any): any {
diff --git a/src/questionSystem/exerciseQuestionSyntaxGuide.md b/src/questionSystem/exerciseQuestionSyntaxGuide.md
index 99e3109ab18c745f37bc96e2836f3ed657f00245..50824f4d28ab3043668832b20dc1028a0da80896 100644
--- a/src/questionSystem/exerciseQuestionSyntaxGuide.md
+++ b/src/questionSystem/exerciseQuestionSyntaxGuide.md
@@ -66,6 +66,28 @@ class Main {
 
 Für eine List mit Sprachen siehe Abschnitt `Syntax highlighting unterstützte Sprachen` (ganz unten) 
 
+### Programmiersprachenspezifische Anmerkungen
+
+Für Anmerkungen/Markdown, welche nur für eine spezielle Programmiersprache angezeigt werden sollen, kann man folgendermaßen vorgehen:
+
+```
+::: lang [Programmiersprache, wie sie in der Oberfläche angezeigt wird (nicht interner Name)]
+:::
+```
+
+also z.b.
+
+```
+::: lang Java
+Dieser Hinweis wird **nur** für `Java` angezeigt.
+:::
+```
+
+in diesen Blöcken kann wieder Markdown verwendet werden.
+
+Die Lister der Programmiersprachen hängt von der Konfiguration ab.
+Diese Liste ist z.B. beim freigeben einer Aufgabe zu finden oder beim Erstellen von eigenen Projekten.
+
 
 * ### Pdf (pdf)
 Es kann **eine** Url zu einem Pdf angegeben werden. Die Url muss dabei eine Asset-Url sein (beginnt mit asset://).
diff --git a/src/styles/common.styl b/src/styles/common.styl
index 42185cf2d6e2dafc110747e154cb0002678fe8db..794cfc9e7321beb5c2a225b93e40aea6e14d742a 100644
--- a/src/styles/common.styl
+++ b/src/styles/common.styl
@@ -1612,3 +1612,6 @@ $sonarEase = linear
 }
 
 
+.markdown-guide pre {
+  overflow: auto;
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 7d263cd6fbf83fce875fafca1b7f89de6feb5675..cc4e299b974666552dcbe6c107e00bb251c2c02f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3722,6 +3722,11 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
+markdown-it-container@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz#1d19b06040a020f9a827577bb7dbf67aa5de9a5b"
+  integrity sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==
+
 markdown-it-mathjax@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/markdown-it-mathjax/-/markdown-it-mathjax-2.0.0.tgz#ae2b4f4c5c719a03f9e475c664f7b2685231d9e9"