Hello community,

here is the log from the commit of package umbrello for openSUSE:Factory 
checked in at 2017-01-23 11:38:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/umbrello (Old)
 and      /work/SRC/openSUSE:Factory/.umbrello.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "umbrello"

Changes:
--------
--- /work/SRC/openSUSE:Factory/umbrello/umbrello.changes        2016-12-17 
11:02:12.889068553 +0100
+++ /work/SRC/openSUSE:Factory/.umbrello.new/umbrello.changes   2017-01-23 
11:38:58.528385310 +0100
@@ -1,0 +2,7 @@
+Sat Jan 14 09:11:16 UTC 2017 - [email protected]
+
+- - Update to KDE Applications 16.12.1
+   * KDE Applications 16.12.1 
+   * https://www.kde.org/announcements/announce-applications-16.12.1.php
+
+-------------------------------------------------------------------

Old:
----
  umbrello-16.12.0.tar.xz

New:
----
  umbrello-16.12.1.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ umbrello.spec ++++++
--- /var/tmp/diff_new_pack.KxOKFw/_old  2017-01-23 11:38:59.080307031 +0100
+++ /var/tmp/diff_new_pack.KxOKFw/_new  2017-01-23 11:38:59.084306464 +0100
@@ -24,7 +24,7 @@
 License:        GPL-2.0 and GFDL-1.2
 Group:          Development/Tools/Other
 Url:            http://www.kde.org/
-Version:        16.12.0
+Version:        16.12.1
 Release:        0
 Source0:        %{name}-%{version}.tar.xz
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build

++++++ umbrello-16.12.0.tar.xz -> umbrello-16.12.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/CMakeLists.txt 
new/umbrello-16.12.1/CMakeLists.txt
--- old/umbrello-16.12.0/CMakeLists.txt 2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/CMakeLists.txt 2017-01-09 20:11:13.000000000 +0100
@@ -3,7 +3,7 @@
 # KDE Application Version, managed by release script
 set (KDE_APPLICATIONS_VERSION_MAJOR "16")
 set (KDE_APPLICATIONS_VERSION_MINOR "12")
-set (KDE_APPLICATIONS_VERSION_MICRO "0")
+set (KDE_APPLICATIONS_VERSION_MICRO "1")
 
 set(UMBRELLO_VERSION_MAJOR "2")
 MATH(EXPR UMBRELLO_VERSION_MINOR "9+${KDE_APPLICATIONS_VERSION_MINOR}")
@@ -163,6 +163,7 @@
         KIO
         TextEditor
         WidgetsAddons
+        WindowSystem
         XmlGui
     )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/lib/cppparser/driver.h 
new/umbrello-16.12.1/lib/cppparser/driver.h
--- old/umbrello-16.12.0/lib/cppparser/driver.h 2016-12-06 21:07:36.000000000 
+0100
+++ new/umbrello-16.12.1/lib/cppparser/driver.h 2017-01-09 20:11:13.000000000 
+0100
@@ -21,6 +21,7 @@
 
 #include "ast.h"
 
+#include "debug_utils.h"
 #include "macro.h"
 #include <qpair.h>
 #include <QStringList>
