diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp
index f60e2b2fa2b6d573835b9a9693ca188873eba712..aad80ad691c42ed1646b7dc03bec3b00121e8778 100644
--- a/src/domain/UBGraphicsItemDelegate.cpp
+++ b/src/domain/UBGraphicsItemDelegate.cpp
@@ -407,6 +407,18 @@ void UBGraphicsItemDelegate::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
 
 }
 
+bool UBGraphicsItemDelegate::keyPressEvent(QKeyEvent *event)
+{
+    Q_UNUSED(event);
+    return true;
+}
+
+bool UBGraphicsItemDelegate::keyReleaseEvent(QKeyEvent *event)
+{
+    Q_UNUSED(event);
+    return true;
+}
+
 QGraphicsItem *UBGraphicsItemDelegate::delegated()
 {
     QGraphicsItem *curDelegate = 0;
diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h
index 79ba27cbb888b879f9bd3447d8d287768d35c4ff..b2096b4573d452b3e1c052cb37338a034f6f68da 100644
--- a/src/domain/UBGraphicsItemDelegate.h
+++ b/src/domain/UBGraphicsItemDelegate.h
@@ -255,6 +255,9 @@ class UBGraphicsItemDelegate : public QObject
         virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
         virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
 
+        virtual bool keyPressEvent(QKeyEvent *event);
+        virtual bool keyReleaseEvent(QKeyEvent *event);
+
         virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change,
                 const QVariant &value);
         virtual UBGraphicsScene *castUBGraphicsScene();
diff --git a/src/domain/UBGraphicsTextItem.cpp b/src/domain/UBGraphicsTextItem.cpp
index 3ba635fa7462fe85112533489329240c50307823..3a4fc0d25bfcf1b4eed99655e4b08c231a96ec06 100644
--- a/src/domain/UBGraphicsTextItem.cpp
+++ b/src/domain/UBGraphicsTextItem.cpp
@@ -201,10 +201,10 @@ void UBGraphicsTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 
     if (mMultiClickState == 1)
     {
+        QGraphicsTextItem::mouseReleaseEvent(event);
+
         if (Delegate())
             Delegate()->mouseReleaseEvent(event);
-
-        QGraphicsTextItem::mouseReleaseEvent(event);
     }
     else
     {
@@ -212,6 +212,26 @@ void UBGraphicsTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
     }
 }
 
