diff --git a/xos/tools/apigen/api.template.py b/xos/tools/apigen/api.template.py
index 9f5123c..ef56885 100644
--- a/xos/tools/apigen/api.template.py
+++ b/xos/tools/apigen/api.template.py
@@ -38,30 +38,30 @@
     return patterns('',
     # legacy - deprecated
         url(r'^xos/$', api_root),
-    {% for object in generator.all %}
-        url(r'xos/{{ object.rest_name }}/$', {{ object.camel }}List.as_view(), name='{{ object.singular }}-list-legacy'),
-        url(r'xos/{{ object.rest_name }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel }}Detail.as_view(), name ='{{ object.singular }}-detail-legacy'),
+    {% for object in generator.all() %}
+        url(r'xos/{{ object.rest_name() }}/$', {{ object.camel() }}List.as_view(), name='{{ object.singular() }}-list-legacy'),
+        url(r'xos/{{ object.rest_name() }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel() }}Detail.as_view(), name ='{{ object.singular() }}-detail-legacy'),
     {% endfor %}
     ) + patterns('',
     # new - use these instead of the above
         url(r'^api/core/$', api_root),
-    {% for object in generator.all %}
-        url(r'api/core/{{ object.rest_name }}/$', {{ object.camel }}List.as_view(), name='{{ object.singular }}-list'),
-        url(r'api/core/{{ object.rest_name }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel }}Detail.as_view(), name ='{{ object.singular }}-detail'),
+    {% for object in generator.all() %}
+        url(r'api/core/{{ object.rest_name() }}/$', {{ object.camel() }}List.as_view(), name='{{ object.singular() }}-list'),
+        url(r'api/core/{{ object.rest_name() }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel() }}Detail.as_view(), name ='{{ object.singular() }}-detail'),
     {% endfor %}
     )
 
 @api_view(['GET'])
 def api_root_legacy(request, format=None):
     return Response({
-        {% for object in generator.all %}'{{ object.plural }}': reverse('{{ object }}-list-legacy', request=request, format=format),
+        {% for object in generator.all() %}'{{ object.plural() }}': reverse('{{ object }}-list-legacy', request=request, format=format),
         {% endfor %}
     })
 
 @api_view(['GET'])
 def api_root(request, format=None):
     return Response({
-        {% for object in generator.all %}'{{ object.plural }}': reverse('{{ object }}-list', request=request, format=format),
+        {% for object in generator.all() %}'{{ object.plural() }}': reverse('{{ object }}-list', request=request, format=format),
         {% endfor %}
     })
 
@@ -120,13 +120,13 @@
                    newModel = through(**{local_fieldName: obj, remote_fieldName: item})
                    newModel.save()
 
-{% for object in generator.all %}
+{% for object in generator.all() %}
 
-class {{ object.camel }}Serializer(serializers.HyperlinkedModelSerializer):
+class {{ object.camel() }}Serializer(serializers.HyperlinkedModelSerializer):
     id = IdField()
     {% for ref in object.refs %}
     {% if ref.multi %}
-    {{ ref.plural }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
+    {{ ref.plural() }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
     {% else %}
     {{ ref }} = serializers.HyperlinkedRelatedField(read_only=True, view_name='{{ ref }}-detail')
     {% endif %}
@@ -141,16 +141,16 @@
         except:
             return None
     class Meta:
-        model = {{ object.camel }}
-        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
+        model = {{ object.camel() }}
+        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural() }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
 
-class {{ object.camel }}IdSerializer(XOSModelSerializer):
+class {{ object.camel() }}IdSerializer(XOSModelSerializer):
     id = IdField()
     {% for ref in object.refs %}
     {% if ref.multi %}
-    {{ ref.plural }} = serializers.PrimaryKeyRelatedField(many=True,  required=False, queryset = {{ ref.camel }}.objects.all())
+    {{ ref.plural() }} = serializers.PrimaryKeyRelatedField(many=True,  required=False, queryset = {{ ref.camel() }}.objects.all())
     {% else %}
-    {{ ref }} = serializers.PrimaryKeyRelatedField( queryset = {{ ref.camel }}.objects.all())
+    {{ ref }} = serializers.PrimaryKeyRelatedField( queryset = {{ ref.camel() }}.objects.all())
     {% endif %}
     {% endfor %}
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -163,28 +163,28 @@
         except:
             return None
     class Meta:
-        model = {{ object.camel }}
-        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
+        model = {{ object.camel() }}
+        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural() }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
 
 
 {% endfor %}
 
 serializerLookUp = {
-{% for object in generator.all %}
-                 {{ object.camel }}: {{ object.camel }}Serializer,
+{% for object in generator.all() %}
+                 {{ object.camel() }}: {{ object.camel() }}Serializer,
 {% endfor %}
                  None: None,
                 }
 
 # Based on core/views/*.py
-{% for object in generator.all %}
+{% for object in generator.all() %}
 
-class {{ object.camel }}List(XOSListCreateAPIView):
-    queryset = {{ object.camel }}.objects.select_related().all()
-    serializer_class = {{ object.camel }}Serializer
-    id_serializer_class = {{ object.camel }}IdSerializer
+class {{ object.camel() }}List(XOSListCreateAPIView):
+    queryset = {{ object.camel() }}.objects.select_related().all()
+    serializer_class = {{ object.camel() }}Serializer
+    id_serializer_class = {{ object.camel() }}IdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
-    filter_fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
+    filter_fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural() }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
 
     def get_serializer_class(self):
         no_hyperlinks=False
@@ -198,13 +198,13 @@
     def get_queryset(self):
         if (not self.request.user.is_authenticated()):
             raise XOSNotAuthenticated()
-        return {{ object.camel }}.select_by_user(self.request.user)
+        return {{ object.camel() }}.select_by_user(self.request.user)
 
 
-class {{ object.camel }}Detail(XOSRetrieveUpdateDestroyAPIView):
-    queryset = {{ object.camel }}.objects.select_related().all()
-    serializer_class = {{ object.camel }}Serializer
-    id_serializer_class = {{ object.camel }}IdSerializer
+class {{ object.camel() }}Detail(XOSRetrieveUpdateDestroyAPIView):
+    queryset = {{ object.camel() }}.objects.select_related().all()
+    serializer_class = {{ object.camel() }}Serializer
+    id_serializer_class = {{ object.camel() }}IdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks=False
@@ -218,7 +218,7 @@
     def get_queryset(self):
         if (not self.request.user.is_authenticated()):
             raise XOSNotAuthenticated()
-        return {{ object.camel }}.select_by_user(self.request.user)
+        return {{ object.camel() }}.select_by_user(self.request.user)
 
     # update() is handled by XOSRetrieveUpdateDestroyAPIView
 
diff --git a/xos/tools/apigen/deps.template.json b/xos/tools/apigen/deps.template.json
index e4164cf..ca35531 100644
--- a/xos/tools/apigen/deps.template.json
+++ b/xos/tools/apigen/deps.template.json
@@ -1,7 +1,7 @@
 {
-{% for o in generator.all %}
-    "{{ o.camel }}": [
-	{% for f in o.refs %}"{{ f.camel }}",
+{% for o in generator.all() %}
+    "{{ o.camel() }}": [
+	{% for f in o.refs %}"{{ f.camel() }}",
 	{% endfor %}]
 {% endfor %}
 }
diff --git a/xos/tools/apigen/dot.template.dot b/xos/tools/apigen/dot.template.dot
index eade386..91ff7f4 100644
--- a/xos/tools/apigen/dot.template.dot
+++ b/xos/tools/apigen/dot.template.dot
@@ -1,7 +1,7 @@
 digraph plstack {
-{% for o in generator.all %}
+{% for o in generator.all() %}
 {% for f in o.refs %}
-  "{{ o.camel }}"->"{{ f.camel }}";
+  "{{ o.camel() }}"->"{{ f.camel() }}";
 {% endfor %}
 {% endfor %}
 }
diff --git a/xos/tools/apigen/fields.template.txt b/xos/tools/apigen/fields.template.txt
index ad5a0b4..e75526d 100644
--- a/xos/tools/apigen/fields.template.txt
+++ b/xos/tools/apigen/fields.template.txt
@@ -1,4 +1,4 @@
-{% for object in generator.all %}
+{% for object in generator.all() %}
 Object {{ object }}:
 Fields:
 {% for field in object.fields %}{{ field.name }}:{{ field.type }}
diff --git a/xos/tools/apigen/hpc-api.template.py b/xos/tools/apigen/hpc-api.template.py
index ed252b8..23d27c2 100644
--- a/xos/tools/apigen/hpc-api.template.py
+++ b/xos/tools/apigen/hpc-api.template.py
@@ -38,29 +38,29 @@
     return patterns('',
         url(r'^hpcapi/$', hpc_api_root_legacy),
     # legacy - deprecated
-    {% for object in generator.rest_models %}
-        url(r'hpcapi/{{ object.rest_name }}/$', {{ object.camel }}List.as_view(), name='{{ object.singular }}-list-legacy'),
-        url(r'hpcapi/{{ object.rest_name }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel }}Detail.as_view(), name ='{{ object.singular }}-detail-legacy'),
+    {% for object in generator.rest_models() %}
+        url(r'hpcapi/{{ object.rest_name() }}/$', {{ object.camel() }}List.as_view(), name='{{ object.singular() }}-list-legacy'),
+        url(r'hpcapi/{{ object.rest_name() }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel() }}Detail.as_view(), name ='{{ object.singular() }}-detail-legacy'),
     {% endfor %}
     # new api - use these
         url(r'^api/service/hpc/$', hpc_api_root),
-    {% for object in generator.rest_models %}
-        url(r'api/service/hpc/{{ object.rest_name }}/$', {{ object.camel }}List.as_view(), name='{{ object.singular }}-list'),
-        url(r'api/service/hpc/{{ object.rest_name }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel }}Detail.as_view(), name ='{{ object.singular }}-detail'),
+    {% for object in generator.rest_models() %}
+        url(r'api/service/hpc/{{ object.rest_name() }}/$', {{ object.camel() }}List.as_view(), name='{{ object.singular() }}-list'),
+        url(r'api/service/hpc/{{ object.rest_name() }}/(?P<pk>[a-zA-Z0-9\-]+)/$', {{ object.camel() }}Detail.as_view(), name ='{{ object.singular() }}-detail'),
     {% endfor %}
     )
 
 @api_view(['GET'])
 def hpc_api_root_legacy(request, format=None):
     return Response({
-        {% for object in generator.rest_models %}'{{ object.plural }}': reverse('{{ object }}-list-legacy', request=request, format=format),
+        {% for object in generator.rest_models() %}'{{ object.plural() }}': reverse('{{ object }}-list-legacy', request=request, format=format),
         {% endfor %}
     })
 
 @api_view(['GET'])
 def hpc_api_root(request, format=None):
     return Response({
-        {% for object in generator.rest_models %}'{{ object.plural }}': reverse('{{ object }}-list', request=request, format=format),
+        {% for object in generator.rest_models() %}'{{ object.plural() }}': reverse('{{ object }}-list', request=request, format=format),
         {% endfor %}
     })
 
@@ -118,13 +118,13 @@
                    newModel = through(**{local_fieldName: obj, remote_fieldName: item})
                    newModel.save()
 
-{% for object in generator.rest_models %}
+{% for object in generator.rest_models() %}
 
-class {{ object.camel }}Serializer(serializers.HyperlinkedModelSerializer):
+class {{ object.camel() }}Serializer(serializers.HyperlinkedModelSerializer):
     id = IdField()
     {% for ref in object.refs %}
     {% if ref.multi %}
-    {{ ref.plural }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
+    {{ ref.plural() }} = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='{{ ref }}-detail')
     {% else %}
     {{ ref }} = serializers.HyperlinkedRelatedField(read_only=True, view_name='{{ ref }}-detail')
     {% endif %}
@@ -139,16 +139,16 @@
         except:
             return None
     class Meta:
-        model = {{ object.camel }}
-        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
+        model = {{ object.camel() }}
+        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural() }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
 
-class {{ object.camel }}IdSerializer(XOSModelSerializer):
+class {{ object.camel() }}IdSerializer(XOSModelSerializer):
     id = IdField()
     {% for ref in object.refs %}
     {% if ref.multi %}
-    {{ ref.plural }} = serializers.PrimaryKeyRelatedField(many=True, required=False, queryset = {{ ref.camel }}.objects.all())
+    {{ ref.plural() }} = serializers.PrimaryKeyRelatedField(many=True, required=False, queryset = {{ ref.camel() }}.objects.all())
     {% else %}
-    {{ ref }} = serializers.PrimaryKeyRelatedField( queryset = {{ ref.camel }}.objects.all())
+    {{ ref }} = serializers.PrimaryKeyRelatedField( queryset = {{ ref.camel() }}.objects.all())
     {% endif %}
     {% endfor %}
     humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
@@ -161,28 +161,28 @@
         except:
             return None
     class Meta:
-        model = {{ object.camel }}
-        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
+        model = {{ object.camel() }}
+        fields = ('humanReadableName', 'validators', {% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural() }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
 
 
 {% endfor %}
 
 serializerLookUp = {
-{% for object in generator.rest_models %}
-                 {{ object.camel }}: {{ object.camel }}Serializer,
+{% for object in generator.rest_models() %}
+                 {{ object.camel() }}: {{ object.camel() }}Serializer,
 {% endfor %}
                  None: None,
                 }
 
 # Based on core/views/*.py
-{% for object in generator.rest_models %}
+{% for object in generator.rest_models() %}
 
-class {{ object.camel }}List(XOSListCreateAPIView):
-    queryset = {{ object.camel }}.objects.select_related().all()
-    serializer_class = {{ object.camel }}Serializer
-    id_serializer_class = {{ object.camel }}IdSerializer
+class {{ object.camel() }}List(XOSListCreateAPIView):
+    queryset = {{ object.camel() }}.objects.select_related().all()
+    serializer_class = {{ object.camel() }}Serializer
+    id_serializer_class = {{ object.camel() }}IdSerializer
     filter_backends = (filters.DjangoFilterBackend,)
-    filter_fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
+    filter_fields = ({% for prop in object.props %}'{{ prop }}',{% endfor %}{% for ref in object.refs %}{%if ref.multi %}'{{ ref.plural() }}'{% else %}'{{ ref }}'{% endif %},{% endfor %})
 
     def get_serializer_class(self):
         no_hyperlinks=False
@@ -196,13 +196,13 @@
     def get_queryset(self):
         if (not self.request.user.is_authenticated()):
             raise XOSNotAuthenticated()
-        return {{ object.camel }}.select_by_user(self.request.user)
+        return {{ object.camel() }}.select_by_user(self.request.user)
 
 
-class {{ object.camel }}Detail(XOSRetrieveUpdateDestroyAPIView):
-    queryset = {{ object.camel }}.objects.select_related().all()
-    serializer_class = {{ object.camel }}Serializer
-    id_serializer_class = {{ object.camel }}IdSerializer
+class {{ object.camel() }}Detail(XOSRetrieveUpdateDestroyAPIView):
+    queryset = {{ object.camel() }}.objects.select_related().all()
+    serializer_class = {{ object.camel() }}Serializer
+    id_serializer_class = {{ object.camel() }}IdSerializer
 
     def get_serializer_class(self):
         no_hyperlinks=False
@@ -216,7 +216,7 @@
     def get_queryset(self):
         if (not self.request.user.is_authenticated()):
             raise XOSNotAuthenticated()
-        return {{ object.camel }}.select_by_user(self.request.user)
+        return {{ object.camel() }}.select_by_user(self.request.user)
 
     # update() is handled by XOSRetrieveUpdateDestroyAPIView
 
diff --git a/xos/tools/apigen/modelgen b/xos/tools/apigen/modelgen
index 068b7cb..e5e4232 100755
--- a/xos/tools/apigen/modelgen
+++ b/xos/tools/apigen/modelgen
@@ -6,7 +6,7 @@
 import sys
 import json
 import re
-from django.template import Context, Template
+import jinja2
 from optparse import OptionParser
 
 # Django set up
@@ -260,10 +260,13 @@
 		generator.add_object(m)
 
 	generator.compute_links()
-	template_contents = open(template_name).read()
-	template = Template(template_contents)
-	context = Context({'generator':generator})
-	rendered = template.render(context)
+
+        os_template_loader = jinja2.FileSystemLoader( searchpath=[os.path.split(template_name)[0]])
+        os_template_env = jinja2.Environment(loader=os_template_loader)
+
+        template = os_template_env.get_template(os.path.split(template_name)[1])
+        rendered = template.render({"generator": generator})
+
         lines = rendered.splitlines()
         current_buffer = []
         for l in lines:
diff --git a/xos/tools/apigen/modelyaml.fields.template.txt b/xos/tools/apigen/modelyaml.fields.template.txt
index 69129ed..161cd65 100644
--- a/xos/tools/apigen/modelyaml.fields.template.txt
+++ b/xos/tools/apigen/modelyaml.fields.template.txt
@@ -1,5 +1,5 @@
-{% for object in generator.all %}
-{{ object.camel }}:
+{% for object in generator.all() %}
+{{ object.camel() }}:
 fields:
   {% for f in object.fields %}
   - name: {{ f.name }}
diff --git a/xos/tools/apigen/simple.template.txt b/xos/tools/apigen/simple.template.txt
index fb00670..4dfe494 100644
--- a/xos/tools/apigen/simple.template.txt
+++ b/xos/tools/apigen/simple.template.txt
@@ -1,4 +1,4 @@
-{% for object in generator.all %}
+{% for object in generator.all() %}
 Object {{ object }}:
 Refs:
 {% for ref in object.refs %}
diff --git a/xos/tools/apigen/style.template b/xos/tools/apigen/style.template
index db80f55..2f238c1 100644
--- a/xos/tools/apigen/style.template
+++ b/xos/tools/apigen/style.template
@@ -9,7 +9,7 @@
        # this one is okay
        return False
 
-   {% for model in generator.all %}
+   {% for model in generator.all() %}
        pos = fieldName.find("{{ model }}")
        if (pos > 0) and (fieldName[pos-1] != "_"):
            return True
@@ -34,13 +34,13 @@
        print "m2m field '%s.%s' is missing underscore" % (modelName, fieldName)
 
 def main():
-{% for obj in generator.all %}
-   stylecheck_model_name("{{ obj.camel }}");
+{% for obj in generator.all() %}
+   stylecheck_model_name("{{ obj.camel() }}");
 {% for ref in obj.refs %}
-   stylecheck_field_plural("{{ obj.camel }}", "{{ ref.plural }}");
+   stylecheck_field_plural("{{ obj.camel() }}", "{{ ref.plural }}");
 {% endfor %}
 {% for prop in obj.props %}
-   stylecheck_field_name("{{ obj.camel }}", "{{ prop }}");
+   stylecheck_field_name("{{ obj.camel() }}", "{{ prop }}");
 {% endfor %}
 {% endfor %}
 
diff --git a/xos/tools/apigen/synchronizer.template.txt b/xos/tools/apigen/synchronizer.template.txt
index c784e21..67f3ca1 100644
--- a/xos/tools/apigen/synchronizer.template.txt
+++ b/xos/tools/apigen/synchronizer.template.txt
@@ -1,5 +1,5 @@
-{% for app,files in generator.apps.items %}
-{% for file,models in files.items %}
+{% for app,files in generator.apps.items() %}
+{% for file,models in files.items() %}
 {% for m in models %}
 # This file implements the synchronization of the {{ m.class_name }} model
 # TODO (see below):
@@ -17,7 +17,7 @@
 
 class Sync{{m.camel.title}}(SyncStep):
     # The model synchronized
-    provides=[{{m.class_name.title}}]
+    provides=[{{m.class_name.title()}}]
     # How often do you want this to run. 0 means immediately following changes to the model
     requested_interval=0
     # The model in which changes trigger this module
@@ -55,16 +55,14 @@
   tasks:
   - task_1:
       {% for f in m.fields %}
-      {{f.name}}: {% templatetag openbrace %}{% templatetag openbrace %}{{f.name}}{% templatetag closebrace %}{% templatetag closebrace %}
+      {{f.name}}: {{ '{{' }}{{f.name}}{{ '}}' }}
       {% endfor %}
-      {% verbatim %}
-      {% if delete %}
+      {{ '{%' }} if delete {{ '%}' }}
       state: absent
-      {% else %}
+      {{ '{%' }} else {{ '%}' }}
       state: present
-      {% endif %}
-      {% endif %}
-      {% endverbatim %}
+      {{ '{%' }} endif {{ '%}' }}
+      {{ '{%' }} endif {{ '%}' }}
 +++ Sync{{ m.class_name }}.yaml
 {% endfor %}
 {% endfor %}
diff --git a/xos/tools/apigen/yang.template.txt b/xos/tools/apigen/yang.template.txt
index ad4b1b1..9dc43e1 100644
--- a/xos/tools/apigen/yang.template.txt
+++ b/xos/tools/apigen/yang.template.txt
@@ -1,5 +1,5 @@
-{% for app,files in generator.apps.items %}
-{% for file,m in files.items %}
+{% for app,files in generator.apps.items() %}
+{% for file,m in files.items() %}
 module xos-{{ app }}-{{ file }} {
     namespace "urn:xos:{{app}}.{{ file }}";
     prefix xos-cs;
@@ -12,7 +12,7 @@
     complex-type {{ m.class_name }} {
       {% for f in m.fields %}
 
-      leaf {{ f.name }} { type {{ f.type }}{% ifequal f.type "ForeignKey" %} { ct:instance-type {{f.related.model.class_name}};{% if f.null%}{%else%}require-instance true{% endif %}{% endifequal %};{% if f.max_length %} { length {{ f.max_length }};{% endif %}{% if None %}default "{{ f.default }}";{% endif %}}
+      leaf {{ f.name }} { type {{ f.type }}{% if f.type=="ForeignKey" %} { ct:instance-type {{f.related.model.class_name}};{% if f.null%}{%else%}require-instance true{% endif %}{% endif %};{% if f.max_length %} { length {{ f.max_length }};{% endif %}{% if None %}default "{{ f.default }}";{% endif %}}
       {% endfor %}
     }
 }