@@ -109,7 +110,7 @@
 
     TranslationUnitAST* operator -> () const
     {
-        if (!this) return 0;
+        uCheckPointerAndReturnIfZero(this);
         return (TranslationUnitAST*)m_translationUnit.data();
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/maintainer/release-windows-packages 
new/umbrello-16.12.1/maintainer/release-windows-packages
--- old/umbrello-16.12.0/maintainer/release-windows-packages    2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/maintainer/release-windows-packages    2017-01-09 
20:11:13.000000000 +0100
@@ -6,20 +6,11 @@
 #
 # requirements:
 #
-#  osc       - opensuse command line client
+#  osc  - opensuse build service command line client
 #
 # syntax: release-windows-packages <mode>
 #
-# where mode is:
-#
-# clean      - clean working area
-# fetch      - fetch file lists from opensuse download server
-# download   - download rpm packages
-# unpack     - unpack rpm files
-# repack     - repackage source tar ball to 7z
-# upload     - upload files to ftp:/upload.kde.org
-# ticket     - file a tar ball move request
-# all        - performs all above mentioned steps
+# run ./release-windows-packages to see all modes
 #
 REPO=openSUSE_42.2
 VERSION=2.20.90
@@ -34,11 +25,11 @@
 fi
 
 case $1 in
-clean)
+clean) ## clean working area
         rm -rf work/*
         ;;
 
-download)
+download) ## download rpm packages
         cd work
         rm -rf binaries
         osc $oscoptions getbinaries windows\:mingw:\win32 
mingw32-umbrello-installer $REPO x86_64
@@ -50,15 +41,15 @@
         #src64pkg=$(osc $oscoptions ls -b -r $REPO -a x86_64 
windows:mingw:win64 mingw64-umbrello | grep src)
         #osc $oscoptions getbinaries --sources windows\:mingw:\win32 
mingw64-umbrello $REPO x86_64 $src64pkg
         # fetch debug packages
-        #debug32pkg=$(osc $oscoptions ls -b -r $REPO -a x86_64 
windows:mingw:win32 mingw32-umbrello | grep debug)
-        #osc $oscoptions getbinaries windows\:mingw:\win32 mingw32-umbrello 
$REPO x86_64 $debug32pkg
-        #debug64pkg=$(osc $oscoptions ls -b -r $REPO -a x86_64 
windows:mingw:win64 mingw64-umbrello | grep debug)
-        #osc $oscoptions getbinaries windows\:mingw:\win64 mingw64-umbrello 
$REPO x86_64 $debug64pkg
+        debug32pkg=$(osc $oscoptions ls -b -r $REPO -a x86_64 
windows:mingw:win32 mingw32-umbrello | grep debug)
+        osc $oscoptions getbinaries windows\:mingw:\win32 mingw32-umbrello 
$REPO x86_64 $debug32pkg
+        debug64pkg=$(osc $oscoptions ls -b -r $REPO -a x86_64 
windows:mingw:win64 mingw64-umbrello | grep debug)
+        osc $oscoptions getbinaries windows\:mingw:\win64 mingw64-umbrello 
$REPO x86_64 $debug64pkg
         ;;
 
-unpack)
+unpack) ## unpack rpm files
         cd work
-        files=$(find binaries -name *installer* -o -name *portable* -o -name 
*src* | grep "$VERSION")
+        files=$(find binaries -name *installer* -o -name *portable* -o -name 
*src* -o -name *debug* | grep "$VERSION")
         if test -d tmp; then
                 rm -rf tmp
         fi
@@ -66,44 +57,71 @@
         for i in $(echo $files); do
                 (cd tmp; rpm2cpio ../$i | cpio -idmv)
         done
-        # move binary packages
+        ;;
+
+movepackage) ## move windows binary packages into upload folder
+        cd work
         rm -rf out
         mkdir -p out
-        find tmp/ -name '*.exe' -exec mv {} out \;
-        find tmp/ -name '*.7z' -exec mv {} out \;
+        find tmp/ -type f -name '*.exe' -exec cp {} out \;
+        find tmp/ -type f -name '*.7z' -exec cp {} out \;
+        ;;
+
+packdebug) ## package debug package
+        cd work
+        rm -rf out/*debug*.7z
+        arch=mingw32
+        version=$(find binaries/ -name *$arch*debug* | sed 
's,.*debug-,,g;s,\.noarch.*,,g')
+        dir=tmp/usr/i686-w64-mingw32/sys-root/mingw
+        outfile=$PWD/out/umbrello-i686-w64-mingw32-$version-debug.7z
+        (cd $dir; 7z a -r -mx=9 $outfile *.debug *.sym)
+
+        arch=mingw64
+        version=$(find binaries/ -name *$arch*debug* | sed 
's,.*debug-,,g;s,\.noarch.*,,g')
+        dir=tmp/usr/x86_64-w64-mingw32/sys-root/mingw
+        outfile=$PWD/out/umbrello-x86_64-w64-mingw32-$version-debug.7z
+        (cd $dir; 7z a -r -mx=9 $outfile *.debug *.sym)
         ;;
 
-repack)
+repacksource) ## repackage source tar ball to 7z
         # repackage source package
         srcfile=$(find work/tmp -name '*.xz')
         outfile=$(basename $srcfile | sed 's,\.tar\.xz,\.7z,g')
         (mkdir -p work/srctmp; cd work/srctmp; tar -xJf ../../$srcfile; 7za a 
../out/$outfile *; cd ..; rm -rf srctmp)
-        # create sha256sums
-        (cd work/out; sha256sum  *.7z *.exe > umbrello.sha256sum)
         ;;
 
-upload)
-        # upload
+createsha) ## create sha256sums
+        (cd work/out; find -type f -name '*.7z' -o -name '*.exe' | sed 
's,\./,,g' | sort | xargs sha256sum > umbrello.sha256sum)
+        ;;
+
+upload) ## upload files to staging area
         for i in $(find work/out -name '*.7z' -o -name '*.exe'); do
-                curl -T $i  ftp://upload.kde.org/incoming/
+            curl -T $i  ftp://upload.kde.org/incoming/
         done
         ;;
 
-ticket)
+createdescription) ## create ticket description
         description="Please move the umbrello related files which has been 
uploaded to upload.kde.org/incoming to download mirror 
'stable/umbrello/$VERSION' location and please update the symbolic link 
'stable/umbrello/latest' to 'stable/umbrello/$VERSION'"
-        sums=$(cat work/out/umbrello.sha256sum | sort -n | gawk 'BEGIN { print 
"dir   shasum                                                            file"} 
 $2 ~ /i686/ { print "win32 " $0 } $2 ~ /x86_64/ { print "win64 " $0 } $2 ~ 
/umbrello-[0-9]/ { print "src   " $0 }')
-        description=$(echo -e "$description\n\n$sums")
+        sums=$(cat work/out/umbrello.sha256sum | gawk 'BEGIN { print "dir   
shasum                                                            file"}  $2 ~ 
/i686/ { print "win32 " $0 } $2 ~ /x86_64/ { print "win64 " $0 } $2 ~ 
/umbrello-[0-9]/ { print "src   " $0 }')
+        echo -e "$description\n\n$sums"
+        ;;
+
+ticket) ## submit phabricator ticket
+        description=$($0 createdescription)
         curl $PHABURL/api/maniphest.createtask \
         -d api.token=$apitoken \
         -d "title=tarball move request for stable/umbrello/$VERSION" \
         -d "description=$description" \
         -d "$options"
         ;;
-all)
+
+all) ## run all required targets
         $0 clean
         $0 download
         $0 unpack
-        $0 repack
+        $0 movepackage
+        $0 repacksource
+        $0 createsha
         $0 upload
         $0 ticket
         ;;
@@ -111,6 +129,10 @@
 *)
         echo "Make sure to setup VERSION inside $0 and run"
         echo "$0 all"
+        echo
+        echo "or run single targets"
+        echo
+        gawk '$0 ~ /^[a-z].*) ##/ { sub(/) ##/,"",$0); a = $1; $1 = ""; 
printf("    %-20s  - %s\n",a, $0); }' $0
         ;;
 esac
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/models/UmbrelloArchitecture/umlmodel.xmi 
new/umbrello-16.12.1/models/UmbrelloArchitecture/umlmodel.xmi
--- old/umbrello-16.12.0/models/UmbrelloArchitecture/umlmodel.xmi       
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/models/UmbrelloArchitecture/umlmodel.xmi       
2017-01-09 20:11:13.000000000 +0100
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<XMI verified="false" xmi.version="1.2" timestamp="2016-09-08T09:21:22" 
xmlns:UML="http://schema.omg.org/spec/UML/1.3";>
+<XMI verified="false" xmi.version="1.2" timestamp="2016-12-07T15:41:11" 
xmlns:UML="http://schema.omg.org/spec/UML/1.3";>
  <XMI.header>
   <XMI.documentation>
    <XMI.exporter>umbrello uml modeller http://umbrello.kde.org</XMI.exporter>
-   <XMI.exporterVersion>1.6.10</XMI.exporterVersion>
+   <XMI.exporterVersion>1.6.11</XMI.exporterVersion>
    <XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
   </XMI.documentation>
   <XMI.metamodel xmi.version="1.3" href="UML.xml" xmi.name="UML"/>
@@ -3277,6 +3277,54 @@
       <UML:Generalization discriminator="" visibility="public" 
isSpecification="false" namespace="Logical View" child="TAoUrco7Ay7k" 
xmi.id="gO7Qpzh1cajf" parent="MiNwPJtCBwbc" name=""/>
       <UML:Class visibility="public" isSpecification="false" 
namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="qzPQClI4rXhy" name="QObject*"/>
       <UML:Class visibility="public" isSpecification="false" 
namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="zKeUCT61MFDV" name="client"/>
+      <UML:Class visibility="public" isSpecification="false" 
namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="IPgsE6pvMDOS" comment="This class contains the non-graphical 
information required for a UML Datatype.&#xa;This class inherits from @ref 
UMLClassifier which contains most&#xa;of the information.&#xa;&#xa;@short 
Non-graphical information for a Datatype.&#xa;@see UMLClassifier&#xa;Bugs and 
comments to [email protected] or http://bugs.kde.org"; name="UMLDatatype">
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="poaSnVGpabWV"/>
+       </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Attribute visibility="protected" isSpecification="false" 
xmi.id="yo92eJiU9of8" type="n7aGFKb1ZnwJ" name="m_isRef"/>
+        <UML:Operation stereotype="constructor" visibility="public" 
isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" 
isRoot="false" xmi.id="TPI1ymWBB2Jx" name="UMLDatatype">
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter visibility="private" isSpecification="false" 
xmi.id="2B1Qiv2JdZEW" type="bAIcUIEX6vYI" value="" name="name"/>
+          <UML:Parameter visibility="private" isSpecification="false" 
xmi.id="TaG9VPaymqyl" type="5S6muohkOTCO" value="" name="id"/>
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" 
isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="dSuoSDjTOit5" name="~ UMLDatatype"/>
+        <UML:Operation visibility="public" isSpecification="false" 
isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="cwOFTblu9z1e" name="setOriginType">
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter visibility="private" isSpecification="false" 
xmi.id="NZb9QZs3zmpS" type="VuGgnzWeCLmX" value="" name="origType"/>
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" 
isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="zZvMHmRtin6A" name="originType">
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="Mp2Vp4AAdjH1" 
type="VuGgnzWeCLmX"/>
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" 
isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="IA4FuuhsRaCi" name="setIsReference">
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter visibility="private" isSpecification="false" 
xmi.id="Nda3OgDlWEEJ" type="n7aGFKb1ZnwJ" value="" name="isRef"/>
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" 
isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="GMRt5ivLqxbj" name="isReference">
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="pGbGrnxEOXHk" 
type="n7aGFKb1ZnwJ"/>
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" 
isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="BTVffiwv2No8" name="loadFromXMI">
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter kind="return" xmi.id="xcML7b6I2Zwh" 
type="n7aGFKb1ZnwJ"/>
+          <UML:Parameter visibility="private" isSpecification="false" 
xmi.id="6hTud2dSJChA" type="BWQJ4VEIPGAq" value="" name="element"/>
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" 
isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" 
xmi.id="FscIGPOK4rCh" name="saveToXMI">
+         <UML:BehavioralFeature.parameter>
+          <UML:Parameter visibility="private" isSpecification="false" 
xmi.id="sq8B0pJyPfHW" type="d82UIG7f8Y5w" value="" name="qDoc"/>
+          <UML:Parameter visibility="private" isSpecification="false" 
xmi.id="GLmJtiy8bbQp" type="BWQJ4VEIPGAq" value="" name="qElement"/>
+         </UML:BehavioralFeature.parameter>
+        </UML:Operation>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Generalization discriminator="" visibility="public" 
isSpecification="false" namespace="Logical View" child="IPgsE6pvMDOS" 
xmi.id="poaSnVGpabWV" parent="NOCGzjiKUdGC" name=""/>
      </UML:Namespace.ownedElement>
      <XMI.extension xmi.extender="umbrello">
       <diagrams resolution="88">
@@ -3314,6 +3362,7 @@
          <datatypewidget width="142" showstereotype="1" x="57" 
usesdiagramusefillcolor="0" y="423" usesdiagramfillcolor="0" isinstance="0" 
localid="iHFxfHWr6QkP" fillcolor="#ffffc0" height="40" linecolor="#ff0000" 
xmi.id="NtM068hGxJZI" textcolor="#000000" usefillcolor="0" linewidth="0" 
font="Noto Sans,9,-1,0,50,0,0,0,0,0"/>
          <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" 
linewidth="0" showoperations="0" textcolor="#000000" 
usesdiagramusefillcolor="0" showpubliconly="0" showpackage="1" x="57" 
showattsigs="601" showstereotype="1" y="336" showattributes="1" font="Noto 
Sans,9,-1,0,50,0,0,0,0,0" localid="wXMMs2R6OO6g" width="105" isinstance="0" 
usefillcolor="0" fillcolor="#ffffc0" xmi.id="7tNIitS1FZUG" showscope="1" 
height="19" showopsigs="601"/>
          <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" 
linewidth="0" showoperations="0" textcolor="#000000" 
usesdiagramusefillcolor="0" showpubliconly="0" showpackage="1" x="123.975" 
showattsigs="601" showstereotype="1" y="1020.4" showattributes="1" font="Noto 
Sans,9,-1,0,50,0,0,0,0,0" localid="C7KITH1tDFPa" width="53" isinstance="0" 
usefillcolor="0" fillcolor="#ffffc0" xmi.id="uMl1DfCwnQtw" showscope="1" 
height="19" showopsigs="601"/>
+         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" 
linewidth="0" showoperations="0" textcolor="#000000" 
usesdiagramusefillcolor="0" showpubliconly="0" showpackage="1" x="2178.82" 
showattsigs="601" showstereotype="1" y="483.768" showattributes="1" font="Noto 
Sans,9,-1,0,50,0,0,0,0,0" localid="dy60dNWrhI8a" width="87" isinstance="0" 
usefillcolor="0" fillcolor="#ffffc0" xmi.id="IPgsE6pvMDOS" showscope="1" 
height="26" showopsigs="601"/>
         </widgets>
         <messages/>
         <associations>
@@ -3355,7 +3404,7 @@
            <endpoint endx="595" endy="931"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="2" usesdiagramusefillcolor="0" 
widgetaid="MiNwPJtCBwbc" usesdiagramfillcolor="0" fillcolor="#ffff00" 
linecolor="#ff0000" seqnum="" totalcounta="2" xmi.id="lYX43ktrCwIU" 
widgetbid="Yc0BnEgp6uEQ" totalcountb="3" type="500" textcolor="none" 
usefillcolor="1" linewidth="0" font="Noto Sans,9,-1,0,50,0,0,0,0,0">
+         <assocwidget indexa="1" indexb="1" usesdiagramusefillcolor="0" 
widgetaid="MiNwPJtCBwbc" usesdiagramfillcolor="0" fillcolor="#ffff00" 
linecolor="#ff0000" seqnum="" totalcounta="2" xmi.id="lYX43ktrCwIU" 
widgetbid="Yc0BnEgp6uEQ" totalcountb="2" type="500" textcolor="none" 
usefillcolor="1" linewidth="0" font="Noto Sans,9,-1,0,50,0,0,0,0,0">
           <linepath layout="Polyline">
            <startpoint startx="749" starty="542"/>
            <endpoint endx="595" endy="931"/>
@@ -3502,6 +3551,12 @@
            <endpoint endx="176.975" endy="1039.4"/>
           </linepath>
          </assocwidget>
+         <assocwidget indexa="1" indexb="1" usesdiagramusefillcolor="0" 
widgetaid="IPgsE6pvMDOS" usesdiagramfillcolor="0" fillcolor="#ffff00" 
linecolor="#ff0000" seqnum="" totalcounta="2" xmi.id="poaSnVGpabWV" 
widgetbid="NOCGzjiKUdGC" totalcountb="2" type="500" textcolor="none" 
usefillcolor="1" linewidth="0" font="Noto Sans,9,-1,0,50,0,0,0,0,0">
+          <linepath layout="Polyline">
+           <startpoint startx="2178.82" starty="483.768"/>
+           <endpoint endx="1778" endy="412"/>
+          </linepath>
+         </assocwidget>
         </associations>
        </diagram>
        <diagram showopsig="1" linecolor="#ff0000" snapx="25" 
showattribassocs="1" snapy="25" linewidth="0" showattsig="1" 
textcolor="#000000" isopen="1" showpackage="1" showpubliconly="0" 
showstereotype="1" name="UML parent handling" font="Sans 
Serif,9,-1,0,50,0,0,0,0,0" canvasheight="665" canvaswidth="726" localid="-1" 
snapcsgrid="0" showgrid="0" showops="1" griddotcolor="#d3d3d3" 
backgroundcolor="#ffffff" autoincrementsequence="0" usefillcolor="1" 
fillcolor="#ffffc0" zoom="100" xmi.id="3ZBjupRIc6iz" documentation="" 
showscope="1" snapgrid="0" showatts="1" type="3">
@@ -3587,6 +3642,7 @@
       <UML:Artifact visibility="public" isSpecification="false" 
namespace="Component View" drawas="1" isAbstract="false" isLeaf="false" 
isRoot="false" xmi.id="KBNFUwXswPtn" 
comment="*************************************************************************&#xa;
                                                                         *&#xa; 
  This program is free software; you can redistribute it and/or modify  *&#xa;  
 it under the terms of the GNU General Public License as published by  *&#xa;   
the Free Software Foundation; either version 2 of the License, or     *&#xa;   
(at your option) any later version.                                   *&#xa;    
                                                                     *&#xa;   
copyright (C) 2004-2007                                               *&#xa;   
Umbrello UML Modeller Authors &lt;[email protected]>                *&#xa; 
*************************************************************************" 
name="umltemplatelist.h"/>
       <UML:Artifact visibility="public" isSpecification="false" 
namespace="Component View" drawas="1" isAbstract="false" isLeaf="false" 
isRoot="false" xmi.id="umf7IfVzVMkZ" 
comment="*************************************************************************&#xa;
   This program is free software; you can redistribute it and/or modify  *&#xa; 
  it under the terms of the GNU General Public License as published by  *&#xa;  
 the Free Software Foundation; either version 2 of the License, or     *&#xa;   
(at your option) any later version.                                   *&#xa;    
                                                                     *&#xa;   
copyright (C) 2002-2014                                               *&#xa;   
Umbrello UML Modeller Authors &lt;[email protected]>                *&#xa; 
*************************************************************************" 
name="uniqueconstraint.h"/>
       <UML:Artifact visibility="public" isSpecification="false" 
namespace="Component View" drawas="1" isAbstract="false" isLeaf="false" 
isRoot="false" xmi.id="Bfsi2w2k0p6Y" 
comment="*************************************************************************&#xa;
   This program is free software; you can redistribute it and/or modify  *&#xa; 
  it under the terms of the GNU General Public License as published by  *&#xa;  
 the Free Software Foundation; either version 2 of the License, or     *&#xa;   
(at your option) any later version.                                   *&#xa;    
                                                                     *&#xa;   
copyright (C) 2002-2014                                               *&#xa;   
Umbrello UML Modeller Authors &lt;[email protected]>                *&#xa; 
*************************************************************************" 
name="usecase.h"/>
+      <UML:Artifact visibility="public" isSpecification="false" 
namespace="Component View" drawas="1" isAbstract="false" isLeaf="false" 
isRoot="false" xmi.id="45Ngwft2vOVk" 
comment="*************************************************************************&#xa;
   This program is free software; you can redistribute it and/or modify  *&#xa; 
  it under the terms of the GNU General Public License as published by  *&#xa;  
 the Free Software Foundation; either version 2 of the License, or     *&#xa;   
(at your option) any later version.                                   *&#xa;    
                                                                     *&#xa;   
copyright (C) 2003-2016                                               *&#xa;   
Umbrello UML Modeller Authors &lt;[email protected]>                *&#xa; 
*************************************************************************" 
name="datatype.h"/>
      </UML:Namespace.ownedElement>
     </UML:Model>
     <UML:Model visibility="public" isSpecification="false" namespace="m1" 
isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Deployment View" 
name="Deployment View">
@@ -3599,7 +3655,7 @@
   </UML:Model>
  </XMI.content>
  <XMI.extensions xmi.extender="umbrello">
-  <docsettings viewid="3ZBjupRIc6iz" uniqueid="stisR61Kuw0A" documentation=""/>
+  <docsettings viewid="TGcjrcWrBVaN" uniqueid="dy60dNWrhI8a" documentation=""/>
   <listview>
    <listitem open="1" type="800" id="Views">
     <listitem open="1" type="802" id="Use Case View"/>
@@ -3614,6 +3670,7 @@
      <listitem open="0" type="824" id="AYkCWatmubZS"/>
      <listitem open="0" type="824" id="gKM4dS7LnwJE"/>
      <listitem open="0" type="824" id="KxrHx68I0q2j"/>
+     <listitem open="0" type="824" id="45Ngwft2vOVk"/>
      <listitem open="0" type="824" id="MwIvVnuQ6wb3"/>
      <listitem open="0" type="824" id="asKmUMoU376N"/>
      <listitem open="0" type="824" id="2IE3wxcoF0Vw"/>
@@ -3785,13 +3842,13 @@
       <listitem open="0" type="813" id="7CMamDdSMZqv">
        <listitem open="0" type="813" id="evBABG9k36En"/>
       </listitem>
-      <listitem open="0" type="813" id="IMIJw0bGwz97">
+      <listitem open="1" type="813" id="IMIJw0bGwz97">
        <listitem open="0" type="813" id="276qIb5XWJkC"/>
       </listitem>
       <listitem open="0" type="813" id="RlsO2dtrrLHP">
        <listitem open="0" type="813" id="a7KusyjitTKG"/>
       </listitem>
-      <listitem open="0" type="813" id="hNcnJA4NvA3o">
+      <listitem open="1" type="813" id="hNcnJA4NvA3o">
        <listitem open="0" type="813" id="5S6muohkOTCO"/>
       </listitem>
       <listitem open="0" type="813" id="HhSgiZswOAfN">
@@ -4055,7 +4112,7 @@
       <listitem open="0" type="815" id="1vNRp6bIW2d8"/>
       <listitem open="0" type="815" id="GTcJ0Wj9d7GL"/>
      </listitem>
-     <listitem open="0" type="813" id="atDLKcH70N77">
+     <listitem open="1" type="813" id="atDLKcH70N77">
       <listitem open="0" type="815" id="EgFiJveikOZY"/>
       <listitem open="0" type="815" id="OvsevRjnjVhh"/>
       <listitem open="0" type="815" id="lInEtv07I2Z5"/>
@@ -4074,6 +4131,17 @@
       <listitem open="0" type="815" id="XApeAYMIruWL"/>
       <listitem open="0" type="815" id="h9ZA3eY5rF5s"/>
      </listitem>
+     <listitem open="0" type="813" id="IPgsE6pvMDOS">
+      <listitem open="0" type="815" id="dSuoSDjTOit5"/>
+      <listitem open="0" type="815" id="GMRt5ivLqxbj"/>
+      <listitem open="0" type="815" id="BTVffiwv2No8"/>
+      <listitem open="0" type="814" id="yo92eJiU9of8"/>
+      <listitem open="0" type="815" id="zZvMHmRtin6A"/>
+      <listitem open="0" type="815" id="FscIGPOK4rCh"/>
+      <listitem open="0" type="815" id="IA4FuuhsRaCi"/>
+      <listitem open="0" type="815" id="cwOFTblu9z1e"/>
+      <listitem open="0" type="815" id="TPI1ymWBB2Jx"/>
+     </listitem>
      <listitem open="0" type="813" id="juoqWYRuBROj">
       <listitem open="0" type="815" id="bv26mP55yIhW"/>
       <listitem open="0" type="815" id="YQ6GupXlijdK"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/CMakeLists.txt 
new/umbrello-16.12.1/umbrello/CMakeLists.txt
--- old/umbrello-16.12.0/umbrello/CMakeLists.txt        2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/CMakeLists.txt        2017-01-09 
20:11:13.000000000 +0100
@@ -563,7 +563,7 @@
         ${CMAKE_CURRENT_SOURCE_DIR}/pics/global/hi128-apps-umbrello.png
     )
     add_executable(umbrello ${umbrello_SRCS})
-    target_link_libraries(umbrello libumbrello)
+    target_link_libraries(umbrello libumbrello KF5::WindowSystem)
 endif()
 if(LIB_BUILD_MODE EQUAL SHARED)
     install(TARGETS libumbrello ${INSTALL_TARGETS_DEFAULT_ARGS} )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/cmds/widget/cmdcreatewidget.cpp 
new/umbrello-16.12.1/umbrello/cmds/widget/cmdcreatewidget.cpp
--- old/umbrello-16.12.0/umbrello/cmds/widget/cmdcreatewidget.cpp       
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/cmds/widget/cmdcreatewidget.cpp       
2017-01-09 20:11:13.000000000 +0100
@@ -53,8 +53,8 @@
             // widget back from the saved XMI state.
             QDomElement widgetElement = m_element.firstChild().toElement();
             umlWidget = scene()->loadWidgetFromXMI(widgetElement);
-
-            addWidgetToScene(umlWidget);
+            if (umlWidget)
+                addWidgetToScene(umlWidget);
         }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/codegenerators/ada/adawriter.cpp 
new/umbrello-16.12.1/umbrello/codegenerators/ada/adawriter.cpp
--- old/umbrello-16.12.0/umbrello/codegenerators/ada/adawriter.cpp      
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/codegenerators/ada/adawriter.cpp      
2017-01-09 20:11:13.000000000 +0100
@@ -712,7 +712,7 @@
                 if (forceSections() || atl.count()) {
                     ada << indent() << "-- Attributes:" << m_endl;
                     foreach (UMLAttribute* at, atl) {
-                        if (at->isStatic())
+                        if (!at || at->isStatic())
                             continue;
                         ada << indent() << cleanName(at->name()) << " : "
                         << at->getTypeName();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/codegenerators/cpp/cppwriter.cpp 
new/umbrello-16.12.1/umbrello/codegenerators/cpp/cppwriter.cpp
--- old/umbrello-16.12.0/umbrello/codegenerators/cpp/cppwriter.cpp      
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/codegenerators/cpp/cppwriter.cpp      
2017-01-09 20:11:13.000000000 +0100
@@ -1123,6 +1123,7 @@
 void CppWriter::writeDataTypes(UMLClassifier *c, Uml::Visibility::Enum 
permitScope, QTextStream &stream)
 {
     foreach (UMLObject* o, c->containedObjects()) {
+        uIgnoreZeroPointer(o);
         if (o->visibility() != permitScope)
             continue;
         if (!o->isUMLDatatype())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/codegenerators/tcl/tclwriter.cpp 
new/umbrello-16.12.1/umbrello/codegenerators/tcl/tclwriter.cpp
--- old/umbrello-16.12.0/umbrello/codegenerators/tcl/tclwriter.cpp      
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/codegenerators/tcl/tclwriter.cpp      
2017-01-09 20:11:13.000000000 +0100
@@ -413,11 +413,15 @@
         // only use OTHER classes (e.g. we don't need to write includes for 
ourselves!!
         // AND only IF the roleName is defined, otherwise, it is not meant to 
be noticed.
         if (a->getObjectId(Uml::RoleType::A) == myId && 
!a->getRoleName(Uml::RoleType::B).isEmpty()) {
-            classifier = dynamic_cast < UMLClassifier * 
>(a->getObject(Uml::RoleType::B));
+            classifier = a->getObject(Uml::RoleType::B)->asUMLClassifier();
+            if (classifier == 0)
+                continue;
             writeUse(classifier);
         } else if (a->getObjectId(Uml::RoleType::B) == myId
                    && !a->getRoleName(Uml::RoleType::A).isEmpty()) {
-            classifier = dynamic_cast < UMLClassifier * 
>(a->getObject(Uml::RoleType::A));
+            classifier = a->getObject(Uml::RoleType::A)->asUMLClassifier();
+            if (classifier == 0)
+                continue;
             if (classifier->package().isEmpty())
                 writeCode(QLatin1String("namespace eval ") + 
cleanName(classifier->name()) +
                           QLatin1String(" {}"));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/codeimport/classimport.cpp 
new/umbrello-16.12.1/umbrello/codeimport/classimport.cpp
--- old/umbrello-16.12.0/umbrello/codeimport/classimport.cpp    2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/codeimport/classimport.cpp    2017-01-09 
20:11:13.000000000 +0100
@@ -88,6 +88,7 @@
     uint processedFilesCount = 0;
     bool result = true;
     umldoc->setLoading(true);
+    umldoc->setImporting(true);
     foreach (const QString& fileName, fileNames) {
         umldoc->writeToStatusBar(i18n("Importing file: %1 Progress: %2/%3",
                                  fileName, processedFilesCount, 
fileNames.size()));
@@ -96,6 +97,7 @@
         processedFilesCount++;
     }
     umldoc->setLoading(false);
+    umldoc->setImporting(false);
     umldoc->writeToStatusBar(result ? i18nc("ready to status bar", "Ready.") : 
i18nc("failed to status bar", "Failed."));
     return result;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/codeimport/import_utils.cpp 
new/umbrello-16.12.1/umbrello/codeimport/import_utils.cpp
--- old/umbrello-16.12.0/umbrello/codeimport/import_utils.cpp   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/codeimport/import_utils.cpp   2017-01-09 
20:11:13.000000000 +0100
@@ -283,7 +283,7 @@
             else
                 uError() << "createUMLObject(" << name << "): "
                     << "origType " << typeName << " is not a UMLClassifier";
-            if (isRef || isPointer)
+            if (dt && (isRef || isPointer))
                 dt->setIsReference();
             /*
             if (isPointer) {
@@ -312,7 +312,7 @@
     if (! strippedComment.isEmpty()) {
         o->setDoc(strippedComment);
     }
-    if (!stereotype.isEmpty()) {
+    if (o && !stereotype.isEmpty()) {
         o->setStereotype(stereotype);
     }
     if (gRelatedClassifier == 0 || gRelatedClassifier == o)
@@ -512,7 +512,7 @@
                                  const QString& name)
 {
     UMLClassifier *owner = method->umlParent()->asUMLClassifier();
-    UMLObject *typeObj = owner->findTemplate(type);
+    UMLObject *typeObj = owner ? owner->findTemplate(type) : 0;
     if (typeObj == 0) {
         bPutAtGlobalScope = true;
         gRelatedClassifier = owner;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/codeimport/javaimport.cpp 
new/umbrello-16.12.1/umbrello/codeimport/javaimport.cpp
--- old/umbrello-16.12.0/umbrello/codeimport/javaimport.cpp     2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/codeimport/javaimport.cpp     2017-01-09 
20:11:13.000000000 +0100
@@ -18,6 +18,7 @@
 #include "debug_utils.h"
 #include "enum.h"
 #include "import_utils.h"
+#include "object_factory.h"
 #include "operation.h"
 #include "package.h"
 #include "uml.h"
@@ -393,6 +394,22 @@
         UMLObject *ns = Import_Utils::createUMLObject(UMLObject::ot_Enum,
                         name, currentScope(), m_comment);
         UMLEnum *enumType = ns->asUMLEnum();
+        // handle type mismatch
+        if (ns && enumType == 0) {
+            QString comment = ns->doc();
+            QString stereotype = ns->stereotype();
+            Uml::Visibility::Enum visibility = ns->visibility();
+            UMLApp::app()->document()->removeUMLObject(ns, true);
+            ns = Object_Factory::createNewUMLObject(UMLObject::ot_Enum, name, 
currentScope(), false);
+            ns->setDoc(comment);
+            ns->setStereotypeCmd(stereotype.isEmpty() ? QLatin1String("enum") 
: stereotype);
+            ns->setVisibilityCmd(visibility);
+            // add to parents child list
+            if (!currentScope()->containedObjects().contains(ns))
+                currentScope()->containedObjects().append(ns);
+            enumType = ns->asUMLEnum();
+        }
+
         skipStmt(QLatin1String("{"));
         while (m_srcIndex < srcLength - 1 && advance() != QLatin1String("}")) {
             Import_Utils::addEnumLiteral(enumType, m_source[m_srcIndex]);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/codeimport/pythonimport.cpp 
new/umbrello-16.12.1/umbrello/codeimport/pythonimport.cpp
--- old/umbrello-16.12.0/umbrello/codeimport/pythonimport.cpp   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/codeimport/pythonimport.cpp   2017-01-09 
20:11:13.000000000 +0100
@@ -313,8 +313,15 @@
             m_comment = QString();
         }
 
-        const QString& name = advance();
-        // operation
+        QString name = advance();
+        Uml::Visibility::Enum visibility = Uml::Visibility::Public;
+        if (name.startsWith(QLatin1String("__"))) {
+            name = name.mid(2);
+            visibility = Uml::Visibility::Private;
+        } else if (name.startsWith(QLatin1String("_"))) {
+            name = name.mid(1);
+            visibility = Uml::Visibility::Protected;
+        }
         UMLOperation *op = Import_Utils::makeOperation(m_klass, name);
         if (advance() != QLatin1String("(")) {
             uError() << "importPython def " << name << ": expecting \"(\"";
@@ -336,7 +343,7 @@
             if (advance() != QLatin1String(","))
                 break;
         }
-        Import_Utils::insertMethod(m_klass, op, Uml::Visibility::Public, 
QLatin1String("string"),
+        Import_Utils::insertMethod(m_klass, op, visibility, 
QLatin1String("string"),
                                    m_isStatic, false /*isAbstract*/, false 
