diff --git a/src/libs/utils/newclasswidget.h b/src/libs/utils/newclasswidget.h
index c8923a3a3edaff2d3759be3ae6d9ae938810fc00..72b8a7fa61f95d0f1af177062ac8b26a88560d3f 100644
--- a/src/libs/utils/newclasswidget.h
+++ b/src/libs/utils/newclasswidget.h
@@ -77,7 +77,8 @@ class QTCREATOR_UTILS_EXPORT NewClassWidget : public QWidget
     Q_PROPERTY(QStringList files READ files DESIGNABLE false USER true)
     Q_ENUMS(ClassType)
 public:
-    enum ClassType { NoClassType, ClassInheritsQObject, ClassInheritsQWidget };
+    enum ClassType { NoClassType, ClassInheritsQObject, ClassInheritsQWidget,
+                     SharedDataClass };
 
     explicit NewClassWidget(QWidget *parent = 0);
     ~NewClassWidget();
diff --git a/src/libs/utils/newclasswidget.ui b/src/libs/utils/newclasswidget.ui
index 2e725644bc7d9600eedf1d9058f74e3b5501f6ab..92576f3aeec31c3099c46bc95bf075dacd995ca1 100644
--- a/src/libs/utils/newclasswidget.ui
+++ b/src/libs/utils/newclasswidget.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>418</width>
+    <width>431</width>
     <height>291</height>
    </rect>
   </property>
@@ -68,6 +68,11 @@
        <string>Inherits QWidget</string>
       </property>
      </item>
+     <item>
+      <property name="text">
+       <string>Based on QSharedData</string>
+      </property>
+     </item>
     </widget>
    </item>
    <item row="3" column="0">
diff --git a/src/plugins/cppeditor/cppclasswizard.cpp b/src/plugins/cppeditor/cppclasswizard.cpp
index 199f56573cec7b8ab31d931ad1d855794c9dc89f..ce9625eecc6e6f2660113f72737b1f5eecbc3b4c 100644
--- a/src/plugins/cppeditor/cppclasswizard.cpp
+++ b/src/plugins/cppeditor/cppclasswizard.cpp
@@ -262,12 +262,20 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par
         headerStr << '\n';
         Utils::writeIncludeFileDirective(baseClass, true, headerStr);
     }
+    if (params.classType == Utils::NewClassWidget::SharedDataClass) {
+        headerStr << '\n';
+        Utils::writeIncludeFileDirective(QLatin1String("QSharedDataPointer"), true, headerStr);
+    }
 
     const QString namespaceIndent = Utils::writeOpeningNameSpaces(namespaceList, QString(), headerStr);
 
+    const QString sharedDataClass = unqualifiedClassName + QLatin1String("Data");
+
+    if (params.classType == Utils::NewClassWidget::SharedDataClass)
+        headerStr << '\n' << "class " << sharedDataClass << ";\n";
+
     // Class declaration
-    headerStr << '\n';
-    headerStr << namespaceIndent << "class " << unqualifiedClassName;
+    headerStr << '\n' << namespaceIndent << "class " << unqualifiedClassName;
     if (!baseClass.isEmpty())
         headerStr << " : public " << baseClass << "\n";
     else
@@ -284,8 +292,21 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par
         headerStr << "explicit " << unqualifiedClassName << '(' << parentQObjectClass
                 << " *parent = 0);\n";
     }
+    // Copy/Assignment for shared data classes.
+    if (params.classType == Utils::NewClassWidget::SharedDataClass) {
+        headerStr << namespaceIndent << indent
+                  << unqualifiedClassName << "(const " << unqualifiedClassName << "&);\n"
+                  << namespaceIndent << indent
+                  << unqualifiedClassName << "& operator=(const " << unqualifiedClassName << "&);\n"
+                  << namespaceIndent << indent
+                  << '~' << unqualifiedClassName << "();\n";
+    }
     if (defineQObjectMacro)
         headerStr << '\n' << namespaceIndent << "signals:\n\n" << namespaceIndent << "public slots:\n\n";
+    if (params.classType == Utils::NewClassWidget::SharedDataClass) {
+        headerStr << '\n' << namespaceIndent << "private:\n"
+                  << namespaceIndent << indent << "QSharedDataPointer<" << sharedDataClass << "> data;\n";
+    }
     headerStr << namespaceIndent << "};\n";
 
     Utils::writeClosingNameSpaces(namespaceList, QString(), headerStr);
@@ -293,17 +314,29 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par
     headerStr << '\n';
     headerStr << "#endif // "<<  guard << '\n';
 
-
     // == Source file ==
     QTextStream sourceStr(source);
     sourceStr << license;
     Utils::writeIncludeFileDirective(params.headerFile, false, sourceStr);
+    if (params.classType == Utils::NewClassWidget::SharedDataClass)
+        Utils::writeIncludeFileDirective(QLatin1String("QSharedData"), true, sourceStr);
+
     Utils::writeOpeningNameSpaces(namespaceList, QString(), sourceStr);
+    // Private class:
+    if (params.classType == Utils::NewClassWidget::SharedDataClass) {
+        sourceStr << '\n' << namespaceIndent << "class " << sharedDataClass
+                  << " : public QSharedData {\n"
+                  << namespaceIndent << "public:\n"
+                  << namespaceIndent << "};\n";
+    }
 
     // Constructor
-    sourceStr << '\n' << namespaceIndent ;
+    sourceStr << '\n' << namespaceIndent;
     if (parentQObjectClass.isEmpty()) {
-        sourceStr << unqualifiedClassName << "::" << unqualifiedClassName << "()\n";
+        sourceStr << unqualifiedClassName << "::" << unqualifiedClassName << "()";
+        if (params.classType == Utils::NewClassWidget::SharedDataClass)
+            sourceStr << " : data(new " << sharedDataClass << ')';
+        sourceStr << '\n';
     } else {
         sourceStr << unqualifiedClassName << "::" << unqualifiedClassName
                 << '(' << parentQObjectClass << " *parent) :\n"
@@ -311,7 +344,25 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par
     }
 
     sourceStr << namespaceIndent << "{\n" << namespaceIndent << "}\n";
-
+    if (params.classType == Utils::NewClassWidget::SharedDataClass) {
+        // Copy
+        sourceStr << '\n' << namespaceIndent << unqualifiedClassName << "::" << unqualifiedClassName << "(const "
+                << unqualifiedClassName << " &rhs) : data(rhs.data)\n"
+                << namespaceIndent << "{\n" << namespaceIndent << "}\n\n";
+        // Assignment
+        sourceStr << namespaceIndent << unqualifiedClassName << " &"
+                  << unqualifiedClassName << "::operator=(const " << unqualifiedClassName << " &rhs)\n"
+                  << namespaceIndent << "{\n"
+                  << namespaceIndent << indent << "if (this != &rhs)\n"
+                  << namespaceIndent << indent << indent << "data.operator=(rhs.data);\n"
+                  << namespaceIndent << indent << "return *this;\n"
+                  << namespaceIndent << "}\n\n";
+         // Destructor
+        sourceStr << namespaceIndent << unqualifiedClassName << "::~"
+                  << unqualifiedClassName << "()\n"
+                  << namespaceIndent << "{\n"
+                  << namespaceIndent << "}\n";
+    }
     Utils::writeClosingNameSpaces(namespaceList, QString(), sourceStr);
     return true;
 }