diff --git a/modules/gui/src/python_shell/output_redirector.cc b/modules/gui/src/python_shell/output_redirector.cc
index ec052e0d3a34330d79b6b13124578d91b84d09cd..fa72516c4b37b3d70608ba558ea6cd0bff892df4 100644
--- a/modules/gui/src/python_shell/output_redirector.cc
+++ b/modules/gui/src/python_shell/output_redirector.cc
@@ -28,18 +28,37 @@
 namespace ost { namespace gui {
 
 OutputRedirector::OutputRedirector():
- QObject()
+ QObject(),
+ buffer_(),
+ timer_()
 {
 }
 
 
 void OutputRedirector::Write( String const& str )
 {
-  //buffer_.append(str);
-  emit OnOutput(QString::fromStdString(str));
+  if(timer_.isValid()){
+    if(timer_.elapsed()>1000){
+      QString output = buffer_+QString::fromStdString(str);
+      buffer_="";
+      emit OnOutput(output);
+      timer_.restart();
+    }else{
+      buffer_+=QString::fromStdString(str);
+    }
+  }else{
+    buffer_+=QString::fromStdString(str);
+    timer_.start();
+  }
+}
 
+void OutputRedirector::Flush()
+{
+  timer_=QTime();
+  QString output = buffer_;
+  buffer_="";
+  emit OnOutput(output);
 }
-String  OutputRedirector::buffer_; 
 
 
 
diff --git a/modules/gui/src/python_shell/output_redirector.hh b/modules/gui/src/python_shell/output_redirector.hh
index c19426505339b2be7eec2959984217328df92775..7a1217297a7ea7113917d3a71d620d723469e77b 100644
--- a/modules/gui/src/python_shell/output_redirector.hh
+++ b/modules/gui/src/python_shell/output_redirector.hh
@@ -26,6 +26,7 @@
   Author: Andreas Schenk
 */
 
+#include <QTime>
 #include <QString>
 #include <QObject>
 #include <ost/gui/module_config.hh>
@@ -38,10 +39,12 @@ Q_OBJECT
 public:
   OutputRedirector();
   void Write(const String& str);
+  void Flush();
 signals:
   void OnOutput(const QString& output);
 private:
-    static String  buffer_; 
+    QString  buffer_;
+    QTime timer_;
 };
 
 }}//ns
diff --git a/modules/gui/src/python_shell/python_interpreter_worker.cc b/modules/gui/src/python_shell/python_interpreter_worker.cc
index 8f1688804c2013406cf2a093be0431c5d665873a..494df6c0bca61cd5b4a67791d55128c7d27a5ab9 100644
--- a/modules/gui/src/python_shell/python_interpreter_worker.cc
+++ b/modules/gui/src/python_shell/python_interpreter_worker.cc
@@ -93,6 +93,8 @@ void PythonInterpreterWorker::run_command_(std::pair<unsigned int,QString> pair)
     } else {
       bp::exec(bp::str(command.toStdString()),main_namespace_,main_namespace_);
     }
+    output_redirector_->Flush();
+    error_redirector_->Flush();
     emit Finished(pair.first,true);
     return;
   }catch(bp::error_already_set){
@@ -103,6 +105,8 @@ void PythonInterpreterWorker::run_command_(std::pair<unsigned int,QString> pair)
       PyErr_Print();
     }
   }
+  output_redirector_->Flush();
+  error_redirector_->Flush();
   emit Finished(pair.first,false);
   return;
 }