/*isFriend*/,
                                    false /*isConstructor*/, m_comment);
         m_isStatic = false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/debug/debug_utils.h 
new/umbrello-16.12.1/umbrello/debug/debug_utils.h
--- old/umbrello-16.12.0/umbrello/debug/debug_utils.h   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/debug/debug_utils.h   2017-01-09 
20:11:13.000000000 +0100
@@ -131,6 +131,25 @@
 
 #define uIgnoreZeroPointer(a) if (!a) { uDebug() << "zero pointer detected" << 
__FILE__ << __LINE__; continue; }
 
+/**
+  Check a pointer and return 0 if it is zero.
+
+  This macros is implemented as asm code to prevent
+  removing by gcc optimizer for example in class methods
+  where 'this' pointer is attributed as "nonnull".
+
+  @param p pointer to check
+  @return returns 0 is pointer is zero
+*/
+#define uCheckPointerAndReturnIfZero(p) \
+    asm goto ("test %0,%0; jne %l[next]" \
+              : /* No outputs. */ \
+              : "r"(p) \
+              : \
+              : next); \
+         return 0; \
+       next:
+
 
 /**
  * In a Q_OBJECT class define any enum as Q_ENUMS.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/dialogs/umlattributedialog.cpp 
new/umbrello-16.12.1/umbrello/dialogs/umlattributedialog.cpp
--- old/umbrello-16.12.0/umbrello/dialogs/umlattributedialog.cpp        
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/dialogs/umlattributedialog.cpp        
2017-01-09 20:11:13.000000000 +0100
@@ -126,18 +126,18 @@
         m_pNameLE->setText(m_pAttribute->name());
         return false;
     }
-    m_pAttribute->setName(name);
+    m_pAttribute->blockSignals(true);
     m_visibilityEnumWidget->apply();
-
-    // Set the scope as the default in the option state
-    Settings::optionState().classState.defaultAttributeScope = 
m_pAttribute->visibility();
-
     m_pAttribute->setInitialValue(m_pInitialLE->text());
     m_stereotypeWidget->apply();
     m_pAttribute->setStatic(m_pStaticCB->isChecked());
-
     m_datatypeWidget->apply();
     m_docWidget->apply();
+    m_pAttribute->blockSignals(false);
+    // trigger signals
+    m_pAttribute->setName(name);
 
+    // Set the scope as the default in the option state
+    Settings::optionState().classState.defaultAttributeScope = 
m_pAttribute->visibility();
     return true;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/layoutgenerator.cpp 
new/umbrello-16.12.1/umbrello/layoutgenerator.cpp
--- old/umbrello-16.12.0/umbrello/layoutgenerator.cpp   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/layoutgenerator.cpp   2017-01-09 
20:11:13.000000000 +0100
@@ -294,7 +294,14 @@
 {
     QString diagramType = Uml::DiagramType::toString(scene->type()).toLower();
 #if QT_VERSION >= 0x050000
-    QStringList fileNames = 
QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, 
QString::fromLatin1("umbrello/layouts/%1*.desktop").arg(diagramType));
+    const QStringList dirs = 
QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, 
QLatin1String("umbrello/layouts"), QStandardPaths::LocateDirectory);
+    QStringList fileNames;
+    foreach(const QString& dir, dirs) {
+        const QStringList entries = QDir(dir).entryList(QStringList() << 
QString::fromLatin1("%1*.desktop").arg(diagramType));
+        foreach(const QString& file, entries) {
+            fileNames.append(dir + QLatin1Char('/') + file);
+        }
+    }
 #else
     KStandardDirs dirs;
     QStringList fileNames = dirs.findAllResources("data", 
QString::fromLatin1("umbrello/layouts/%1*.desktop").arg(diagramType));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/listpopupmenu.cpp 
new/umbrello-16.12.1/umbrello/listpopupmenu.cpp
--- old/umbrello-16.12.0/umbrello/listpopupmenu.cpp     2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/listpopupmenu.cpp     2017-01-09 
20:11:13.000000000 +0100
@@ -419,9 +419,12 @@
        }
     case WidgetBase::wt_Class:
     case WidgetBase::wt_Interface:
-        makeClassifierPopup(static_cast<ClassifierWidget*>(object));
+        {
+            ClassifierWidget* classifier = object->asClassifierWidget();
+            if (classifier)
+                makeClassifierPopup(classifier);
+        }
         break;
-
     case WidgetBase::wt_Enum:
         insertSubMenuNew(mt_Enum);
         insertSubMenuColor(object->useFillColor());
@@ -1050,6 +1053,7 @@
     insert(mt_Delete);
 
     switch(mt) {
+    case mt_AttributeAssociation:
     case mt_FullAssociation:
         insert(mt_Rename_Name, i18n("Change Association Name..."));
         insert(mt_Rename_RoleAName, i18n("Change Role A Name..."));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/model_utils.cpp 
new/umbrello-16.12.1/umbrello/model_utils.cpp
--- old/umbrello-16.12.0/umbrello/model_utils.cpp       2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/model_utils.cpp       2017-01-09 
20:11:13.000000000 +0100
@@ -859,7 +859,7 @@
         QString retType = pat.cap(1);
         retType = retType.trimmed();
         if (retType != QLatin1String("void")) {
-            UMLObject *pRetType = owningScope->findTemplate(retType);
+            UMLObject *pRetType = owningScope ? 
owningScope->findTemplate(retType) : 0;
             if (pRetType == 0) {
                 pRetType = pDoc->findUMLObject(retType, 
UMLObject::ot_UMLObject, owningScope);
                 if (pRetType == 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umldoc.cpp 
new/umbrello-16.12.1/umbrello/umldoc.cpp
--- old/umbrello-16.12.0/umbrello/umldoc.cpp    2016-12-06 21:07:36.000000000 
+0100
+++ new/umbrello-16.12.1/umbrello/umldoc.cpp    2017-01-09 20:11:13.000000000 
+0100
@@ -113,6 +113,7 @@
 #endif
     m_pChangeLog(0),
     m_bLoading(false),
+    m_importing(false),
     m_Doc(QString()),
     m_pAutoSaveTimer(0),
     m_nViewID(Uml::ID::None),
@@ -1519,6 +1520,23 @@
 }
 
 /**
+ * Returns true when importing file(s).
+ * @return the value of the flag
+ */
+bool UMLDoc::importing() const
+{
+    return m_importing;
+}
+/**
+ * Sets importing boolean flag to the value given.
+ * @param state   value to set
+ */
+void UMLDoc::setImporting(bool state /* = true */)
+{
+    m_importing = state;
+}
+
+/**
  * Returns the m_bClosing flag.
  * @return the value of the flag
  */
