diff --git a/apps/opencs/view/world/dialoguesubview.cpp b/apps/opencs/view/world/dialoguesubview.cpp
index 5c083f881..65db33cbf 100644
--- a/apps/opencs/view/world/dialoguesubview.cpp
+++ b/apps/opencs/view/world/dialoguesubview.cpp
@@ -24,6 +24,59 @@
 
 #include "recordstatusdelegate.hpp"
 #include "util.hpp"
+/*
+==============================NotEditableSubDelegate==========================================
+*/
+CSVWorld::NotEditableSubDelegate::NotEditableSubDelegate(const CSMWorld::IdTable* table, QObject * parent) :
+QAbstractItemDelegate(parent),
+mTable(table)
+{}
+
+void CSVWorld::NotEditableSubDelegate::setEditorData (QLabel* editor, const QModelIndex& index) const
+{
+    QVariant v = index.data(Qt::EditRole);
+    if (!v.isValid())
+    {
+        v = index.data(Qt::DisplayRole);
+        if (!v.isValid())
+        {
+            return;
+        }
+    }
+
+    if (QVariant::String == v.type())
+    {
+        editor->setText(v.toString());
+    } else //else we are facing enums
+    {
+        int data = v.toInt();
+        std::vector<std::string> enumNames (CSMWorld::Columns::getEnums (static_cast<CSMWorld::Columns::ColumnId> (mTable->getColumnId (index.column()))));
+        editor->setText(QString::fromUtf8(enumNames.at(data).c_str()));
+    }
+}
+
+void CSVWorld::NotEditableSubDelegate::setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const
+{
+    //not editable widgets will not save model data
+}
+
+void CSVWorld::NotEditableSubDelegate::paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
+{
+    //does nothing
+}
+
+QSize CSVWorld::NotEditableSubDelegate::sizeHint (const QStyleOptionViewItem& option, const QModelIndex& index) const
+{
+    return QSize();
+}
+
+QWidget* CSVWorld::NotEditableSubDelegate::createEditor (QWidget *parent,
+                                const QStyleOptionViewItem& option,
+                                const QModelIndex& index,
+                                CSMWorld::ColumnBase::Display display) const
+{
+    return new QLabel(parent);
+}
 
 /*
 ==============================DialogueDelegateDispatcherProxy==========================================
@@ -64,7 +117,8 @@ QWidget* CSVWorld::DialogueDelegateDispatcherProxy::getEditor() const
 CSVWorld::DialogueDelegateDispatcher::DialogueDelegateDispatcher(QObject* parent, CSMWorld::IdTable* table, QUndoStack& undoStack) :
 mParent(parent),
 mTable(table),
-mUndoStack(undoStack)
+mUndoStack(undoStack),
+mNotEditableDelegate(table, parent)
 {
 }
 
@@ -97,27 +151,7 @@ void CSVWorld::DialogueDelegateDispatcher::setEditorData (QWidget* editor, const
     QLabel* label = qobject_cast<QLabel*>(editor);
     if(label)
     {
-        QVariant v = index.data(Qt::EditRole);
-        if (!v.isValid())
-        {
-            v = index.data(Qt::DisplayRole);
-            if (!v.isValid())
-            {
-                return;
-            }
-        }
-        if (CSMWorld::Columns::hasEnums(static_cast<CSMWorld::Columns::ColumnId>(mTable->getColumnId(index.column()))))
-        {
-            int data = v.toInt();
-            std::vector<std::string> enumNames (CSMWorld::Columns::getEnums (static_cast<CSMWorld::Columns::ColumnId> (mTable->getColumnId (index.column()))));
-            label->setText(QString::fromUtf8(enumNames.at(data).c_str()));
-        } else
-        {
-            if (QVariant::String == v.type())
-            {
-                label->setText(v.toString());
-            }
-        }
+        mNotEditableDelegate.setEditorData(label, index);
         return;
     }
 
@@ -170,8 +204,7 @@ QWidget* CSVWorld::DialogueDelegateDispatcher::makeEditor(CSMWorld::ColumnBase::
     QWidget* editor = NULL;
     if (! (mTable->flags (index) & Qt::ItemIsEditable))
     {
-        editor = new QLabel(qobject_cast<QWidget*>(mParent));
-        return editor;
+        return mNotEditableDelegate.createEditor(qobject_cast<QWidget*>(mParent), QStyleOptionViewItem(), index, display);
     }
 
     std::map<int, CommandDelegate*>::iterator delegateIt(mDelegates.find(display));
diff --git a/apps/opencs/view/world/dialoguesubview.hpp b/apps/opencs/view/world/dialoguesubview.hpp
index 06c849e39..33514d205 100644
--- a/apps/opencs/view/world/dialoguesubview.hpp
+++ b/apps/opencs/view/world/dialoguesubview.hpp
@@ -12,6 +12,7 @@
 class QDataWidgetMapper;
 class QSize;
 class QEvent;
+class QLabel;
 
 namespace CSMWorld
 {
@@ -27,6 +28,27 @@ namespace CSVWorld
 {
     class CommandDelegate;
 
+    class NotEditableSubDelegate : public QAbstractItemDelegate
+    {
+        const CSMWorld::IdTable* mTable;
+    public:
+        NotEditableSubDelegate(const CSMWorld::IdTable* table, QObject * parent = 0);
+
+        virtual void setEditorData (QLabel* editor, const QModelIndex& index) const;
+
+        virtual void setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const;
+
+        virtual void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
+        ///< does nothing
+
+        virtual QSize sizeHint (const QStyleOptionViewItem& option, const QModelIndex& index) const;
+        ///< does nothing
+
+        virtual QWidget *createEditor (QWidget *parent,
+                                const QStyleOptionViewItem& option,
+                                const QModelIndex& index,
+                                CSMWorld::ColumnBase::Display display = CSMWorld::ColumnBase::Display_None) const;
+    };
 
     //this can't be nested into the DialogueDelegateDispatcher, because it needs to emit signals
     class DialogueDelegateDispatcherProxy : public QObject
@@ -68,6 +90,8 @@ namespace CSVWorld
 
         QUndoStack& mUndoStack;
 
+        NotEditableSubDelegate mNotEditableDelegate;
+
         std::vector<DialogueDelegateDispatcherProxy*> mProxys; //once we move to the C++11 we should use unique_ptr
 
     public:
diff --git a/apps/opencs/view/world/util.cpp b/apps/opencs/view/world/util.cpp
index f93edab3e..3635ee1d4 100644
--- a/apps/opencs/view/world/util.cpp
+++ b/apps/opencs/view/world/util.cpp
@@ -190,7 +190,7 @@ bool CSVWorld::CommandDelegate::updateEditorSetting (const QString &settingName,
     return false;
 }
 
-void CSVWorld::CommandDelegate::setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay)
+void CSVWorld::CommandDelegate::setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay) const
 {
     QVariant v = index.data(Qt::EditRole);
     if (tryDisplay)
@@ -204,7 +204,7 @@ void CSVWorld::CommandDelegate::setEditorData (QWidget *editor, const QModelInde
             }
         }
         QPlainTextEdit* plainTextEdit = qobject_cast<QPlainTextEdit*>(editor);
-        if(plainTextEdit)
+        if(plainTextEdit) //for some reason it is easier to brake the loop here
         {
             if(plainTextEdit->toPlainText() == v.toString())
             {
diff --git a/apps/opencs/view/world/util.hpp b/apps/opencs/view/world/util.hpp
index 9b9d89535..814f09d3a 100644
--- a/apps/opencs/view/world/util.hpp
+++ b/apps/opencs/view/world/util.hpp
@@ -113,7 +113,7 @@ namespace CSVWorld
             virtual bool updateEditorSetting (const QString &settingName, const QString &settingValue);
             ///< \return Does column require update?
 
-            virtual void setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay = false);
+            virtual void setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay = false) const;
 
 
         private slots: