diff --git a/plyproto/model.py b/plyproto/model.py
new file mode 100644
index 0000000..7e39ae9
--- /dev/null
+++ b/plyproto/model.py
@@ -0,0 +1,218 @@
+__author__ = "Dusan (Ph4r05) Klinec"
+__copyright__ = "Copyright (C) 2014 Dusan (ph4r05) Klinec"
+__license__ = "Apache License, Version 2.0"
+__version__ = "1.0"
+
+# Base node
+class SourceElement(object):
+    '''
+    A SourceElement is the base class for all elements that occur in a Java
+    file parsed by plyj.
+    '''
+    def __init__(self):
+        super(SourceElement, self).__init__()
+        self._fields = []
+
+    def __repr__(self):
+        equals = ("{0}={1!r}".format(k, getattr(self, k))
+                  for k in self._fields)
+        args = ", ".join(equals)
+        return "{0}({1})".format(self.__class__.__name__, args)
+
+    def __eq__(self, other):
+        try:
+            return self.__dict__ == other.__dict__
+        except AttributeError:
+            return False
+
+    def __ne__(self, other):
+        return not self == other
+
+    def accept(self, visitor):
+        pass
+
+class PackageDeclaration(SourceElement):
+    def __init__(self, name):
+        super(PackageDeclaration, self).__init__()
+        self._fields = ['name']
+        self.name = name
+
+    def accept(self, visitor):
+        visitor.visit_PackageDeclaration(self)
+
+class ImportStatement(SourceElement):
+    def __init__(self, name):
+        super(ImportStatement, self).__init__()
+        self._fields = ['name']
+        self.name = name
+
+    def accept(self, visitor):
+        visitor.visit_ImportStatement(self)
+
+class OptionDefinition(SourceElement):
+    def __init__(self, name, value):
+        super(OptionDefinition, self).__init__()
+        self._fields = ['name', 'value']
+        self.name = name
+        self.value = value
+
+    def accept(self, visitor):
+        visitor.visit_OptionDefinition(self)
+
+class FieldDirectiveDeclaration(SourceElement):
+    def __init__(self, name, value):
+        super(FieldDirectiveDeclaration, self).__init__()
+        self._fields = ['name', 'value']
+        self.name = name
+        self.value = value
+
+    def accept(self, visitor):
+        visitor.visit_FieldDirectiveDeclaration(self)
+
+class FieldPrimitiveType(SourceElement):
+    def __init__(self, name):
+        super(FieldPrimitiveType, self).__init__()
+        self._fields = ['name']
+        self.name = name
+
+    def accept(self, visitor):
+        visitor.visit_FieldPrimitiveType(self)
+
+class FieldDeclaration(SourceElement):
+    def __init__(self, field_modifier, ftype, name, fieldId, fieldDirective):
+        super(FieldDeclaration, self).__init__()
+        self._fields = ['field_modifier', 'ftype', 'name', 'fieldId', 'fieldDirective']
+        self.name = name
+        self.field_modifier = field_modifier
+        self.ftype = ftype
+        self.fieldId = fieldId
+        self.fieldDirective = fieldDirective
+
+    def accept(self, visitor):
+        visitor.visit_FieldDeclaration(self)
+
+class EnumFieldDeclaration(SourceElement):
+    def __init__(self, name, fieldId):
+        super(EnumFieldDeclaration, self).__init__()
+        self._fields = ['name', 'fieldId']
+        self.name = name
+        self.fieldId = fieldId
+
+    def accept(self, visitor):
+        visitor.visit_EnumFieldDeclaration(self)
+
+class EnumDeclaration(SourceElement):
+    def __init__(self, name, body):
+        super(EnumDeclaration, self).__init__()
+        self._fields = ['name', 'body']
+        self.name = name
+        self.body = body
+
+    def accept(self, visitor):
+        if visitor.visit_EnumDeclaration(self):
+            for s in self.body:
+                s.accept(visitor)
+
+class MessageDeclaration(SourceElement):
+    def __init__(self, name, body):
+        super(MessageDeclaration, self).__init__()
+        self._fields = ['name', 'body']
+        self.name = name
+        self.body = body
+
+    def accept(self, visitor):
+        if visitor.visit_MessageDeclaration(self):
+            for s in self.body:
+                s.accept(visitor)
+
+class MessageExtension(SourceElement):
+    def __init__(self, name, body):
+        super(MessageExtension, self).__init__()
+        self._fields = ['name', 'body']
+        self.name = name
+        self.body = body
+
+    def accept(self, visitor):
+        if visitor.visit_MessageExtension(self):
+            for s in self.body:
+                s.accept(visitor)
+
+class MethodDefinition(SourceElement):
+    def __init__(self, name, name2, name3):
+        super(MethodDefinition, self).__init__()
+        self._fields = ['name', 'name2', 'name3']
+        self.name = name
+        self.name2 = name2
+        self.name3 = name3
+
+    def accept(self, visitor):
+        visitor.visit_MethodDefinition(self)
+
+class ServiceDeclaration(SourceElement):
+    def __init__(self, name, body):
+        super(ServiceDeclaration, self).__init__()
+        self._fields = ['name', 'body']
+        self.name = name
+        self.body = body
+
+    def accept(self, visitor):
+        if visitor.visit_ServiceDeclaration(self):
+            for s in self.body:
+                s.accept(visitor)
+
+class ExtensionsMax(SourceElement):
+    pass
+
+class ExtensionsDirective(SourceElement):
+    def __init__(self, fromVal, toVal):
+        super(ExtensionsDirective, self).__init__()
+        self._fields = ['fromVal', 'toVal']
+        self.fromVal = fromVal
+        self.toVal = toVal
+
+    def accept(self, visitor):
+        visitor.visit_ExtensionsDirective(self)
+
+class Literal(SourceElement):
+
+    def __init__(self, value):
+        super(Literal, self).__init__()
+        self._fields = ['value']
+        self.value = value
+
+    def accept(self, visitor):
+        visitor.visit_Literal(self)
+
+class Name(SourceElement):
+
+    def __init__(self, value):
+        super(Name, self).__init__()
+        self._fields = ['value']
+        self.value = value
+
+    def append_name(self, name):
+        try:
+            self.value = self.value + '.' + name.value
+        except:
+            self.value = self.value + '.' + name
+
+    def accept(self, visitor):
+        visitor.visit_Name(self)
+
+
+class Visitor(object):
+
+    def __init__(self, verbose=False):
+        self.verbose = verbose
+
+    def __getattr__(self, name):
+        if not name.startswith('visit_'):
+            raise AttributeError('name must start with visit_ but was {}'
+                                 .format(name))
+
+        def f(element):
+            if self.verbose:
+                msg = 'unimplemented call to {}; ignoring ({})'
+                print(msg.format(name, element))
+            return True
+        return f
