diff --git a/modules/gui/src/python_shell/python_shell_widget.cc b/modules/gui/src/python_shell/python_shell_widget.cc
index a1ee30cb5e33eeaafe6b89d94beccdf75925d490..534afecdab0c6cb0078f9be26bef2d83afda8496 100644
--- a/modules/gui/src/python_shell/python_shell_widget.cc
+++ b/modules/gui/src/python_shell/python_shell_widget.cc
@@ -135,7 +135,7 @@ void PythonShellWidget::setup_readonly_state_machine_()
                                                          Qt::NoModifier,
                                                          readwrite_state_,
                                                          true,
-                                                         new EditPositionGuard(this,EditPositionGuard::EQUAL))));
+                                                         new EditPositionGuard(this,EditPositionGuard::EQUAL|EditPositionGuard::SELECTION))));
   connect(readonly,SIGNAL(entered()),this,SLOT(OnReadonlyEntered()));
   connect(readwrite_state_,SIGNAL(entered()),this,SLOT(OnReadwriteEntered()));
   readonly_machine_->setInitialState(readwrite_state_);
diff --git a/modules/gui/src/python_shell/transition.cc b/modules/gui/src/python_shell/transition.cc
index 57559da980c3805805f23ec851bb7a6993e65d35..e39ac8099c16fbf52185197063a9f0d58302f117 100644
--- a/modules/gui/src/python_shell/transition.cc
+++ b/modules/gui/src/python_shell/transition.cc
@@ -61,7 +61,8 @@ KeyEventTransition::KeyEventTransition(QEvent::Type type,int key,Qt::KeyboardMod
 std::pair<bool,bool> KeyEventTransition::checkEvent(QKeyEvent* event)
 {
   assert(is_active_());
-  if(event->type()==type_ && (event->key()==key_ || key_==Qt::Key_Any) && event->modifiers() == modifiers_ && guard_->check()){
+  if(event->type()==type_ && (event->key()==key_ || 
+     key_==Qt::Key_Any) && event->modifiers() == modifiers_ && guard_->check()){
     trigger_();
     return std::pair<bool,bool>(true,swallow_);
   }
diff --git a/modules/gui/src/python_shell/transition_guard.cc b/modules/gui/src/python_shell/transition_guard.cc
index 4409dfe3b6ec6c089e6677ba103fbf05daded002..765cb5f67d359ab718f08f343a8601016e6655fe 100644
--- a/modules/gui/src/python_shell/transition_guard.cc
+++ b/modules/gui/src/python_shell/transition_guard.cc
@@ -37,14 +37,17 @@ EditPositionGuard::EditPositionGuard(PythonShellWidget* shell, int flags):
 bool EditPositionGuard::check()
 {
   bool returnflag=false;
+  QTextCursor tc=shell_->textCursor();
   if(flags_ & SMALLER){
-    returnflag |= shell_->textCursor().position()< shell_->GetEditStartBlock().position();
+    returnflag|=tc.selectionStart()<shell_->GetEditStartBlock().position();
   }
   if(flags_ & EQUAL){
-    returnflag |= shell_->textCursor().position()== shell_->GetEditStartBlock().position();
+    if (!(flags_ & SELECTION && tc.hasSelection())) {
+      returnflag|=tc.selectionStart()==shell_->GetEditStartBlock().position();    
+    }
   }
   if(flags_ & BIGGER){
-    returnflag |= shell_->textCursor().position()> shell_->GetEditStartBlock().position();
+    returnflag |= tc.selectionStart()> shell_->GetEditStartBlock().position();
   }
   return returnflag;
 }
diff --git a/modules/gui/src/python_shell/transition_guard.hh b/modules/gui/src/python_shell/transition_guard.hh
index d3e90b9a37b3d6c7d50b5c8ab245ed68420c1ea6..5ae202ca56a8131fc1e3589ffd8c63d330602c4e 100644
--- a/modules/gui/src/python_shell/transition_guard.hh
+++ b/modules/gui/src/python_shell/transition_guard.hh
@@ -40,7 +40,8 @@ public:
   enum FLAGS{
     SMALLER=1,
     EQUAL=2,
-    BIGGER=4
+    BIGGER=4,
+    SELECTION=8
   };
     EditPositionGuard(PythonShellWidget* shell,int flags);
     virtual bool check();