Index: design/admin/templates/class/edit.tpl
===================================================================
--- design/admin/templates/class/edit.tpl	(revision 21153)
+++ design/admin/templates/class/edit.tpl	(working copy)
@@ -203,6 +203,12 @@
 {'Disable translation'|i18n( 'design/admin/class/edit' )}
 </label>
 
+{* Read only. *}
+<label>
+<input type="checkbox" name="ContentAttribute_is_read_only_checked[]" value="{$Attributes.item.id}"  {section show=$Attributes.item.is_read_only}checked="checked"{/section} title="{'Use this checkbox to specify whether this attribute can be edited.'|i18n( 'design/admin/class/edit' )|wash}" />
+{'Read only'|i18n( 'design/admin/class/edit' )}
+</label>
+
 </div>
 
 {class_attribute_edit_gui class_attribute=$Attributes.item}
Index: design/admin/templates/class/view.tpl
===================================================================
--- design/admin/templates/class/view.tpl	(revision 21153)
+++ design/admin/templates/class/view.tpl	(working copy)
@@ -141,6 +141,10 @@
         <div class="block">
             <p>{section show=$Attributes.item.can_translate|eq(0)}{'Translation is disabled'|i18n( 'design/admin/class/view' )}{section-else}{'Translation is enabled'|i18n( 'design/admin/class/view' )}{/section}</p>
         </div>
+        
+        <div class="block">
+            <p>{section show=$Attributes.item.is_read_only|eq(0)}{'Is not read only'|i18n("design/admin/class/view")}{section-else}{'Is read only'|i18n("design/admin/class/view")}{/section}</p>
+        </div>
     </td>
 </tr>
 
