Index: kernel/classes/ezdatatype.php
===================================================================
--- kernel/classes/ezdatatype.php	(revision 24473)
+++ kernel/classes/ezdatatype.php	(working copy)
@@ -666,19 +666,82 @@
     }
 
 
-    /*!
-     \note Transaction unsafe. If you call several transaction unsafe methods you must enclose
-     the calls within a db transaction; thus within db->begin and db->commit.
+    /**
+     * @note Transaction unsafe. If you call several transaction unsafe methods you must enclose
+     *       the calls within a db transaction; thus within db->begin and db->commit.
+     *
+     * @param eZContentClassAttribute $classAttribute Content class attribute of the datatype
      */
     function storeDefinedClassAttribute( $classAttribute )
     {
     }
 
+    /**
+     * @note Transaction unsafe. If you call several transaction unsafe methods you must enclose
+     *       the calls within a db transaction; thus within db->begin and db->commit.
+     * @param eZContentClassAttribute $classAttribute Content class attribute of the datatype
+     */
+    function storeModifiedClassAttribute( $classAttribute )
+    {
+    }
+
+    /**
+     * @note Transaction unsafe. If you call several transaction unsafe methods you must enclose
+     *       the calls within a db transaction; thus within db->begin and db->commit.
+     * @param eZContentClassAttribute $classAttribute Content class attribute of the datatype
+     * @param int $version Version of the attribute to be stored
+     */
+    function storeVersionedClassAttribute( $classAttribute, $version )
+    {
+        switch ( $version )
+        {
+            case eZContentClass::VERSION_STATUS_DEFINED:
+                $this->storeDefinedClassAttribute( $classAttribute );
+                break;
+
+            case eZContentClass::VERSION_STATUS_MODIFIED:
+                $this->storeModifiedClassAttribute( $classAttribute );
+                break;
+        }
+    }
+
+    /**
+     * @param eZContentClassAttribute $classAttribute Content class attribute of the datatype
+     */
     function preStoreDefinedClassAttribute( $classAttribute )
     {
         $this->preStoreClassAttribute( $classAttribute, $classAttribute->attribute( 'version' ) );
     }
 
