I don&#39;t have a patch, but I do have some analysis. The following refers to vobject/base.py.<br><br>&nbsp;&nbsp;&nbsp; def setBehaviorFromVersionLine(self, versionLine):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=getBehavior(<a href="http://self.name">self.name</a>, versionLine.value)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if v: self.setBehavior(v)<br><br>For a vcard that contains &quot;VERSION:3.0&quot;, this sets the behavior to an instance of vobject.vcard.VCard3_0.<br>For a vcard that contains &quot;VERSION:2.1&quot;, this does not set the behavior since, v is None.<br>
<br>Later, valueRepr (not used in v.n.family, for example, but it illustrates the point) is called by prettyPrint:<br><br>&nbsp;&nbsp;&nbsp; def valueRepr( self ): <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v = self.value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.behavior:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v = self.behavior.valueRepr( self )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ascii( v )<br><br>For a vcard that contains &quot;VERSION:3.0&quot;, and the content line name is FN, behavior is an instance of vobject.vcard.FN.<br>For a vcard that contains &quot;VERSION:3.0&quot;, and the content line name is N, behavior is an instance of vobject.vcard.NameBehavior.<br>
For a vcard that contains &quot;VERSION:2.1&quot;, and the content line name is FN, behavior is None.<br>
For a vcard that contains &quot;VERSION:2.1&quot;, and the content line name is N, behavior is None.<br><br>Looking at how we retrieve a behavior:<br><br>def getBehavior(name, id=None):<br>&nbsp;&nbsp;&nbsp; name=name.upper()<br>&nbsp;&nbsp;&nbsp; if name in __behaviorRegistry:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if id:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for n, behavior in __behaviorRegistry[name]:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if n==id:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return behavior<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return __behaviorRegistry[name][0][1]<br>&nbsp;&nbsp;&nbsp; return None<br>
<br>&#39;VCARD&#39; is in the registry. The only entry in the list is for 3.0: [(&#39;3.0&#39;, &lt;class &#39;vobject.vcard.VCard3_0&#39;&gt;)]. The id that comes in, for a name of VCARD, is the version; either 2.1 or 3.0. It then tries to match that version in the list, but 2.1 does not exist in the list, so it returns None in the end. So, it seems like the fallback behavior doesn&#39;t exist in this method. Since this method is used for all behaviors (VCARD, N, FN, etc.), I would be hesistant to make a blanket rule of picking the first one in the list, if a match was not found.<br>
<br>What do you think?<br>