@@ -1819,7 +1837,7 @@
         return 0;
     }
     UMLFolder *f = currentView->umlScene()->folder();
-    while (f->umlPackage()) {
+    while (f && f->umlPackage()) {
         f = f->umlParent()->asUMLFolder();
     }
     return f;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umldoc.h 
new/umbrello-16.12.1/umbrello/umldoc.h
--- old/umbrello-16.12.0/umbrello/umldoc.h      2016-12-06 21:07:36.000000000 
+0100
+++ new/umbrello-16.12.1/umbrello/umldoc.h      2017-01-09 20:11:13.000000000 
+0100
@@ -222,6 +222,9 @@
     bool loading() const;
     void setLoading(bool state = true);
 
+    bool importing() const;
+    void setImporting(bool state = true);
+
     bool closing() const;
 
     void addDefaultDatatypes();
@@ -290,6 +293,11 @@
     bool m_bLoading;
 
     /**
+     * true if the we're importing
+     */
+    bool m_importing;
+
+    /**
      * Documentation for the project.
      */
     QString m_Doc;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umllistview.cpp 
new/umbrello-16.12.1/umbrello/umllistview.cpp
--- old/umbrello-16.12.0/umbrello/umllistview.cpp       2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umllistview.cpp       2017-01-09 
20:11:13.000000000 +0100
@@ -1201,7 +1201,7 @@
  */
 void UMLListView::slotObjectRemoved(UMLObject* object)
 {
-    if (m_doc->loading()) { //needed for class wizard
+    if (m_doc->loading() && !m_doc->importing()) { //needed for class wizard 
but not when importing
         return;
     }
     disconnect(object, SIGNAL(modified()), this, SLOT(slotObjectChanged()));
@@ -2244,7 +2244,7 @@
         // the parent entity)
         if (type == UMLListViewItem::lvt_PrimaryKeyConstraint) {
             UMLUniqueConstraint* uuc = object->asUMLUniqueConstraint();
-            UMLEntity* ent = uuc->umlParent()->asUMLEntity();
+            UMLEntity* ent = uuc ? uuc->umlParent()->asUMLEntity() : 0;
             if (ent) {
                 ent->setAsPrimaryKey(uuc);
             }
@@ -2517,7 +2517,8 @@
                 DEBUG(DBG_SRC) << "Loaded <listview> entry does not match uml 
model"
                                << item->text(0) << " parent "
                                << parent->text(0) << " (" << parent << ") != "
-                               << itmParent->text(0) << " (" << itmParent << 
")";
+                               << (itmParent ? itmParent->text(0) : 
QLatin1String(""))
+                               << " (" << itmParent << ")";
             }
             break;
         case UMLListViewItem::lvt_Attribute:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umllistviewitem.cpp 
new/umbrello-16.12.1/umbrello/umllistviewitem.cpp
--- old/umbrello-16.12.0/umbrello/umllistviewitem.cpp   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umllistviewitem.cpp   2017-01-09 
20:11:13.000000000 +0100
@@ -510,7 +510,7 @@
             return;
         }
         UMLOperation *op = m_object->asUMLOperation();
-        UMLClassifier *parent = op->umlParent()->asUMLClassifier();
+        UMLClassifier *parent = op ? op->umlParent()->asUMLClassifier() : 0;
         Model_Utils::OpDescriptor od;
         Model_Utils::Parse_Status st = Model_Utils::parseOperation(newText, 
od, parent);
         if (st == Model_Utils::PS_OK) {
@@ -566,7 +566,7 @@
         Model_Utils::Parse_Status st;
         st = Model_Utils::parseAttribute(newText, nt, parent, &vis);
         if (st == Model_Utils::PS_OK) {
-            UMLObject *exists = parent->findChildObject(newText);
+            UMLObject *exists = parent ? parent->findChildObject(newText) : 0;
             if (exists) {
                 cancelRenameWithMsg();
                 return;
@@ -627,7 +627,7 @@
         Model_Utils::NameAndType nt;
         Model_Utils::Parse_Status st = Model_Utils::parseTemplate(newText, nt, 
parent);
         if (st == Model_Utils::PS_OK) {
-            UMLObject *exists = parent->findChildObject(newText);
+            UMLObject *exists = parent ? parent->findChildObject(newText) : 0;
             if (exists) {
                 cancelRenameWithMsg();
                 return;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/attribute.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/attribute.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/attribute.cpp        2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/attribute.cpp        2017-01-09 
20:11:13.000000000 +0100
@@ -130,7 +130,7 @@
  * @param sig   If true will show the attribute type and initial value.
  * @return  Returns a string representation of the UMLAttribute.
  */
-QString UMLAttribute::toString(Uml::SignatureType::Enum sig)
+QString UMLAttribute::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
     QString s;
 
@@ -172,6 +172,11 @@
         QString string = s + name() + QLatin1String(" : ") + typeName;
         if (m_InitialValue.length() > 0)
             string += QLatin1String(" = ") + m_InitialValue;
+        if (withStereotype) {
+            QString st = stereotype(true);
+            if (!st.isEmpty())
+                string += QLatin1Char(' ') + st;
+        }
         return string;
     }
     return s + name();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/attribute.h 
new/umbrello-16.12.1/umbrello/umlmodel/attribute.h
--- old/umbrello-16.12.0/umbrello/umlmodel/attribute.h  2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/attribute.h  2017-01-09 
20:11:13.000000000 +0100
@@ -50,7 +50,7 @@
     QString getInitialValue() const;
     void setInitialValue(const QString &iv);
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     QString getFullyQualifiedName(const QString& separator = QString(),
                                   bool includeRoot = false) const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/checkconstraint.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/checkconstraint.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/checkconstraint.cpp  2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/checkconstraint.cpp  2017-01-09 
20:11:13.000000000 +0100
@@ -93,8 +93,9 @@
  * @param sig   If true will show the attribute type and initial value.
  * @return  Returns a string representation of the UMLAttribute.
  */
-QString UMLCheckConstraint::toString(Uml::SignatureType::Enum sig)
+QString UMLCheckConstraint::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
+    Q_UNUSED(withStereotype);
     QString s;
 
     if (sig == Uml::SignatureType::ShowSig || sig == 
Uml::SignatureType::SigNoVis) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/checkconstraint.h 
new/umbrello-16.12.1/umbrello/umlmodel/checkconstraint.h
--- old/umbrello-16.12.0/umbrello/umlmodel/checkconstraint.h    2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/checkconstraint.h    2017-01-09 
20:11:13.000000000 +0100
@@ -39,7 +39,7 @@
 
     virtual UMLObject* clone() const;
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     QString getFullyQualifiedName(const QString& separator = QString(),
                                   bool includeRoot = false) const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/classifier.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/classifier.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/classifier.cpp       2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/classifier.cpp       2017-01-09 
20:11:13.000000000 +0100
@@ -1342,7 +1342,7 @@
             bool found = false;
             //make sure that an attribute with the same name doesn't already 
exist
             foreach (UMLAttribute *at, atl) {
-                uIgnoreZeroPointer(a);
+                uIgnoreZeroPointer(at);
                 if (at->name() == roleNameB) {
                     found = true;
                     break;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/classifierlistitem.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/classifierlistitem.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/classifierlistitem.cpp       
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/classifierlistitem.cpp       
2017-01-09 20:11:13.000000000 +0100
@@ -87,9 +87,10 @@
  * @param sig   What type of operation string to show.
  * @return  The string representation of the operation.
  */
-QString UMLClassifierListItem::toString(Uml::SignatureType::Enum sig)
+QString UMLClassifierListItem::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
     Q_UNUSED(sig);
+    Q_UNUSED(withStereotype);
     return name();
 }
 
@@ -100,7 +101,7 @@
  */
 UMLClassifier * UMLClassifierListItem::getType() const
 {
-    return m_pSecondary->asUMLClassifier();
+    return m_pSecondary ? m_pSecondary->asUMLClassifier() : 0;
 }
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/classifierlistitem.h 
new/umbrello-16.12.1/umbrello/umlmodel/classifierlistitem.h
--- old/umbrello-16.12.0/umbrello/umlmodel/classifierlistitem.h 2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/classifierlistitem.h 2017-01-09 
20:11:13.000000000 +0100
@@ -43,7 +43,7 @@
     void setTypeName(const QString &type);
     virtual QString getTypeName() const;
 
-    virtual QString toString(Uml::SignatureType::Enum sig = 
Uml::SignatureType::NoSig);
+    virtual QString toString(Uml::SignatureType::Enum sig = 
Uml::SignatureType::NoSig, bool withStereotype=false);
 
     virtual void copyInto(UMLObject *lhs) const;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/entity.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/entity.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/entity.cpp   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/entity.cpp   2017-01-09 
20:11:13.000000000 +0100
@@ -524,7 +524,8 @@
     }
 
     // check if this constraint already exists as a unique constraint for this 
entity
-    UMLUniqueConstraint* uuc = 
findChildObjectById(uconstr->id())->asUMLUniqueConstraint();
+    UMLObject *o = findChildObjectById(uconstr->id());
+    UMLUniqueConstraint* uuc = o ? o->asUMLUniqueConstraint() : 0;
     if (uuc == 0) {
         addConstraint(uconstr);
         uuc = uconstr;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/entityattribute.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/entityattribute.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/entityattribute.cpp  2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/entityattribute.cpp  2017-01-09 
20:11:13.000000000 +0100
@@ -166,8 +166,9 @@
  * @param sig   If true will show the entityattribute type and initial value.
  * @return  Returns a string representation of the UMLEntityAttribute.
  */
-QString UMLEntityAttribute::toString(Uml::SignatureType::Enum sig)
+QString UMLEntityAttribute::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
+    Q_UNUSED(withStereotype);
     QString s;
     //FIXME
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/entityattribute.h 
new/umbrello-16.12.1/umbrello/umlmodel/entityattribute.h
--- old/umbrello-16.12.0/umbrello/umlmodel/entityattribute.h    2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/entityattribute.h    2017-01-09 
20:11:13.000000000 +0100
@@ -63,7 +63,7 @@
     void setNull(const bool null);
     bool getNull() const;
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/enumliteral.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/enumliteral.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/enumliteral.cpp      2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/enumliteral.cpp      2017-01-09 
20:11:13.000000000 +0100
@@ -84,10 +84,11 @@
  * @param sig   If true will show the attribute type and value.
  * @return  Returns a string representation of the UMLEnumLiteral.
  */
-QString UMLEnumLiteral::toString(Uml::SignatureType::Enum sig)
+QString UMLEnumLiteral::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
     QString s;
     Q_UNUSED(sig);
+    Q_UNUSED(withStereotype);
 
     s = name();
     if (m_Value.length() > 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/enumliteral.h 
new/umbrello-16.12.1/umbrello/umlmodel/enumliteral.h
--- old/umbrello-16.12.0/umbrello/umlmodel/enumliteral.h        2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/enumliteral.h        2017-01-09 
20:11:13.000000000 +0100
@@ -41,7 +41,7 @@
     QString value() const;
     void setValue(const QString &v);
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/foreignkeyconstraint.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/foreignkeyconstraint.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/foreignkeyconstraint.cpp     
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/foreignkeyconstraint.cpp     
2017-01-09 20:11:13.000000000 +0100
@@ -118,8 +118,9 @@
  * @param sig   If true will show the attribute type and initial value.
  * @return  Returns a string representation of the UMLAttribute.
  */
-QString UMLForeignKeyConstraint::toString(Uml::SignatureType::Enum sig)
+QString UMLForeignKeyConstraint::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
+    Q_UNUSED(withStereotype);
     QString s;
 
     if (sig == Uml::SignatureType::ShowSig || sig == 
Uml::SignatureType::SigNoVis) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/foreignkeyconstraint.h 
new/umbrello-16.12.1/umbrello/umlmodel/foreignkeyconstraint.h
--- old/umbrello-16.12.0/umbrello/umlmodel/foreignkeyconstraint.h       
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/foreignkeyconstraint.h       
2017-01-09 20:11:13.000000000 +0100
@@ -57,7 +57,7 @@
 
     virtual UMLObject* clone() const;
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     void setReferencedEntity(UMLEntity* ent);
     UMLEntity* getReferencedEntity() const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/operation.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/operation.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/operation.cpp        2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/operation.cpp        2017-01-09 
20:11:13.000000000 +0100
@@ -196,7 +196,7 @@
  * @param sig       what type of operation string to show
  * @return          the string representation of the operation
  */
-QString UMLOperation::toString(Uml::SignatureType::Enum sig)
+QString UMLOperation::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
     QString s;
 
@@ -211,6 +211,11 @@
     if (sig == Uml::SignatureType::NoSig || sig == 
Uml::SignatureType::NoSigNoVis) {
         if (parameterlessOpNeedsParentheses)
             s.append(QLatin1String("()"));
+        if (withStereotype) {
+            QString st = stereotype(true);
+            if (!st.isEmpty())
+                s += QLatin1Char(' ') + st;
+        }
         return s;
     }
     int last = m_List.count();
@@ -219,7 +224,7 @@
         int i = 0;
         foreach (UMLAttribute *param, m_List) {
             i++;
-            s.append(param->toString(Uml::SignatureType::SigNoVis));
+            s.append(param->toString(Uml::SignatureType::SigNoVis, 
withStereotype));
             if (i < last)
                 s.append(QLatin1String(", "));
         }
@@ -246,6 +251,11 @@
             s += returnType;
         }
     }
+    if (withStereotype) {
+        QString st = stereotype(true);
+        if (!st.isEmpty())
+            s += QLatin1Char(' ') + st;
+    }
     return s;
 }
 
@@ -358,6 +368,8 @@
         return true;
 
     UMLClassifier * c = umlParent()->asUMLClassifier();
+    if (!c)
+        return false;
     QString cName = c->name();
     QString opName = name();
     // It's a constructor operation if the operation name
@@ -375,7 +387,8 @@
     if (stereotype() == QLatin1String("destructor"))
         return true;
     UMLClassifier * c = umlParent()->asUMLClassifier();
-
+    if (!c)
+        return false;
     QString cName = c->name();
     QString opName = name();
     // Special support for C++ syntax:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/operation.h 
new/umbrello-16.12.1/umbrello/umlmodel/operation.h
--- old/umbrello-16.12.0/umbrello/umlmodel/operation.h  2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/operation.h  2017-01-09 
20:11:13.000000000 +0100
@@ -49,7 +49,7 @@
 
     UMLAttribute * findParm(const QString &name);
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     void addParm(UMLAttribute *parameter, int position = -1);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/template.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/template.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/template.cpp 2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/template.cpp 2017-01-09 
20:11:13.000000000 +0100
@@ -51,14 +51,22 @@
 {
 }
 
-QString UMLTemplate::toString(Uml::SignatureType::Enum sig)
+QString UMLTemplate::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
     Q_UNUSED(sig);
+    QString s;
+
     if (m_pSecondary == 0 || m_pSecondary->name() == QLatin1String("class")) {
-        return name();
+        s = name();
     } else {
-        return name() + QLatin1String(" : ") + m_pSecondary->name();
+        s = name() + QLatin1String(" : ") + m_pSecondary->name();
+    }
+    if (withStereotype) {
+        QString st = stereotype(true);
+        if (!st.isEmpty())
+            s += QLatin1String(" ") + st;
     }
+    return s;
 }
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/template.h 
new/umbrello-16.12.1/umbrello/umlmodel/template.h
--- old/umbrello-16.12.0/umbrello/umlmodel/template.h   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/template.h   2017-01-09 
20:11:13.000000000 +0100
@@ -40,7 +40,7 @@
 
     virtual ~UMLTemplate();
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     virtual QString getTypeName() const;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlmodel/umlobject.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/umlobject.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/umlobject.cpp        2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/umlobject.cpp        2017-01-09 
20:11:13.000000000 +0100
@@ -669,6 +669,7 @@
  */
 UMLObject *UMLObject::umlParent() const
 {
+    uCheckPointerAndReturnIfZero(this);
     return dynamic_cast<UMLObject *>(parent());
 }
 
@@ -1226,32 +1227,33 @@
 #include "uniqueconstraint.h"
 #include "usecase.h"
 
-UMLActor* UMLObject::asUMLActor() {return dynamic_cast<UMLActor*>(this); }
-UMLArtifact* UMLObject::asUMLArtifact() { return 
dynamic_cast<UMLArtifact*>(this); }
-UMLAssociation* UMLObject::asUMLAssociation() { return 
dynamic_cast<UMLAssociation*>(this); }
-UMLAttribute* UMLObject::asUMLAttribute() { return 
dynamic_cast<UMLAttribute*>(this); }
-UMLCanvasObject* UMLObject::asUMLCanvasObject() { return 
dynamic_cast<UMLCanvasObject*>(this); }
-UMLCategory* UMLObject::asUMLCategory() { return 
dynamic_cast<UMLCategory*>(this); }
-UMLCheckConstraint* UMLObject::asUMLCheckConstraint() { return 
dynamic_cast<UMLCheckConstraint*>(this); }
-UMLClassifier* UMLObject::asUMLClassifier() { return 
dynamic_cast<UMLClassifier*>(this); }
-UMLClassifierListItem *UMLObject::asUMLClassifierListItem() { return 
dynamic_cast<UMLClassifierListItem*>(this); }
-UMLComponent* UMLObject::asUMLComponent() { return 
dynamic_cast<UMLComponent*>(this); }
-UMLDatatype *UMLObject::asUMLDatatype() { return 
dynamic_cast<UMLDatatype*>(this); }
-UMLEntity* UMLObject::asUMLEntity() { return dynamic_cast<UMLEntity*>(this); }
-UMLEntityAttribute* UMLObject::asUMLEntityAttribute() { return 
dynamic_cast<UMLEntityAttribute*>(this); }
-UMLEntityConstraint* UMLObject::asUMLEntityConstraint() { return 
dynamic_cast<UMLEntityConstraint*>(this); }
-UMLEnum* UMLObject::asUMLEnum() { return dynamic_cast<UMLEnum*>(this); }
-UMLEnumLiteral* UMLObject::asUMLEnumLiteral() { return 
dynamic_cast<UMLEnumLiteral*>(this); }
-UMLFolder* UMLObject::asUMLFolder() { return dynamic_cast<UMLFolder*>(this); }
-UMLForeignKeyConstraint* UMLObject::asUMLForeignKeyConstraint() { return 
dynamic_cast<UMLForeignKeyConstraint*>(this); }
-UMLNode* UMLObject::asUMLNode() { return dynamic_cast<UMLNode*>(this); }
-UMLObject* UMLObject::asUMLObject() { return dynamic_cast<UMLObject*>(this); }
-UMLOperation* UMLObject::asUMLOperation() { return 
dynamic_cast<UMLOperation*>(this); }
-UMLPackage* UMLObject::asUMLPackage() { return 
dynamic_cast<UMLPackage*>(this); }
-UMLPort* UMLObject::asUMLPort() { return dynamic_cast<UMLPort*>(this); }
-UMLRole* UMLObject::asUMLRole() { return dynamic_cast<UMLRole*>(this); }
-UMLStereotype* UMLObject::asUMLStereotype() { return 
dynamic_cast<UMLStereotype*>(this); }
-UMLTemplate* UMLObject::asUMLTemplate() { return 
dynamic_cast<UMLTemplate*>(this); }
-UMLUniqueConstraint* UMLObject::asUMLUniqueConstraint() { return 
dynamic_cast<UMLUniqueConstraint*>(this); }
-UMLUseCase* UMLObject::asUMLUseCase() { return 
dynamic_cast<UMLUseCase*>(this); }
+
+UMLActor* UMLObject::asUMLActor() { uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLActor*>(this); }
+UMLArtifact* UMLObject::asUMLArtifact() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLArtifact*>(this); }
+UMLAssociation* UMLObject::asUMLAssociation() { 
uCheckPointerAndReturnIfZero(this); return dynamic_cast<UMLAssociation*>(this); 
}
+UMLAttribute* UMLObject::asUMLAttribute() { 
uCheckPointerAndReturnIfZero(this); return dynamic_cast<UMLAttribute*>(this); }
+UMLCanvasObject* UMLObject::asUMLCanvasObject() { 
uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLCanvasObject*>(this); }
+UMLCategory* UMLObject::asUMLCategory() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLCategory*>(this); }
+UMLCheckConstraint* UMLObject::asUMLCheckConstraint() { 
uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLCheckConstraint*>(this); }
+UMLClassifier* UMLObject::asUMLClassifier() { 
uCheckPointerAndReturnIfZero(this); return dynamic_cast<UMLClassifier*>(this); }
+UMLClassifierListItem *UMLObject::asUMLClassifierListItem() { 
uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLClassifierListItem*>(this); }
+UMLComponent* UMLObject::asUMLComponent() { 
uCheckPointerAndReturnIfZero(this); return dynamic_cast<UMLComponent*>(this); }
+UMLDatatype *UMLObject::asUMLDatatype() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLDatatype*>(this); }
+UMLEntity* UMLObject::asUMLEntity() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLEntity*>(this); }
+UMLEntityAttribute* UMLObject::asUMLEntityAttribute() { 
uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLEntityAttribute*>(this); }
+UMLEntityConstraint* UMLObject::asUMLEntityConstraint() { 
uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLEntityConstraint*>(this); }
+UMLEnum* UMLObject::asUMLEnum() { uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLEnum*>(this); }
+UMLEnumLiteral* UMLObject::asUMLEnumLiteral() { 
uCheckPointerAndReturnIfZero(this); return dynamic_cast<UMLEnumLiteral*>(this); 
}
+UMLFolder* UMLObject::asUMLFolder() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLFolder*>(this); }
+UMLForeignKeyConstraint* UMLObject::asUMLForeignKeyConstraint() { 
uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLForeignKeyConstraint*>(this); }
+UMLNode* UMLObject::asUMLNode() { uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLNode*>(this); }
+UMLObject* UMLObject::asUMLObject() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLObject*>(this); }
+UMLOperation* UMLObject::asUMLOperation() { 
uCheckPointerAndReturnIfZero(this); return dynamic_cast<UMLOperation*>(this); }
+UMLPackage* UMLObject::asUMLPackage() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLPackage*>(this); }
+UMLPort* UMLObject::asUMLPort() { uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLPort*>(this); }
+UMLRole* UMLObject::asUMLRole() { uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLRole*>(this); }
+UMLStereotype* UMLObject::asUMLStereotype() { 
uCheckPointerAndReturnIfZero(this); return dynamic_cast<UMLStereotype*>(this); }
+UMLTemplate* UMLObject::asUMLTemplate() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLTemplate*>(this); }
+UMLUniqueConstraint* UMLObject::asUMLUniqueConstraint() { 
uCheckPointerAndReturnIfZero(this); return 
dynamic_cast<UMLUniqueConstraint*>(this); }
+UMLUseCase* UMLObject::asUMLUseCase() { uCheckPointerAndReturnIfZero(this); 
return dynamic_cast<UMLUseCase*>(this); }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/uniqueconstraint.cpp 
new/umbrello-16.12.1/umbrello/umlmodel/uniqueconstraint.cpp
--- old/umbrello-16.12.0/umbrello/umlmodel/uniqueconstraint.cpp 2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/uniqueconstraint.cpp 2017-01-09 
20:11:13.000000000 +0100
@@ -109,9 +109,10 @@
  * @param sig  If true will show the attribute type and initial value.
  * @return  Returns a string representation of the UMLAttribute.
  */