+    /**
+     * @param eZContentClassAttribute $classAttribute Content class attribute of the datatype
+     */
+    function preStoreModifiedClassAttribute( $classAttribute )
+    {
+        $this->preStoreClassAttribute( $classAttribute, $classAttribute->attribute( 'version' ) );
+    }
+
+    /**
+     * Hook function which is called before an content class attribute is stored
+     *
+     * @see eZContentClassAttribute::storeVersioned()
+     * @param eZContentClassAttribute $classAttribute Content class attribute of the datatype
+     * @param int $version Version of the attribute to be stored
+     */
+    function preStoreVersionedClassAttribute( $classAttribute, $version )
+    {
+        switch ( $version )
+        {
+            case eZContentClass::VERSION_STATUS_DEFINED:
+                $this->preStoreDefinedClassAttribute( $classAttribute );
+                break;
+
+            case eZContentClass::VERSION_STATUS_MODIFIED:
+                $this->preStoreModifiedClassAttribute( $classAttribute );
+                break;
+        }
+    }
+
     /*!
      Validates the input for a class attribute and returns a validation
      state as defined in eZInputValidator.
Index: kernel/classes/ezcontentclass.php
===================================================================
--- kernel/classes/ezcontentclass.php	(revision 24473)
+++ kernel/classes/ezcontentclass.php	(working copy)
@@ -786,7 +786,7 @@
     function remove( $removeAttributes = false, $version = eZContentClass::VERSION_STATUS_DEFINED )
     {
         // If we are not allowed to remove just return false
-        if ( $this->Version != eZContentClass::VERSION_STATUS_TEMPORARY && !$this->isRemovable() )
+        if ( $this->Version == eZContentClass::VERSION_STATUS_DEFINED && !$this->isRemovable() )
             return false;
 
         if ( is_array( $removeAttributes ) or $removeAttributes )
@@ -990,51 +990,71 @@
         $this->setAttribute( 'creator_id', $userID );
     }
 
-    /*!
-     Stores the current class as a defined version, updates the contentobject_name
-     attribute and recreates the class group entries.
-     \note It will remove any existing temporary or defined classes before storing.
-    */
-    function storeDefined( $attributes )
+    /**
+     * Stores the current class as a defined version, updates the contentobject_name
+     * attribute and recreates the class group entries.
+     *
+     * @note It will remove any existing temporary or defined classes before storing.
+     *
+     * @param array $attributes array of attributes of the content class
+     */
+    public function storeDefined( $attributes )
     {
+        $this->storeVersioned( $attributes, self::VERSION_STATUS_DEFINED );
+    }
+
+    /**
+     * Stores the current class as a modified version, updates the contentobject_name
+     * attribute and recreates the class group entries.
+     *
+     * @note It will remove classes in the previous and specified version before storing.
+     * 
+     * @param array $attributes array of attributes
+     * @param int $version version status
+     * @since Version 4.3
+     */
+    public function storeVersioned( $attributes, $version )
+    {
+        switch ( $version )
+        {
+            case self::VERSION_STATUS_DEFINED:
+                $previousVersion = self::VERSION_STATUS_MODIFIED;
+                break;
+            case self::VERSION_STATUS_MODIFIED:
+                $previousVersion = self::VERSION_STATUS_TEMPORARY;
+                break;
+        }
+
         $db = eZDB::instance();
         $db->begin();
 
-        $this->removeAttributes( false, eZContentClass::VERSION_STATUS_DEFINED );
-        $this->removeAttributes( false, eZContentClass::VERSION_STATUS_TEMPORARY );
+        $this->removeAttributes( false, $version );
+        $this->removeAttributes( false, $previousVersion );
         $this->remove( false );
-        $this->setVersion( eZContentClass::VERSION_STATUS_DEFINED, $attributes );
-        // include_once( "kernel/classes/datatypes/ezuser/ezuser.php" );
-        $user = eZUser::currentUser();
-        $user_id = $user->attribute( "contentobject_id" );
-        $this->setAttribute( "modifier_id", $user_id );
+        $this->setVersion( $version, $attributes );
+        $this->setAttribute( "modifier_id", eZUser::currentUser()->attribute( "contentobject_id" ) );
         $this->setAttribute( "modified", time() );
         $this->adjustAttributePlacements( $attributes );
         foreach( $attributes as $attribute )
         {
-            $attribute->storeDefined();
+            $attribute->storeVersioned( $version );
         }
 
         // Set contentobject_name to something sensible if it is missing
-        if ( count( $attributes ) > 0 )
+        if ( count( $attributes ) > 0 && trim( $this->attribute( 'contentobject_name' ) ) == '' )
         {
-            $identifier = $attributes[0]->attribute( 'identifier' );
-            $identifier = '<' . $identifier . '>';
-            if ( trim( $this->attribute( 'contentobject_name' ) ) == '' )
-            {
-                $this->setAttribute( 'contentobject_name', $identifier );
-            }
+            $this->setAttribute( 'contentobject_name', '<' . $attributes[0]->attribute( 'identifier' ) . '>' );
         }
 
         // Recreate class member entries
-        eZContentClassClassGroup::removeClassMembers( $this->ID, eZContentClass::VERSION_STATUS_DEFINED );
-        $classgroups = eZContentClassClassGroup::fetchGroupList( $this->ID, eZContentClass::VERSION_STATUS_TEMPORARY );
-        foreach( $classgroups as $classgroup )
+        eZContentClassClassGroup::removeClassMembers( $this->ID, $version );
+        
+        foreach( eZContentClassClassGroup::fetchGroupList( $this->ID, $previousVersion ) as $classgroup )
         {
-            $classgroup->setAttribute( 'contentclass_version', eZContentClass::VERSION_STATUS_DEFINED );
+            $classgroup->setAttribute( 'contentclass_version', $version );
             $classgroup->store();
         }
-        eZContentClassClassGroup::removeClassMembers( $this->ID, eZContentClass::VERSION_STATUS_TEMPORARY );
+        eZContentClassClassGroup::removeClassMembers( $this->ID, $previousVersion );
 
         eZExpiryHandler::registerShutdownFunction();
         $handler = eZExpiryHandler::instance();
Index: kernel/classes/ezcontentclassedithandler.php
===================================================================
--- kernel/classes/ezcontentclassedithandler.php	(revision 0)
+++ kernel/classes/ezcontentclassedithandler.php	(revision 0)
@@ -0,0 +1,91 @@
+<?php
+//
+// Definition of eZContentClassEditHandler class
+//
+// Created on: <11-Jan-2010 11:56:00 pa>
+//
+// ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
+// SOFTWARE NAME: eZ Publish
+// SOFTWARE RELEASE: 4.3.x
+// COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
+// SOFTWARE LICENSE: GNU General Public License v2.0
+// NOTICE: >
+//   This program is free software; you can redistribute it and/or
+//   modify it under the terms of version 2.0  of the GNU General
+//   Public License as published by the Free Software Foundation.
+//
+//   This program is distributed in the hope that it will be useful,
+//   but WITHOUT ANY WARRANTY; without even the implied warranty of
+//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//   GNU General Public License for more details.
+//
+//   You should have received a copy of version 2.0 of the GNU General
+//   Public License along with this program; if not, write to the Free
+//   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+//   MA 02110-1301, USA.
+//
+//
+// ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
+//
+
+/**
+ * Handler for content class editing.
+ */
+class eZContentClassEditHandler
+{
+
+    /**
+     * Store the modification made to an eZContentClass.
+     *
+     * @param eZContentClass Content class to be stored.
+     * @param array[eZContentClassAttribute] Attributes of the new content class.
+     * @param array Unordered view parameters
+     */
+    public function store( eZContentClass $class, array $attributes, array &$unorderedParameters )
+    {
+        $oldClassAttributes = $class->fetchAttributes( $class->attribute( 'id' ), true, eZContentClass::VERSION_STATUS_DEFINED );
+        // Delete object attributes which have been removed.
+        foreach ( $oldClassAttributes as $oldClassAttribute )
+        {
+            $attributeExists = false;
+            $oldClassAttributeID = $oldClassAttribute->attribute( 'id' );
+            foreach ( $class->fetchAttributes( ) as $newClassAttribute )
+            {
+                if ( $oldClassAttributeID == $newClassAttribute->attribute( 'id' ) )
+                {
+                    $attributeExists = true;
+                    break;
+                }
+            }
+            if ( !$attributeExists )
+            {
+                foreach ( eZContentObjectAttribute::fetchSameClassAttributeIDList( $oldClassAttributeID ) as $objectAttribute )
+                {
+                    $objectAttribute->removeThis( $objectAttribute->attribute( 'id' ) );
+                }
+            }
+        }
+        $class->storeDefined( $attributes );
+
+        // Add object attributes which have been added.
+        foreach ( $attributes as $newClassAttribute )
+        {
+            $attributeExists = false;
+            $newClassAttributeID = $newClassAttribute->attribute( 'id' );
+            foreach ( $oldClassAttributes as $oldClassAttribute )
+            {
+                if ( $newClassAttributeID == $oldClassAttribute->attribute( 'id' ) )
+                {
+                    $attributeExists = true;
+                    break;
+                }
+            }
+            if ( !$attributeExists )
+            {
+                $newClassAttribute->initializeObjectAttributes( $objects );
+            }
+        }
+    }
+}
+
+?>
\ No newline at end of file
Index: kernel/classes/ezcontentclassattribute.php
===================================================================
--- kernel/classes/ezcontentclassattribute.php	(revision 24473)
+++ kernel/classes/ezcontentclassattribute.php	(working copy)
@@ -259,12 +259,31 @@
         return $stored;
     }
 