diff --git a/modules/gui/src/python_shell/python_shell_widget.cc b/modules/gui/src/python_shell/python_shell_widget.cc
index 534afecdab0c6cb0078f9be26bef2d83afda8496..e41fa8a1e8a8c00eea7f8c7e5fac8f633898be51 100644
--- a/modules/gui/src/python_shell/python_shell_widget.cc
+++ b/modules/gui/src/python_shell/python_shell_widget.cc
@@ -115,27 +115,90 @@ PythonShellWidget::PythonShellWidget(QWidget* parent):
 void PythonShellWidget::setup_readonly_state_machine_()
 {
   State* readonly=new State;
+  State* mixed=new State;
+  readonly_machine_->addState(mixed);
   readonly_machine_->addState(readonly);
   readonly_machine_->addState(readwrite_state_);
-  readonly->addTransition((new SignalTransition(this,
+  readonly->addTransition(new SignalTransition(this,
                                                 SIGNAL(cursorPositionChanged()),
                                                 readwrite_state_,
-                                                new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER))));
-  readonly->addTransition((new KeyEventTransition(QEvent::KeyPress,
+                                                new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER,
+                                                                           EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER)));
+  readonly->addTransition(new SignalTransition(this,
+                                                SIGNAL(cursorPositionChanged()),
+                                                mixed,
+                                                new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER,
+                                                                           EditPositionGuard::ANCHORSMALLER)));
+  readonly->addTransition(new SignalTransition(this,
+                                                SIGNAL(cursorPositionChanged()),
+                                                mixed,
+                                                new EditPositionGuard(this,EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER,
+                                                                           EditPositionGuard::SMALLER)));
+
+  readonly->addTransition(new KeyEventTransition(QEvent::KeyPress,
+                                                  Qt::Key_Backspace,
+                                                  Qt::NoModifier,
+                                                  readwrite_state_,
+                                                  true));
+
+  readonly->addTransition(new KeyEventTransition(QEvent::KeyPress,
                                                   Qt::Key_Any,
                                                   Qt::NoModifier,
                                                   readwrite_state_,
-                                                  false)));
-  readwrite_state_->addTransition((new SignalTransition(this,
+                                                  false));
+
+  readwrite_state_->addTransition(new SignalTransition(this,
                                                       SIGNAL(cursorPositionChanged()),
                                                       readonly,
-                                                      new EditPositionGuard(this,EditPositionGuard::SMALLER))));
-  readwrite_state_->addTransition((new KeyEventTransition(QEvent::KeyPress,
+                                                      new EditPositionGuard(this,EditPositionGuard::SMALLER | EditPositionGuard::EQUAL,
+                                                                                 EditPositionGuard::ANCHORSMALLER)));
+  readwrite_state_->addTransition(new SignalTransition(this,
+                                                      SIGNAL(cursorPositionChanged()),
+                                                      readonly,
+                                                      new EditPositionGuard(this,EditPositionGuard::ANCHORSMALLER | EditPositionGuard::ANCHOREQUAL,
+                                                                                 EditPositionGuard::SMALLER)));
+
+  readwrite_state_->addTransition(new SignalTransition(this,
+                                                        SIGNAL(cursorPositionChanged()),
+                                                        mixed,
+                                                        new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER,
+                                                                                   EditPositionGuard::ANCHORSMALLER)));
+  readwrite_state_->addTransition(new SignalTransition(this,
+                                                        SIGNAL(cursorPositionChanged()),
+                                                        mixed,
+                                                        new EditPositionGuard(this,EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER,
+                                                                                   EditPositionGuard::SMALLER)));
+
+  readwrite_state_->addTransition(new KeyEventTransition(QEvent::KeyPress,
                                                          Qt::Key_Backspace,
                                                          Qt::NoModifier,
                                                          readwrite_state_,
                                                          true,
-                                                         new EditPositionGuard(this,EditPositionGuard::EQUAL|EditPositionGuard::SELECTION))));
+                                                         new EditPositionGuard(this,EditPositionGuard::EQUAL,
+                                                                                    EditPositionGuard::ANCHOREQUAL)));
+
+  mixed->addTransition(new SignalTransition(this,
+                                             SIGNAL(cursorPositionChanged()),
+                                             readwrite_state_,
+                                             new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER,
+                                                                        EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER)));
+
+  KeyEventTransition* kt1=new KeyEventTransition(QEvent::KeyPress,
+                                                 Qt::Key_Backspace,
+                                                 Qt::NoModifier,
+                                                 readwrite_state_,
+                                                 true);
+  mixed->addTransition(kt1);
+  connect(kt1,SIGNAL(triggered()),this,SLOT(OnMixedToReadwrite()));
+
+  KeyEventTransition* kt2=new KeyEventTransition(QEvent::KeyPress,
+                                                 Qt::Key_Any,
+                                                 Qt::NoModifier,
+                                                 readwrite_state_,
+                                                 false);
+  mixed->addTransition(kt2);
+  connect(kt2,SIGNAL(triggered()),this,SLOT(OnMixedToReadwrite()));
+
   connect(readonly,SIGNAL(entered()),this,SLOT(OnReadonlyEntered()));
   connect(readwrite_state_,SIGNAL(entered()),this,SLOT(OnReadwriteEntered()));
   readonly_machine_->setInitialState(readwrite_state_);
@@ -253,6 +316,19 @@ void PythonShellWidget::OnReadwriteEntered()
   }
   setReadOnly(false);
 }
