diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml
index 68d3693014e..5bf2daa302f 100644
--- a/idea/resources/META-INF/plugin-common.xml
+++ b/idea/resources/META-INF/plugin-common.xml
@@ -3371,5 +3371,6 @@
+
\ No newline at end of file
diff --git a/idea/src/org/jetbrains/kotlin/idea/editor/KotlinStripTrailingSpacesFilterFactory.kt b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinStripTrailingSpacesFilterFactory.kt
new file mode 100644
index 00000000000..0fcc39d1ea9
--- /dev/null
+++ b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinStripTrailingSpacesFilterFactory.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.idea.editor
+
+import com.intellij.lang.Language
+import com.intellij.openapi.editor.Document
+import com.intellij.openapi.editor.impl.PsiBasedStripTrailingSpacesFilter
+import com.intellij.psi.PsiFile
+import org.jetbrains.kotlin.idea.KotlinLanguage
+import org.jetbrains.kotlin.psi.KtStringTemplateExpression
+import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
+
+class KotlinStripTrailingSpacesFilterFactory : PsiBasedStripTrailingSpacesFilter.Factory() {
+ override fun isApplicableTo(language: Language): Boolean {
+ return language.`is`(KotlinLanguage.INSTANCE)
+ }
+
+ override fun createFilter(document: Document): PsiBasedStripTrailingSpacesFilter {
+ return KotlinStripTrailingSpacesFilter(document)
+ }
+
+ private class KotlinStripTrailingSpacesFilter(document: Document) : PsiBasedStripTrailingSpacesFilter(document) {
+ override fun process(psiFile: PsiFile) {
+ psiFile.accept(object : KtTreeVisitorVoid() {
+ override fun visitStringTemplateExpression(expression: KtStringTemplateExpression) {
+ disableRange(expression.textRange, false)
+ }
+ })
+ }
+ }
+}
\ No newline at end of file
diff --git a/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt
new file mode 100644
index 00000000000..6e0ce257484
--- /dev/null
+++ b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt
@@ -0,0 +1,4 @@
+val s ="""
+ foo, foo
+ bar, bar
+"""
\ No newline at end of file
diff --git a/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt.after b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt.after
new file mode 100644
index 00000000000..ecd1524ecc6
--- /dev/null
+++ b/idea/testData/editor/stripTrailingSpaces/keepTrailingSpacesInRawString.kt.after
@@ -0,0 +1,4 @@
+val s = """
+ foo, foo
+ bar, bar
+"""
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/StripTrailingSpacesTest.kt b/idea/tests/org/jetbrains/kotlin/idea/editor/StripTrailingSpacesTest.kt
new file mode 100644
index 00000000000..785e23c1472
--- /dev/null
+++ b/idea/tests/org/jetbrains/kotlin/idea/editor/StripTrailingSpacesTest.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.idea.editor
+
+import com.intellij.openapi.editor.ex.EditorSettingsExternalizable
+import com.intellij.openapi.fileEditor.FileDocumentManager
+import com.intellij.psi.PsiDocumentManager
+import com.intellij.testFramework.EditorTestUtil
+import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
+import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
+
+class StripTrailingSpacesTest : LightCodeInsightFixtureTestCase() {
+ override fun getTestDataPath(): String {
+ return PluginTestCaseBase.getTestDataPathBase() + "/editor/stripTrailingSpaces/"
+ }
+
+ fun testKeepTrailingSpacesInRawString() {
+ doTest()
+ }
+
+ fun doTest() {
+ myFixture.configureByFile("${getTestName(true)}.kt")
+
+ val editorSettings = EditorSettingsExternalizable.getInstance()
+ val stripSpaces = editorSettings.stripTrailingSpaces
+ try {
+ editorSettings.stripTrailingSpaces = EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE
+ val doc = myFixture.editor.document
+ EditorTestUtil.performTypingAction(editor, ' ')
+ PsiDocumentManager.getInstance(project).commitDocument(doc)
+ FileDocumentManager.getInstance().saveDocument(doc)
+ } finally {
+ editorSettings.stripTrailingSpaces = stripSpaces
+ }
+
+ myFixture.checkResultByFile("${getTestName(true)}.kt.after")
+ }
+}