-QString UMLUniqueConstraint::toString(Uml::SignatureType::Enum sig)
+QString UMLUniqueConstraint::toString(Uml::SignatureType::Enum sig, bool 
withStereotype)
 {
-     QString s;
+    Q_UNUSED(withStereotype);
+    QString s;
 
     if (sig == Uml::SignatureType::ShowSig || sig == 
Uml::SignatureType::SigNoVis) {
         s = name() + QLatin1Char(':');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlmodel/uniqueconstraint.h 
new/umbrello-16.12.1/umbrello/umlmodel/uniqueconstraint.h
--- old/umbrello-16.12.0/umbrello/umlmodel/uniqueconstraint.h   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlmodel/uniqueconstraint.h   2017-01-09 
20:11:13.000000000 +0100
@@ -40,7 +40,7 @@
 
     virtual UMLObject* clone() const;
 
-    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig);
+    QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig, 
bool withStereotype=false);
 
     QString getFullyQualifiedName(const QString& separator = QString(),
                                   bool includeRoot = false) const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlscene.cpp 
new/umbrello-16.12.1/umbrello/umlscene.cpp
--- old/umbrello-16.12.0/umbrello/umlscene.cpp  2016-12-06 21:07:36.000000000 
+0100
+++ new/umbrello-16.12.1/umbrello/umlscene.cpp  2017-01-09 20:11:13.000000000 
+0100
@@ -2460,7 +2460,7 @@
     // if the underlying model object is really a UMLClassifier then
     if (tmpUmlObj->isUMLDatatype()) {
         UMLDatatype *dt = tmpUmlObj->asUMLDatatype();
-        while (dt->originType() != 0) {
+        while (dt && dt->originType() != 0) {
             tmpUmlObj = dt->originType();
             if (!tmpUmlObj->isUMLDatatype())
                 break;
@@ -2527,7 +2527,7 @@
     if (type->isUMLDatatype()) {
         UMLDatatype *dt = type->asUMLDatatype();
         // if the Datatype is a reference (pointer) type
-        if (dt->isReference()) {
+        if (dt && dt->isReference()) {
             //Uml::AssociationType::Enum assocType = 
Uml::AssociationType::Composition;
             UMLClassifier *c = dt->originType();
             UMLWidget *w = c ? findWidget(c->id()) : 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlwidgets/associationwidget.cpp 
new/umbrello-16.12.1/umbrello/umlwidgets/associationwidget.cpp
--- old/umbrello-16.12.0/umbrello/umlwidgets/associationwidget.cpp      
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlwidgets/associationwidget.cpp      
2017-01-09 20:11:13.000000000 +0100
@@ -448,26 +448,6 @@
     UMLApp::app()->docWindow()->updateDocumentation();
     QPointer<AssociationPropertiesDialog> dlg = new 
AssociationPropertiesDialog(static_cast<QWidget*>(m_scene->activeView()), this);
     if (dlg->exec()) {
-        //rules built into these functions to stop updating incorrect values
-        setName(name());
-
-        setRoleName(roleName(RoleType::A), RoleType::A);
-        setRoleName(roleName(RoleType::B), RoleType::B);
-
-        setDocumentation(documentation());
-
-        setRoleDocumentation(roleDocumentation(RoleType::A), RoleType::A);
-        setRoleDocumentation(roleDocumentation(RoleType::B), RoleType::B);
-
-        setMultiplicity(multiplicity(RoleType::A), RoleType::A);
-        setMultiplicity(multiplicity(RoleType::B), RoleType::B);
-
-        setVisibility(visibility(RoleType::A), RoleType::A);
-        setVisibility(visibility(RoleType::B), RoleType::B);
-
-        setChangeability(changeability(RoleType::A), RoleType::A);
-        setChangeability(changeability(RoleType::B), RoleType::B);
-
         UMLApp::app()->docWindow()->showDocumentation(this, true);
     }
     delete dlg;
@@ -1131,16 +1111,21 @@
  */
 void AssociationWidget::setVisibility(Visibility::Enum value, 
Uml::RoleType::Enum role)
 {
-    if (value == visibility(role)) {
-        return;
-    }
-    if (m_umlObject) {
+    if (value != visibility(role) && m_umlObject) {
         // update our model object
         const UMLObject::ObjectType ot = m_umlObject->baseType();
-        if (ot == UMLObject::ot_Association)
-            association()->setVisibility(value, role);
-        else if (ot == UMLObject::ot_Attribute)
-            attribute()->setVisibility(value);
+        if (ot == UMLObject::ot_Association) {
+            UMLAssociation *a = association();
+            a->blockSignals(true);
+            a->setVisibility(value, role);
+            a->blockSignals(false);
+        }
+        else if (ot == UMLObject::ot_Attribute) {
+            UMLAttribute *a = attribute();
+            a->blockSignals(true);
+            a->setVisibility(value);
+            a->blockSignals(false);
+        }
     }
     m_role[role].visibility = value;
     // update role pre-text attribute as appropriate
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/umbrello-16.12.0/umbrello/umlwidgets/classifierwidget.cpp 
new/umbrello-16.12.1/umbrello/umlwidgets/classifierwidget.cpp
--- old/umbrello-16.12.0/umbrello/umlwidgets/classifierwidget.cpp       
2016-12-06 21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlwidgets/classifierwidget.cpp       
2017-01-09 20:11:13.000000000 +0100
@@ -541,7 +541,7 @@
             foreach (UMLClassifierListItem *a, list) {
                 if (visualProperty(ShowPublicOnly) && a->visibility() != 
Uml::Visibility::Public)
                     continue;
-                const int attWidth = fm.size(0, 
a->toString(m_attributeSignature)).width();
+                const int attWidth = fm.size(0, 
a->toString(m_attributeSignature, visualProperty(ShowStereotype))).width();
                 if (attWidth > width)
                     width = attWidth;
             }
@@ -560,7 +560,7 @@
             foreach (UMLOperation* op,  list) {
                       if (visualProperty(ShowPublicOnly) && op->visibility() 
!= Uml::Visibility::Public)
                     continue;
-                const QString displayedOp = op->toString(m_operationSignature);
+                const QString displayedOp = op->toString(m_operationSignature, 
visualProperty(ShowStereotype));
                 UMLWidget::FontType oft;
                 oft = (op->isAbstract() ? UMLWidget::FT_ITALIC : 
UMLWidget::FT_NORMAL);
                 const int w = UMLWidget::getFontMetrics(oft).size(0, 
displayedOp).width();
@@ -621,7 +621,7 @@
     int height = count * fm.lineSpacing() + (MARGIN*2);
 
     foreach (UMLTemplate *t, list) {
-        int textWidth = fm.size(0, t->toString()).width();
+        int textWidth = fm.size(0, t->toString(Uml::SignatureType::NoSig, 
visualProperty(ShowStereotype))).width();
         if (textWidth > width)
             width = textWidth;
     }
@@ -740,7 +740,7 @@
         const int x = width() - templatesBoxSize.width() + MARGIN;
         int y = MARGIN;
         foreach (UMLTemplate *t, tlist) {
-            QString text = t->toString();
+            QString text = t->toString(Uml::SignatureType::NoSig, 
visualProperty(ShowStereotype));
             painter->drawText(x, y, fm.size(0, text).width(), fontHeight, 
Qt::AlignVCenter, text);
             y += fontHeight;
         }
@@ -1034,7 +1034,7 @@
     foreach (UMLClassifierListItem *obj, list) {
           if (visualProperty(ShowPublicOnly) && obj->visibility() != 
Uml::Visibility::Public)
             continue;
-        QString text = obj->toString(sigType);
+        QString text = obj->toString(sigType, visualProperty(ShowStereotype));
         f.setItalic(obj->isAbstract());
         f.setUnderline(obj->isStatic());
         painter->setFont(f);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/umbrello/umlwidgets/umlwidget.cpp 
new/umbrello-16.12.1/umbrello/umlwidgets/umlwidget.cpp
--- old/umbrello-16.12.0/umbrello/umlwidgets/umlwidget.cpp      2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/umbrello/umlwidgets/umlwidget.cpp      2017-01-09 
20:11:13.000000000 +0100
@@ -584,6 +584,7 @@
     } else {
         m_inMoveArea = false;
     }
+    m_startMove = false;
 }
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/unittests/CMakeLists.txt 
new/umbrello-16.12.1/unittests/CMakeLists.txt
--- old/umbrello-16.12.0/unittests/CMakeLists.txt       2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/unittests/CMakeLists.txt       2017-01-09 
20:11:13.000000000 +0100
@@ -115,6 +115,9 @@
 ecm_add_executable(testumlroledialog ${testumlroledialog_SRCS})
 target_link_libraries(testumlroledialog ${LIBS})
 
+ecm_add_executable(testcrashhandler testcrashhandler.cpp)
+target_link_libraries(testcrashhandler ${LIBS})
+
 find_package(LLVM CONFIG)
 find_package(CLANG QUIET)
 if(LLVM_FOUND)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/unittests/testbasictypes.cpp 
new/umbrello-16.12.1/unittests/testbasictypes.cpp
--- old/umbrello-16.12.0/unittests/testbasictypes.cpp   2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/unittests/testbasictypes.cpp   2017-01-09 
20:11:13.000000000 +0100
@@ -39,6 +39,16 @@
 {
 };
 
+B* asB(A* p)
+{
+    return dynamic_cast<B*>(p);
+}
+
+A* getPointer()
+{
+    return 0;
+}
+
 void TestBasicTypes::test_dynamic_cast()
 {
     QScopedPointer<A> a1(new A);
@@ -47,6 +57,13 @@
     QScopedPointer<A> a2(new B);
     B* b2 = dynamic_cast<B*> (a2.data());
     QVERIFY(b2);
+    QScopedPointer<A> a3((B*)0);
+    B* b3 = dynamic_cast<B*> (a3.data());
+    QVERIFY(!b3);
+    B* b4 = dynamic_cast<B*> (getPointer());
+    QVERIFY(!b4);
+    B* b5 = asB(getPointer());
+    QVERIFY(!b5);
 }
 
 void TestBasicTypes::test_QString_english()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/unittests/testcrashhandler.cpp 
new/umbrello-16.12.1/unittests/testcrashhandler.cpp
--- old/umbrello-16.12.0/unittests/testcrashhandler.cpp 1970-01-01 
01:00:00.000000000 +0100
+++ new/umbrello-16.12.1/unittests/testcrashhandler.cpp 2017-01-09 
20:11:13.000000000 +0100
@@ -0,0 +1,45 @@
+/*
+    Copyright 2016  Ralf Habacker  <[email protected]>
+
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of
+    the License or (at your option) version 3 or any later version
+    accepted by the membership of KDE e.V. (or its successor approved
+    by the membership of KDE e.V.), which shall act as a proxy
+    defined in Section 14 of version 3 of the license.
+
+    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 the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <qglobal.h>
+#if QT_VERSION >= 0x050000
+#include <QApplication>
+#else
+#include <KAboutData>
+#include <KApplication>
+#include <KCmdLineArgs>
+#endif
+
+int main(int argc, char **argv)
+{
+#if QT_VERSION >= 0x050000
+    QApplication app(argc, argv);
+    // enable crash handler
+#else
+    KAboutData aboutData("testcrashhandler", 0, KLocalizedString(),
+                         "0.0.0", KLocalizedString(), KAboutData::License_GPL,
+                         KLocalizedString(), KLocalizedString(),
+                         "");
+    KCmdLineArgs::init(argc, argv, &aboutData);
+    KApplication app;
+#endif
+    int *a = 0;
+    *a = 1;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/unittests/testumlobject.cpp 
new/umbrello-16.12.1/unittests/testumlobject.cpp
--- old/umbrello-16.12.0/unittests/testumlobject.cpp    2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/unittests/testumlobject.cpp    2017-01-09 
20:11:13.000000000 +0100
@@ -230,4 +230,15 @@
     QCOMPARE(UMLObject::toI18nString(UMLObject::ot_Class), i18n("Class 
&name:"));
 }
 
+void TestUMLObject::test_dynamic_cast()
+{
+    QScopedPointer<UMLObject> a1(new UMLClassifier);
+    UMLClassifier *b = a1->asUMLClassifier();
+    QVERIFY(b);
+    UMLObject *a2 = 0;
+    b = a2->asUMLClassifier();
+    QVERIFY(!b);
+}
+
+
 QTEST_MAIN(TestUMLObject)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/umbrello-16.12.0/unittests/testumlobject.h 
new/umbrello-16.12.1/unittests/testumlobject.h
--- old/umbrello-16.12.0/unittests/testumlobject.h      2016-12-06 
21:07:36.000000000 +0100
+++ new/umbrello-16.12.1/unittests/testumlobject.h      2017-01-09 
20:11:13.000000000 +0100
@@ -41,6 +41,7 @@
     void test_setUMLPackage();
     void test_setVisibility();
     void test_toString();
+    void test_dynamic_cast();
 };
 
 #endif // TESTUMLOBJECT_H


Reply via email to