-    /*!
-     \note Transaction unsafe. If you call several transaction unsafe methods you must enclose
-     the calls within a db transaction; thus within db->begin and db->commit.
+    /**
+     * Store the content class in the version status "defined".
+     *
+     * @note Transaction unsafe. If you call several transaction unsafe methods you must enclose
+     *       the calls within a db transaction; thus within db->begin and db->commit.
+     *
+     * @return null|false false if the operation failed
      */
     function storeDefined()
     {
+        return $this->storeVersioned( eZContentClass::VERSION_STATUS_DEFINED );
+    }
+
+    /**
+     * Store the content class in the specified version status.
+     * 
+     * @note Transaction unsafe. If you call several transaction unsafe methods you must enclose
+     *       the calls within a db transaction; thus within db->begin and db->commit.
+     *
+     * @param int $version version status
+     * @since Version 4.3
+     * @return null|false false if the operation failed
+     */
+    function storeVersioned( $version )
+    {
         $dataType = $this->dataType();
         if ( !$dataType )
         {
@@ -275,18 +294,16 @@
 
         $db = eZDB::instance();
         $db->begin();
-        $dataType->preStoreDefinedClassAttribute( $this );
+        $dataType->preStoreVersionedClassAttribute( $this, $version );
 
         $this->setAttribute( 'serialized_name_list', $this->NameList->serializeNames() );
 
-        $stored = eZPersistentObject::store();
+        eZPersistentObject::store();
 
         // store the content data for this attribute
         $info = $dataType->attribute( "information" );
-        $dataType->storeDefinedClassAttribute( $this );
+        $dataType->storeVersionedClassAttribute( $this, $version );
         $db->commit();
-
-        return $stored;
     }
 
     /*!
Index: kernel/class/view.php
===================================================================
--- kernel/class/view.php	(revision 24473)
+++ kernel/class/view.php	(working copy)
@@ -89,6 +89,7 @@
 $tpl->setVariable( 'attributes', $attributes );
 $tpl->setVariable( 'datatypes', $datatypes );
 $tpl->setVariable( 'validation', $validation );
+$tpl->setVariable( 'scheduled_script_id', (int) $Params['ScheduledScriptID'] );
 
 $Result = array();
 $Result['content'] = $tpl->fetch( 'design:class/view.tpl' );
Index: kernel/class/edit.php
===================================================================
--- kernel/class/edit.php	(revision 24473)
+++ kernel/class/edit.php	(working copy)
@@ -63,6 +63,19 @@
 
 if ( is_numeric( $ClassID ) )
 {
+    $class = eZContentClass::fetch( $ClassID, true, eZContentClass::VERSION_STATUS_MODIFIED );
+    if ( is_object( $class ) )
+    {
+        require_once( 'kernel/common/template.php' );
+        $tpl = templateInit();
+        $tpl->setVariable( 'class', $class );
+        $tpl->setVariable( "access_type", $GLOBALS['eZCurrentAccess'] );
+
+        return array( 'content' => $tpl->fetch( 'design:class/edit_locked.tpl' ),
+                      'path' => array( array( 'url' => '/class/grouplist/',
+                                              'text' => ezi18n( 'kernel/class', 'Class list' ) ) ) );
+    }
+
     $class = eZContentClass::fetch( $ClassID, true, eZContentClass::VERSION_STATUS_TEMPORARY );
 
     // If temporary version does not exist fetch the current and add temperory class to corresponding group
@@ -609,8 +622,6 @@
 if ( $http->hasPostVariable( 'StoreButton' ) && $canStore )
 {
 
-    $id = $class->attribute( 'id' );
-    $oldClassAttributes = $class->fetchAttributes( $id, true, eZContentClass::VERSION_STATUS_DEFINED );
     $newClassAttributes = $class->fetchAttributes( );
 
     // validate class name and identifier; check presence of class attributes
@@ -638,6 +649,7 @@
     // validate class identifier
 
     $db = eZDB::instance();
+    $db->begin();
     $classCount = $db->arrayQuery( "SELECT COUNT(*) AS count FROM ezcontentclass WHERE  identifier='$classIdentifier' AND version=" . eZContentClass::VERSION_STATUS_DEFINED . " AND id <> $classID" );
     if ( $classCount[0]['count'] > 0 )
     {
@@ -645,10 +657,10 @@
         $basicClassPropertiesValid = false;
     }
     unset( $classList );
-    unset( $db );
 
     if ( !$basicClassPropertiesValid )
     {
+        $db->commit();
         $canStore = false;
         $validation['processed'] = false;
     }
@@ -656,69 +668,29 @@
     {
         if ( !$http->hasSessionVariable( 'ClassCanStoreTicket' ) )
         {
+            $db->commit();
             return $Module->redirectToView( 'view', array( $ClassID ), array( 'Language' => $EditLanguage ) );
         }
 
-        // Class cleanup, update existing class objects according to new changes
-        $db = eZDB::instance();
-        $db->begin();
+        $unorderedParameters = array( 'Language' => $EditLanguage );
 
-        $objects = null;
-        $objectCount = eZContentObject::fetchSameClassListCount( $ClassID );
-        if ( $objectCount > 0 )
+        // Is there existing objects of this content class?
+        if ( eZContentObject::fetchSameClassListCount( $ClassID ) > 0 )
         {
-            // Delete object attributes which have been removed.
-            foreach ( $oldClassAttributes as $oldClassAttribute )
-            {
-                $attributeExist = false;
-                $oldClassAttributeID = $oldClassAttribute->attribute( 'id' );
-                foreach ( $newClassAttributes as $newClassAttribute )
-                {
-                    $newClassAttributeID = $newClassAttribute->attribute( 'id' );
-                    if ( $oldClassAttributeID == $newClassAttributeID )
-                        $attributeExist = true;
-                }
-                if ( !$attributeExist )
-                {
-                    $objectAttributes = eZContentObjectAttribute::fetchSameClassAttributeIDList( $oldClassAttributeID );
-                    foreach ( $objectAttributes as $objectAttribute )
-                    {
-                        $objectAttributeID = $objectAttribute->attribute( 'id' );
-                        $objectAttribute->removeThis( $objectAttributeID );
-                    }
-                }
-            }
-            $class->storeDefined( $attributes );
-
-            // Add object attributes which have been added.
-            foreach ( $attributes as $newClassAttribute )
-            {
-                $attributeExist = false;
-                $newClassAttributeID = $newClassAttribute->attribute( 'id' );
-                foreach ( $oldClassAttributes as $oldClassAttribute )
-                {
-                    $oldClassAttributeID = $oldClassAttribute->attribute( 'id' );
-                    if ( $oldClassAttributeID == $newClassAttributeID )
-                    {
-                        $attributeExist = true;
-                        break;
-                    }
-                }
-                if ( !$attributeExist )
-                {
-                    $newClassAttribute->initializeObjectAttributes( $objects );
-                }
-            }
+            eZExtension::getHandlerClass( new ezpExtensionOptions( array( 'iniFile' => 'site.ini',
+                                                                          'iniSection'   => 'ContentSettings',
+                                                                          'iniVariable'  => 'ContentClassEditHandler' ) ) )
+                    ->store( $class, $attributes, $unorderedParameters );
         }
         else
         {
-            $class->storeDefined( $attributes );
+            $unorderedParameters['ScheduledScriptID'] = 0;
+            $class->storeVersioned( $attributes, eZContentClass::VERSION_STATUS_DEFINED );
         }
 
         $db->commit();
-
         $http->removeSessionVariable( 'ClassCanStoreTicket' );
-        return $Module->redirectToView( 'view', array( $ClassID ), array( 'Language' => $EditLanguage ) );
+        return $Module->redirectToView( 'view', array( $ClassID ), $unorderedParameters );
     }
 }
 
Index: kernel/class/module.php
===================================================================
--- kernel/class/module.php	(revision 24473)
+++ kernel/class/module.php	(working copy)
@@ -40,7 +40,8 @@
     "script" => "view.php",
     "default_navigation_part" => 'ezsetupnavigationpart',
     "params" => array( "ClassID" ),
-    'unordered_params' => array( 'language' => 'Language' ) );
+    'unordered_params' => array( 'language' => 'Language',
+                                 'scriptid' => 'ScheduledScriptID' ) );
 $ViewList["copy"] = array(
     "script" => "copy.php",
     'ui_context' => 'edit',
Index: settings/site.ini
===================================================================
--- settings/site.ini	(revision 24473)
+++ settings/site.ini	(working copy)
@@ -1011,6 +1011,11 @@
 # this value in seconds, it is considered timed out (process died, for instance),
 # and generation is taken over by the requesting process
 CacheGenerationTimeout=60
+# Handler responsible of storing changes made on a content class when objects exist
+# and require an update. This might be a huge task that can lead to time out,
+# you may consider using the 'eZContentClassEditDeferredHandler' provided with the
+# eZ Script Monitor extension.
+ContentClassEditHandler=eZContentClassEditHandler
 
 [MailSettings]
 # The type of transport for emails, can be either sendmail or SMTP
Index: design/standard/templates/class/edit_locked.tpl
===================================================================
--- design/standard/templates/class/edit_locked.tpl	(revision 0)
+++ design/standard/templates/class/edit_locked.tpl	(revision 0)
@@ -0,0 +1,62 @@
+<div class="message-warning">
+
+<h2><span class="time">[{currentdate()|l10n( shortdatetime )}]</span> {'Class locked'|i18n( 'design/standard/class/edit_locked' )}</h2>
+
+    <p>{'This class has pending modifications defered to cronjob and thus it cannot be edited.'|i18n( 'design/standard/class/edit_locked' )}</p>
+    <p>{'Wait until the script is finished. You might see the status in the %urlstart script monitor%urlend</a>.'|i18n( 'design/standard/class/edit_locked', , hash( '%urlstart', concat( '<a href=', 'scriptmonitor/list'|ezurl, '>' ),
+                                                                                                                                                                  '%urlend', '</a>' ) )}</p>
+    <p>{'To force the modification of the class you may run the following command'|i18n( 'design/standard/class/edit_locked' )}:</p>
+    <pre>php extension/ezscriptmonitor/bin/syncobjectattributes.php -s {$access_type.name|wash} --classid={$class.id}</pre>
+
+</div>
+
+
+<form action={concat( 'class/edit/', $class.id )|ezurl} method="post" name="ClassEdit">
+
+<div class="context-block">
+
+{* DESIGN: Header START *}<div class="box-header"><div class="box-tc"><div class="box-ml"><div class="box-mr"><div class="box-tl"><div class="box-tr">
+
+<h1 class="context-title">{'Edit <%class_name> [Class]'|i18n( 'design/standard/class/edit_locked',, hash( '%class_name', $class.name ) )|wash}</h1>
+
+{* DESIGN: Mainline *}<div class="header-mainline"></div>
+
+{* DESIGN: Header END *}</div></div></div></div></div></div>
+
+{* DESIGN: Content START *}<div class="box-ml"><div class="box-mr"><div class="box-content">
+
+<div class="context-attributes">
+
+<div class="block">
+<label>{'Class'|i18n( 'design/standard/class/edit_locked' )}:</label>
+{$class.name|wash}
+</div>
+
+<div class="block">
+<label>{'Last modifier'|i18n( 'design/standard/class/edit_locked' )}:</label>
+<a href={$class.modifier.contentobject.main_node.url_alias|ezurl}>{$class.modifier.contentobject.name|wash}</a>
+</div>
+
+<div class="block">
+<label>{'Last modified on'|i18n( 'design/standard/class/edit_locked' )}:</label>
+{$class.modified|l10n( shortdatetime )}
+</div>
+
+<p>{'The class will be available for editing after the script has been run by the cronjob.'|i18n( 'design/standard/class/edit_locked' )}</p>
+
+</div>
+
+{* DESIGN: Content END *}</div></div></div>
+
+<div class="controlbar">
+{* DESIGN: Control bar START *}<div class="box-bc"><div class="box-ml"><div class="box-mr"><div class="box-tc"><div class="box-bl"><div class="box-br">
+<div class="block">
+<input class="button" type="submit" name="RetryButton" value="{'Retry'|i18n( 'design/standard/class/edit_locked' )}" />
+<input class="button" type="submit" name="CancelConflictButton" value="{'Cancel'|i18n( 'design/standard/class/edit_locked' )}" />
+</div>
+{* DESIGN: Control bar END *}</div></div></div></div></div></div>
+</div>
+
+</div>
+
+</form>
Index: autoload/ezp_kernel.php
===================================================================
--- autoload/ezp_kernel.php	(revision 24473)
+++ autoload/ezp_kernel.php	(working copy)
@@ -71,6 +71,7 @@
       'eZContentClassAttribute'                            => 'kernel/classes/ezcontentclassattribute.php',
       'eZContentClassAttributeNameList'                    => 'kernel/classes/ezcontentclassattributenamelist.php',
       'eZContentClassClassGroup'                           => 'kernel/classes/ezcontentclassclassgroup.php',
+      'eZContentClassEditHandler'                          => 'kernel/classes/ezcontentclassedithandler.php',
       'eZContentClassGroup'                                => 'kernel/classes/ezcontentclassgroup.php',
       'eZContentClassName'                                 => 'kernel/classes/ezcontentclassname.php',
       'eZContentClassNameList'                             => 'kernel/classes/ezcontentclassnamelist.php',
Index: design/admin/templates/class/view.tpl
===================================================================
--- design/admin/templates/class/view.tpl	(revision 24473)
+++ design/admin/templates/class/view.tpl	(working copy)
@@ -13,6 +13,15 @@
 {/section}
 {/section}
 
+{if $scheduled_script_id|gt(0)}
+    <div class="message-warning">
+        <h2><span class="time">[{currentdate()|l10n( shortdatetime )}]</span> {'Class storing deferred'|i18n( 'design/admin/class/view' )}</h2>
+        <p>
+            {'The storing of the class has been deferred because existing objects need to be updated. The process has been scheduled to run in the background and will be started automatically. Please do not edit the class again until the process has finished. You can monitor the progress of the background process here:'|i18n( 'design/admin/class/view' )}<br />
+            <b><a href={concat('scriptmonitor/view/',$scheduled_script_id)|ezurl}>{'Background process monitor'|i18n( 'design/admin/class/view' )}</a></b>
+        </p>
+    </div>
+{/if}
 
 <div class="context-block">
 {* DESIGN: Header START *}<div class="box-header"><div class="box-tc"><div class="box-ml"><div class="box-mr"><div class="box-tl"><div class="box-tr">