+void UBGraphicsTextItem::keyPressEvent(QKeyEvent *event)
+{
+    if (Delegate() && !Delegate()->keyPressEvent(event)) {
+        qDebug() << "UBGraphicsTextItem::keyPressEvent(QKeyEvent *event) has been rejected by delegate. Don't call base class method";
+        return;
+    }
+
+    QGraphicsTextItem::keyPressEvent(event);
+}
+
+void UBGraphicsTextItem::keyReleaseEvent(QKeyEvent *event)
+{
+    if (Delegate() && !Delegate()->keyReleaseEvent(event)) {
+        qDebug() << "UBGraphicsTextItem::keyPressEvent(QKeyEvent *event) has been rejected by delegate. Don't call base class method";
+        return;
+    }
+
+    QGraphicsTextItem::keyReleaseEvent(event);
+}
+
 void UBGraphicsTextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
 {
     QColor color = UBSettings::settings()->isDarkBackground() ? mColorOnDarkBackground : mColorOnLightBackground;
diff --git a/src/domain/UBGraphicsTextItem.h b/src/domain/UBGraphicsTextItem.h
index f44da9419680fcc69f4e0e736edd4df482644bac..fd7e2af4c04e22932553f2f3a25f1252c6aca283 100644
--- a/src/domain/UBGraphicsTextItem.h
+++ b/src/domain/UBGraphicsTextItem.h
@@ -110,6 +110,9 @@ class UBGraphicsTextItem : public QGraphicsTextItem, public UBItem, public UBRes
         virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
         virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
 
+        virtual void keyPressEvent(QKeyEvent *event);
+        virtual void keyReleaseEvent(QKeyEvent *event);
+
         virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
 
         virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
diff --git a/src/domain/UBGraphicsTextItemDelegate.cpp b/src/domain/UBGraphicsTextItemDelegate.cpp
index 3c22d6d9497718ffdeaba5eb59d0f54291e3a9c3..b724494be003a4ef876a27e3cd2850fe0bf8c2f6 100644
--- a/src/domain/UBGraphicsTextItemDelegate.cpp
+++ b/src/domain/UBGraphicsTextItemDelegate.cpp
@@ -334,6 +334,8 @@ void UBGraphicsTextItemDelegate::alignButtonProcess()
         AlignTextButton *asAlText = static_cast<AlignTextButton*>(mAlignButton);
         if (asAlText->nextKind() == AlignTextButton::k_mixed) {
             restoreTextCursorFormats();
+            asAlText->setNextKind();
+            return;
         }
         asAlText->setNextKind();
 
@@ -366,14 +368,19 @@ void UBGraphicsTextItemDelegate::onCursorPositionChanged(const QTextCursor &curs
     qDebug() << "-----------------------";
     qDebug() << "we have a selection!" << cursor.selectionStart();
     qDebug() << "-----------------------";
-    updateAlighButtonState();
+//    updateAlighButtonState();
 }
 
 void UBGraphicsTextItemDelegate::onModificationChanged(bool ch)
 {
     Q_UNUSED(ch);
     qDebug() << "modification changed";
-    updateAlighButtonState();
+//    updateAlighButtonState();
+}
+
+void UBGraphicsTextItemDelegate::onContentChanged()
+{
+    qDebug() << "onContentChanged";
 }
 
 UBGraphicsTextItem* UBGraphicsTextItemDelegate::delegated()
@@ -502,6 +509,31 @@ bool UBGraphicsTextItemDelegate::mouseReleaseEvent(QGraphicsSceneMouseEvent *eve
     return true;
 }
 
+bool UBGraphicsTextItemDelegate::keyPressEvent(QKeyEvent *event)
+{
+    Q_UNUSED(event);
+    return true;
+}
+
+bool UBGraphicsTextItemDelegate::keyReleaseEvent(QKeyEvent *event)
+{
+    if (!delegated()->hasFocus()) {
+        return true;
+    }
+
+    switch (event->key()) {
+    case Qt::Key_Left:
+    case Qt::Key_Right:
+    case Qt::Key_Up:
+    case Qt::Key_Down:
+        updateAlighButtonState();
+        break;
+    }
+
+    qDebug() << "Key has been released" << QString::number(event->key(), 16);
+    return true;
+}
+
 void UBGraphicsTextItemDelegate::ChangeTextSize(qreal factor, textChangeMode changeMode)
 {
     if (scaleSize == changeMode)
@@ -609,6 +641,7 @@ void UBGraphicsTextItemDelegate::updateAlighButtonState()
         return;
     }
 
+    qDebug() << "new cursor position" << delegated()->textCursor().position();
     AlignTextButton *asAlBtn = static_cast<AlignTextButton*>(mAlignButton);
 
     if (!oneBlockSelection()) {
diff --git a/src/domain/UBGraphicsTextItemDelegate.h b/src/domain/UBGraphicsTextItemDelegate.h
index a6b4c5b15eed41111db8a4fe00f34c5180b10ed6..1614a24d2474c1c127fc2173389d81e34e254675 100644
--- a/src/domain/UBGraphicsTextItemDelegate.h
+++ b/src/domain/UBGraphicsTextItemDelegate.h
@@ -129,6 +129,9 @@ class UBGraphicsTextItemDelegate : public UBGraphicsItemDelegate
         virtual bool mouseMoveEvent(QGraphicsSceneMouseEvent *event);
         virtual bool mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
 
+        virtual bool keyPressEvent(QKeyEvent *event);
+        virtual bool keyReleaseEvent(QKeyEvent *event);
+
     private:
         UBGraphicsTextItem* delegated();
 
@@ -179,6 +182,7 @@ class UBGraphicsTextItemDelegate : public UBGraphicsItemDelegate
         void alignButtonProcess();
         void onCursorPositionChanged(const QTextCursor& cursor);
         void onModificationChanged(bool ch);
+        void onContentChanged();
 
 private:
       const int delta;