diff --git a/SOURCES/konsole-avoid-pasting-control-characters.patch b/SOURCES/konsole-avoid-pasting-control-characters.patch
new file mode 100644
index 0000000..c41b747
--- /dev/null
+++ b/SOURCES/konsole-avoid-pasting-control-characters.patch
@@ -0,0 +1,291 @@
+diff --git a/src/Emulation.cpp b/src/Emulation.cpp
+index 02ed4be..80d93ba 100644
+--- a/src/Emulation.cpp
++++ b/src/Emulation.cpp
+@@ -39,6 +39,7 @@ Emulation::Emulation() :
+     _decoder(0),
+     _keyTranslator(0),
+     _usesMouse(false),
++    _bracketedPasteMode(false),
+     _imageSizeInitialized(false)
+ {
+     // create screens with a default size
+@@ -52,6 +53,8 @@ Emulation::Emulation() :
+     // listen for mouse status changes
+     connect(this , SIGNAL(programUsesMouseChanged(bool)) ,
+             SLOT(usesMouseChanged(bool)));
++    connect(this , SIGNAL(programBracketedPasteModeChanged(bool)) ,
++            SLOT(bracketedPasteModeChanged(bool)));
+ }
+ 
+ bool Emulation::programUsesMouse() const
+@@ -64,6 +67,16 @@ void Emulation::usesMouseChanged(bool usesMouse)
+     _usesMouse = usesMouse;
+ }
+ 
++bool Emulation::programBracketedPasteMode() const
++{
++    return _bracketedPasteMode;
++}
++
++void Emulation::bracketedPasteModeChanged(bool bracketedPasteMode)
++{
++    _bracketedPasteMode = bracketedPasteMode;
++}
++
+ ScreenWindow* Emulation::createWindow()
+ {
+     ScreenWindow* window = new ScreenWindow();
+diff --git a/src/Emulation.h b/src/Emulation.h
+index aa24d69..966b423 100644
+--- a/src/Emulation.h
++++ b/src/Emulation.h
+@@ -215,6 +215,8 @@ public:
+      */
+     bool programUsesMouse() const;
+ 
++    bool programBracketedPasteMode() const;
++
+ public slots:
+ 
+     /** Change the size of the emulation's image */
+@@ -314,6 +316,8 @@ signals:
+      */
+     void programUsesMouseChanged(bool usesMouse);
+ 
++    void programBracketedPasteModeChanged(bool bracketedPasteMode);
++
+     /**
+      * Emitted when the contents of the screen image change.
+      * The emulation buffers the updates from successive image changes,
+@@ -474,8 +478,11 @@ private slots:
+ 
+     void usesMouseChanged(bool usesMouse);
+ 
++    void bracketedPasteModeChanged(bool bracketedPasteMode);
++
+ private:
+     bool _usesMouse;
++    bool _bracketedPasteMode;
+     QTimer _bulkTimer1;
+     QTimer _bulkTimer2;
+     bool _imageSizeInitialized;
+diff --git a/src/Session.cpp b/src/Session.cpp
+index 2d8ca89..68e8ef7 100644
+--- a/src/Session.cpp
++++ b/src/Session.cpp
+@@ -326,6 +326,11 @@ void Session::addView(TerminalDisplay* widget)
+ 
+     widget->setUsesMouse(_emulation->programUsesMouse());
+ 
++    connect(_emulation, SIGNAL(programBracketedPasteModeChanged(bool)),
++            widget, SLOT(setBracketedPasteMode(bool)));
++
++    widget->setBracketedPasteMode(_emulation->programBracketedPasteMode());
++
+     widget->setScreenWindow(_emulation->createWindow());
+ 
+     //connect view signals and slots
+diff --git a/src/TerminalDisplay.cpp b/src/TerminalDisplay.cpp
+index 871dc9f..be80e7c 100644
+--- a/src/TerminalDisplay.cpp
++++ b/src/TerminalDisplay.cpp
+@@ -51,6 +51,7 @@
+ #include <KIO/NetAccess>
+ #include <konq_operations.h>
+ #include <KFileItem>
++#include <KMessageBox>
+ 
+ // Konsole
+ #include "Filter.h"
+@@ -367,6 +368,7 @@ TerminalDisplay::TerminalDisplay(QWidget* parent)
+     setMouseTracking(true);
+ 
+     setUsesMouse(true);
++    setBracketedPasteMode(false);
+ 
+     setColorTable(ColorScheme::defaultTable);
+ 
+@@ -2554,6 +2556,15 @@ bool TerminalDisplay::usesMouse() const
+     return _mouseMarks;
+ }
+ 
++void TerminalDisplay::setBracketedPasteMode(bool on)
++{
++    _bracketedPasteMode = on;
++}
++bool TerminalDisplay::bracketedPasteMode() const
++{
++    return _bracketedPasteMode;
++}
++
+ /* ------------------------------------------------------------------------- */
+ /*                                                                           */
+ /*                               Clipboard                                   */
+@@ -2568,8 +2579,84 @@ void TerminalDisplay::doPaste(QString text, bool appendReturn)
+     if (appendReturn)
+         text.append("\r");
+ 
++    QStringList unsafeCharacters;
++    Q_FOREACH (const QChar &c, text) {
++        if (!c.isPrint() && c != QLatin1Char('\t') && c != QLatin1Char('\n')) {
++            QString description;
++            switch(c.unicode()) {
++            case '\x03':
++                description = i18n("^C Interrupt: May abort the current process");
++                break;
++            case '\x04':
++                description = i18n("^D End of transmission: May exit the current process");
++                break;
++            case '\x07':
++                description = i18n("^G Bell: Will try to emit an audible warning");
++                break;
++            case '\x08':
++                description = i18n("^H Backspace");
++                break;
++            case '\x13':
++                description = i18n("^S Scroll lock: Locks terminal output");
++                break;
++            case '\x1a':
++                description = i18n("^Z Suspend: Stops current process");
++                break;
++            case '\x1b':
++                description = i18n("ESC: Used for special commands to the current process");
++                break;
++            default:
++                description = i18n("Other unprintable character (\\x%1)").arg(QString::number(c.unicode(), 16));
++                break;
++            }
++            unsafeCharacters.append(description);
++        }
++    }
++    unsafeCharacters.removeDuplicates();
++
++    if (!unsafeCharacters.isEmpty()) {
++        int result = KMessageBox::warningYesNoCancelList(window(),
++                i18n("The text you're trying to paste contains hidden unprintable characters, "
++                    "do you want to filter them out?"),
++                unsafeCharacters,
++                i18nc("@title", "Filter"),
++                KGuiItem(i18nc("@action:button",
++                    "&Remove unprintable"),
++                    QLatin1String("filter-symbolic")),
++                KGuiItem(i18nc("@action:button",
++                    "Confirm &paste"),
++                    QLatin1String("edit-paste")),
++                KGuiItem(i18nc("@action:button",
++                    "&Cancel paste"),
++                    QLatin1String("dialog-cancel")),
++                QLatin1String("ShowPasteUnprintableWarning")
++            );
++        switch(result){
++        case KMessageBox::Cancel:
++            return;
++        case KMessageBox::Yes: {
++            QString sanitized;
++            Q_FOREACH (const QChar &c, text) {
++                if (c.isPrint() || c == QLatin1Char('\t') || c == QLatin1Char('\n')) {
++                    sanitized.append(c);
++                }
++            }
++            text = sanitized;
++        }
++        case KMessageBox::No:
++            break;
++        default:
++            break;
++        }
++    }
++
+     if (!text.isEmpty()) {
+         text.replace('\n', '\r');
++        if (bracketedPasteMode()) {
++            text.remove(QLatin1String("\033"));
++            text.prepend("\033[200~");
++            text.append("\033[201~");
++        }
+         // perform paste by simulating keypress events
+         QKeyEvent e(QEvent::KeyPress, 0, Qt::NoModifier, text);
+         emit keyPressedSignal(&e);
+diff --git a/src/TerminalDisplay.h b/src/TerminalDisplay.h
+index 8e246b8..23913d1 100644
+--- a/src/TerminalDisplay.h
++++ b/src/TerminalDisplay.h
+@@ -512,6 +512,9 @@ public slots:
+     /** See setUsesMouse() */
+     bool usesMouse() const;
+ 
++    void setBracketedPasteMode(bool bracketedPasteMode);
++    bool bracketedPasteMode() const;
++
+     /**
+      * Shows a notification that a bell event has occurred in the terminal.
+      * TODO: More documentation here
+@@ -770,6 +773,7 @@ private:
+     bool _showTerminalSizeHint;
+     bool _bidiEnabled;
+     bool _mouseMarks;
++    bool _bracketedPasteMode;
+ 
+     QPoint  _iPntSel; // initial selection point
+     QPoint  _pntSel; // current selection point
+diff --git a/src/Vt102Emulation.cpp b/src/Vt102Emulation.cpp
+index 7f663f2..76b3ac5 100644
+--- a/src/Vt102Emulation.cpp
++++ b/src/Vt102Emulation.cpp
+@@ -787,6 +787,11 @@ void Vt102Emulation::processToken(int token, int p, int q)
+     case TY_CSI_PR('h', 1049) : saveCursor(); _screen[1]->clearEntireScreen(); setMode(MODE_AppScreen); break; //XTERM
+     case TY_CSI_PR('l', 1049) : resetMode(MODE_AppScreen); restoreCursor(); break; //XTERM
+ 
++    case TY_CSI_PR('h', 2004) :          setMode      (MODE_BracketedPaste); break; //XTERM
++    case TY_CSI_PR('l', 2004) :        resetMode      (MODE_BracketedPaste); break; //XTERM
++    case TY_CSI_PR('s', 2004) :         saveMode      (MODE_BracketedPaste); break; //XTERM
++    case TY_CSI_PR('r', 2004) :      restoreMode      (MODE_BracketedPaste); break; //XTERM
++
+     //FIXME: weird DEC reset sequence
+     case TY_CSI_PE('p'      ) : /* IGNORED: reset         (        ) */ break;
+ 
+@@ -1194,6 +1199,7 @@ void Vt102Emulation::resetModes()
+     resetMode(MODE_Mouse1005);  saveMode(MODE_Mouse1005);
+     resetMode(MODE_Mouse1006);  saveMode(MODE_Mouse1006);
+     resetMode(MODE_Mouse1015);  saveMode(MODE_Mouse1015);
++    resetMode(MODE_BracketedPaste);  saveMode(MODE_BracketedPaste);
+ 
+     resetMode(MODE_AppScreen);  saveMode(MODE_AppScreen);
+     resetMode(MODE_AppCuKeys);  saveMode(MODE_AppCuKeys);
+@@ -1219,6 +1225,10 @@ void Vt102Emulation::setMode(int m)
+         emit programUsesMouseChanged(false);
+         break;
+ 
++    case MODE_BracketedPaste:
++        emit programBracketedPasteModeChanged(true);
++        break;
++
+     case MODE_AppScreen :
+         _screen[1]->clearSelection();
+         setScreen(1);
+@@ -1245,6 +1255,10 @@ void Vt102Emulation::resetMode(int m)
+         emit programUsesMouseChanged(true);
+         break;
+ 
++    case MODE_BracketedPaste:
++        emit programBracketedPasteModeChanged(false);
++        break;
++
+     case MODE_AppScreen :
+         _screen[0]->clearSelection();
+         setScreen(0);
+diff --git a/src/Vt102Emulation.h b/src/Vt102Emulation.h
+index c15f6ea..8d678e0 100644
+--- a/src/Vt102Emulation.h
++++ b/src/Vt102Emulation.h
+@@ -46,7 +46,8 @@ class QKeyEvent;
+ #define MODE_Ansi            (MODES_SCREEN+10)   // Use US Ascii for character sets G0-G3 (DECANM)
+ #define MODE_132Columns      (MODES_SCREEN+11)  // 80 <-> 132 column mode switch (DECCOLM)
+ #define MODE_Allow132Columns (MODES_SCREEN+12)  // Allow DECCOLM mode
+-#define MODE_total           (MODES_SCREEN+13)
++#define MODE_BracketedPaste  (MODES_SCREEN+13)  // Xterm-style bracketed paste mode
++#define MODE_total           (MODES_SCREEN+14)
+ 
+ namespace Konsole
+ {
diff --git a/SPECS/konsole.spec b/SPECS/konsole.spec
index 74fc80b..5a64db7 100644
--- a/SPECS/konsole.spec
+++ b/SPECS/konsole.spec
@@ -1,7 +1,7 @@
 Name:    konsole
 Summary: KDE Terminal emulator
 Version: 4.10.5
-Release: 4%{?dist}
+Release: 5%{?dist}
 
 # sources: MIT and LGPLv2 and LGPLv2+ and GPLv2+
 License: GPLv2 and GFDL
@@ -15,6 +15,7 @@ URL:     http://konsole.kde.org/
 Source0: ftp://ftp.kde.org/pub/kde/%{stable}/%{version}/src/%{name}-%{version}.tar.xz
 
 Patch1:  konsole-avoid-repeated-calls-to-redusername-method.patch
+Patch2:  konsole-avoid-pasting-control-characters.patch
 
 BuildRequires: desktop-file-utils
 BuildRequires: kdelibs4-devel >= %{version}
@@ -42,6 +43,7 @@ Requires: kdelibs4%{?_isa}%{?_kde4_version: >= %{_kde4_version}}
 %setup -q
 
 %patch1 -p1 -b .avoid-repeated-calls-to-redusername-method
+%patch2 -p1 -b .avoid-pasting-control-characters
 
 %build
 mkdir -p %{_target_platform}
@@ -83,6 +85,10 @@ desktop-file-validate %{buildroot}%{_kde4_datadir}/applications/kde4/konsole.des
 
 
 %changelog
+* Thu Feb 20 2020 Jan Grulich <jgrulich@redhat.com> - 4.10.5-5
+- Avoid pasting control characters
+  Resolves: bz#1557758
+
 * Thu Mar 24 2016 Jan Grulich <jgrulich@redhat.com> - 4.10.5-4
 - Avoid repeated calls to readUserName() method
   Resolves: bz#1283800