+void PythonShellWidget::OnMixedToReadwrite()
+{
+  QTextCursor tc=textCursor();
+  if(tc.position()< GetEditStartBlock().position()){
+    tc.setPosition(GetEditStartBlock().position(),QTextCursor::KeepAnchor);
+    setTextCursor(tc);
+  }else{
+    tc.setPosition(GetEditStartBlock().position(),QTextCursor::MoveAnchor);
+    tc.setPosition(textCursor().position(),QTextCursor::KeepAnchor);
+    setTextCursor(tc);
+  }
+
+}
 
 void PythonShellWidget::OnEnterTransition()
 {
diff --git a/modules/gui/src/python_shell/python_shell_widget.hh b/modules/gui/src/python_shell/python_shell_widget.hh
index 3bcb20f77191ebd52a4bbc671584c64a41bc8c77..60a3ba30da460127afa8a49d9d75e93e4085f512 100644
--- a/modules/gui/src/python_shell/python_shell_widget.hh
+++ b/modules/gui/src/python_shell/python_shell_widget.hh
@@ -83,6 +83,7 @@ public slots:
   void OnEnterTransition();
   void OnReadonlyEntered();
   void OnReadwriteEntered();
+  void OnMixedToReadwrite();
 
 protected:
   virtual void mouseReleaseEvent (QMouseEvent* event );
diff --git a/modules/gui/src/python_shell/transition_guard.cc b/modules/gui/src/python_shell/transition_guard.cc
index 765cb5f67d359ab718f08f343a8601016e6655fe..c32898964cf3a17c7375b5824b9fa0343cd538e1 100644
--- a/modules/gui/src/python_shell/transition_guard.cc
+++ b/modules/gui/src/python_shell/transition_guard.cc
@@ -27,27 +27,43 @@ bool HistoryGuard::check()
   return history_->GetCommandMode()==mode_;
 }
 
-EditPositionGuard::EditPositionGuard(PythonShellWidget* shell, int flags):
+EditPositionGuard::EditPositionGuard(PythonShellWidget* shell, int flags1, int flags2):
   TransitionGuard(),
   shell_(shell),
-  flags_(flags)
+  flags1_(flags1),
+  flags2_(flags2)
 {
 }
 
 bool EditPositionGuard::check()
 {
+  return check_flag(flags1_) &&  check_flag(flags2_);
+}
+
+bool EditPositionGuard::check_flag(int flags)
+{
+  if(flags==0){
+    return true;
+  }
   bool returnflag=false;
   QTextCursor tc=shell_->textCursor();
-  if(flags_ & SMALLER){
-    returnflag|=tc.selectionStart()<shell_->GetEditStartBlock().position();
+  if(flags & SMALLER){
+    returnflag|=tc.position()<shell_->GetEditStartBlock().position();
+  }
+  if(flags & EQUAL){
+    returnflag|=tc.position()==shell_->GetEditStartBlock().position();
   }
-  if(flags_ & EQUAL){
-    if (!(flags_ & SELECTION && tc.hasSelection())) {
-      returnflag|=tc.selectionStart()==shell_->GetEditStartBlock().position();    
-    }
+  if(flags & BIGGER){
+    returnflag |= tc.position()> shell_->GetEditStartBlock().position();
   }
-  if(flags_ & BIGGER){
-    returnflag |= tc.selectionStart()> shell_->GetEditStartBlock().position();
+  if(flags & ANCHORSMALLER){
+    returnflag|=tc.anchor()<shell_->GetEditStartBlock().position();
+  }
+  if(flags & ANCHOREQUAL){
+    returnflag|=tc.anchor()==shell_->GetEditStartBlock().position();
+  }
+  if(flags & ANCHORBIGGER){
+    returnflag |= tc.anchor()> shell_->GetEditStartBlock().position();
   }
   return returnflag;
 }
@@ -64,4 +80,7 @@ bool BlockStatusGuard::check()
   QString command=shell_->GetCommand();
   return PythonInterpreter::Instance().GetCodeBlockStatus(command) & status_;
 }
+
+
+
 }} //ns
diff --git a/modules/gui/src/python_shell/transition_guard.hh b/modules/gui/src/python_shell/transition_guard.hh
index 5ae202ca56a8131fc1e3589ffd8c63d330602c4e..e9534326db06414c167b617bd67d53e437b13dea 100644
--- a/modules/gui/src/python_shell/transition_guard.hh
+++ b/modules/gui/src/python_shell/transition_guard.hh
@@ -38,16 +38,21 @@ class EditPositionGuard : public TransitionGuard
 {
 public:
   enum FLAGS{
+    ALWAYSTRUE=0,
     SMALLER=1,
     EQUAL=2,
     BIGGER=4,
-    SELECTION=8
+    ANCHORSMALLER=8,
+    ANCHOREQUAL=16,
+    ANCHORBIGGER=32
   };
-    EditPositionGuard(PythonShellWidget* shell,int flags);
+    EditPositionGuard(PythonShellWidget* shell,int flags1, int flags2=ALWAYSTRUE);
     virtual bool check();
 protected:
+    virtual bool check_flag(int flag);
     PythonShellWidget* shell_;
-    int flags_;
+    int flags1_;
+    int flags2_;
 };
 
 class BlockStatusGuard : public TransitionGuard
@@ -60,6 +65,8 @@ protected:
     int status_;
 };
 
+
+
 }} //ns