Index: design/admin/templates/content/edit_attribute.tpl
===================================================================
--- design/admin/templates/content/edit_attribute.tpl	(revision 21153)
+++ design/admin/templates/content/edit_attribute.tpl	(working copy)
@@ -2,45 +2,51 @@
 {section var=attributes loop=$content_attributes}
 <div class="block">
 {* Show view GUI if we can't edit, oterwise: show edit GUI. *}
-{section show=and( eq( $attributes.item.can_translate, 0 ), ne( $object.initial_language_code, $attributes.item.language_code ) )}
-    <label>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.can_translate|not} <span class="nontranslatable">({'not translatable'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}:</label>
-    {section show=$is_translating_content}
-        <div class="original">
-        {attribute_view_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
-        <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
-        </div>
-    {section-else}
-        {attribute_view_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
-        <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
-    {/section}
+{section show=$attributes.item.contentclass_attribute.is_read_only}
+    <label>{$attributes.item.contentclass_attribute_name|wash} <span class="readonly">({'read only'|i18n( 'design/admin/content/edit_attribute' )})</span>:</label>
+    {attribute_view_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
+    <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
 {section-else}
-    {section show=$is_translating_content}
-        <label{section show=$attributes.item.has_validation_error} class="message-error"{/section}>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.is_required} <span class="required">({'required'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}{section show=$attributes.item.is_information_collector} <span class="collector">({'information collector'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}:</label>
-        <div class="original">
-        {attribute_view_gui attribute_base=$attribute_base attribute=$from_content_attributes[$attributes.key] view_parameters=$view_parameters}
-        </div>
-        <div class="translation">
-        {section show=$attributes.display_info.edit.grouped_input}
-            <fieldset>
-            {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
+    {section show=and( eq( $attributes.item.can_translate, 0 ), ne( $object.initial_language_code, $attributes.item.language_code ) )}
+        <label>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.can_translate|not} <span class="nontranslatable">({'not translatable'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}:</label>
+        {section show=$is_translating_content}
+            <div class="original">
+            {attribute_view_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
             <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
-            </fieldset>
+            </div>
         {section-else}
-            {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
+            {attribute_view_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
             <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
         {/section}
-        </div>
     {section-else}
-        {section show=$attributes.display_info.edit.grouped_input}
-            <fieldset>
-            <legend{section show=$attributes.item.has_validation_error} class="message-error"{/section}>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.is_required} <span class="required">({'required'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}{section show=$attributes.item.is_information_collector} <span class="collector">({'information collector'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}</legend>
-            {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
-            <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
-            </fieldset>
+        {section show=$is_translating_content}
+            <label{section show=$attributes.item.has_validation_error} class="message-error"{/section}>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.is_required} <span class="required">({'required'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}{section show=$attributes.item.is_information_collector} <span class="collector">({'information collector'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}:</label>
+            <div class="original">
+            {attribute_view_gui attribute_base=$attribute_base attribute=$from_content_attributes[$attributes.key] view_parameters=$view_parameters}
+            </div>
+            <div class="translation">
+            {section show=$attributes.display_info.edit.grouped_input}
+                <fieldset>
+                {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
+                <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
+                </fieldset>
+            {section-else}
+                {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
+                <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
+            {/section}
+            </div>
         {section-else}
-            <label{section show=$attributes.item.has_validation_error} class="message-error"{/section}>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.is_required} <span class="required">({'required'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}{section show=$attributes.item.is_information_collector} <span class="collector">({'information collector'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}:</label>
-            {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
-            <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
+            {section show=$attributes.display_info.edit.grouped_input}
+                <fieldset>
+                <legend{section show=$attributes.item.has_validation_error} class="message-error"{/section}>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.is_required} <span class="required">({'required'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}{section show=$attributes.item.is_information_collector} <span class="collector">({'information collector'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}</legend>
+                {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
+                <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
+                </fieldset>
+            {section-else}
+                <label{section show=$attributes.item.has_validation_error} class="message-error"{/section}>{$attributes.item.contentclass_attribute_name|wash}{section show=$attributes.item.is_required} <span class="required">({'required'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}{section show=$attributes.item.is_information_collector} <span class="collector">({'information collector'|i18n( 'design/admin/content/edit_attribute' )})</span>{/section}:</label>
+                {attribute_edit_gui attribute_base=$attribute_base attribute=$attributes.item view_parameters=$view_parameters}
+                <input type="hidden" name="ContentObjectAttribute_id[]" value="{$attributes.item.id}" />
+            {/section}
         {/section}
     {/section}
 {/section}
Index: design/standard/templates/class/edit.tpl
===================================================================
--- design/standard/templates/class/edit.tpl	(revision 21153)
+++ design/standard/templates/class/edit.tpl	(working copy)
@@ -181,6 +181,11 @@
 <input type="checkbox" name="ContentAttribute_can_translate_checked[]" value="{$Attributes:item.id}" {section show=$Attributes:item.can_translate|eq(0)}checked="checked"{/section} /><label>{"Disable translation"|i18n("design/standard/class/edit")}</label>
 </div>
 
+{* Read only. *}
+<div class="block">
+<input type="checkbox" name="ContentAttribute_is_read_only_checked[]" value="{$Attributes.item.id}"  {section show=$Attributes:item.is_read_only}checked="checked"{/section} /><label>{"Read only"|i18n("design/standard/class/edit")|wash}</label>
+</div
+
 </td>
 <!-- Attribute flags End -->
 
Index: design/standard/templates/class/view.tpl
===================================================================
--- design/standard/templates/class/view.tpl	(revision 21153)
+++ design/standard/templates/class/view.tpl	(working copy)
@@ -137,6 +137,9 @@
             <p>{section show=$Attributes:item.can_translate|eq(0)}{"Translation is disabled"|i18n("design/standard/class/view")}{section-else}{"Translation is enabled"|i18n("design/standard/class/view")}{/section}</p>
         </div>
 
+        <div class="block">
+            <p>{section show=$Attributes:item.is_read_only|eq(0)}{"Is not read only"|i18n("design/standard/class/view")}{section-else}{"Is read only"|i18n("design/standard/class/view")}{/section}</p>
+        </div>
     </td>
 
 </tr>
Index: design/standard/templates/content/edit_attribute.tpl
===================================================================
--- design/standard/templates/content/edit_attribute.tpl	(revision 21153)
+++ design/standard/templates/content/edit_attribute.tpl	(working copy)
@@ -4,8 +4,9 @@
     <div class="block">
 
     {* only show edit GUI if we can edit *}
-    {section show=and(eq($ContentObjectAttribute:item.contentclass_attribute.can_translate,0),
-                      ne($object.initial_language_code,$ContentObjectAttribute:item.language_code) ) }
+    {section show=or( and(eq($ContentObjectAttribute:item.contentclass_attribute.can_translate,0),
+                          ne($object.initial_language_code,$ContentObjectAttribute:item.language_code) ),
+                      eq($ContentObjectAttribute:item.contentclass_attribute.is_read_only,1) ) }
         <label>{$ContentObjectAttribute:item.contentclass_attribute.name|wash}</label><div class="labelbreak"></div>
         <input type="hidden" name="ContentObjectAttribute_id[]" value="{$ContentObjectAttribute:item.id}" />
         {attribute_view_gui attribute_base=$attribute_base attribute=$ContentObjectAttribute:item view_parameters=$view_parameters}
Index: kernel/class/edit.php
===================================================================
--- kernel/class/edit.php	(revision 21153)
+++ kernel/class/edit.php	(working copy)
@@ -346,6 +346,7 @@
         $validation['processed'] = true;
         $validation['attributes'] = $unvalidatedAttributes;
         $requireVariable = 'ContentAttribute_is_required_checked';
+        $readOnlyVariable = 'ContentAttribute_is_read_only_checked';
         $searchableVariable = 'ContentAttribute_is_searchable_checked';
         $informationCollectorVariable = 'ContentAttribute_is_information_collector_checked';
         $canTranslateVariable = 'ContentAttribute_can_translate_checked';
@@ -353,6 +354,7 @@
         $searchableCheckedArray = array();
         $informationCollectorCheckedArray = array();
         $canTranslateCheckedArray = array();
+        $readOnlyCheckedArray = array();
         if ( $http->hasPostVariable( $requireVariable ) )
             $requireCheckedArray = $http->postVariable( $requireVariable );
         if ( $http->hasPostVariable( $searchableVariable ) )
@@ -361,6 +363,8 @@
             $informationCollectorCheckedArray = $http->postVariable( $informationCollectorVariable );
         if ( $http->hasPostVariable( $canTranslateVariable ) )
             $canTranslateCheckedArray = $http->postVariable( $canTranslateVariable );
+        if ( $http->hasPostVariable( $readOnlyVariable ) )
+            $readOnlyCheckedArray = $http->postVariable( $readOnlyVariable );
 
         if ( $http->hasPostVariable( 'ContentAttribute_priority' ) )
             $placementArray = $http->postVariable( 'ContentAttribute_priority' );
@@ -373,6 +377,7 @@
             $attribute->setAttribute( 'is_information_collector', in_array( $attributeID, $informationCollectorCheckedArray ) );
             // Set can_translate to 0 if user has clicked Disable translation in GUI
             $attribute->setAttribute( 'can_translate', !in_array( $attributeID, $canTranslateCheckedArray ) );
+            $attribute->setAttribute( 'is_read_only', in_array( $attributeID, $readOnlyCheckedArray ) );
 
             $placement = (int) $placementArray[$key];
             if ( $attribute->attribute( 'placement' ) != $placement )
Index: kernel/classes/ezcontentclassattribute.php
===================================================================
--- kernel/classes/ezcontentclassattribute.php	(revision 21153)
+++ kernel/classes/ezcontentclassattribute.php	(working copy)
@@ -93,6 +93,10 @@
                                                                  'datatype' => 'integer',
                                                                  'default' => 0,
                                                                  'required' => true ),
+                                         'is_read_only' => array( 'name' => 'IsReadOnly',
+                                                                  'datatype' => 'integer',
+                                                                  'default' => 0,
+                                                                  'required' => true ),
                                          'can_translate' => array( 'name' => 'CanTranslate',
                                                                    'datatype' => 'integer',
                                                                    'default' => 0
@@ -213,6 +217,7 @@
             'serialized_name_list' => $nameList->serializeNames(),
             'is_searchable' => 1,
             'is_required' => 0,
+            'is_read_only' => 0,
             'can_translate' => 1,
             'is_information_collector' => 0,
             'data_type_string' => $data_type_string,
Index: kernel/classes/ezcontentobject.php
===================================================================
--- kernel/classes/ezcontentobject.php	(revision 21153)
+++ kernel/classes/ezcontentobject.php	(working copy)
@@ -2183,11 +2183,13 @@
             if ( $currentLanguage != $defaultLanguage )
                 $isTranslation = true;
 
+            // If current attribute is read only, then do not validate
+            $doNotValidate = $contentClassAttribute->attribute( 'is_read_only' ) ? true : false;
+
             // If current attribute is a translation
             // Check if this attribute can be translated
             // If not do not validate, since the input will be copyed from the original
-            $doNotValidate = false;
-            if ( $isTranslation )
+            if ( $doNotValidate == false && $isTranslation )
             {
                 if ( !$contentClassAttribute->attribute( 'can_translate' ) )
                     $doNotValidate = true;
@@ -2295,9 +2297,11 @@
             if ( $currentLanguage != $defaultLanguage )
                 $isTranslation = true;
 
+            // If current attribute is read only, input should not be fetched
+            $fetchInput = $contentClassAttribute->attribute( 'is_read_only' ) ? false : true;
+
             // If current attribute is an un-translateable translation, input should not be fetched
-            $fetchInput = true;
-            if ( $isTranslation == true )
+            if ( $fetchInput == true && $isTranslation == true )
             {
                 if ( !$contentClassAttribute->attribute( 'can_translate' ) )
                 {
Index: share/db_schema.dba
===================================================================
--- share/db_schema.dba	(revision 21153)
+++ share/db_schema.dba	(working copy)
@@ -1275,6 +1275,13 @@
         'not_null' => '1',
         'default' => 0,
       ),
+      'is_read_only' =>
+      array (
+        'length' => 11,
+        'type' => 'int',
+        'not_null' => '1',
+        'default' => 0,
+      ),
       'placement' => 
       array (
         'length' => 11,
