From 698a56526ce5704e49054b8f8e40ab173a9a3166 Mon Sep 17 00:00:00 2001
From: Shwetha GS <sshivalingamurthy@hortonworks.com>
Date: Sun, 2 Oct 2016 18:23:33 +0530
Subject: [PATCH] ATLAS-1171 Structured, high-level public APIs (mneethiraj via shwethags)

---
 intg/pom.xml                                                                      |  65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/api/AtlasApiEntities.java                     |  52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/api/AtlasApiTypes.java                        |  99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/api/PList.java                                | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/api/SearchFilter.java                         | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java             |  43 +++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/instance/AtlasClassification.java       |  60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/instance/AtlasEntity.java               | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/instance/AtlasObjectId.java             | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java               | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/typedef/AtlasBaseTypeDef.java           | 353 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/typedef/AtlasClassificationDef.java     | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/typedef/AtlasEntityDef.java             | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/typedef/AtlasEnumDef.java               | 335 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java             | 401 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java                      | 271 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java                   | 547 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java             | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java                     | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java                       |  87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasMapType.java                        | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasStructType.java                     | 292 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasType.java                           |  73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java                   | 442 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java                      | 411 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java   |  89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java           |  89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasClassificationDef.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEntityDef.java         | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEnumDef.java           | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasStructDef.java         | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasArrayType.java                  | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasBigDecimalType.java             | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasBigIntegerType.java             | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasBooleanType.java                |  88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasByteType.java                   | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java         | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasDateType.java                   | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasDoubleType.java                 | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java                 | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasFloatType.java                  | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasIntType.java                    | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasLongType.java                   | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasMapType.java                    | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasObjectIdType.java               | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasShortType.java                  | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasStringType.java                 |  90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java                 | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 pom.xml                                                                           |   8 ++++++++
 release-log.txt                                                                   |   1 +
 src/build/checkstyle.xml                                                          |   4 +++-
 webapp/pom.xml                                                                    |   5 +++++
 webapp/src/main/java/org/apache/atlas/web/rest/TypesREST.java                     | 371 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 53 files changed, 8316 insertions(+), 1 deletion(-)
 create mode 100644 intg/pom.xml
 create mode 100644 intg/src/main/java/org/apache/atlas/api/AtlasApiEntities.java
 create mode 100644 intg/src/main/java/org/apache/atlas/api/AtlasApiTypes.java
 create mode 100644 intg/src/main/java/org/apache/atlas/api/PList.java
 create mode 100644 intg/src/main/java/org/apache/atlas/api/SearchFilter.java
 create mode 100644 intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/instance/AtlasClassification.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/instance/AtlasEntity.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/instance/AtlasObjectId.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/typedef/AtlasBaseTypeDef.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/typedef/AtlasClassificationDef.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/typedef/AtlasEntityDef.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/typedef/AtlasEnumDef.java
 create mode 100644 intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasMapType.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasType.java
 create mode 100644 intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java
 create mode 100644 intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java
 create mode 100644 intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java
 create mode 100644 intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java
 create mode 100644 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasClassificationDef.java
 create mode 100644 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEntityDef.java
 create mode 100644 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEnumDef.java
 create mode 100644 intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasStructDef.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasArrayType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasBigDecimalType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasBigIntegerType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasBooleanType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasByteType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasDateType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasDoubleType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasFloatType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasIntType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasLongType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasMapType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasObjectIdType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasShortType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasStringType.java
 create mode 100644 intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java
 create mode 100644 webapp/src/main/java/org/apache/atlas/web/rest/TypesREST.java

diff --git a/intg/pom.xml b/intg/pom.xml
new file mode 100644
index 0000000..ff3136d
--- /dev/null
+++ b/intg/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>apache-atlas</artifactId>
+        <groupId>org.apache.atlas</groupId>
+        <version>0.8-incubating-SNAPSHOT</version>
+    </parent>
+    <artifactId>atlas-intg</artifactId>
+    <description>Apache Atlas Integration</description>
+    <name>Apache Atlas Integration</name>
+    <packaging>jar</packaging>
+
+    <properties>
+        <checkstyle.failOnViolation>true</checkstyle.failOnViolation>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-common</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-jaxrs</artifactId>
+            <version>${codehaus.jackson.version}</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/intg/src/main/java/org/apache/atlas/api/AtlasApiEntities.java b/intg/src/main/java/org/apache/atlas/api/AtlasApiEntities.java
new file mode 100644
index 0000000..69b02b9
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/api/AtlasApiEntities.java
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.api;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasObjectId;
+
+/**
+ * API to work with CRUD of Atlas entities.
+ */
+public interface AtlasApiEntities {
+    AtlasEntity createEntity(AtlasEntity entity) throws AtlasBaseException;
+
+    AtlasEntity getEntity(AtlasObjectId objId) throws AtlasBaseException;
+
+    AtlasEntity updateEntity(AtlasObjectId objId, AtlasEntity entity) throws AtlasBaseException;
+
+    AtlasEntity updateEntityAttributes(AtlasObjectId objId, Map<String, Object> attributes) throws AtlasBaseException;
+
+    void deleteEntity(AtlasObjectId objId) throws AtlasBaseException;
+
+    PList<AtlasEntity> searchEntities(SearchFilter filter) throws AtlasBaseException;
+
+
+    void addEntityClassification(AtlasObjectId entityId, AtlasClassification classification) throws AtlasBaseException;
+
+    void removeEntityClassification(AtlasObjectId entityId, String classificationName) throws AtlasBaseException;
+
+    List<AtlasClassification> getEntityClassifications(AtlasObjectId entityId) throws AtlasBaseException;
+
+    List<String> getEntityClassificationNames(AtlasObjectId entityId) throws AtlasBaseException;
+}
diff --git a/intg/src/main/java/org/apache/atlas/api/AtlasApiTypes.java b/intg/src/main/java/org/apache/atlas/api/AtlasApiTypes.java
new file mode 100644
index 0000000..6950406
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/api/AtlasApiTypes.java
@@ -0,0 +1,99 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.api;
+
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.typedef.AtlasClassificationDef;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.apache.atlas.model.typedef.AtlasEnumDef;
+import org.apache.atlas.model.typedef.AtlasStructDef;
+
+/**
+ * API to work with CRUD of Atlas types - enum/struct/classification/entity.
+ */
+public interface AtlasApiTypes {
+    AtlasEnumDef createEnumDef(AtlasEnumDef enumDef) throws AtlasBaseException;
+
+    AtlasEnumDef getEnumDefByName(String name) throws AtlasBaseException;
+
+    AtlasEnumDef getEnumDefByGuid(String guid) throws AtlasBaseException;
+
+    AtlasEnumDef updateEnumDefByName(String name, AtlasEnumDef enumDef) throws AtlasBaseException;
+
+    AtlasEnumDef updateEnumDefByGuid(String guid, AtlasEnumDef enumDef) throws AtlasBaseException;
+
+    void deleteEnumDefByName(String name) throws AtlasBaseException;
+
+    void deleteEnumDefByGuid(String guid) throws AtlasBaseException;
+
+    PList<AtlasEnumDef> searchEnumDefs(SearchFilter filter) throws AtlasBaseException;
+
+
+    AtlasStructDef createStructDef(AtlasStructDef structDef) throws AtlasBaseException;
+
+    AtlasStructDef getStructDefByName(String name) throws AtlasBaseException;
+
+    AtlasStructDef getStructDefByGuid(String guid) throws AtlasBaseException;
+
+    AtlasStructDef updateStructDefByName(String name, AtlasStructDef structDef) throws AtlasBaseException;
+
+    AtlasStructDef updateStructDefByGuid(String guid, AtlasStructDef structDef) throws AtlasBaseException;
+
+    void deleteStructDefByName(String name) throws AtlasBaseException;
+
+    void deleteStructDefByGuid(String guid) throws AtlasBaseException;
+
+    PList<AtlasStructDef> searchStructDefs(SearchFilter filter) throws AtlasBaseException;
+
+
+    AtlasClassificationDef createClassificationDef(AtlasClassificationDef classificationDef) throws AtlasBaseException;
+
+    AtlasClassificationDef getClassificationDefByName(String name) throws AtlasBaseException;
+
+    AtlasClassificationDef getClassificationDefByGuid(String guid) throws AtlasBaseException;
+
+    AtlasClassificationDef updateClassificationDefByName(String name, AtlasClassificationDef classificationDef)
+        throws AtlasBaseException;
+
+    AtlasClassificationDef updateClassificationDefByGuid(String guid, AtlasClassificationDef classificationDef)
+        throws AtlasBaseException;
+
+    void deleteClassificationDefByName(String name) throws AtlasBaseException;
+
+    void deleteClassificationDefByGuid(String guid) throws AtlasBaseException;
+
+    PList<AtlasClassificationDef> searchClassificationDefs(SearchFilter filter) throws AtlasBaseException;
+
+
+    AtlasEntityDef createEntityDef(AtlasEntityDef entityDef) throws AtlasBaseException;
+
+    AtlasEntityDef getEntityDefByName(String name) throws AtlasBaseException;
+
+    AtlasEntityDef getEntityDefByIdByGuid(String guid) throws AtlasBaseException;
+
+    AtlasEntityDef updateEntityDefByName(String name, AtlasEntityDef entityDef) throws AtlasBaseException;
+
+    AtlasEntityDef updateEntityDefByGuid(String guid, AtlasEntityDef entityDef) throws AtlasBaseException;
+
+    void deleteEntityDef(String name) throws AtlasBaseException;
+
+    void deleteEntityDefByGuid(String guid) throws AtlasBaseException;
+
+    PList<AtlasEntityDef> searchEntityDefs(SearchFilter filter) throws AtlasBaseException;
+}
diff --git a/intg/src/main/java/org/apache/atlas/api/PList.java b/intg/src/main/java/org/apache/atlas/api/PList.java
new file mode 100644
index 0000000..c6a3025
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/api/PList.java
@@ -0,0 +1,128 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.api;
+
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import org.apache.atlas.api.SearchFilter.SortType;
+
+/**
+ * Paged-list, for returning search results.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class PList<T> implements java.io.Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private List<T>  list       = null;
+    private long     startIndex = 0;
+    private int      pageSize   = 0;
+    private long     totalCount = 0;
+    private String   sortBy     = null;
+    private SortType sortType   = null;
+
+    public PList() {
+    }
+
+    public PList(List<T> list, long startIndex, int pageSize, long totalCount, SortType sortType, String sortBy) {
+        setList(list);
+        setStartIndex(startIndex);
+        setPageSize(pageSize);
+        setTotalCount(totalCount);
+        setSortType(sortType);
+        setSortBy(sortBy);
+    }
+
+    public List<T> getList() {
+        return list;
+    }
+
+    public void setList(List<T> list) {
+        this.list = list;
+    }
+
+    public long getStartIndex() {
+        return startIndex;
+    }
+
+    public void setStartIndex(long startIndex) {
+        this.startIndex = startIndex;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public long getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(long totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public SortType getSortType() {
+        return sortType;
+    }
+
+    public void setSortType(SortType sortType) {
+        this.sortType = sortType;
+    }
+
+    public String getSortBy() {
+        return sortBy;
+    }
+
+    public void setSortBy(String sortBy) {
+        this.sortBy = sortBy;
+    }
+
+
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("PList<T>{");
+        sb.append("list='").append((list == null ? "null" : ("size:" + list.size()))).append('\'');
+        sb.append(", startIndex=").append(startIndex);
+        sb.append(", pageSize=").append(pageSize);
+        sb.append(", totalCount=").append(totalCount);
+        sb.append(", sortType=").append(sortType);
+        sb.append(", version=").append(sortBy);
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/api/SearchFilter.java b/intg/src/main/java/org/apache/atlas/api/SearchFilter.java
new file mode 100644
index 0000000..f9235ad
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/api/SearchFilter.java
@@ -0,0 +1,123 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.api;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+/**
+ * Generic filter, to specify search criteria using name/value pairs.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class SearchFilter {
+    /**
+     * to specify whether the result should be sorted? If yes, whether asc or desc.
+     */
+    public enum SortType { NONE, ASC, DESC };
+
+    private Map<String, String> params     = null;
+    private long                startIndex = 0;
+    private long                maxRows    = Long.MAX_VALUE;
+    private boolean             getCount   = true;
+    private String              sortBy     = null;
+    private SortType            sortType   = null;
+
+    public SearchFilter() {
+        setParams(null);
+    }
+
+    public SearchFilter(Map<String, String> params) {
+        setParams(params);
+    }
+
+    public Map<String, String> getParams() {
+        return params;
+    }
+
+    public void setParams(Map<String, String> params) {
+        this.params = params;
+    }
+
+    public String getParam(String name) {
+        String ret = null;
+
+        if (name != null && params != null) {
+            ret = params.get(name);
+        }
+
+        return ret;
+    }
+
+    public void setParam(String name, String value) {
+        if (name != null) {
+            if (params == null) {
+                params = new HashMap<String, String>();
+            }
+
+            params.put(name, value);
+        }
+    }
+
+    public long getStartIndex() {
+        return startIndex;
+    }
+
+    public void setStartIndex(long startIndex) {
+        this.startIndex = startIndex;
+    }
+
+    public long getMaxRows() {
+        return maxRows;
+    }
+
+    public void setMaxRows(long maxRows) {
+        this.maxRows = maxRows;
+    }
+
+    public boolean isGetCount() {
+        return getCount;
+    }
+
+    public void setGetCount(boolean getCount) {
+        this.getCount = getCount;
+    }
+
+    public String getSortBy() {
+        return sortBy;
+    }
+
+    public void setSortBy(String sortBy) {
+        this.sortBy = sortBy;
+    }
+
+    public SortType getSortType() {
+        return sortType;
+    }
+
+    public void setSortType(SortType sortType) {
+        this.sortType = sortType;
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java b/intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java
new file mode 100644
index 0000000..3538f41
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.exception;
+
+/**
+ * Base Exception class for Atlas API.
+ */
+public class AtlasBaseException extends Exception {
+
+    public AtlasBaseException() {
+    }
+
+    public AtlasBaseException(String message) {
+        super(message);
+    }
+
+    public AtlasBaseException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public AtlasBaseException(Throwable cause) {
+        super(cause);
+    }
+
+    public AtlasBaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasClassification.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasClassification.java
new file mode 100644
index 0000000..2f034d4
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasClassification.java
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.instance;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+/**
+ * An instance of a classfication; it doesn't have an identity, this object exists only when associated with an entity.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasClassification extends AtlasStruct implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public AtlasClassification() {
+        this(null, null);
+    }
+
+    public AtlasClassification(String typeName) {
+        this(typeName, null);
+    }
+
+    public AtlasClassification(String typeName, Map<String, Object> attributes) {
+        super(typeName, attributes);
+    }
+
+    public AtlasClassification(String typeName, String attrName, Object attrValue) {
+        super(typeName, attrName, attrValue);
+    }
+
+    public AtlasClassification(AtlasClassification other) {
+        if (other != null) {
+            setTypeName(other.getTypeName());
+            setAttributes(other.getAttributes());
+        }
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntity.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntity.java
new file mode 100644
index 0000000..e1d7bc6
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntity.java
@@ -0,0 +1,206 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.instance;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * An instance of an entity - like hive_table, hive_database.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasEntity extends AtlasStruct implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Status of the entity - can be active or deleted. Deleted entities are not removed from Atlas store.
+     */
+    public enum Status { STATUS_ACTIVE, STATUS_DELETED };
+
+    private String guid       = null;
+    private Status status     = Status.STATUS_ACTIVE;
+    private String createdBy  = null;
+    private String updatedBy  = null;
+    private Date   createTime = null;
+    private Date   updateTime = null;
+    private Long   version    = null;
+
+    public AtlasEntity() {
+        this(null, null);
+    }
+
+    public AtlasEntity(String typeName) {
+        this(typeName, null);
+    }
+
+    public AtlasEntity(AtlasEntityDef entityDef) {
+        this(entityDef != null ? entityDef.getName() : null, null);
+    }
+
+    public AtlasEntity(String typeName, Map<String, Object> attributes) {
+        super(typeName, attributes);
+
+        setGuid(null);
+        setStatus(null);
+        setCreatedBy(null);
+        setUpdatedBy(null);
+        setCreateTime(null);
+        setUpdateTime(null);
+        setVersion(null);
+    }
+
+    public AtlasEntity(AtlasEntity other) {
+        super(other);
+
+        if (other != null) {
+            setGuid(other.getGuid());
+            setStatus(other.getStatus());
+            setCreatedBy(other.getCreatedBy());
+            setUpdatedBy(other.getUpdatedBy());
+            setCreateTime(other.getCreateTime());
+            setUpdateTime(other.getUpdateTime());
+            setVersion(other.getVersion());
+        }
+    }
+
+    public String getGuid() {
+        return guid;
+    }
+
+    public void setGuid(String guid) {
+        this.guid = guid;
+    }
+
+    public Status getStatus() {
+        return status;
+    }
+
+    public void setStatus(Status status) {
+        this.status = status;
+    }
+
+    public String getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(String createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    public String getUpdatedBy() {
+        return updatedBy;
+    }
+
+    public void setUpdatedBy(String updatedBy) {
+        this.updatedBy = updatedBy;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getVersion() {
+        return version;
+    }
+
+    public void setVersion(Long version) {
+        this.version = version;
+    }
+
+    @Override
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("AtlasEntity{");
+        sb.append("guid='").append(guid).append('\'');
+        sb.append(", status=").append(status);
+        sb.append(", createdBy='").append(createdBy).append('\'');
+        sb.append(", updatedBy='").append(updatedBy).append('\'');
+        dumpDateField(", createTime=", createTime, sb);
+        dumpDateField(", updateTime=", updateTime, sb);
+        sb.append(", version=").append(version);
+        sb.append(", ");
+        super.toString(sb);
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        if (!super.equals(o)) { return false; }
+
+        AtlasEntity that = (AtlasEntity) o;
+
+        if (guid != null ? !guid.equals(that.guid) : that.guid != null) { return false; }
+        if (status != null ? !status.equals(that.status) : that.status != null) { return false; }
+        if (createdBy != null ? !createdBy.equals(that.createdBy) : that.createdBy != null) { return false; }
+        if (updatedBy != null ? !updatedBy.equals(that.updatedBy) : that.updatedBy != null) { return false; }
+        if (createTime != null ? !createTime.equals(that.createTime) : that.createTime != null) { return false; }
+        if (updateTime != null ? !updateTime.equals(that.updateTime) : that.updateTime != null) { return false; }
+        if (version != null ? !version.equals(that.version) : that.version != null) { return false; }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+
+        result = 31 * result + guid != null ? guid.hashCode() : 0;
+        result = 31 * result + (status != null ? status.hashCode() : 0);
+        result = 31 * result + (createdBy != null ? createdBy.hashCode() : 0);
+        result = 31 * result + (updatedBy != null ? updatedBy.hashCode() : 0);
+        result = 31 * result + (createTime != null ? createTime.hashCode() : 0);
+        result = 31 * result + (updateTime != null ? updateTime.hashCode() : 0);
+        result = 31 * result + (version != null ? version.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasObjectId.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasObjectId.java
new file mode 100644
index 0000000..6936cdc
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasObjectId.java
@@ -0,0 +1,132 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.instance;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+/**
+ * Reference to an object-instance of an Atlas type - like entity.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasObjectId  implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public static final String KEY_TYPENAME = "typeName";
+    public static final String KEY_GUID     = "guid";
+
+    private String typeName;
+    private String guid;
+
+    public AtlasObjectId() {
+        this(null, null);
+    }
+
+    public AtlasObjectId(String typeName) {
+        this(typeName, null);
+    }
+
+    public AtlasObjectId(String typeName, String guid) {
+        setTypeName(typeName);
+        setGuid(guid);
+    }
+
+    public AtlasObjectId(AtlasObjectId other) {
+        if (other != null) {
+            setTypeName(other.getTypeName());
+            setGuid(other.getGuid());
+        }
+    }
+
+    public AtlasObjectId(Map objIdMap) {
+        if (objIdMap != null) {
+            Object t = objIdMap.get(KEY_TYPENAME);
+            Object g = objIdMap.get(KEY_GUID);
+
+            if (t != null) {
+                setTypeName(t.toString());
+            }
+
+            if (g != null) {
+                setGuid(g.toString());
+            }
+        }
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public String getGuid() {
+        return guid;
+    }
+
+    public void setGuid(String guid) {
+        this.guid = guid;
+    }
+
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("AtlasObjectId{");
+        sb.append("typeName='").append(typeName).append('\'');
+        sb.append(", guid='").append(guid).append('\'');
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+
+        AtlasObjectId that = (AtlasObjectId) o;
+
+        if (typeName != null ? !typeName.equals(that.typeName) : that.typeName != null) { return false; }
+        if (guid != null ? !guid.equals(that.guid) : that.guid != null) { return false; }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = typeName != null ? typeName.hashCode() : 0;
+        result = 31 * result + (guid != null ? guid.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
new file mode 100644
index 0000000..cfe4938
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
@@ -0,0 +1,230 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.instance;
+
+import java.io.Serializable;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * Captures details of struct contents. Not instantiated directly, used only via AtlasEntity, AtlasClassification.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasStruct implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public static final String     SERIALIZED_DATE_FORMAT_STR = "yyyyMMdd-HH:mm:ss.SSS-Z";
+    public static final DateFormat DATE_FORMATTER             = new SimpleDateFormat(SERIALIZED_DATE_FORMAT_STR);
+
+    private String              typeName;
+    private Map<String, Object> attributes;
+
+    public AtlasStruct() {
+        this(null, null);
+    }
+
+    public AtlasStruct(String typeName) {
+        this(typeName, null);
+    }
+
+    public AtlasStruct(String typeName, Map<String, Object> attributes) {
+        setTypeName(typeName);
+        setAttributes(attributes);
+    }
+
+    public AtlasStruct(String typeName, String attrName, Object attrValue) {
+        setTypeName(typeName);
+        setAttribute(attrName, attrValue);
+    }
+
+    public AtlasStruct(AtlasStruct other) {
+        if (other != null) {
+            setTypeName(other.getTypeName());
+            setAttributes(other.getAttributes());
+        }
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public Map<String, Object> getAttributes() {
+        return attributes;
+    }
+
+    public void setAttributes(Map<String, Object> attributes) {
+        this.attributes = attributes;
+    }
+
+    public boolean hasAttribute(String name) {
+        Map<String, Object> a = this.attributes;
+
+        return a != null ? a.containsKey(name) : null;
+    }
+
+    public Object getAttribute(String name) {
+        Map<String, Object> a = this.attributes;
+
+        return a != null ? a.get(name) : null;
+    }
+
+    public void setAttribute(String name, Object value) {
+        Map<String, Object> a = this.attributes;
+
+        if (a != null) {
+            a.put(name, value);
+        } else {
+            a = new HashMap<String, Object>();
+            a.put(name, value);
+
+            this.attributes = a;
+        }
+    }
+
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("AtlasStruct{");
+        sb.append("typeName='").append(typeName).append('\'');
+        sb.append(", attributes=[");
+        dumpObjects(attributes, sb);
+        sb.append("]");
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+
+        AtlasStruct that = (AtlasStruct) o;
+
+        if (typeName != null ? !typeName.equals(that.typeName) : that.typeName != null) { return false; }
+        if (attributes != null ? !attributes.equals(that.attributes) : that.attributes != null) { return false; }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (typeName != null ? typeName.hashCode() : 0);
+        result = 31 * result + (attributes != null ? attributes.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+
+
+    public static StringBuilder dumpModelObjects(Collection<? extends AtlasStruct> objList, StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        if (CollectionUtils.isNotEmpty(objList)) {
+            int i = 0;
+            for (AtlasStruct obj : objList) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+
+                obj.toString(sb);
+                i++;
+            }
+        }
+
+        return sb;
+    }
+
+    public static StringBuilder dumpObjects(Collection<? extends Object> objects, StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        if (CollectionUtils.isNotEmpty(objects)) {
+            int i = 0;
+            for (Object obj : objects) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+
+                sb.append(obj);
+                i++;
+            }
+        }
+
+        return sb;
+    }
+
+    public static StringBuilder dumpObjects(Map<? extends Object, ? extends Object> objects, StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        if (MapUtils.isNotEmpty(objects)) {
+            int i = 0;
+            for (Map.Entry<? extends Object, ? extends Object> e : objects.entrySet()) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+
+                sb.append(e.getKey()).append(":").append(e.getValue());
+                i++;
+            }
+        }
+
+        return sb;
+    }
+
+    public static StringBuilder dumpDateField(String prefix, Date value, StringBuilder sb) {
+        sb.append(prefix);
+
+        if (value == null) {
+            sb.append(value);
+        } else {
+            sb.append(DATE_FORMATTER.format(value));
+        }
+
+        return sb;
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasBaseTypeDef.java b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasBaseTypeDef.java
new file mode 100644
index 0000000..d40354c
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasBaseTypeDef.java
@@ -0,0 +1,353 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * Base class that captures common-attributes for all Atlas types.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public abstract class AtlasBaseTypeDef implements java.io.Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public static final String ATLAS_TYPE_BOOLEAN        = "boolean";
+    public static final String ATLAS_TYPE_BYTE           = "byte";
+    public static final String ATLAS_TYPE_SHORT          = "short";
+    public static final String ATLAS_TYPE_INT            = "int";
+    public static final String ATLAS_TYPE_LONG           = "long";
+    public static final String ATLAS_TYPE_FLOAT          = "float";
+    public static final String ATLAS_TYPE_DOUBLE         = "double";
+    public static final String ATLAS_TYPE_BIGINTEGER     = "biginteger";
+    public static final String ATLAS_TYPE_BIGDECIMAL     = "bigdecimal";
+    public static final String ATLAS_TYPE_STRING         = "string";
+    public static final String ATLAS_TYPE_DATE           = "date";
+    public static final String ATLAS_TYPE_OBJECT_ID      = "objectid";
+
+    public static final String ATLAS_TYPE_ARRAY_PREFIX    = "array<";
+    public static final String ATLAS_TYPE_ARRAY_SUFFIX    = ">";
+    public static final String ATLAS_TYPE_MAP_PREFIX      = "map<";
+    public static final String ATLAS_TYPE_MAP_KEY_VAL_SEP = ",";
+    public static final String ATLAS_TYPE_MAP_SUFFIX      = ">";
+
+    public static final String ATLAS_TYPE_PROCESS        = "Process";
+    public static final String ATLAS_TYPE_DATASET        = "DataSet";
+    public static final String ATLAS_TYPE_ASSET          = "Asset";
+    public static final String ATLAS_TYPE_INFRASTRUCTURE = "Infrastructure";
+
+    public static final String[] ATLAS_PRIMITIVE_TYPES = {
+        ATLAS_TYPE_BOOLEAN,
+        ATLAS_TYPE_BYTE,
+        ATLAS_TYPE_SHORT,
+        ATLAS_TYPE_INT,
+        ATLAS_TYPE_LONG,
+        ATLAS_TYPE_FLOAT,
+        ATLAS_TYPE_DOUBLE,
+        ATLAS_TYPE_BIGINTEGER,
+        ATLAS_TYPE_BIGDECIMAL,
+        ATLAS_TYPE_STRING,
+    };
+
+    public static final String[] ATLAS_BUILTIN_TYPES = {
+        ATLAS_TYPE_BOOLEAN,
+        ATLAS_TYPE_BYTE,
+        ATLAS_TYPE_SHORT,
+        ATLAS_TYPE_INT,
+        ATLAS_TYPE_LONG,
+        ATLAS_TYPE_FLOAT,
+        ATLAS_TYPE_DOUBLE,
+        ATLAS_TYPE_BIGINTEGER,
+        ATLAS_TYPE_BIGDECIMAL,
+        ATLAS_TYPE_STRING,
+
+        ATLAS_TYPE_DATE,
+        ATLAS_TYPE_OBJECT_ID,
+    };
+
+    public static final String     SERIALIZED_DATE_FORMAT_STR = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
+    public static final DateFormat DATE_FORMATTER             = new SimpleDateFormat(SERIALIZED_DATE_FORMAT_STR);
+
+    private String  guid       = null;
+    private String  createdBy  = null;
+    private String  updatedBy  = null;
+    private Date    createTime = null;
+    private Date    updateTime = null;
+    private Long    version    = null;
+    private String  name;
+    private String  description;
+    private String  typeVersion;
+
+    public AtlasBaseTypeDef() {
+        this(null, null, null);
+    }
+
+    public AtlasBaseTypeDef(String name) {
+        this(name, null, null);
+    }
+
+    public AtlasBaseTypeDef(String name, String description) {
+        this(name, description, null);
+    }
+
+    public AtlasBaseTypeDef(String name, String description, String typeVersion) {
+        super();
+
+        setGuid(null);
+        setCreatedBy(null);
+        setUpdatedBy(null);
+        setCreateTime(null);
+        setUpdateTime(null);
+        setVersion(null);
+        setName(name);
+        setDescription(description);
+        setTypeVersion(typeVersion);
+    }
+
+    public AtlasBaseTypeDef(AtlasBaseTypeDef other) {
+        if (other != null) {
+            setGuid(other.getGuid());
+            setCreatedBy(other.getCreatedBy());
+            setUpdatedBy(other.getUpdatedBy());
+            setCreateTime(other.getCreateTime());
+            setUpdateTime(other.getUpdateTime());
+            setVersion(other.getVersion());
+            setName(other.getName());
+            setDescription(other.getDescription());
+            setTypeVersion(other.getTypeVersion());
+        } else {
+            setGuid(null);
+            setCreatedBy(null);
+            setUpdatedBy(null);
+            setCreateTime(null);
+            setUpdateTime(null);
+            setVersion(null);
+            setName(null);
+            setDescription(null);
+            setTypeVersion(null);
+        }
+    }
+
+    public String getGuid() {
+        return guid;
+    }
+
+    public void setGuid(String guid) {
+        this.guid = guid;
+    }
+
+    public String getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(String createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    public String getUpdatedBy() {
+        return updatedBy;
+    }
+
+    public void setUpdatedBy(String updatedBy) {
+        this.updatedBy = updatedBy;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getVersion() {
+        return version;
+    }
+
+    public void setVersion(Long version) {
+        this.version = version;
+    }
+
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getTypeVersion() {
+        return typeVersion;
+    }
+
+    public void setTypeVersion(String typeVersion) {
+        this.typeVersion = typeVersion;
+    }
+
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append(", AtlasBaseTypeDef{");
+        sb.append("guid='").append(guid).append('\'');
+        sb.append(", createdBy='").append(createdBy).append('\'');
+        sb.append(", updatedBy='").append(updatedBy).append('\'');
+        dumpDateField(", createTime=", createTime, sb);
+        dumpDateField(", updateTime=", updateTime, sb);
+        sb.append(", version=").append(version);
+        sb.append(", name='").append(name).append('\'');
+        sb.append(", description='").append(description).append('\'');
+        sb.append(", typeVersion='").append(typeVersion).append('\'');
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+
+        AtlasBaseTypeDef that = (AtlasBaseTypeDef) o;
+
+        if (guid != null ? !guid.equals(that.guid) : that.guid != null) { return false; }
+        if (createdBy != null ? !createdBy.equals(that.createdBy) : that.createdBy != null) { return false; }
+        if (updatedBy != null ? !updatedBy.equals(that.updatedBy) : that.updatedBy != null) { return false; }
+        if (createTime != null ? !createTime.equals(that.createTime) : that.createTime != null) { return false; }
+        if (updateTime != null ? !updateTime.equals(that.updateTime) : that.updateTime != null) { return false; }
+        if (version != null ? !version.equals(that.version) : that.version != null) { return false; }
+        if (name != null ? !name.equals(that.name) : that.name != null) { return false; }
+        if (description != null ? !description.equals(that.description) : that.description != null) { return false; }
+        if (typeVersion != null ? !typeVersion.equals(that.typeVersion) : that.typeVersion != null) { return false; }
+
+        return true;
+
+    }
+
+    @Override
+    public int hashCode() {
+        int result = guid != null ? guid.hashCode() : 0;
+        result = 31 * result + (createdBy != null ? createdBy.hashCode() : 0);
+        result = 31 * result + (updatedBy != null ? updatedBy.hashCode() : 0);
+        result = 31 * result + (createTime != null ? createTime.hashCode() : 0);
+        result = 31 * result + (updateTime != null ? updateTime.hashCode() : 0);
+        result = 31 * result + (version != null ? version.hashCode() : 0);
+        result = 31 * result + (name != null ? name.hashCode() : 0);
+        result = 31 * result + (description != null ? description.hashCode() : 0);
+        result = 31 * result + (typeVersion != null ? typeVersion.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+
+    public static String getArrayTypeName(String elemTypeName) {
+        return  ATLAS_TYPE_ARRAY_PREFIX + elemTypeName + ATLAS_TYPE_ARRAY_SUFFIX;
+    }
+
+    public static String getMapTypeName(String keyTypeName, String valueTypeName) {
+        return String.format("%s%s%s%s%s", ATLAS_TYPE_MAP_PREFIX, keyTypeName, ATLAS_TYPE_MAP_KEY_VAL_SEP,
+                valueTypeName, ATLAS_TYPE_MAP_SUFFIX);
+    }
+
+    public static StringBuilder dumpObjects(Collection<? extends Object> objects, StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        if (CollectionUtils.isNotEmpty(objects)) {
+            int i = 0;
+            for (Object obj : objects) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+
+                sb.append(obj);
+                i++;
+            }
+        }
+
+        return sb;
+    }
+
+    public static StringBuilder dumpObjects(Map<? extends Object, ? extends Object> objects, StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        if (MapUtils.isNotEmpty(objects)) {
+            int i = 0;
+            for (Map.Entry<? extends Object, ? extends Object> e : objects.entrySet()) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+
+                sb.append(e.getKey()).append(":").append(e.getValue());
+                i++;
+            }
+        }
+
+        return sb;
+    }
+
+    public static StringBuilder dumpDateField(String prefix, Date value, StringBuilder sb) {
+        sb.append(prefix);
+
+        if (value == null) {
+            sb.append(value);
+        } else {
+            sb.append(DATE_FORMATTER.format(value));
+        }
+
+        return sb;
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasClassificationDef.java b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasClassificationDef.java
new file mode 100644
index 0000000..f0188d9
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasClassificationDef.java
@@ -0,0 +1,169 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * class that captures details of a classification-type.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasClassificationDef extends AtlasStructDef implements java.io.Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Set<String> superTypes;
+
+
+    public AtlasClassificationDef() {
+        super();
+
+        setSuperTypes(null);
+    }
+
+    public AtlasClassificationDef(String name) {
+        this(name, null, null, null, null);
+    }
+
+    public AtlasClassificationDef(String name, String description) {
+        this(name, description, null, null, null);
+    }
+
+    public AtlasClassificationDef(String name, String description, String typeVersion) {
+        this(name, description, typeVersion, null, null);
+    }
+
+    public AtlasClassificationDef(String name, String description, String typeVersion,
+                                  List<AtlasAttributeDef> attributeDefs) {
+        this(name, description, typeVersion, attributeDefs, null);
+    }
+
+    public AtlasClassificationDef(String name, String description, String typeVersion,
+                                  List<AtlasAttributeDef> attributeDefs, Set<String> superTypes) {
+        super(name, description, typeVersion, attributeDefs);
+
+        setSuperTypes(superTypes);
+    }
+
+    public AtlasClassificationDef(AtlasClassificationDef other) {
+        super(other);
+
+        setSuperTypes(other != null ? other.getSuperTypes() : null);
+    }
+
+    public Set<String> getSuperTypes() {
+        return superTypes;
+    }
+
+    public void setSuperTypes(Set<String> superTypes) {
+        if (superTypes != null && this.superTypes == superTypes) {
+            return;
+        }
+
+        if (CollectionUtils.isEmpty(superTypes)) {
+            this.superTypes = Collections.emptySet();
+        } else {
+            this.superTypes = Collections.unmodifiableSet(new HashSet<String>(superTypes));
+        }
+    }
+
+    public boolean hasSuperType(String typeName) {
+        return hasSuperType(superTypes, typeName);
+    }
+
+    public void addSuperType(String typeName) {
+        Set<String> s = this.superTypes;
+
+        if (!hasSuperType(s, typeName)) {
+            s = new HashSet<String>(s);
+
+            s.add(typeName);
+
+            this.superTypes = Collections.unmodifiableSet(s);
+        }
+    }
+
+    public void removeSuperType(String typeName) {
+        Set<String> s = this.superTypes;
+
+        if (hasSuperType(s, typeName)) {
+            s = new HashSet<String>(s);
+
+            s.remove(typeName);
+
+            this.superTypes = Collections.unmodifiableSet(s);
+        }
+    }
+
+    private static boolean hasSuperType(Set<String> superTypes, String typeName) {
+        return superTypes != null && typeName != null && superTypes.contains(typeName);
+    }
+
+    @Override
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("AtlasClassificationDef{");
+        super.toString(sb);
+        sb.append(", superTypes=[");
+        dumpObjects(superTypes, sb);
+        sb.append("]");
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        if (!super.equals(o)) { return false; }
+
+        AtlasClassificationDef that = (AtlasClassificationDef) o;
+
+        if (superTypes != null ? !superTypes.equals(that.superTypes) : that.superTypes != null) { return false; }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (superTypes != null ? superTypes.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasEntityDef.java b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasEntityDef.java
new file mode 100644
index 0000000..aaa2bac
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasEntityDef.java
@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * class that captures details of a entity-type.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasEntityDef extends AtlasStructDef implements java.io.Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Set<String> superTypes;
+
+
+    public AtlasEntityDef() {
+        this(null, null, null, null, null);
+    }
+
+    public AtlasEntityDef(String name) {
+        this(name, null, null, null, null);
+    }
+
+    public AtlasEntityDef(String name, String description) {
+        this(name, description, null, null, null);
+    }
+
+    public AtlasEntityDef(String name, String description, String typeVersion) {
+        this(name, description, typeVersion, null, null);
+    }
+
+    public AtlasEntityDef(String name, String description, String typeVersion, List<AtlasAttributeDef> attributeDefs) {
+        this(name, description, typeVersion, attributeDefs, null);
+    }
+
+    public AtlasEntityDef(String name, String description, String typeVersion, List<AtlasAttributeDef> attributeDefs,
+                          Set<String> superTypes) {
+        super(name, description, typeVersion, attributeDefs);
+
+        setSuperTypes(superTypes);
+    }
+
+    public AtlasEntityDef(AtlasEntityDef other) {
+        super(other);
+
+        setSuperTypes(other != null ? other.getSuperTypes() : null);
+    }
+
+    public Set<String> getSuperTypes() {
+        return superTypes;
+    }
+
+    public void setSuperTypes(Set<String> superTypes) {
+        if (superTypes != null && this.superTypes == superTypes) {
+            return;
+        }
+
+        if (CollectionUtils.isEmpty(superTypes)) {
+            this.superTypes = Collections.emptySet();
+        } else {
+            this.superTypes = Collections.unmodifiableSet(new HashSet<String>(superTypes));
+        }
+    }
+
+    public boolean hasSuperType(String typeName) {
+        return hasSuperType(superTypes, typeName);
+    }
+
+    public void addSuperType(String typeName) {
+        Set<String> s = this.superTypes;
+
+        if (!hasSuperType(s, typeName)) {
+            s = new HashSet<String>(s);
+
+            s.add(typeName);
+
+            this.superTypes = Collections.unmodifiableSet(s);
+        }
+    }
+
+    public void removeSuperType(String typeName) {
+        Set<String> s = this.superTypes;
+
+        if (hasSuperType(s, typeName)) {
+            s = new HashSet<String>(s);
+
+            s.remove(typeName);
+
+            this.superTypes = Collections.unmodifiableSet(s);
+        }
+    }
+
+    private static boolean hasSuperType(Set<String> superTypes, String typeName) {
+        return superTypes != null && typeName != null && superTypes.contains(typeName);
+    }
+
+    @Override
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("AtlasEntityDef{");
+        super.toString(sb);
+        sb.append(", superTypes=[");
+        dumpObjects(superTypes, sb);
+        sb.append("]");
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        if (!super.equals(o)) { return false; }
+
+        AtlasEntityDef that = (AtlasEntityDef) o;
+
+        if (superTypes != null ? !superTypes.equals(that.superTypes) : that.superTypes != null) { return false; }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (superTypes != null ? superTypes.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasEnumDef.java b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasEnumDef.java
new file mode 100644
index 0000000..5347461
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasEnumDef.java
@@ -0,0 +1,335 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import java.io.Serializable;
+import java.util.*;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.hadoop.util.StringUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * class that captures details of an enum-type.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasEnumDef extends AtlasBaseTypeDef implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private List<AtlasEnumElementDef> elementDefs;
+    private String                    defaultValue;
+
+    public AtlasEnumDef() {
+        super();
+
+        setElementDefs(null);
+        setDefaultValue(null);
+    }
+
+    public AtlasEnumDef(String name) {
+        this(name, null, null, null, null);
+    }
+
+    public AtlasEnumDef(String name, String description) {
+        this(name, description, null, null, null);
+    }
+
+    public AtlasEnumDef(String name, String description, String typeVersion) {
+        this(name, description, typeVersion, null, null);
+    }
+
+    public AtlasEnumDef(String name, String description, List<AtlasEnumElementDef> elementDefs) {
+        this(name, description, null, elementDefs, null);
+    }
+
+    public AtlasEnumDef(String name, String description, String typeVersion, List<AtlasEnumElementDef> elementDefs) {
+        this(name, description, typeVersion, elementDefs, null);
+    }
+
+    public AtlasEnumDef(String name, String description, String typeVersion, List<AtlasEnumElementDef> elementDefs,
+                        String defaultValue) {
+        super(name, description, typeVersion);
+
+        setElementDefs(elementDefs);
+        setDefaultValue(defaultValue);
+    }
+
+    public AtlasEnumDef(AtlasEnumDef other) {
+        super(other);
+
+        if (other != null) {
+            setElementDefs(other.getElementDefs());
+            setDefaultValue(other.getDefaultValue());
+        }
+    }
+
+    public List<AtlasEnumElementDef> getElementDefs() {
+        return elementDefs;
+    }
+
+    public void setElementDefs(List<AtlasEnumElementDef> elementDefs) {
+        if (elementDefs != null && this.elementDefs == elementDefs) {
+            return;
+        }
+
+        if (CollectionUtils.isEmpty(elementDefs)) {
+            this.elementDefs = Collections.emptyList();
+        } else {
+            // if multiple elements with same value are present, keep only the last entry
+            List<AtlasEnumElementDef> tmpList       = new ArrayList<AtlasEnumElementDef>(elementDefs.size());
+            Set<String>               elementValues = new HashSet<String>();
+
+            ListIterator<AtlasEnumElementDef> iter = elementDefs.listIterator(elementDefs.size());
+            while (iter.hasPrevious()) {
+                AtlasEnumElementDef elementDef   = iter.previous();
+                String              elementValue = elementDef != null ? elementDef.getValue() : null;
+
+                if (elementValue != null) {
+                    elementValue = elementValue.toLowerCase();
+
+                    if (!elementValues.contains(elementValue)) {
+                        tmpList.add(new AtlasEnumElementDef(elementDef));
+
+                        elementValues.add(elementValue);
+                    }
+                }
+            }
+            Collections.reverse(tmpList);
+
+            this.elementDefs = Collections.unmodifiableList(tmpList);
+        }
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String value) {
+        this.defaultValue = value;
+    }
+
+    public AtlasEnumElementDef getElement(String elemValue) {
+        return findElement(this.elementDefs, elemValue);
+    }
+
+    public void addElement(AtlasEnumElementDef elementDef) {
+        List<AtlasEnumElementDef> e = this.elementDefs;
+
+        List<AtlasEnumElementDef> tmpList = new ArrayList<AtlasEnumElementDef>();
+        if (CollectionUtils.isNotEmpty(e)) {
+            // copy existing elements, except ones having same value as the element being added
+            for (AtlasEnumElementDef existingElem : e) {
+                if (!StringUtils.equalsIgnoreCase(existingElem.getValue(), elementDef.getValue())) {
+                    tmpList.add(existingElem);
+                }
+            }
+        }
+        tmpList.add(new AtlasEnumElementDef(elementDef));
+
+        this.elementDefs = Collections.unmodifiableList(tmpList);
+    }
+
+    public void removeElement(String elemValue) {
+        List<AtlasEnumElementDef> e = this.elementDefs;
+
+        // if element doesn't exist, no need to create the tmpList below
+        if (hasElement(e, elemValue)) {
+            List<AtlasEnumElementDef> tmpList = new ArrayList<AtlasEnumElementDef>();
+
+            // copy existing elements, except ones having same value as the element being removed
+            for (AtlasEnumElementDef existingElem : e) {
+                if (!StringUtils.equalsIgnoreCase(existingElem.getValue(), elemValue)) {
+                    tmpList.add(existingElem);
+                }
+            }
+
+            this.elementDefs = Collections.unmodifiableList(tmpList);
+        }
+    }
+
+    public boolean hasElement(String elemValue) {
+        return getElement(elemValue) != null;
+    }
+
+    private static boolean hasElement(List<AtlasEnumElementDef> elementDefs, String elemValue) {
+        return findElement(elementDefs, elemValue) != null;
+    }
+
+    private static AtlasEnumElementDef findElement(List<AtlasEnumElementDef> elementDefs, String elemValue) {
+        AtlasEnumElementDef ret = null;
+
+        if (CollectionUtils.isNotEmpty(elementDefs)) {
+            for (AtlasEnumElementDef elementDef : elementDefs) {
+                if (StringUtils.equalsIgnoreCase(elementDef.getValue(), elemValue)) {
+                    ret = elementDef;
+                    break;
+                }
+            }
+        }
+
+        return ret;
+    }
+
+    @Override
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("AtlasEnumDef{");
+        super.toString(sb);
+        sb.append(", elementDefs=[");
+        dumpObjects(elementDefs, sb);
+        sb.append("]");
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        if (!super.equals(o)) { return false; }
+
+        AtlasEnumDef that = (AtlasEnumDef) o;
+
+        if (elementDefs != null ? !elementDefs.equals(that.elementDefs) : that.elementDefs != null) { return false; }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (elementDefs != null ? elementDefs.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+
+
+    /**
+     * class that captures details of an enum-element.
+     */
+    @JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+    @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+    @JsonIgnoreProperties(ignoreUnknown=true)
+    public static class AtlasEnumElementDef implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        private String  value;
+        private String  description;
+        private Integer ordinal;
+
+        public AtlasEnumElementDef() {
+            this(null, null, null);
+        }
+
+        public AtlasEnumElementDef(String value, String description, Integer ordinal) {
+            setValue(value);
+            setDescription(description);
+            setOrdinal(ordinal);
+        }
+
+        public AtlasEnumElementDef(AtlasEnumElementDef other) {
+            if (other != null) {
+                setValue(other.getValue());
+                setDescription(other.getDescription());
+                setOrdinal(other.getOrdinal());
+            }
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public void setDescription(String description) {
+            this.description = description;
+        }
+
+        public Integer getOrdinal() {
+            return ordinal;
+        }
+
+        public void setOrdinal(Integer ordinal) {
+            this.ordinal = ordinal;
+        }
+
+        public StringBuilder toString(StringBuilder sb) {
+            if (sb == null) {
+                sb = new StringBuilder();
+            }
+
+            sb.append("AtlasEnumElementDef{");
+            sb.append("value='").append(value).append('\'');
+            sb.append(", description='").append(description).append('\'');
+            sb.append(", ordinal=").append(ordinal);
+            sb.append('}');
+
+            return sb;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) { return true; }
+            if (o == null || getClass() != o.getClass()) { return false; }
+
+            AtlasEnumElementDef that = (AtlasEnumElementDef) o;
+
+            if (value != null ? !value.equals(that.value) : that.value != null) { return false; }
+            if (description != null ? !description.equals(that.description) : that.description != null) {
+                return false;
+            }
+            if (ordinal != null ? !ordinal.equals(that.ordinal) : that.ordinal != null) { return false; }
+
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = value != null ? value.hashCode() : 0;
+            result = 31 * result + (description != null ? description.hashCode() : 0);
+            result = 31 * result + (ordinal != null ? ordinal.hashCode() : 0);
+            return result;
+        }
+
+        @Override
+        public String toString() {
+            return toString(new StringBuilder()).toString();
+        }
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java
new file mode 100644
index 0000000..af42c05
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java
@@ -0,0 +1,401 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.hadoop.util.StringUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * class that captures details of a struct-type.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // do not update this list contents directly - the list might be in the middle of iteration in another thread
+    // to update list contents: 1) make a copy 2) update the copy 3) assign the copy to this member
+    private List<AtlasAttributeDef> attributeDefs;
+
+    public AtlasStructDef() {
+        this(null, null, null, null);
+    }
+
+    public AtlasStructDef(String name) {
+        this(name, null, null, null);
+    }
+
+    public AtlasStructDef(String name, String description) {
+        this(name, description, null, null);
+    }
+
+    public AtlasStructDef(String name, String description, String typeVersion) {
+        this(name, description, typeVersion, null);
+    }
+
+    public AtlasStructDef(String name, String description, String typeVersion, List<AtlasAttributeDef> attributeDefs) {
+        super(name, description, typeVersion);
+
+        setAttributeDefs(attributeDefs);
+    }
+
+    public AtlasStructDef(AtlasStructDef other) {
+        super(other);
+
+        setAttributeDefs(other != null ? other.getAttributeDefs() : null);
+    }
+
+    public List<AtlasAttributeDef> getAttributeDefs() {
+        return attributeDefs;
+    }
+
+    public void setAttributeDefs(List<AtlasAttributeDef> attributeDefs) {
+        if (this.attributeDefs != null && this.attributeDefs == attributeDefs) {
+            return;
+        }
+
+        if (CollectionUtils.isEmpty(attributeDefs)) {
+            this.attributeDefs = Collections.emptyList();
+        } else {
+            // if multiple attributes with same name are present, keep only the last entry
+            List<AtlasAttributeDef> tmpList     = new ArrayList<AtlasAttributeDef>(attributeDefs.size());
+            Set<String>             attribNames = new HashSet<String>();
+
+            ListIterator<AtlasAttributeDef> iter = attributeDefs.listIterator(attributeDefs.size());
+            while (iter.hasPrevious()) {
+                AtlasAttributeDef attributeDef = iter.previous();
+                String            attribName   = attributeDef != null ? attributeDef.getName() : null;
+
+                if (attribName != null) {
+                    attribName = attribName.toLowerCase();
+
+                    if (!attribNames.contains(attribName)) {
+                        tmpList.add(new AtlasAttributeDef(attributeDef));
+
+                        attribNames.add(attribName);
+                    }
+                }
+            }
+            Collections.reverse(tmpList);
+
+            this.attributeDefs = Collections.unmodifiableList(tmpList);
+        }
+    }
+
+    public AtlasAttributeDef getAttribute(String attrName) {
+        return findAttribute(this.attributeDefs, attrName);
+    }
+
+    public void addAttribute(AtlasAttributeDef attributeDef) {
+        if (attributeDef == null) {
+            return;
+        }
+
+        List<AtlasAttributeDef> a = this.attributeDefs;
+
+        List<AtlasAttributeDef> tmpList = new ArrayList<AtlasAttributeDef>();
+        if (CollectionUtils.isNotEmpty(a)) {
+            // copy existing attributes, except ones having same name as the attribute being added
+            for (AtlasAttributeDef existingAttrDef : a) {
+                if (!StringUtils.equalsIgnoreCase(existingAttrDef.getName(), attributeDef.getName())) {
+                    tmpList.add(existingAttrDef);
+                }
+            }
+        }
+        tmpList.add(new AtlasAttributeDef(attributeDef));
+
+        this.attributeDefs = Collections.unmodifiableList(tmpList);
+    }
+
+    public void removeAttribute(String attrName) {
+        List<AtlasAttributeDef> a = this.attributeDefs;
+
+        if (hasAttribute(a, attrName)) {
+            List<AtlasAttributeDef> tmpList = new ArrayList<AtlasAttributeDef>();
+
+            // copy existing attributes, except ones having same name as the attribute being removed
+            for (AtlasAttributeDef existingAttrDef : a) {
+                if (!StringUtils.equalsIgnoreCase(existingAttrDef.getName(), attrName)) {
+                    tmpList.add(existingAttrDef);
+                }
+            }
+
+            this.attributeDefs = Collections.unmodifiableList(tmpList);
+        }
+    }
+
+    public boolean hasAttribute(String attrName) {
+        return getAttribute(attrName) != null;
+    }
+
+    private static boolean hasAttribute(List<AtlasAttributeDef> attributeDefs, String attrName) {
+        return findAttribute(attributeDefs, attrName) != null;
+    }
+
+    private static AtlasAttributeDef findAttribute(List<AtlasAttributeDef> attributeDefs, String attrName) {
+        AtlasAttributeDef ret = null;
+
+        if (CollectionUtils.isNotEmpty(attributeDefs)) {
+            for (AtlasAttributeDef attributeDef : attributeDefs) {
+                if (StringUtils.equalsIgnoreCase(attributeDef.getName(), attrName)) {
+                    ret = attributeDef;
+                    break;
+                }
+            }
+        }
+
+        return ret;
+    }
+
+    @Override
+    public StringBuilder toString(StringBuilder sb) {
+        if (sb == null) {
+            sb = new StringBuilder();
+        }
+
+        sb.append("AtlasStructDef{");
+        super.toString(sb);
+        sb.append(", attributeDefs=[");
+        dumpObjects(attributeDefs, sb);
+        sb.append("]");
+        sb.append('}');
+
+        return sb;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) { return true; }
+        if (o == null || getClass() != o.getClass()) { return false; }
+        if (!super.equals(o)) { return false; }
+
+        AtlasStructDef that = (AtlasStructDef) o;
+
+        if (attributeDefs != null ? !attributeDefs.equals(that.attributeDefs) : that.attributeDefs != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (attributeDefs != null ? attributeDefs.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder()).toString();
+    }
+
+    /**
+     * class that captures details of a struct-attribute.
+     */
+    @JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+    @JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
+    @JsonIgnoreProperties(ignoreUnknown=true)
+    public static class AtlasAttributeDef implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * single-valued attribute or multi-valued attribute.
+         */
+        public enum Cardinality { SINGLE, LIST, SET };
+
+        public static final int COUNT_NOT_SET = -1;
+
+        private String      name;
+        private String      typeName;
+        private boolean     isOptional;
+        private Cardinality cardinality;
+        private int         valuesMinCount;
+        private int         valuesMaxCount;
+        private boolean     isUnique;
+        private boolean     isIndexable;
+
+        public AtlasAttributeDef() { this(null, null); }
+
+        public AtlasAttributeDef(String name, String typeName) {
+            this(name, typeName, false, Cardinality.SINGLE, 1, 1, false, false);
+        }
+
+        public AtlasAttributeDef(String name, String typeName, boolean isOptional, Cardinality cardinality,
+                                 int valuesMinCount, int valuesMaxCount, boolean isUnique, boolean isIndexable) {
+            setName(name);
+            setTypeName(typeName);
+            setOptional(isOptional);
+            setCardinality(cardinality);
+            setValuesMinCount(valuesMinCount);
+            setValuesMaxCount(valuesMaxCount);
+            setUnique(isUnique);
+            setIndexable(isIndexable);
+        }
+
+        public AtlasAttributeDef(AtlasAttributeDef other) {
+            if (other != null) {
+                setName(other.getName());
+                setTypeName(other.getTypeName());
+                setOptional(other.isOptional());
+                setCardinality(other.getCardinality());
+                setValuesMinCount(other.getValuesMinCount());
+                setValuesMaxCount(other.getValuesMaxCount());
+                setUnique(other.isUnique());
+                setIndexable(other.isIndexable());
+            }
+        }
+
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getTypeName() {
+            return typeName;
+        }
+
+        public void setTypeName(String typeName) {
+            this.typeName = typeName;
+        }
+
+        public boolean isOptional() {
+            return isOptional;
+        }
+
+        public void setOptional(boolean optional) { isOptional = optional; }
+
+        public void setCardinality(Cardinality cardinality) {
+            this.cardinality = cardinality;
+        }
+
+        public Cardinality getCardinality() {
+            return cardinality;
+        }
+
+        public int getValuesMinCount() {
+            return valuesMinCount;
+        }
+
+        public void setValuesMinCount(int valuesMinCount) {
+            this.valuesMinCount = valuesMinCount;
+        }
+
+        public int getValuesMaxCount() {
+            return valuesMaxCount;
+        }
+
+        public void setValuesMaxCount(int valuesMaxCount) {
+            this.valuesMaxCount = valuesMaxCount;
+        }
+
+        public boolean isUnique() {
+            return isUnique;
+        }
+
+        public void setUnique(boolean unique) {
+            isUnique = unique;
+        }
+
+        public boolean isIndexable() {
+            return isIndexable;
+        }
+
+        public void setIndexable(boolean idexable) {
+            isIndexable = idexable;
+        }
+
+
+        public StringBuilder toString(StringBuilder sb) {
+            if (sb == null) {
+                sb = new StringBuilder();
+            }
+
+            sb.append("AtlasAttributeDef{");
+            sb.append("name='").append(name).append('\'');
+            sb.append(", typeName='").append(typeName).append('\'');
+            sb.append(", isOptional=").append(isOptional);
+            sb.append(", cardinality=").append(cardinality);
+            sb.append(", valuesMinCount=").append(valuesMinCount);
+            sb.append(", valuesMaxCount=").append(valuesMaxCount);
+            sb.append(", isUnique=").append(isUnique);
+            sb.append(", isIndexable=").append(isIndexable);
+            sb.append('}');
+
+            return sb;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) { return true; }
+            if (o == null || getClass() != o.getClass()) { return false; }
+
+            AtlasAttributeDef that = (AtlasAttributeDef) o;
+
+            if (name != null ? !name.equals(that.name) : that.name != null) { return false; }
+            if (typeName != null ? !typeName.equals(that.typeName) : that.typeName != null) { return false; }
+            if (isOptional != that.isOptional) { return false; }
+            if (cardinality != null ? !cardinality.equals(that.cardinality) : that.cardinality != null) {
+                return false;
+            }
+            if (valuesMinCount != that.valuesMinCount) { return false; }
+            if (valuesMaxCount != that.valuesMaxCount) { return false; }
+            if (isUnique != that.isUnique) { return false; }
+            if (isIndexable != that.isIndexable) { return false; }
+
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = name != null ? name.hashCode() : 0;
+            result = 31 * result + (typeName != null ? typeName.hashCode() : 0);
+            result = 31 * result + (isOptional ? 1 : 0);
+            result = 31 * result + (cardinality != null ? cardinality.hashCode() : 0);
+            result = 31 * result + valuesMinCount;
+            result = 31 * result + valuesMaxCount;
+            result = 31 * result + (isUnique ? 1 : 0);
+            result = 31 * result + (isIndexable ? 1 : 0);
+            return result;
+        }
+
+        @Override
+        public String toString() {
+            return toString(new StringBuilder()).toString();
+        }
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java b/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java
new file mode 100644
index 0000000..1473c3a
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java
@@ -0,0 +1,271 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.COUNT_NOT_SET;
+
+/**
+ * class that implements behaviour of an array-type.
+ */
+public class AtlasArrayType extends AtlasType {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasArrayType.class);
+
+    private final String elementTypeName;
+    private final int    minCount;
+    private final int    maxCount;
+
+    private AtlasType elementType;
+
+    public AtlasArrayType(AtlasType elementType) {
+        this(elementType, COUNT_NOT_SET, COUNT_NOT_SET);
+    }
+
+    public AtlasArrayType(AtlasType elementType, int minCount, int maxCount) {
+        super(AtlasBaseTypeDef.getArrayTypeName(elementType.getTypeName()));
+
+        this.elementTypeName = elementType.getTypeName();
+        this.minCount        = minCount;
+        this.maxCount        = maxCount;
+        this.elementType     = elementType;
+    }
+
+    public AtlasArrayType(String elementTypeName) {
+        this(elementTypeName, COUNT_NOT_SET, COUNT_NOT_SET);
+    }
+
+    public AtlasArrayType(String elementTypeName, int minCount, int maxCount) {
+        super(AtlasBaseTypeDef.getArrayTypeName(elementTypeName));
+
+        this.elementTypeName = elementTypeName;
+        this.minCount        = minCount;
+        this.maxCount        = maxCount;
+        this.elementType     = null;
+    }
+
+    public AtlasArrayType(String elementTypeName, AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        this(elementTypeName, COUNT_NOT_SET, COUNT_NOT_SET, typeRegistry);
+    }
+
+    public AtlasArrayType(String elementTypeName, int minCount, int maxCount, AtlasTypeRegistry typeRegistry)
+        throws  AtlasBaseException {
+        super(AtlasBaseTypeDef.getArrayTypeName(elementTypeName));
+
+        this.elementTypeName = elementTypeName;
+        this.minCount        = minCount;
+        this.maxCount        = maxCount;
+
+        this.resolveReferences(typeRegistry);
+    }
+
+    @Override
+    public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        elementType = typeRegistry.getType(elementTypeName);
+
+        if (elementType == null) {
+            String msg = elementTypeName + ": unknown element-type for array";
+
+            LOG.error(msg);
+
+            throw new AtlasBaseException(msg);
+        }
+
+        elementType.resolveReferences(typeRegistry);
+    }
+
+    @Override
+    public Collection<? extends Object> createDefaultValue() {
+        Collection<Object> ret = new ArrayList<Object>();
+
+        ret.add(elementType.createDefaultValue());
+
+        if (minCount != COUNT_NOT_SET) {
+            for (int i = 1; i < minCount; i++) {
+                ret.add(elementType.createDefaultValue());
+            }
+        }
+
+        return ret;
+    }
+
+    @Override
+    public boolean isValidValue(Object obj) {
+        if (obj != null) {
+            if (obj instanceof List || obj instanceof Set) {
+                Collection objList = (Collection) obj;
+
+                if (!isValidElementCount(objList.size())) {
+                    return false;
+                }
+
+                for (Object element : objList) {
+                    if (!elementType.isValidValue(element)) {
+                        return false;
+                    }
+                }
+            } else if (obj.getClass().isArray()) {
+                int arrayLen = Array.getLength(obj);
+
+                if (!isValidElementCount(arrayLen)) {
+                    return false;
+                }
+
+                for (int i = 0; i < arrayLen; i++) {
+                    if (!elementType.isValidValue(Array.get(obj, i))) {
+                        return false;
+                    }
+                }
+            } else {
+                return false; // invalid type
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public Collection<? extends Object> getNormalizedValue(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+
+        if (obj instanceof List || obj instanceof Set) {
+            List<Object> ret = new ArrayList<Object>();
+
+            Collection objList = (Collection) obj;
+
+            if (!isValidElementCount(objList.size())) {
+                return null;
+            }
+
+            for (Object element : objList) {
+                if (element != null) {
+                    Object normalizedValue = elementType.getNormalizedValue(element);
+
+                    if (normalizedValue != null) {
+                        ret.add(normalizedValue);
+                    } else {
+                        return null; // invalid element value
+                    }
+                } else {
+                    ret.add(element);
+                }
+            }
+
+            return ret;
+        } else if (obj.getClass().isArray()) {
+            List<Object> ret = new ArrayList<Object>();
+
+            int arrayLen = Array.getLength(obj);
+
+            if (!isValidElementCount(arrayLen)) {
+                return null;
+            }
+
+            for (int i = 0; i < arrayLen; i++) {
+                Object element = Array.get(obj, i);
+
+                if (element != null) {
+                    Object normalizedValue = elementType.getNormalizedValue(element);
+
+                    if (normalizedValue != null) {
+                        ret.add(normalizedValue);
+                    } else {
+                        return null; // invalid element value
+                    }
+                } else {
+                    ret.add(element);
+                }
+            }
+
+            return ret;
+        }
+
+        return null;
+    }
+
+    @Override
+    public boolean validateValue(Object obj, String objName, List<String> messages) {
+        boolean ret = true;
+
+        if (obj != null) {
+            if (obj instanceof List || obj instanceof Set) {
+                Collection objList = (Collection) obj;
+
+                if (!isValidElementCount(objList.size())) {
+                    ret = false;
+
+                    messages.add(objName + ": incorrect number of values. found=" + objList.size()
+                                 + "; expected: minCount=" + minCount + ", maxCount=" + maxCount);
+                }
+
+                int idx = 0;
+                for (Object element : objList) {
+                    ret = elementType.validateValue(element, objName + "[" + idx + "]", messages) && ret;
+                    idx++;
+                }
+            } else if (obj.getClass().isArray()) {
+                int arrayLen = Array.getLength(obj);
+
+                if (!isValidElementCount(arrayLen)) {
+                    ret = false;
+
+                    messages.add(objName + ": incorrect number of values. found=" + arrayLen
+                                 + "; expected: minCount=" + minCount + ", maxCount=" + maxCount);
+                }
+
+                for (int i = 0; i < arrayLen; i++) {
+                    ret = elementType.validateValue(Array.get(obj, i), objName + "[" + i + "]", messages) && ret;
+                }
+            } else {
+                ret = false;
+
+                messages.add(objName + "=" + obj + ": invalid value for type " + getTypeName());
+            }
+        }
+
+        return ret;
+    }
+
+    private boolean isValidElementCount(int count) {
+        if (minCount != COUNT_NOT_SET) {
+            if (count < minCount) {
+                return false;
+            }
+        }
+
+        if (maxCount != COUNT_NOT_SET) {
+            if (count > maxCount) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java b/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java
new file mode 100644
index 0000000..16a3df6
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java
@@ -0,0 +1,547 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.atlas.model.instance.AtlasObjectId;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+import org.apache.commons.lang.StringUtils;
+
+
+/**
+ * Built-in types in Atlas.
+ */
+public class AtlasBuiltInTypes {
+
+    /**
+     * class that implements behaviour of boolean type.
+     */
+    public static class AtlasBooleanType extends AtlasType {
+        private static final Boolean DEFAULT_VALUE = Boolean.FALSE;
+
+        public AtlasBooleanType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_BOOLEAN);
+        }
+
+        @Override
+        public Boolean createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            return true;
+        }
+
+        @Override
+        public Boolean getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof Boolean) {
+                    return (Boolean)obj;
+                } else {
+                    return Boolean.valueOf(obj.toString());
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of byte type.
+     */
+    public static class AtlasByteType extends AtlasType {
+        private static final Byte DEFAULT_VALUE = new Byte((byte)0);
+
+        public AtlasByteType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_BYTE);
+        }
+
+        @Override
+        public Byte createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public Byte getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof Byte) {
+                    return (Byte) obj;
+                } else if (obj instanceof Number) {
+                    return ((Number) obj).byteValue();
+                } else {
+                    String strValue = obj.toString();
+
+                    if (StringUtils.isNotEmpty(strValue)) {
+                        return Byte.valueOf(strValue);
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of short type.
+     */
+    public static class AtlasShortType extends AtlasType {
+        private static final Short DEFAULT_VALUE = new Short((short)0);
+
+        public AtlasShortType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_SHORT);
+        }
+
+        @Override
+        public Short createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public Short getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof Short) {
+                    return (Short)obj;
+                } else if (obj instanceof Number) {
+                    return ((Number) obj).shortValue();
+                } else {
+                    try {
+                        return Short.valueOf(obj.toString());
+                    } catch(NumberFormatException excp) {
+                        // ignore
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of integer type.
+     */
+    public static class AtlasIntType extends AtlasType {
+        private static final Integer DEFAULT_VALUE = new Integer(0);
+
+        public AtlasIntType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_INT);
+        }
+
+        @Override
+        public Integer createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public Integer getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof Integer) {
+                    return (Integer) obj;
+                } else if (obj instanceof Number) {
+                    return ((Number) obj).intValue();
+                } else {
+                    try {
+                        return Integer.valueOf(obj.toString());
+                    } catch (NumberFormatException excp) {
+                        // ignore
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of long type.
+     */
+    public static class AtlasLongType extends AtlasType {
+        private static final Long DEFAULT_VALUE = new Long(0);
+
+        public AtlasLongType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_LONG);
+        }
+
+        @Override
+        public Long createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public Long getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof Long) {
+                    return (Long) obj;
+                } else if (obj instanceof Number) {
+                    return ((Number) obj).longValue();
+                } else {
+                    try {
+                        return Long.valueOf(obj.toString());
+                    } catch (NumberFormatException excp) {
+                        // ignore
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of float type.
+     */
+    public static class AtlasFloatType extends AtlasType {
+        private static final Float DEFAULT_VALUE = new Float(0);
+
+        public AtlasFloatType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_FLOAT);
+        }
+
+        @Override
+        public Float createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public Float getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof Float) {
+                    return (Float) obj;
+                } else if (obj instanceof Number) {
+                    return ((Number) obj).floatValue();
+                } else {
+                    try {
+                        return Float.valueOf(obj.toString());
+                    } catch (NumberFormatException excp) {
+                        // ignore
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of double type.
+     */
+    public static class AtlasDoubleType extends AtlasType {
+        private static final Double DEFAULT_VALUE = new Double(0);
+
+        public AtlasDoubleType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_DOUBLE);
+        }
+
+        @Override
+        public Double createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public Double getNormalizedValue(Object obj) {
+            Double ret;
+
+            if (obj != null) {
+                if (obj instanceof Double) {
+                    return (Double) obj;
+                } else if (obj instanceof Number) {
+                    return ((Number) obj).doubleValue();
+                } else {
+                    try {
+                        return Double.valueOf(obj.toString());
+                    } catch (NumberFormatException excp) {
+                        // ignore
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of Java BigInteger type.
+     */
+    public static class AtlasBigIntegerType extends AtlasType {
+        private static final BigInteger DEFAULT_VALUE = BigInteger.ZERO;
+
+        public AtlasBigIntegerType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER);
+        }
+
+        @Override
+        public BigInteger createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public BigInteger getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof BigInteger) {
+                    return (BigInteger) obj;
+                } else if (obj instanceof Number) {
+                    return BigInteger.valueOf(((Number) obj).longValue());
+                } else {
+                    try {
+                        return new BigInteger(obj.toString());
+                    } catch (NumberFormatException excp) {
+                        // ignore
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of Java BigDecimal type.
+     */
+    public static class AtlasBigDecimalType extends AtlasType {
+        private static final BigDecimal DEFAULT_VALUE = BigDecimal.ZERO;
+
+        public AtlasBigDecimalType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_BIGDECIMAL);
+        }
+
+        @Override
+        public BigDecimal createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public BigDecimal getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof BigDecimal) {
+                    return (BigDecimal) obj;
+                } else if (obj instanceof Number) {
+                    return BigDecimal.valueOf(((Number) obj).longValue());
+                } else {
+                    try {
+                        return new BigDecimal(obj.toString());
+                    } catch (NumberFormatException excp) {
+                        // ignore
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of Date type.
+     */
+    public static class AtlasDateType extends AtlasType {
+        private static final Date DEFAULT_VALUE = new Date(0);
+
+        public AtlasDateType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_DATE);
+        }
+
+        @Override
+        public Date createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof Date || obj instanceof Number) {
+                return true;
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public Date getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof Date) {
+                    return (Date) obj;
+                } else if (obj instanceof Number) {
+                    return new Date(((Number) obj).longValue());
+                } else {
+                    try {
+                        return AtlasBaseTypeDef.DATE_FORMATTER.parse(obj.toString());
+                    } catch (ParseException excp) {
+                        try { // try to read it as a number
+                            long longDate = Long.valueOf(obj.toString());
+                            return new Date(longDate);
+                        } catch (NumberFormatException e) {
+                            // ignore
+                        }
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of String type.
+     */
+    public static class AtlasStringType extends AtlasType {
+        private static final String DEFAULT_VALUE = "";
+
+        public AtlasStringType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_STRING);
+        }
+
+        @Override
+        public String createDefaultValue() {
+            return DEFAULT_VALUE;
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            return true;
+        }
+
+        @Override
+        public String getNormalizedValue(Object obj) {
+            if (obj != null) {
+                return obj.toString();
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     * class that implements behaviour of Atlas object-id type.
+     */
+    public static class AtlasObjectIdType extends AtlasType {
+        public AtlasObjectIdType() {
+            super(AtlasBaseTypeDef.ATLAS_TYPE_OBJECT_ID);
+        }
+
+        @Override
+        public AtlasObjectId createDefaultValue() {
+            return new AtlasObjectId(AtlasBaseTypeDef.ATLAS_TYPE_ASSET, "test");
+        }
+
+        @Override
+        public boolean isValidValue(Object obj) {
+            if (obj == null || obj instanceof AtlasObjectId) {
+                return true;
+            } else if (obj instanceof Map) {
+                Map map = (Map)obj;
+
+                return map.containsKey(AtlasObjectId.KEY_TYPENAME) && map.containsKey(AtlasObjectId.KEY_GUID);
+            }
+
+            return getNormalizedValue(obj) != null;
+        }
+
+        @Override
+        public AtlasObjectId getNormalizedValue(Object obj) {
+            if (obj != null) {
+                if (obj instanceof AtlasObjectId) {
+                    return (AtlasObjectId) obj;
+                } else if (obj instanceof Map) {
+                    Map map = (Map) obj;
+
+                    if (map.containsKey(AtlasObjectId.KEY_TYPENAME) && map.containsKey(AtlasObjectId.KEY_GUID)) {
+                        return new AtlasObjectId(map);
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
new file mode 100644
index 0000000..e0a0c6d
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
@@ -0,0 +1,201 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.typedef.AtlasClassificationDef;
+import org.apache.commons.collections.CollectionUtils;
+
+
+/**
+ * class that implements behaviour of a classification-type.
+ */
+public class AtlasClassificationType extends AtlasStructType {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasClassificationType.class);
+
+    private final AtlasClassificationDef classificationDef;
+
+    private List<AtlasClassificationType> superTypes    = Collections.emptyList();
+    private Set<String>                   allSuperTypes = Collections.emptySet();
+
+    public AtlasClassificationType(AtlasClassificationDef classificationDef) {
+        super(classificationDef);
+
+        this.classificationDef = classificationDef;
+    }
+
+    public AtlasClassificationType(AtlasClassificationDef classificationDef, AtlasTypeRegistry typeRegistry)
+        throws AtlasBaseException {
+        super(classificationDef);
+
+        this.classificationDef = classificationDef;
+
+        resolveReferences(typeRegistry);
+    }
+
+    @Override
+    public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        super.resolveReferences(typeRegistry);
+
+        List<AtlasClassificationType> s    = new ArrayList<AtlasClassificationType>();
+        Set<String>                   allS = new HashSet<String>();
+
+        for (String superTypeName : classificationDef.getSuperTypes()) {
+            AtlasType superType = typeRegistry.getType(superTypeName);
+
+            if (superType != null && superType instanceof AtlasClassificationType) {
+                AtlasClassificationType superClassificationType = (AtlasClassificationType)superType;
+
+                superClassificationType.resolveReferences(typeRegistry);
+
+                s.add(superClassificationType);
+                allS.add(superTypeName);
+
+                if (CollectionUtils.isNotEmpty(superClassificationType.getAllSuperTypes())) {
+                    allS.addAll(superClassificationType.getAllSuperTypes());
+                }
+            } else {
+                String msg = superTypeName + ((superType == null) ? ": unknown" : ": incompatible");
+
+                msg += (" supertype in classification " + classificationDef.getName());
+
+                LOG.error(msg);
+
+                throw new AtlasBaseException(msg);
+            }
+        }
+
+        this.superTypes    = Collections.unmodifiableList(s);
+        this.allSuperTypes = allS;
+    }
+
+    public Set<String> getSuperTypes() {
+        return classificationDef.getSuperTypes();
+    }
+
+    public Set<String> getAllSuperTypes() { return allSuperTypes; }
+
+    public boolean isSuperTypeOf(AtlasClassificationType classificationType) {
+        return classificationType != null ? classificationType.getAllSuperTypes().contains(this.getTypeName()) : false;
+    }
+
+    public boolean isSubTypeOf(AtlasClassificationType classificationType) {
+        return classificationType != null ? allSuperTypes.contains(classificationType.getTypeName()) : false;
+    }
+
+    @Override
+    public AtlasClassification createDefaultValue() {
+        AtlasClassification ret = new AtlasClassification(classificationDef.getName());
+
+        populateDefaultValues(ret);
+
+        return ret;
+    }
+
+    @Override
+    public boolean isValidValue(Object obj) {
+        if (obj != null) {
+            for (AtlasClassificationType superType : superTypes) {
+                if (!superType.isValidValue(obj)) {
+                    return false;
+                }
+            }
+
+            return super.isValidValue(obj);
+        }
+
+        return true;
+    }
+
+    @Override
+    public Object getNormalizedValue(Object obj) {
+        Object ret = null;
+
+        if (obj != null) {
+            if (isValidValue(obj)) {
+                if (obj instanceof AtlasClassification) {
+                    normalizeAttributeValues((AtlasClassification) obj);
+                    ret = obj;
+                } else if (obj instanceof Map) {
+                    normalizeAttributeValues((Map) obj);
+                    ret = obj;
+                }
+            }
+        }
+
+        return ret;
+    }
+
+    @Override
+    public boolean validateValue(Object obj, String objName, List<String> messages) {
+        boolean ret = true;
+
+        if (obj != null) {
+            for (AtlasClassificationType superType : superTypes) {
+                ret = superType.validateValue(obj, objName, messages) && ret;
+            }
+
+            ret = super.validateValue(obj, objName, messages) && ret;
+        }
+
+        return ret;
+    }
+
+    public void normalizeAttributeValues(AtlasClassification classification) {
+        if (classification != null) {
+            for (AtlasClassificationType superType : superTypes) {
+                superType.normalizeAttributeValues(classification);
+            }
+
+            super.normalizeAttributeValues(classification);
+        }
+    }
+
+    @Override
+    public void normalizeAttributeValues(Map<String, Object> obj) {
+        if (obj != null) {
+            for (AtlasClassificationType superType : superTypes) {
+                superType.normalizeAttributeValues(obj);
+            }
+
+            super.normalizeAttributeValues(obj);
+        }
+    }
+
+    public void populateDefaultValues(AtlasClassification classification) {
+        if (classification != null) {
+            for (AtlasClassificationType superType : superTypes) {
+                superType.populateDefaultValues(classification);
+            }
+
+            super.populateDefaultValues(classification);
+        }
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
new file mode 100644
index 0000000..e91fb99
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
@@ -0,0 +1,201 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.apache.commons.collections.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * class that implements behaviour of an entity-type.
+ */
+public class AtlasEntityType extends AtlasStructType {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityType.class);
+
+    private final AtlasEntityDef entityDef;
+
+    private List<AtlasEntityType> superTypes    = Collections.emptyList();
+    private Set<String>           allSuperTypes = Collections.emptySet();
+
+    public AtlasEntityType(AtlasEntityDef entityDef) {
+        super(entityDef);
+
+        this.entityDef = entityDef;
+    }
+
+    public AtlasEntityType(AtlasEntityDef entityDef, AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        super(entityDef);
+
+        this.entityDef = entityDef;
+
+        resolveReferences(typeRegistry);
+    }
+
+    @Override
+    public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        super.resolveReferences(typeRegistry);
+
+        List<AtlasEntityType> s    = new ArrayList<AtlasEntityType>();
+        Set<String>           allS = new HashSet<String>();
+
+        for (String superTypeName : entityDef.getSuperTypes()) {
+            AtlasType superType = typeRegistry.getType(superTypeName);
+
+            if (superType != null && superType instanceof AtlasEntityType) {
+                AtlasEntityType superEntityType = (AtlasEntityType)superType;
+
+                superEntityType.resolveReferences(typeRegistry);
+
+                s.add(superEntityType);
+                allS.add(superTypeName);
+
+                if (CollectionUtils.isNotEmpty(superEntityType.getAllSuperTypes())) {
+                    allS.addAll(superEntityType.getAllSuperTypes());
+                }
+            } else {
+                String msg = superTypeName + ((superType == null) ? ": unknown" : ": incompatible");
+
+                msg += (" supertype in entity " + entityDef.getName());
+
+                LOG.error(msg);
+
+                throw new AtlasBaseException(msg);
+            }
+        }
+
+        this.superTypes    = Collections.unmodifiableList(s);
+        this.allSuperTypes = Collections.unmodifiableSet(allS);
+    }
+
+    public Set<String> getSuperTypes() {
+        return entityDef.getSuperTypes();
+    }
+
+    public Set<String> getAllSuperTypes() {
+        return allSuperTypes;
+    }
+
+    public boolean isSuperTypeOf(AtlasEntityType entityType) {
+        return entityType != null ? entityType.getAllSuperTypes().contains(this.getTypeName()) : false;
+    }
+
+    public boolean isSubTypeOf(AtlasEntityType entityType) {
+        return entityType != null ? allSuperTypes.contains(entityType.getTypeName()) : false;
+    }
+
+    @Override
+    public AtlasEntity createDefaultValue() {
+        AtlasEntity ret = new AtlasEntity(entityDef.getName());
+
+        populateDefaultValues(ret);
+
+        return ret;
+    }
+
+    @Override
+    public boolean isValidValue(Object obj) {
+        if (obj != null) {
+            for (AtlasEntityType superType : superTypes) {
+                if (!superType.isValidValue(obj)) {
+                    return false;
+                }
+            }
+
+            return super.isValidValue(obj);
+        }
+
+        return true;
+    }
+
+    @Override
+    public Object getNormalizedValue(Object obj) {
+        Object ret = null;
+
+        if (obj != null) {
+            if (isValidValue(obj)) {
+                if (obj instanceof AtlasEntity) {
+                    normalizeAttributeValues((AtlasEntity) obj);
+                    ret = obj;
+                } else if (obj instanceof Map) {
+                    normalizeAttributeValues((Map) obj);
+                    ret = obj;
+                }
+            }
+        }
+
+        return ret;
+    }
+
+    @Override
+    public boolean validateValue(Object obj, String objName, List<String> messages) {
+        boolean ret = true;
+
+        if (obj != null) {
+            for (AtlasEntityType superType : superTypes) {
+                ret = superType.validateValue(obj, objName, messages) && ret;
+            }
+
+            ret = super.validateValue(obj, objName, messages) && ret;
+        }
+
+        return ret;
+    }
+
+    public void normalizeAttributeValues(AtlasEntity ent) {
+        if (ent != null) {
+            for (AtlasEntityType superType : superTypes) {
+                superType.normalizeAttributeValues(ent);
+            }
+
+            super.normalizeAttributeValues(ent);
+        }
+    }
+
+    @Override
+    public void normalizeAttributeValues(Map<String, Object> obj) {
+        if (obj != null) {
+            for (AtlasEntityType superType : superTypes) {
+                superType.normalizeAttributeValues(obj);
+            }
+
+            super.normalizeAttributeValues(obj);
+        }
+    }
+
+    public void populateDefaultValues(AtlasEntity ent) {
+        if (ent != null) {
+            for (AtlasEntityType superType : superTypes) {
+                superType.populateDefaultValues(ent);
+            }
+
+            super.populateDefaultValues(ent);
+        }
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java
new file mode 100644
index 0000000..34f5d49
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java
@@ -0,0 +1,87 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.atlas.model.typedef.AtlasEnumDef;
+import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef;
+
+
+/**
+ * class that implements behaviour of an enum-type.
+ */
+public class AtlasEnumType extends AtlasType {
+    private final AtlasEnumDef                     enumDef;
+    private final Map<String, AtlasEnumElementDef> elementDefs;
+    private final String                           defaultValue;
+
+    public AtlasEnumType(AtlasEnumDef enumDef) {
+        super(enumDef.getName());
+
+        Map<String, AtlasEnumElementDef> e = new HashMap<String, AtlasEnumElementDef>();
+
+        for (AtlasEnumElementDef elementDef : enumDef.getElementDefs()) {
+            e.put(elementDef.getValue().toLowerCase(), elementDef);
+        }
+
+        String d = enumDef.getDefaultValue();
+
+        if (d == null) {
+            AtlasEnumElementDef defElem = enumDef.getElementDefs().size() > 0 ? enumDef.getElementDefs().get(0) : null;
+
+            if (defElem != null) {
+                d = defElem.getValue();
+            }
+        }
+
+        this.enumDef      = enumDef;
+        this.elementDefs  = Collections.unmodifiableMap(e);
+        this.defaultValue = d;
+    }
+
+    @Override
+    public Object createDefaultValue() {
+        return defaultValue;
+    }
+
+    @Override
+    public boolean isValidValue(Object obj) {
+        if (obj != null) {
+            return elementDefs.containsKey(obj.toString().toLowerCase());
+        }
+
+        return true;
+    }
+
+    @Override
+    public Object getNormalizedValue(Object obj) {
+        if (obj != null) {
+            AtlasEnumElementDef elementDef = elementDefs.get(obj.toString().toLowerCase());
+
+            if (elementDef != null) {
+                return elementDef.getValue();
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java b/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java
new file mode 100644
index 0000000..ca5bb21
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java
@@ -0,0 +1,189 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+
+/**
+ * class that implements behaviour of a map-type.
+ */
+public class AtlasMapType extends AtlasType {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityType.class);
+
+    private final String keyTypeName;
+    private final String valueTypeName;
+
+    private AtlasType keyType;
+    private AtlasType valueType;
+
+    public AtlasMapType(String keyTypeName, String valueTypeName) {
+        super(AtlasBaseTypeDef.getMapTypeName(keyTypeName, valueTypeName));
+
+        this.keyTypeName   = keyTypeName;
+        this.valueTypeName = valueTypeName;
+    }
+
+    public AtlasMapType(AtlasType keyType, AtlasType valueType) {
+        super(AtlasBaseTypeDef.getMapTypeName(keyType.getTypeName(), valueType.getTypeName()));
+
+        this.keyTypeName   = keyType.getTypeName();
+        this.valueTypeName = valueType.getTypeName();
+        this.keyType       = keyType;
+        this.valueType     = valueType;
+    }
+
+    public AtlasMapType(String keyTypeName, String valueTypeName, AtlasTypeRegistry typeRegistry)
+        throws AtlasBaseException {
+        super(AtlasBaseTypeDef.getMapTypeName(keyTypeName, valueTypeName));
+
+        this.keyTypeName   = keyTypeName;
+        this.valueTypeName = valueTypeName;
+
+        resolveReferences(typeRegistry);
+    }
+
+    @Override
+    public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        this.keyType   = typeRegistry.getType(keyTypeName);
+        this.valueType = typeRegistry.getType(valueTypeName);
+
+        if (keyType == null) {
+            String msg = keyTypeName + ": unknown key-type for map";
+
+            LOG.error(msg);
+
+            throw new AtlasBaseException(msg);
+        }
+
+        if (valueType == null) {
+            String msg = valueTypeName + ": unknown value-type for map";
+
+            LOG.error(msg);
+
+            throw new AtlasBaseException(msg);
+        }
+
+        keyType.resolveReferences(typeRegistry);
+        valueType.resolveReferences(typeRegistry);
+    }
+
+    @Override
+    public Map<Object, Object>  createDefaultValue() {
+        Map<Object, Object> ret = new HashMap<Object, Object>();
+
+        ret.put(keyType.createDefaultValue(), valueType.createDefaultValue());
+
+        return ret;
+    }
+
+    @Override
+    public boolean isValidValue(Object obj) {
+        if (obj != null) {
+            if (obj instanceof Map) {
+                Map<Object, Objects> map = (Map<Object, Objects>) obj;
+
+                for (Map.Entry e : map.entrySet()) {
+                    if (!keyType.isValidValue(e.getKey()) || !valueType.isValidValue(e.getValue())) {
+                        return false; // invalid key/value
+                    }
+                }
+            } else {
+                return false; // invalid type
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public Map<Object, Object> getNormalizedValue(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+
+        if (obj instanceof Map) {
+            Map<Object, Object> ret = new HashMap<Object, Object>();
+
+            Map<Object, Objects> map = (Map<Object, Objects>) obj;
+
+            for (Map.Entry e : map.entrySet()) {
+                Object normalizedKey = keyType.getNormalizedValue(e.getKey());
+
+                if (normalizedKey != null) {
+                    Object value = e.getValue();
+
+                    if (value != null) {
+                        Object normalizedValue = valueType.getNormalizedValue(e.getValue());
+
+                        if (normalizedValue != null) {
+                            ret.put(normalizedKey, normalizedValue);
+                        } else {
+                            return null; // invalid value
+                        }
+                    } else {
+                        ret.put(normalizedKey, value);
+                    }
+                } else {
+                    return null; // invalid key
+                }
+            }
+
+            return ret;
+        }
+
+        return null;
+    }
+
+    @Override
+    public boolean validateValue(Object obj, String objName, List<String> messages) {
+        boolean ret = true;
+
+        if (obj != null) {
+            if (obj instanceof Map) {
+                Map<Object, Objects> map = (Map<Object, Objects>) obj;
+
+                for (Map.Entry e : map.entrySet()) {
+                    Object key = e.getKey();
+
+                    if (!keyType.isValidValue(key)) {
+                        ret = false;
+
+                        messages.add(objName + "." + key + ": invalid key for type " + getTypeName());
+                    } else {
+                        Object value = e.getValue();
+
+                        ret = valueType.validateValue(value, objName + "." + key, messages) && ret;
+                    }
+                }
+            } else {
+                ret = false;
+
+                messages.add(objName + "=" + obj + ": invalid value for type " + getTypeName());
+            }
+        }
+
+        return ret;
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
new file mode 100644
index 0000000..096f061
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
@@ -0,0 +1,292 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import java.util.*;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.instance.AtlasStruct;
+import org.apache.atlas.model.typedef.AtlasStructDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * class that implements behaviour of a struct-type.
+ */
+public class AtlasStructType extends AtlasType {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasStructType.class);
+
+    private final AtlasStructDef structDef;
+
+    private Map<String, AtlasType> attrTypes = Collections.emptyMap();
+
+    public AtlasStructType(AtlasStructDef structDef) {
+        super(structDef.getName());
+
+        this.structDef = structDef;
+    }
+
+    public AtlasStructType(AtlasStructDef structDef, AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        super(structDef.getName());
+
+        this.structDef = structDef;
+
+        this.resolveReferences(typeRegistry);
+    }
+
+    @Override
+    public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+        Map<String, AtlasType> a = new HashMap<String, AtlasType>();
+
+        for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+            AtlasType attrType = typeRegistry.getType(attributeDef.getTypeName());
+
+            if (attrType != null) {
+                Cardinality cardinality = attributeDef.getCardinality();
+
+                if (cardinality == Cardinality.LIST || cardinality == Cardinality.SET) {
+                    attrType = new AtlasArrayType(attrType,
+                                                  attributeDef.getValuesMinCount(),
+                                                  attributeDef.getValuesMaxCount());
+                }
+
+                a.put(attributeDef.getName(), attrType);
+            } else {
+                String msg = attributeDef.getTypeName() + ": unknown type for attribute "
+                             + structDef.getName() + "." + attributeDef.getName();
+
+                LOG.error(msg);
+
+                throw new AtlasBaseException(msg);
+            }
+        }
+
+        this.attrTypes = Collections.unmodifiableMap(a);
+    }
+
+    @Override
+    public AtlasStruct createDefaultValue() {
+        AtlasStruct ret = new AtlasStruct(structDef.getName());
+
+        populateDefaultValues(ret);
+
+        return  ret;
+    }
+
+    @Override
+    public boolean isValidValue(Object obj) {
+        if (obj != null) {
+            if (obj instanceof AtlasStruct) {
+                AtlasStruct structObj = (AtlasStruct) obj;
+
+                for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+                    if (!isAssignableValue(structObj.getAttribute(attributeDef.getName()), attributeDef)) {
+                        return false;
+                    }
+                }
+            } else if (obj instanceof Map) {
+                Map map = (Map) obj;
+
+                for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+                    if (!isAssignableValue(map.get(attributeDef.getName()), attributeDef)) {
+                        return false; // no value for non-optinal attribute
+                    }
+                }
+            } else {
+                return false; // invalid type
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public Object getNormalizedValue(Object obj) {
+        Object ret = null;
+
+        if (obj != null) {
+            if (isValidValue(obj)) {
+                if (obj instanceof AtlasStruct) {
+                    normalizeAttributeValues((AtlasStruct) obj);
+                    ret = obj;
+                } else if (obj instanceof Map) {
+                    normalizeAttributeValues((Map) obj);
+                    ret = obj;
+                }
+            }
+        }
+
+        return ret;
+    }
+
+    @Override
+    public boolean validateValue(Object obj, String objName, List<String> messages) {
+        boolean ret = true;
+
+        if (obj != null) {
+            if (obj instanceof AtlasStruct) {
+                AtlasStruct structObj = (AtlasStruct) obj;
+
+                for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+                    String    attrName = attributeDef.getName();
+                    AtlasType dataType = attrTypes.get(attributeDef.getName());
+
+                    if (dataType != null) {
+                        Object value     = structObj.getAttribute(attrName);
+                        String fieldName = objName + "." + attrName;
+
+                        if (value != null) {
+                            ret = dataType.validateValue(value, fieldName, messages) && ret;
+                        } else if (!attributeDef.isOptional()) {
+                            ret = false;
+
+                            messages.add(fieldName + ": mandatory attribute value missing in type " + getTypeName());
+                        }
+                    }
+                }
+            } else if (obj instanceof Map) {
+                Map map = (Map) obj;
+
+                for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+                    String    attrName = attributeDef.getName();
+                    AtlasType dataType = attrTypes.get(attributeDef.getName());
+
+                    if (dataType != null) {
+                        Object value     = map.get(attrName);
+                        String fieldName = objName + "." + attrName;
+
+                        if (value != null) {
+                            ret = dataType.validateValue(value, fieldName, messages) && ret;
+                        } else if (!attributeDef.isOptional()) {
+                            ret = false;
+
+                            messages.add(fieldName + ": mandatory attribute value missing in type " + getTypeName());
+                        }
+                    }
+                }
+            } else {
+                ret = false;
+
+                messages.add(objName + "=" + obj + ": invalid value for type " + getTypeName());
+            }
+        }
+
+        return ret;
+    }
+
+    public void normalizeAttributeValues(AtlasStruct obj) {
+        if (obj != null) {
+            for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+                String attributeName = attributeDef.getName();
+
+                if (obj.hasAttribute(attributeName)) {
+                    Object attributeValue = getNormalizedValue(obj.getAttribute(attributeName), attributeDef);
+
+                    obj.setAttribute(attributeName, attributeValue);
+                } else if (!attributeDef.isOptional()) {
+                    obj.setAttribute(attributeName, createDefaultValue(attributeDef));
+                }
+            }
+        }
+    }
+
+    public void normalizeAttributeValues(Map<String, Object> obj) {
+        if (obj != null) {
+            for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+                String attributeName = attributeDef.getName();
+
+                if (obj.containsKey(attributeName)) {
+                    Object attributeValue = getNormalizedValue(obj.get(attributeName), attributeDef);
+
+                    obj.put(attributeName, attributeValue);
+                } else if (!attributeDef.isOptional()) {
+                    obj.put(attributeName, createDefaultValue(attributeDef));
+                }
+            }
+        }
+    }
+
+    public void populateDefaultValues(AtlasStruct obj) {
+        if (obj != null) {
+            Map<String, Object> attributes = obj.getAttributes();
+
+            if (attributes == null) {
+                attributes = new HashMap<String, Object>();
+            }
+
+            for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+                if (!attributeDef.isOptional()) {
+                    attributes.put(attributeDef.getName(), createDefaultValue(attributeDef));
+                }
+            }
+
+            obj.setAttributes(attributes);
+        }
+    }
+
+    private Object createDefaultValue(AtlasAttributeDef attributeDef) {
+        Object ret = null;
+
+        if (attributeDef != null) {
+            AtlasType dataType = attrTypes.get(attributeDef.getName());
+
+            if (dataType != null) {
+                ret = dataType.createDefaultValue();
+            }
+        }
+
+        return ret;
+    }
+
+    private boolean isAssignableValue(Object value, AtlasAttributeDef attributeDef) {
+        boolean ret = true;
+
+        if (value != null) {
+            AtlasType attrType = attrTypes.get(attributeDef.getName());
+
+            if (attrType != null) {
+                if (!attrType.isValidValue(value)) {
+                    ret = false; // invalid value
+                }
+            }
+        } else if (!attributeDef.isOptional()) {
+            ret = false; // mandatory attribute not present
+        }
+
+        return ret;
+    }
+
+    private Object getNormalizedValue(Object value, AtlasAttributeDef attributeDef) {
+        AtlasType attrType = attrTypes.get(attributeDef.getName());
+
+        if (attrType != null) {
+            if (value == null) {
+                if (!attributeDef.isOptional()) {
+                    return attrType.createDefaultValue();
+                }
+            } else {
+                return attrType.getNormalizedValue(value);
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasType.java b/intg/src/main/java/org/apache/atlas/type/AtlasType.java
new file mode 100644
index 0000000..a3f1b02
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasType.java
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+
+import java.util.List;
+
+
+/**
+ * base class that declares interface for all Atlas types.
+ */
+public abstract class AtlasType {
+
+    private static final Gson GSON =
+            new GsonBuilder().setDateFormat(AtlasBaseTypeDef.SERIALIZED_DATE_FORMAT_STR).create();
+
+    private final String typeName;
+
+    public AtlasType(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+
+    }
+
+    public String getTypeName() { return typeName; }
+
+    public abstract Object createDefaultValue();
+
+    public abstract boolean isValidValue(Object obj);
+
+    public abstract Object getNormalizedValue(Object obj);
+
+    public boolean validateValue(Object obj, String objName, List<String> messages) {
+        boolean ret = isValidValue(obj);
+
+        if (!ret) {
+            messages.add(objName + "=" + obj + ": invalid value for type " + getTypeName());
+        }
+
+        return ret;
+    }
+
+
+    public static String toJson(Object obj) {
+        return GSON.toJson(obj);
+    }
+
+    public static <T> T fromJson(String jsonStr, Class<T> type) {
+        return GSON.fromJson(jsonStr, type);
+    }
+}
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java b/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java
new file mode 100644
index 0000000..4b2e325
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasTypeRegistry.java
@@ -0,0 +1,442 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.typedef.*;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_ARRAY_PREFIX;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_ARRAY_SUFFIX;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_MAP_PREFIX;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_MAP_SUFFIX;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_MAP_KEY_VAL_SEP;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * registry for all types defined in Atlas.
+ */
+public class AtlasTypeRegistry {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasStructType.class);
+
+    private final Map<String, AtlasType>               allTypes;
+    private final TypeDefCache<AtlasEnumDef>           enumDefs;
+    private final TypeDefCache<AtlasStructDef>         structDefs;
+    private final TypeDefCache<AtlasClassificationDef> classificationDefs;
+    private final TypeDefCache<AtlasEntityDef>         entityDefs;
+
+
+    public AtlasTypeRegistry() {
+        allTypes           = new ConcurrentHashMap<String, AtlasType>();
+        enumDefs           = new TypeDefCache<AtlasEnumDef>(this);
+        structDefs         = new TypeDefCache<AtlasStructDef>(this);
+        classificationDefs = new TypeDefCache<AtlasClassificationDef>(this);
+        entityDefs         = new TypeDefCache<AtlasEntityDef>(this);
+
+        registerType(new AtlasBuiltInTypes.AtlasBooleanType());
+        registerType(new AtlasBuiltInTypes.AtlasByteType());
+        registerType(new AtlasBuiltInTypes.AtlasShortType());
+        registerType(new AtlasBuiltInTypes.AtlasIntType());
+        registerType(new AtlasBuiltInTypes.AtlasLongType());
+        registerType(new AtlasBuiltInTypes.AtlasFloatType());
+        registerType(new AtlasBuiltInTypes.AtlasDoubleType());
+        registerType(new AtlasBuiltInTypes.AtlasBigIntegerType());
+        registerType(new AtlasBuiltInTypes.AtlasBigDecimalType());
+        registerType(new AtlasBuiltInTypes.AtlasDateType());
+        registerType(new AtlasBuiltInTypes.AtlasStringType());
+        registerType(new AtlasBuiltInTypes.AtlasObjectIdType());
+    }
+
+    public void resolveReferences() throws AtlasBaseException {
+        for (Map.Entry<String, AtlasType> e : allTypes.entrySet()) {
+            e.getValue().resolveReferences(this);
+        }
+    }
+
+    public Collection<String> getAllTypeNames() { return Collections.unmodifiableSet(allTypes.keySet()); }
+
+    public AtlasType getType(String typeName) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.getType(" + typeName + ")");
+        }
+
+        AtlasType ret = allTypes.get(typeName);
+
+        if (ret == null) {
+            try {
+                if (typeName.startsWith(ATLAS_TYPE_ARRAY_PREFIX) && typeName.endsWith(ATLAS_TYPE_ARRAY_SUFFIX)) {
+                    int startIdx = ATLAS_TYPE_ARRAY_PREFIX.length();
+                    int endIdx = typeName.length() - ATLAS_TYPE_ARRAY_SUFFIX.length();
+                    String elementTypeName = typeName.substring(startIdx, endIdx);
+
+                    ret = new AtlasArrayType(elementTypeName, this);
+                } else if (typeName.startsWith(ATLAS_TYPE_MAP_PREFIX) && typeName.endsWith(ATLAS_TYPE_MAP_SUFFIX)) {
+                    int startIdx = ATLAS_TYPE_MAP_PREFIX.length();
+                    int endIdx = typeName.length() - ATLAS_TYPE_MAP_SUFFIX.length();
+                    String[] keyValueTypes = typeName.substring(startIdx, endIdx).split(ATLAS_TYPE_MAP_KEY_VAL_SEP, 2);
+                    String keyTypeName = keyValueTypes.length > 0 ? keyValueTypes[0] : null;
+                    String valueTypeName = keyValueTypes.length > 1 ? keyValueTypes[1] : null;
+
+                    ret = new AtlasMapType(keyTypeName, valueTypeName, this);
+                }
+            } catch(AtlasBaseException excp) {
+                LOG.warn("failed to instantiate type for " + typeName, excp);
+            }
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.getType(" + typeName + ")");
+        }
+
+        return ret;
+    }
+
+
+    public void addEnumDef(AtlasEnumDef enumDef) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.addEnumDef(" + enumDef + ")");
+        }
+
+        enumDefs.addType(enumDef, new AtlasEnumType(enumDef));
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.addEnumDef(" + enumDef + ")");
+        }
+    }
+
+    public Collection<AtlasEnumDef> getAllEnumDefs() { return enumDefs.getAll(); }
+
+    public AtlasEnumDef getEnumDefByGuid(String guid) {
+        return enumDefs.getTypeDefByGuid(guid);
+    }
+
+    public AtlasEnumDef getEnumDefByName(String name) {
+        return enumDefs.getTypeDefByName(name);
+    }
+
+    public void removeEnumDefByGuid(String guid) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeEnumDefByGuid(" + guid + ")");
+        }
+
+        AtlasEnumDef enumDef = enumDefs.getTypeDefByGuid(guid);
+
+        if (enumDef != null) {
+            enumDefs.removeTypeDefByGuid(guid);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeEnumDefByGuid(" + guid + ")");
+        }
+    }
+
+    public void removeEnumDefByName(String name) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeEnumDefByName(" + name + ")");
+        }
+
+        AtlasEnumDef enumDef = enumDefs.getTypeDefByName(name);
+
+        if (enumDef != null) {
+            enumDefs.removeTypeDefByName(name);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeEnumDefByName(" + name + ")");
+        }
+    }
+
+
+    public void addStructDefWithNoRefResolve(AtlasStructDef structDef) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.addStructDefWithNoRefResolve(" + structDef + ")");
+        }
+
+        structDefs.addType(structDef, new AtlasStructType(structDef));
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.addStructDefWithNoRefResolve(" + structDef + ")");
+        }
+    }
+
+    public void addStructDef(AtlasStructDef structDef) throws AtlasBaseException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.addStructDef(" + structDef + ")");
+        }
+
+        structDefs.addType(structDef, new AtlasStructType(structDef, this));
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.addStructDef(" + structDef + ")");
+        }
+    }
+
+    public Collection<AtlasStructDef> getAllStructDefs() { return structDefs.getAll(); }
+
+    public AtlasStructDef getStructDefByGuid(String guid) {
+        return structDefs.getTypeDefByGuid(guid);
+    }
+
+    public AtlasStructDef getStructDefByName(String name) { return structDefs.getTypeDefByName(name); }
+
+    public void removeStructDefByGuid(String guid) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeStructDefByGuid(" + guid + ")");
+        }
+
+        AtlasStructDef structDef = structDefs.getTypeDefByGuid(guid);
+
+        if (structDef != null) {
+            structDefs.removeTypeDefByGuid(guid);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeStructDefByGuid(" + guid + ")");
+        }
+    }
+
+    public void removeStructDefByName(String name) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeStructDefByName(" + name + ")");
+        }
+
+        AtlasStructDef structDef = structDefs.getTypeDefByName(name);
+
+        if (structDef != null) {
+            structDefs.removeTypeDefByName(name);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeStructDefByName(" + name + ")");
+        }
+    }
+
+
+    public void addClassificationDefWithNoRefResolve(AtlasClassificationDef classificationDef) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.addClassificationDefWithNoRefResolve(" + classificationDef + ")");
+        }
+
+        classificationDefs.addType(classificationDef, new AtlasClassificationType(classificationDef));
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.addClassificationDefWithNoRefResolve(" + classificationDef + ")");
+        }
+    }
+
+    public void addClassificationDef(AtlasClassificationDef classificationDef)
+        throws AtlasBaseException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.addClassificationDef(" + classificationDef + ")");
+        }
+
+        classificationDefs.addType(classificationDef, new AtlasClassificationType(classificationDef, this));
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.addClassificationDef(" + classificationDef + ")");
+        }
+    }
+
+    public Collection<AtlasClassificationDef> getAllClassificationDefs() { return classificationDefs.getAll(); }
+
+    public AtlasClassificationDef getClassificationDefByGuid(String guid) {
+        return classificationDefs.getTypeDefByGuid(guid);
+    }
+
+    public AtlasClassificationDef getClassificationDefByName(String name) {
+        return classificationDefs.getTypeDefByName(name);
+    }
+
+    public void removeClassificationDefByGuid(String guid) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeClassificationDefByGuid(" + guid + ")");
+        }
+
+        AtlasClassificationDef classificationDef = classificationDefs.getTypeDefByGuid(guid);
+
+        if (classificationDef != null) {
+            classificationDefs.removeTypeDefByGuid(guid);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeClassificationDefByGuid(" + guid + ")");
+        }
+    }
+
+    public void removeClassificationDefByName(String name) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeClassificationDefByName(" + name + ")");
+        }
+
+        AtlasClassificationDef classificationDef = classificationDefs.getTypeDefByName(name);
+
+        if (classificationDef != null) {
+            classificationDefs.removeTypeDefByName(name);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeClassificationDefByName(" + name + ")");
+        }
+    }
+
+
+    public void addEntityDefWithNoRefResolve(AtlasEntityDef entityDef) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.addEntityDefWithNoRefResolve(" + entityDef + ")");
+        }
+
+        entityDefs.addType(entityDef, new AtlasEntityType(entityDef));
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.addEntityDefWithNoRefResolve(" + entityDef + ")");
+        }
+    }
+
+    public void addEntityDef(AtlasEntityDef entityDef) throws AtlasBaseException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.addEntityDef(" + entityDef + ")");
+        }
+
+        entityDefs.addType(entityDef, new AtlasEntityType(entityDef, this));
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.addEntityDef(" + entityDef + ")");
+        }
+    }
+
+    public Collection<AtlasEntityDef> getAllEntityDefs() { return entityDefs.getAll(); }
+
+    public AtlasEntityDef getEntityDefByGuid(String guid) {
+        return entityDefs.getTypeDefByGuid(guid);
+    }
+
+    public AtlasEntityDef getEntityDefByName(String name) {
+        return entityDefs.getTypeDefByName(name);
+    }
+
+    public void removeEntityDefByGuid(String guid) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeEntityDefByGuid(" + guid + ")");
+        }
+
+        AtlasEntityDef entityDef = entityDefs.getTypeDefByGuid(guid);
+
+        if (entityDef != null) {
+            entityDefs.removeTypeDefByGuid(guid);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeEntityDefByGuid(" + guid + ")");
+        }
+    }
+
+    public void removeEntityDefByName(String name) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AtlasTypeRegistry.removeEntityDefByName(" + name + ")");
+        }
+
+        AtlasEntityDef entityDef = entityDefs.getTypeDefByName(name);
+
+        if (entityDef != null) {
+            entityDefs.removeTypeDefByName(name);
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AtlasTypeRegistry.removeEntityDefByName(" + name + ")");
+        }
+    }
+
+    private void registerType(AtlasType dataType) {
+        allTypes.put(dataType.getTypeName(), dataType);
+    }
+
+    private void unregisterType(AtlasType dataType) {
+        allTypes.remove(dataType.getTypeName());
+    }
+
+    private void unregisterTypeByName(String typeName) {
+        allTypes.remove(typeName);
+    }
+
+    class TypeDefCache<T extends AtlasBaseTypeDef> {
+        private final AtlasTypeRegistry typeRegistry;
+        private final Map<String, T>    typeDefGuidMap = new ConcurrentHashMap<String, T>();
+        private final Map<String, T>    typeDefNameMap = new ConcurrentHashMap<String, T>();
+
+        public TypeDefCache(AtlasTypeRegistry typeRegistry) {
+            this.typeRegistry = typeRegistry;
+        }
+
+        public void addType(T typeDef, AtlasType type) {
+            if (type != null) {
+                if (StringUtils.isNotEmpty(typeDef.getGuid())) {
+                    typeDefGuidMap.put(typeDef.getGuid(), typeDef);
+                }
+
+                if (StringUtils.isNotEmpty(typeDef.getName())) {
+                    typeDefNameMap.put(typeDef.getName(), typeDef);
+                }
+
+                typeRegistry.registerType(type);
+            }
+        }
+
+        public Collection<T> getAll() {
+            return Collections.unmodifiableCollection(typeDefNameMap.values());
+        }
+
+        public T getTypeDefByGuid(String guid) {
+            T ret = guid != null ? typeDefGuidMap.get(guid) : null;
+
+            return ret;
+        }
+
+        public T getTypeDefByName(String name) {
+            T ret = name != null ? typeDefNameMap.get(name) : null;
+
+            return ret;
+        }
+
+        public void removeTypeDefByGuid(String guid) {
+            T typeDef = guid != null ? typeDefGuidMap.remove(guid) : null;
+
+            if (typeDef != null) {
+                if (StringUtils.isNotEmpty(typeDef.getName())) {
+                    typeDefNameMap.remove(typeDef.getName());
+                    typeRegistry.unregisterTypeByName(typeDef.getName());
+                }
+            }
+        }
+
+        public void removeTypeDefByName(String name) {
+            T typeDef = name != null ? typeDefNameMap.get(name) : null;
+
+            if (typeDef != null) {
+                if (StringUtils.isNotEmpty(typeDef.getGuid())) {
+                    typeDefGuidMap.remove(typeDef.getGuid());
+                    typeRegistry.unregisterTypeByName(typeDef.getName());
+                }
+            }
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java b/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java
new file mode 100644
index 0000000..fcd22f8
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/model/ModelTestUtil.java
@@ -0,0 +1,411 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasStruct;
+
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_BUILTIN_TYPES;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_PRIMITIVE_TYPES;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.apache.atlas.model.typedef.AtlasEnumDef;
+import org.apache.atlas.model.typedef.AtlasStructDef;
+import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
+import org.apache.atlas.model.typedef.AtlasClassificationDef;
+import org.apache.atlas.type.AtlasType;
+import org.apache.atlas.type.AtlasClassificationType;
+import org.apache.atlas.type.AtlasEntityType;
+import org.apache.atlas.type.AtlasStructType;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public final class  ModelTestUtil {
+    private static final Logger LOG = LoggerFactory.getLogger(ModelTestUtil.class);
+
+    private static final String PREFIX_ENUM_DEF           = "testEnumDef-";
+    private static final String PREFIX_STRUCT_DEF         = "testStructDef-";
+    private static final String PREFIX_ENTITY_DEF         = "testEntityDef-";
+    private static final String PREFIX_CLASSIFICATION_DEF = "testClassificationDef-";
+    private static final String PREFIX_ATTRIBUTE_NAME     = "attr-";
+    private static final String PREFIX_STRUCT             = "testStruct-";
+    private static final String PREFIX_ENTITY             = "testEntity-";
+    private static final String PREFIX_CLASSIFICATION     = "testClassification-";
+    private static final int    MAX_ENUM_ELEMENT_COUNT    = 30;
+
+    private static final AtomicInteger IDX_ENUM_DEF           = new AtomicInteger();
+    private static final AtomicInteger IDX_ENTITY_DEF         = new AtomicInteger();
+    private static final AtomicInteger IDX_CLASSIFICATION_DEF = new AtomicInteger();
+    private static final AtomicInteger IDX_STRUCT_DEF         = new AtomicInteger();
+    private static final AtomicInteger IDX_CLASSIFICATION     = new AtomicInteger();
+    private static final AtomicInteger IDX_ENTITY             = new AtomicInteger();
+    private static final AtomicInteger IDX_STRUCT             = new AtomicInteger();
+
+    private static final AtlasTypeRegistry      TYPE_REGISTRY;
+    private static final AtlasEnumDef           ENUM_DEF;
+    private static final AtlasEnumDef           ENUM_DEF_WITH_NO_DEFAULT;
+    private static final AtlasStructDef         STRUCT_DEF;
+    private static final AtlasEntityDef         ENTITY_DEF;
+    private static final AtlasEntityDef         ENTITY_DEF_WITH_SUPER_TYPE;
+    private static final AtlasEntityDef         ENTITY_DEF_WITH_SUPER_TYPES;
+    private static final AtlasClassificationDef CLASSIFICATION_DEF;
+    private static final AtlasClassificationDef CLASSIFICATION_DEF_WITH_SUPER_TYPE;
+    private static final AtlasClassificationDef CLASSIFICATION_DEF_WITH_SUPER_TYPES;
+
+    static {
+        TYPE_REGISTRY = new AtlasTypeRegistry();
+
+        ENUM_DEF                 = newEnumDef(true);
+        ENUM_DEF_WITH_NO_DEFAULT = newEnumDef(false);
+
+        STRUCT_DEF = newStructDef();
+
+        ENTITY_DEF                  = newEntityDef();
+        ENTITY_DEF_WITH_SUPER_TYPE  = newEntityDef(new AtlasEntityDef[] { ENTITY_DEF });
+        ENTITY_DEF_WITH_SUPER_TYPES = newEntityDef(new AtlasEntityDef[] { ENTITY_DEF, ENTITY_DEF_WITH_SUPER_TYPE });
+
+        CLASSIFICATION_DEF                  = newClassificationDef();
+        CLASSIFICATION_DEF_WITH_SUPER_TYPE  = newClassificationDef(new AtlasClassificationDef[] { CLASSIFICATION_DEF });
+        CLASSIFICATION_DEF_WITH_SUPER_TYPES = newClassificationDef(
+                               new AtlasClassificationDef[] { CLASSIFICATION_DEF, CLASSIFICATION_DEF_WITH_SUPER_TYPE });
+    }
+
+    private ModelTestUtil() {
+
+    }
+
+    public static AtlasTypeRegistry getTypesRegistry() { return TYPE_REGISTRY; }
+
+    public static AtlasEnumDef getEnumDef() { return ENUM_DEF; }
+
+    public static AtlasEnumDef getEnumDefWithNoDefault() { return ENUM_DEF_WITH_NO_DEFAULT; }
+
+    public static AtlasStructDef getStructDef() { return STRUCT_DEF; }
+
+    public static AtlasEntityDef getEntityDef() { return ENTITY_DEF; }
+
+    public static AtlasEntityDef getEntityDefWithSuperType() { return ENTITY_DEF_WITH_SUPER_TYPE; }
+
+    public static AtlasEntityDef getEntityDefWithSuperTypes() { return ENTITY_DEF_WITH_SUPER_TYPES; }
+
+    public static AtlasClassificationDef getClassificationDef() { return CLASSIFICATION_DEF; }
+
+    public static AtlasClassificationDef getClassificationDefWithSuperType() {
+        return CLASSIFICATION_DEF_WITH_SUPER_TYPE;
+    }
+
+    public static AtlasClassificationDef getClassificationDefWithSuperTypes() {
+        return CLASSIFICATION_DEF_WITH_SUPER_TYPES;
+    }
+
+
+    public static AtlasEnumDef newEnumDef() {
+        return newEnumDef(getTypesRegistry(), true);
+    }
+
+    public static AtlasEnumDef newEnumDef(boolean hasDefaultValue) {
+        return newEnumDef(getTypesRegistry(), hasDefaultValue);
+    }
+
+    public static AtlasEnumDef newEnumDef(AtlasTypeRegistry typesRegistry) {
+        return newEnumDef(getTypesRegistry(), true);
+    }
+
+    public static AtlasEnumDef newEnumDef(AtlasTypeRegistry typesRegistry, boolean hasDefaultValue) {
+        int enumDefIdx = IDX_ENUM_DEF.getAndIncrement();
+
+        AtlasEnumDef ret = new AtlasEnumDef();
+
+        ret.setName(PREFIX_ENUM_DEF + enumDefIdx);
+        ret.setDescription(ret.getName());
+
+        int numElements = ThreadLocalRandom.current().nextInt(1, MAX_ENUM_ELEMENT_COUNT);
+
+        for (int i = 0; i < numElements; i++) {
+            String elementName = "element-" + i;
+            ret.addElement(new AtlasEnumElementDef(elementName, elementName.toUpperCase(), i));
+        }
+
+        if (hasDefaultValue) {
+            int idxDefault = ThreadLocalRandom.current().nextInt(0, numElements);
+
+            ret.setDefaultValue(ret.getElementDefs().get(idxDefault).getValue());
+        }
+
+        typesRegistry.addEnumDef(ret);
+
+        return ret;
+    }
+
+    public static AtlasStructDef newStructDef() {
+        return newStructDef(getTypesRegistry());
+    }
+
+    public static AtlasStructDef newStructDef(AtlasTypeRegistry typesRegistry) {
+        int structDefIdx = IDX_STRUCT_DEF.getAndIncrement();
+
+        AtlasStructDef ret = new AtlasStructDef();
+
+        ret.setName(PREFIX_STRUCT_DEF + structDefIdx);
+        ret.setDescription(ret.getName());
+        ret.setAttributeDefs(newAttributeDefsWithAllBuiltInTypes(PREFIX_ATTRIBUTE_NAME));
+
+        try {
+            typesRegistry.addStructDef(ret);
+        } catch (AtlasBaseException excp) {
+            LOG.error("failed to create struct-def", excp);
+
+            ret = null;
+        }
+
+        return ret;
+    }
+
+    public static AtlasEntityDef newEntityDef() {
+        return newEntityDef(getTypesRegistry(), null);
+    }
+
+    public static AtlasEntityDef newEntityDef(AtlasEntityDef[] superTypes) {
+        return newEntityDef(getTypesRegistry(), superTypes);
+    }
+
+    public static AtlasEntityDef newEntityDef(AtlasTypeRegistry typesRegistry) {
+        return newEntityDef(getTypesRegistry(), null);
+    }
+
+    public static AtlasEntityDef newEntityDef(AtlasTypeRegistry typesRegistry, AtlasEntityDef[] superTypes) {
+        int entDefIdx = IDX_ENTITY_DEF.getAndIncrement();
+
+        AtlasEntityDef ret = new AtlasEntityDef();
+
+        ret.setName(PREFIX_ENTITY_DEF + entDefIdx);
+        ret.setDescription(ret.getName());
+        ret.setAttributeDefs(newAttributeDefsWithAllBuiltInTypes(PREFIX_ATTRIBUTE_NAME));
+
+        if (superTypes != null) {
+            for (AtlasEntityDef superType : superTypes) {
+                ret.addSuperType(superType.getName());
+            }
+        }
+
+        try {
+            typesRegistry.addEntityDef(ret);
+        } catch (AtlasBaseException excp) {
+            LOG.error("failed to create entity-def", excp);
+
+            ret = null;
+        }
+
+        return ret;
+    }
+
+    public static AtlasEntityDef newEntityDefWithSuperTypes() {
+        return newEntityDefWithSuperTypes(getTypesRegistry());
+    }
+
+    public static AtlasEntityDef newEntityDefWithSuperTypes(AtlasTypeRegistry typesRegistry) {
+        return newEntityDef(typesRegistry, new AtlasEntityDef[] { ENTITY_DEF, ENTITY_DEF_WITH_SUPER_TYPE });
+    }
+
+    public static AtlasClassificationDef newClassificationDef() {
+        return newClassificationDef(getTypesRegistry(), null);
+    }
+
+    public static AtlasClassificationDef newClassificationDef(AtlasClassificationDef[] superTypes) {
+        return newClassificationDef(getTypesRegistry(), superTypes);
+    }
+
+    public static AtlasClassificationDef newClassificationDef(AtlasTypeRegistry typesRegistry) {
+        return newClassificationDef(typesRegistry, null);
+    }
+
+    public static AtlasClassificationDef newClassificationDef(AtlasTypeRegistry typesRegistry,
+                                                              AtlasClassificationDef[] superTypes) {
+        int classificationDefIdx = IDX_CLASSIFICATION_DEF.getAndIncrement();
+
+        AtlasClassificationDef ret = new AtlasClassificationDef();
+
+        ret.setName(PREFIX_CLASSIFICATION_DEF + classificationDefIdx);
+        ret.setDescription(ret.getName());
+        ret.setAttributeDefs(newAttributeDefsWithAllBuiltInTypes(PREFIX_ATTRIBUTE_NAME));
+
+        if (superTypes != null) {
+            for (AtlasClassificationDef superType : superTypes) {
+                ret.addSuperType(superType.getName());
+            }
+        }
+
+        try {
+            typesRegistry.addClassificationDef(ret);
+        } catch (AtlasBaseException excp) {
+            LOG.error("failed to create classification-def", excp);
+
+            ret = null;
+        }
+
+        return ret;
+    }
+
+
+    public static AtlasEntity newEntity(AtlasEntityDef entityDef) {
+        return newEntity(entityDef, getTypesRegistry());
+    }
+
+    public static AtlasEntity newEntity(AtlasEntityDef entityDef, AtlasTypeRegistry typesRegistry) {
+        AtlasEntity ret = null;
+
+        AtlasType dataType = typesRegistry.getType(entityDef.getName());
+
+        if (dataType != null && dataType instanceof AtlasEntityType) {
+            ret = ((AtlasEntityType)dataType).createDefaultValue();
+        }
+
+        return ret;
+    }
+
+    public static AtlasStruct newStruct(AtlasStructDef structDef) {
+        return newStruct(structDef, getTypesRegistry());
+    }
+
+    public static AtlasStruct newStruct(AtlasStructDef structDef, AtlasTypeRegistry typesRegistry) {
+        AtlasStruct ret = null;
+
+        AtlasType dataType = typesRegistry.getType(structDef.getName());
+
+        if (dataType != null && dataType instanceof AtlasStructType) {
+            ret = ((AtlasStructType)dataType).createDefaultValue();
+        }
+
+        return ret;
+    }
+
+    public static AtlasClassification newClassification(AtlasClassificationDef classificationDef) {
+        return newClassification(classificationDef, getTypesRegistry());
+    }
+
+    public static AtlasClassification newClassification(AtlasClassificationDef classificationDef,
+                                                        AtlasTypeRegistry typesRegistry) {
+        AtlasClassification ret = null;
+
+        AtlasType dataType = typesRegistry.getType(classificationDef.getName());
+
+        if (dataType != null && dataType instanceof AtlasClassificationType) {
+            ret = ((AtlasClassificationType)dataType).createDefaultValue();
+        }
+
+        return ret;
+    }
+
+    public static List<AtlasAttributeDef> newAttributeDefsWithAllBuiltInTypes(String attrNamePrefix) {
+        List<AtlasAttributeDef> ret = new ArrayList<AtlasAttributeDef>();
+
+        // add all built-in types
+        for (int i = 0; i < ATLAS_BUILTIN_TYPES.length; i++) {
+            ret.add(getAttributeDef(attrNamePrefix, ATLAS_BUILTIN_TYPES[i]));
+        }
+        // add enum types
+        ret.add(getAttributeDef(attrNamePrefix, ENUM_DEF.getName()));
+        ret.add(getAttributeDef(attrNamePrefix, ENUM_DEF_WITH_NO_DEFAULT.getName()));
+
+        // add array of built-in types
+        for (int i = 0; i < ATLAS_BUILTIN_TYPES.length; i++) {
+            ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(ATLAS_BUILTIN_TYPES[i])));
+        }
+        // add array of enum types
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(ENUM_DEF.getName())));
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(ENUM_DEF_WITH_NO_DEFAULT.getName())));
+
+        // add few map types
+        for (int i = 0; i < ATLAS_PRIMITIVE_TYPES.length; i++) {
+            ret.add(getAttributeDef(attrNamePrefix,
+                    AtlasBaseTypeDef.getMapTypeName(ATLAS_PRIMITIVE_TYPES[i], getRandomBuiltInType())));
+        }
+        // add map types with enum as key
+        ret.add(getAttributeDef(attrNamePrefix,
+                                AtlasBaseTypeDef.getMapTypeName(ENUM_DEF.getName(), getRandomBuiltInType())));
+        ret.add(getAttributeDef(attrNamePrefix,
+                AtlasBaseTypeDef.getMapTypeName(ENUM_DEF_WITH_NO_DEFAULT.getName(), getRandomBuiltInType())));
+        // add map types with enum as value
+        ret.add(getAttributeDef(attrNamePrefix,
+                AtlasBaseTypeDef.getMapTypeName(getRandomPrimitiveType(), ENUM_DEF.getName())));
+        ret.add(getAttributeDef(attrNamePrefix,
+                AtlasBaseTypeDef.getMapTypeName(getRandomPrimitiveType(), ENUM_DEF_WITH_NO_DEFAULT.getName())));
+
+        // add few array of arrays
+        for (int i = 0; i < ATLAS_BUILTIN_TYPES.length; i++) {
+            ret.add(getAttributeDef(attrNamePrefix,
+                    AtlasBaseTypeDef.getArrayTypeName(AtlasBaseTypeDef.getArrayTypeName(getRandomBuiltInType()))));
+        }
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(ENUM_DEF.getName())));
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(ENUM_DEF_WITH_NO_DEFAULT.getName())));
+
+        // add few array of maps
+        for (int i = 0; i < ATLAS_PRIMITIVE_TYPES.length; i++) {
+            ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(
+                    AtlasBaseTypeDef.getMapTypeName(ATLAS_PRIMITIVE_TYPES[i], getRandomBuiltInType()))));
+        }
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(
+                AtlasBaseTypeDef.getMapTypeName(ENUM_DEF.getName(), getRandomBuiltInType()))));
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(
+                AtlasBaseTypeDef.getMapTypeName(ENUM_DEF_WITH_NO_DEFAULT.getName(), getRandomBuiltInType()))));
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(
+                AtlasBaseTypeDef.getMapTypeName(getRandomPrimitiveType(), ENUM_DEF.getName()))));
+        ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getArrayTypeName(
+                AtlasBaseTypeDef.getMapTypeName(getRandomPrimitiveType(), ENUM_DEF_WITH_NO_DEFAULT.getName()))));
+
+        // add few map of arrays
+        for (int i = 0; i < ATLAS_PRIMITIVE_TYPES.length; i++) {
+            ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getMapTypeName(ATLAS_PRIMITIVE_TYPES[i],
+                                    AtlasBaseTypeDef.getArrayTypeName(getRandomBuiltInType()))));
+        }
+
+        // add few map of maps
+        for (int i = 0; i < ATLAS_PRIMITIVE_TYPES.length; i++) {
+            ret.add(getAttributeDef(attrNamePrefix, AtlasBaseTypeDef.getMapTypeName(ATLAS_PRIMITIVE_TYPES[i],
+                                   AtlasBaseTypeDef.getMapTypeName(ATLAS_PRIMITIVE_TYPES[i], getRandomBuiltInType()))));
+        }
+
+        return ret;
+    }
+
+    public static String getDefaultAttributeName(String attrType) {
+        return PREFIX_ATTRIBUTE_NAME + attrType;
+    }
+
+    private static AtlasAttributeDef getAttributeDef(String attrNamePrefix, String attrType) {
+        return new AtlasAttributeDef(attrNamePrefix + attrType, attrType);
+    }
+
+    private static String getRandomPrimitiveType() {
+        return ATLAS_PRIMITIVE_TYPES[ThreadLocalRandom.current().nextInt(0, ATLAS_PRIMITIVE_TYPES.length)];
+    }
+
+    private static String getRandomBuiltInType() {
+        return ATLAS_BUILTIN_TYPES[ThreadLocalRandom.current().nextInt(0, ATLAS_BUILTIN_TYPES.length)];
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java
new file mode 100644
index 0000000..577dccf
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasClassification.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.instance;
+
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.typedef.AtlasClassificationDef;
+import org.apache.atlas.type.AtlasType;
+import org.apache.atlas.type.AtlasClassificationType;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+
+public class TestAtlasClassification {
+
+    @Test
+    public void testClassificationSerDe() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDef();
+        AtlasTypeRegistry      typeRegistry      = ModelTestUtil.getTypesRegistry();
+        AtlasType              dataType          = typeRegistry.getType(classificationDef.getName());
+
+        assertTrue(dataType instanceof  AtlasClassificationType);
+
+        AtlasClassification ent1 = ModelTestUtil.newClassification(classificationDef, typeRegistry);
+
+        String jsonString = AtlasType.toJson(ent1);
+
+        AtlasClassification ent2 = AtlasType.fromJson(jsonString, AtlasClassification.class);
+
+        ((AtlasClassificationType)dataType).normalizeAttributeValues(ent2);
+
+        assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasClassification");
+    }
+
+    @Test
+    public void testClassificationSerDeWithSuperType() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDefWithSuperType();
+        AtlasTypeRegistry      typeRegistry      = ModelTestUtil.getTypesRegistry();
+        AtlasType              dataType          = typeRegistry.getType(classificationDef.getName());
+
+        assertTrue(dataType instanceof AtlasClassificationType);
+
+        AtlasClassification ent1 =  ((AtlasClassificationType)dataType).createDefaultValue();
+
+        String jsonString = AtlasType.toJson(ent1);
+
+        AtlasClassification ent2 = AtlasType.fromJson(jsonString, AtlasClassification.class);
+
+        ((AtlasClassificationType)dataType).normalizeAttributeValues(ent2);
+
+        assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasClassification with superType");
+    }
+
+    @Test
+    public void testClassificationSerDeWithSuperTypes() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDefWithSuperTypes();
+        AtlasTypeRegistry      typeRegistry      = ModelTestUtil.getTypesRegistry();
+        AtlasType              dataType          = typeRegistry.getType(classificationDef.getName());
+
+        assertTrue(dataType instanceof  AtlasClassificationType);
+
+        AtlasClassification ent1 =  ((AtlasClassificationType)dataType).createDefaultValue();
+
+        String jsonString = AtlasType.toJson(ent1);
+
+        AtlasClassification ent2 = AtlasType.fromJson(jsonString, AtlasClassification.class);
+
+        ((AtlasClassificationType)dataType).normalizeAttributeValues(ent2);
+
+        assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasClassification with superTypes");
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java
new file mode 100644
index 0000000..fbf1cc7
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/model/instance/TestAtlasEntity.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.instance;
+
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.apache.atlas.type.AtlasType;
+import org.apache.atlas.type.AtlasEntityType;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+
+public class TestAtlasEntity {
+
+    @Test
+    public void testEntitySerDe() {
+        AtlasEntityDef    entityDef    = ModelTestUtil.getEntityDef();
+        AtlasTypeRegistry typeRegistry = ModelTestUtil.getTypesRegistry();
+        AtlasType         dataType     = typeRegistry.getType(entityDef.getName());
+
+        assertTrue(dataType instanceof  AtlasEntityType);
+
+        AtlasEntity ent1 =  ((AtlasEntityType)dataType).createDefaultValue();
+
+        String jsonString = AtlasType.toJson(ent1);
+
+        AtlasEntity ent2 = AtlasType.fromJson(jsonString, AtlasEntity.class);
+
+        ((AtlasEntityType)dataType).normalizeAttributeValues(ent2);
+
+        assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasEntity");
+    }
+
+    @Test
+    public void testEntitySerDeWithSuperType() {
+        AtlasEntityDef    entityDef    = ModelTestUtil.getEntityDefWithSuperType();
+        AtlasTypeRegistry typeRegistry = ModelTestUtil.getTypesRegistry();
+        AtlasType         dataType     = typeRegistry.getType(entityDef.getName());
+
+        assertTrue(dataType instanceof  AtlasEntityType);
+
+        AtlasEntity ent1 =  ((AtlasEntityType)dataType).createDefaultValue();
+
+        String jsonString = AtlasType.toJson(ent1);
+
+        AtlasEntity ent2 = AtlasType.fromJson(jsonString, AtlasEntity.class);
+
+        ((AtlasEntityType)dataType).normalizeAttributeValues(ent2);
+
+        assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasEntity with superType");
+    }
+
+    @Test
+    public void testEntitySerDeWithSuperTypes() {
+        AtlasEntityDef    entityDef    = ModelTestUtil.getEntityDefWithSuperTypes();
+        AtlasTypeRegistry typeRegistry = ModelTestUtil.getTypesRegistry();
+        AtlasType         dataType     = typeRegistry.getType(entityDef.getName());
+
+        assertTrue(dataType instanceof  AtlasEntityType);
+
+        AtlasEntity ent1 =  ((AtlasEntityType)dataType).createDefaultValue();
+
+        String jsonString = AtlasType.toJson(ent1);
+
+        AtlasEntity ent2 = AtlasType.fromJson(jsonString, AtlasEntity.class);
+
+        ((AtlasEntityType)dataType).normalizeAttributeValues(ent2);
+
+        assertEquals(ent2, ent1, "Incorrect serialization/deserialization of AtlasEntity with superTypes");
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasClassificationDef.java b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasClassificationDef.java
new file mode 100644
index 0000000..a1abc6e
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasClassificationDef.java
@@ -0,0 +1,100 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.type.AtlasType;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertFalse;
+
+
+public class TestAtlasClassificationDef {
+
+    @Test
+    public void testClassificationDefSerDeEmpty() {
+        AtlasClassificationDef classificationDef = new AtlasClassificationDef("emptyClassificationDef");
+
+        String jsonString = AtlasType.toJson(classificationDef);
+
+        AtlasClassificationDef classificationDef2 = AtlasType.fromJson(jsonString, AtlasClassificationDef.class);
+
+        assertEquals(classificationDef2, classificationDef,
+                     "Incorrect serialization/deserialization of AtlasClassificationDef");
+    }
+
+    @Test
+    public void testClassificationDefSerDe() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDef();
+
+        String jsonString = AtlasType.toJson(classificationDef);
+
+        AtlasClassificationDef classificationDef2 = AtlasType.fromJson(jsonString, AtlasClassificationDef.class);
+
+        assertEquals(classificationDef2, classificationDef,
+                     "Incorrect serialization/deserialization of AtlasClassificationDef");
+    }
+
+    @Test
+    public void testClassificationDefSerDeWithSuperType() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDefWithSuperType();
+
+        String jsonString = AtlasType.toJson(classificationDef);
+
+        AtlasClassificationDef classificationDef2 = AtlasType.fromJson(jsonString, AtlasClassificationDef.class);
+
+        assertEquals(classificationDef2, classificationDef,
+                     "Incorrect serialization/deserialization of AtlasClassificationDef with superType");
+    }
+
+    @Test
+    public void testClassificationDefSerDeWithSuperTypes() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDefWithSuperTypes();
+
+        String jsonString = AtlasType.toJson(classificationDef);
+
+        AtlasClassificationDef classificationDef2 = AtlasType.fromJson(jsonString, AtlasClassificationDef.class);
+
+        assertEquals(classificationDef2, classificationDef,
+                     "Incorrect serialization/deserialization of AtlasClassificationDef with superTypes");
+    }
+
+    @Test
+    public void testClassificationDefHasSuperTypeWithNoSuperType() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDef();
+
+        for (String superType : classificationDef.getSuperTypes()) {
+            assertTrue(classificationDef.hasSuperType(superType));
+        }
+
+        assertFalse(classificationDef.hasSuperType("01234-xyzabc-;''-)("));
+    }
+
+    @Test
+    public void testClassificationDefHasSuperTypeWithSuperType() {
+        AtlasClassificationDef classificationDef = ModelTestUtil.getClassificationDefWithSuperTypes();
+
+        for (String superType : classificationDef.getSuperTypes()) {
+            assertTrue(classificationDef.hasSuperType(superType));
+        }
+
+        assertFalse(classificationDef.hasSuperType("01234-xyzabc-;''-)("));
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEntityDef.java b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEntityDef.java
new file mode 100644
index 0000000..f3b12ef
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEntityDef.java
@@ -0,0 +1,140 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.type.AtlasType;
+import org.testng.annotations.Test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertFalse;
+
+
+public class TestAtlasEntityDef {
+
+    @Test
+    public void testEntityDefSerDeEmpty() {
+        AtlasEntityDef entityDef = new AtlasEntityDef("emptyEntityDef");
+
+        String jsonString = AtlasType.toJson(entityDef);
+
+        AtlasEntityDef entityDef2 = AtlasType.fromJson(jsonString, AtlasEntityDef.class);
+
+        assertEquals(entityDef2, entityDef, "Incorrect serialization/deserialization of AtlasEntityDef");
+    }
+
+    @Test
+    public void testEntityDefSerDe() {
+        AtlasEntityDef entityDef = ModelTestUtil.getEntityDef();
+
+        String jsonString = AtlasType.toJson(entityDef);
+
+        AtlasEntityDef entityDef2 = AtlasType.fromJson(jsonString, AtlasEntityDef.class);
+
+        assertEquals(entityDef2, entityDef, "Incorrect serialization/deserialization of AtlasEntityDef");
+    }
+
+    @Test
+    public void testEntityDefSerDeWithSuperType() {
+        AtlasEntityDef entityDef = ModelTestUtil.getEntityDefWithSuperType();
+
+        String jsonString = AtlasType.toJson(entityDef);
+
+        AtlasEntityDef entityDef2 = AtlasType.fromJson(jsonString, AtlasEntityDef.class);
+
+        assertEquals(entityDef2, entityDef, "Incorrect serialization/deserialization of AtlasEntityDef with superType");
+    }
+
+    @Test
+    public void testEntityDefSerDeWithSuperTypes() {
+        AtlasEntityDef entityDef = ModelTestUtil.getEntityDefWithSuperTypes();
+
+        String jsonString = AtlasType.toJson(entityDef);
+
+        AtlasEntityDef entityDef2 = AtlasType.fromJson(jsonString, AtlasEntityDef.class);
+
+        assertEquals(entityDef2, entityDef,
+                     "Incorrect serialization/deserialization of AtlasEntityDef with superTypes");
+    }
+
+    @Test
+    public void testEntityDefAddSuperType() {
+        AtlasEntityDef entityDef = ModelTestUtil.newEntityDef();
+
+        String newSuperType = "newType-abcd-1234";
+        entityDef.addSuperType(newSuperType);
+
+        assertTrue(entityDef.hasSuperType(newSuperType));
+    }
+
+    @Test
+    public void testEntityDefDefRemoveElement() {
+        AtlasEntityDef entityDef = ModelTestUtil.newEntityDefWithSuperTypes();
+
+        for (String superType : entityDef.getSuperTypes()) {
+            entityDef.removeSuperType(superType);
+            assertFalse(entityDef.hasSuperType(superType));
+        }
+    }
+
+    @Test
+    public void testEntityDefSetSuperTypes() {
+        AtlasEntityDef entityDef = ModelTestUtil.newEntityDefWithSuperTypes();
+
+        Set<String> oldSuperTypes = entityDef.getSuperTypes();
+        Set<String> newSuperTypes = new HashSet<String>();
+
+        newSuperTypes.add("newType-abcd-1234");
+
+        entityDef.setSuperTypes(newSuperTypes);
+
+        for (String superType : oldSuperTypes) {
+            assertFalse(entityDef.hasSuperType(superType));
+        }
+
+        for (String superType : newSuperTypes) {
+            assertTrue(entityDef.hasSuperType(superType));
+        }
+    }
+
+    @Test
+    public void testEntityDefHasSuperTypeWithNoSuperType() {
+        AtlasEntityDef entityDef = ModelTestUtil.getEntityDef();
+
+        for (String superType : entityDef.getSuperTypes()) {
+            assertTrue(entityDef.hasSuperType(superType));
+        }
+
+        assertFalse(entityDef.hasSuperType("01234-xyzabc-;''-)("));
+    }
+
+    @Test
+    public void testEntityDefHasSuperTypeWithNoSuperTypes() {
+        AtlasEntityDef entityDef = ModelTestUtil.getEntityDefWithSuperTypes();
+
+        for (String superType : entityDef.getSuperTypes()) {
+            assertTrue(entityDef.hasSuperType(superType));
+        }
+
+        assertFalse(entityDef.hasSuperType("01234-xyzabc-;''-)("));
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEnumDef.java b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEnumDef.java
new file mode 100644
index 0000000..61e102e
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasEnumDef.java
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef;
+import org.apache.atlas.type.AtlasType;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+
+public class TestAtlasEnumDef {
+
+    @Test
+    public void testEnumDefSerDeEmpty() {
+        AtlasEnumDef enumDef1 = new AtlasEnumDef();
+
+        String jsonString = AtlasType.toJson(enumDef1);
+
+        AtlasEnumDef enumDef2 = AtlasType.fromJson(jsonString, AtlasEnumDef.class);
+
+        assertEquals(enumDef1, enumDef2, "Incorrect serialization/deserialization of AtlasEnumDef");
+    }
+
+    @Test
+    public void testEnumDefSerDe() {
+        AtlasEnumDef enumDef = ModelTestUtil.getEnumDef();
+
+        String jsonString = AtlasType.toJson(enumDef);
+
+        AtlasEnumDef enumDef2 = AtlasType.fromJson(jsonString, AtlasEnumDef.class);
+
+        assertEquals(enumDef, enumDef2, "Incorrect serialization/deserialization of AtlasEnumDef");
+    }
+
+    @Test
+    public void testEnumDefHasElement() {
+        AtlasEnumDef enumDef = ModelTestUtil.getEnumDef();
+
+        for (AtlasEnumElementDef elementDef : enumDef.getElementDefs()) {
+            assertTrue(enumDef.hasElement(elementDef.getValue()));
+        }
+
+        assertFalse(enumDef.hasElement("01234-xyzabc-;''-)("));
+    }
+
+    @Test
+    public void testEnumDefAddElement() {
+        AtlasEnumDef enumDef = ModelTestUtil.newEnumDef();
+
+        String newElement = "newElement-abcd-1234";
+        enumDef.addElement(new AtlasEnumElementDef(newElement, "A new element", enumDef.getElementDefs().size()));
+        assertTrue(enumDef.hasElement(newElement));
+    }
+
+    @Test
+    public void testEnumDefRemoveElement() {
+        AtlasEnumDef enumDef = ModelTestUtil.newEnumDef();
+
+        if (enumDef.getElementDefs().size() > 0) {
+            String elementValue = enumDef.getElementDefs().get(0).getValue();
+
+            assertTrue(enumDef.hasElement(elementValue));
+
+            enumDef.removeElement(elementValue);
+            assertFalse(enumDef.hasElement(elementValue));
+        }
+    }
+
+    @Test
+    public void testEnumDefSetElementDefs() {
+        AtlasEnumDef enumDef = ModelTestUtil.newEnumDef();
+
+        List<AtlasEnumElementDef> oldElements = enumDef.getElementDefs();
+        List<AtlasEnumElementDef> newElements = new ArrayList<AtlasEnumElementDef>();
+
+        newElements.add(new AtlasEnumElementDef("newElement", "new Element", 100));
+
+        enumDef.setElementDefs(newElements);
+
+        for (AtlasEnumElementDef elementDef : oldElements) {
+            assertFalse(enumDef.hasElement(elementDef.getValue()));
+        }
+
+        for (AtlasEnumElementDef elementDef : newElements) {
+            assertTrue(enumDef.hasElement(elementDef.getValue()));
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasStructDef.java b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasStructDef.java
new file mode 100644
index 0000000..b87b33e
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/model/typedef/TestAtlasStructDef.java
@@ -0,0 +1,104 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.typedef;
+
+import java.util.List;
+
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
+import org.apache.atlas.type.AtlasType;
+import org.testng.annotations.Test;
+
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertFalse;
+
+
+public class TestAtlasStructDef {
+
+    @Test
+    public void testStructDefSerDeEmpty() {
+        AtlasStructDef structDef = new AtlasStructDef("emptyStructDef");
+
+        String jsonString = AtlasType.toJson(structDef);
+
+        AtlasStructDef structDef2 = AtlasType.fromJson(jsonString, AtlasStructDef.class);
+
+        assertEquals(structDef2, structDef, "Incorrect serialization/deserialization of AtlasStructDef");
+    }
+
+    @Test
+    public void testStructDefSerDe() {
+        AtlasStructDef structDef = ModelTestUtil.getStructDef();
+
+        String jsonString = AtlasType.toJson(structDef);
+
+        AtlasStructDef structDef2 = AtlasType.fromJson(jsonString, AtlasStructDef.class);
+
+        assertEquals(structDef2, structDef, "Incorrect serialization/deserialization of AtlasStructDef");
+    }
+
+    @Test
+    public void testStructDefHasAttribute() {
+        AtlasStructDef structDef = ModelTestUtil.getStructDef();
+
+        for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+            assertTrue(structDef.hasAttribute(attributeDef.getName()));
+        }
+
+        assertFalse(structDef.hasAttribute("01234-xyzabc-;''-)("));
+    }
+
+    @Test
+    public void testStructDefAddAttribute() {
+        AtlasStructDef structDef = ModelTestUtil.newStructDef();
+
+        structDef.addAttribute(new AtlasAttributeDef("newAttribute", AtlasBaseTypeDef.ATLAS_TYPE_INT));
+        assertTrue(structDef.hasAttribute("newAttribute"));
+    }
+
+    @Test
+    public void testStructDefRemoveAttribute() {
+        AtlasStructDef structDef = ModelTestUtil.newStructDef();
+
+        String attrName = structDef.getAttributeDefs().get(0).getName();
+        assertTrue(structDef.hasAttribute(attrName));
+
+        structDef.removeAttribute(attrName);
+        assertFalse(structDef.hasAttribute(attrName));
+    }
+
+    @Test
+    public void testStructDefSetAttributeDefs() {
+        AtlasStructDef structDef = ModelTestUtil.newStructDef();
+
+        List<AtlasAttributeDef> oldAttributes = structDef.getAttributeDefs();
+        List<AtlasAttributeDef> newttributes = ModelTestUtil.newAttributeDefsWithAllBuiltInTypes("newAttributes");
+
+        structDef.setAttributeDefs(newttributes);
+
+        for (AtlasAttributeDef attributeDef : oldAttributes) {
+            assertFalse(structDef.hasAttribute(attributeDef.getName()));
+        }
+
+        for (AtlasAttributeDef attributeDef : newttributes) {
+            assertTrue(structDef.hasAttribute(attributeDef.getName()));
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasArrayType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasArrayType.java
new file mode 100644
index 0000000..e1a9658
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasArrayType.java
@@ -0,0 +1,120 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasIntType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.*;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasArrayType {
+    private final AtlasArrayType intArrayType  = new AtlasArrayType(new AtlasIntType());
+    private final Object[]       validValues;
+    private final Object[]       invalidValues;
+
+    {
+        List<Integer> intList  = new ArrayList<Integer>();
+        Set<Integer>  intSet   = new HashSet<Integer>();
+        Integer[]     intArray = new Integer[] { 1, 2, 3 };
+        List<Object>  objList  = new ArrayList<Object>();
+        Set<Object>   objSet   = new HashSet<Object>();
+        Object[]      objArray = new Object[] { 1, 2, 3 };
+        List<String>  strList  = new ArrayList<String>();
+        Set<String>   strSet   = new HashSet<String>();
+        String[]      strArray = new String[] { "1", "2", "3" };
+
+        for (int i = 0; i < 10; i++) {
+            intList.add(i);
+            intSet.add(i);
+            objList.add(i);
+            objSet.add(i);
+            strList.add(Integer.toString(i));
+            strSet.add(Integer.toString(i));
+        }
+
+        validValues = new Object[] {
+            null, new Integer[] { }, intList, intSet, intArray, objList, objSet, objArray, strList, strSet, strArray,
+            new byte[] { 1 }, new short[] { 1 }, new int[] { 1 }, new long[] { 1 }, new float[] { 1 },
+            new double[] { 1 }, new BigInteger[] { BigInteger.valueOf(1) }, new BigDecimal[] { BigDecimal.valueOf(1)},
+        };
+
+        invalidValues = new Object[] {
+            new String[] { "1", "abcd", "3", "xyz", "5" }, "1", Byte.valueOf((byte)1), Short.valueOf((short)1),
+            Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1), Double.valueOf(1), BigInteger.valueOf(1),
+            BigDecimal.valueOf(1),
+        };
+    }
+
+
+    @Test
+    public void testArrayTypeDefaultValue() {
+        Collection defValue = intArrayType.createDefaultValue();
+
+        assertEquals(defValue.size(), 1);
+    }
+
+    @Test
+    public void testArrayTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(intArrayType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(intArrayType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testArrayTypeGetNormalizedValue() {
+        assertNull(intArrayType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Collection normalizedValue = intArrayType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(intArrayType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testArrayTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(intArrayType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(intArrayType.validateValue(value, "testObj", messages));
+            assertTrue(messages.size() > 0, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasBigDecimalType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasBigDecimalType.java
new file mode 100644
index 0000000..0d8c65f
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasBigDecimalType.java
@@ -0,0 +1,114 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasBigDecimalType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasBigDecimalType {
+    private final AtlasBigDecimalType bigDecimalType = new AtlasBigDecimalType();
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", "12ab", "abcd", "-12ab" };
+
+
+    @Test
+    public void testBigDecimalTypeDefaultValue() {
+        BigDecimal defValue = bigDecimalType.createDefaultValue();
+
+        assertEquals(defValue, BigDecimal.valueOf(0));
+    }
+
+    @Test
+    public void testBigDecimalTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(bigDecimalType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(bigDecimalType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(bigDecimalType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testBigDecimalTypeGetNormalizedValue() {
+        assertNull(bigDecimalType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            BigDecimal normalizedValue = bigDecimalType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, BigDecimal.valueOf(1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            BigDecimal normalizedValue = bigDecimalType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, BigDecimal.valueOf(-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(bigDecimalType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testBigDecimalTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(bigDecimalType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(bigDecimalType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(bigDecimalType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasBigIntegerType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasBigIntegerType.java
new file mode 100644
index 0000000..f234bb8
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasBigIntegerType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasBigIntegerType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasBigIntegerType {
+    private final AtlasBigIntegerType bigIntegerType = new AtlasBigIntegerType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", "12ab", "abcd", "-12ab", };
+
+
+    @Test
+    public void testBigIntegerTypeDefaultValue() {
+        BigInteger defValue = bigIntegerType.createDefaultValue();
+
+        assertEquals(defValue, BigInteger.valueOf(0));
+    }
+
+    @Test
+    public void testBigIntegerTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(bigIntegerType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(bigIntegerType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(bigIntegerType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testBigIntegerTypeGetNormalizedValue() {
+        assertNull(bigIntegerType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            BigInteger normalizedValue = bigIntegerType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, BigInteger.valueOf(1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            BigInteger normalizedValue = bigIntegerType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, BigInteger.valueOf(-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(bigIntegerType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testBigIntegerTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(bigIntegerType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(bigIntegerType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(bigIntegerType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasBooleanType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasBooleanType.java
new file mode 100644
index 0000000..4373a38
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasBooleanType.java
@@ -0,0 +1,88 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasBooleanType;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasBooleanType {
+    private final AtlasBooleanType booleanType = new AtlasBooleanType();
+    private final Object[] validValues   = { null, Boolean.TRUE, Boolean.FALSE, "true", "false", "TRUE", "FALSE", };
+    private final Object[] invalidValues = { };
+
+    @Test
+    public void testBooleanTypeDefaultValue() {
+        Boolean defValue = booleanType.createDefaultValue();
+
+        assertFalse(defValue);
+    }
+
+    @Test
+    public void testBooleanTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(booleanType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(booleanType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testBooleanTypeGetNormalizedValue() {
+        Object[] trueValues  = { Boolean.TRUE, "true", "TRUE", "tRuE", "TrUe" };
+        Object[] falseValues = { Boolean.FALSE, "false", "FALSE", "fAlSe", "FaLsE" };
+
+        assertNull(booleanType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : trueValues) {
+            Boolean normalizedValue = booleanType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertTrue(normalizedValue, "value=" + value);
+        }
+
+        for (Object value : falseValues) {
+            Boolean normalizedValue = booleanType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertFalse(normalizedValue, "value=" + value);
+        }
+    }
+
+    @Test
+    public void testBooleanTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(booleanType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(booleanType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasByteType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasByteType.java
new file mode 100644
index 0000000..338ceda
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasByteType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasByteType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasByteType {
+    private final AtlasByteType byteType = new AtlasByteType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", };
+
+
+    @Test
+    public void testByteTypeDefaultValue() {
+        Byte defValue = byteType.createDefaultValue();
+
+        assertEquals(defValue, Byte.valueOf((byte)0));
+    }
+
+    @Test
+    public void testByteTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(byteType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(byteType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(byteType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testByteTypeGetNormalizedValue() {
+        assertNull(byteType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Byte normalizedValue = byteType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Byte.valueOf((byte)1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            Byte normalizedValue = byteType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Byte.valueOf((byte)-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(byteType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testByteTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(byteType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(byteType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(byteType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
new file mode 100644
index 0000000..fc2de25
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
@@ -0,0 +1,125 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import java.util.*;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+import org.apache.atlas.model.typedef.AtlasClassificationDef;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasClassificationType {
+    private final AtlasClassificationType classificationType;
+    private final List<Object>            validValues        = new ArrayList<Object>();
+    private final List<Object>            invalidValues      = new ArrayList<Object>();
+
+    {
+        classificationType = getClassificationType(ModelTestUtil.getClassificationDefWithSuperTypes());
+
+        AtlasClassification invalidValue1 = classificationType.createDefaultValue();
+        AtlasClassification invalidValue2 = classificationType.createDefaultValue();
+        Map<String, Object> invalidValue3 = classificationType.createDefaultValue().getAttributes();
+
+        // invalid value for int
+        invalidValue1.setAttribute(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_INT), "xyz");
+        // invalid value for date
+        invalidValue2.setAttribute(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_DATE), "xyz");
+        // invalid value for bigint
+        invalidValue3.put(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER), "xyz");
+
+        validValues.add(null);
+        validValues.add(classificationType.createDefaultValue());
+        validValues.add(classificationType.createDefaultValue().getAttributes()); // Map<String, Object>
+        invalidValues.add(invalidValue1);
+        invalidValues.add(invalidValue2);
+        invalidValues.add(invalidValue3);
+        invalidValues.add(new AtlasClassification());     // no values for mandatory attributes
+        invalidValues.add(new HashMap<Object, Object>()); // no values for mandatory attributes
+        invalidValues.add(1);               // incorrect datatype
+        invalidValues.add(new HashSet());   // incorrect datatype
+        invalidValues.add(new ArrayList()); // incorrect datatype
+        invalidValues.add(new String[] {}); // incorrect datatype
+    }
+
+    @Test
+    public void testClassificationTypeDefaultValue() {
+        AtlasClassification defValue = classificationType.createDefaultValue();
+
+        assertNotNull(defValue);
+        assertEquals(defValue.getTypeName(), classificationType.getTypeName());
+    }
+
+    @Test
+    public void testClassificationTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(classificationType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(classificationType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testClassificationTypeGetNormalizedValue() {
+        assertNull(classificationType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Object normalizedValue = classificationType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(classificationType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testClassificationTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(classificationType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(classificationType.validateValue(value, "testObj", messages));
+            assertTrue(messages.size() > 0, "value=" + value);
+            messages.clear();
+        }
+    }
+
+    private static AtlasClassificationType getClassificationType(AtlasClassificationDef classificationDef) {
+        try {
+            return new AtlasClassificationType(classificationDef, ModelTestUtil.getTypesRegistry());
+        } catch (AtlasBaseException excp) {
+            return null;
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasDateType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasDateType.java
new file mode 100644
index 0000000..a28840a
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasDateType.java
@@ -0,0 +1,132 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasDateType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Date;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasDateType {
+    private final AtlasDateType dateType = new AtlasDateType();
+
+    private final Object[] validValues    = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", "12ab", "abcd", "-12ab", };
+
+    private final Date   now    = new Date();
+    private final String strNow = AtlasBaseTypeDef.DATE_FORMATTER.format(now);
+
+    @Test
+    public void testDateTypeDefaultValue() {
+        Date defValue = dateType.createDefaultValue();
+
+        assertEquals(defValue, new Date(0));
+    }
+
+    @Test
+    public void testDateTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(dateType.isValidValue(value), "value=" + value);
+        }
+
+        assertTrue(dateType.isValidValue(now), "value=" + now);
+        assertTrue(dateType.isValidValue(strNow), "value=" + strNow);
+
+        for (Object value : negativeValues) {
+            assertTrue(dateType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(dateType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testDateTypeGetNormalizedValue() {
+        assertNull(dateType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Date normalizedValue = dateType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, new Date(1), "value=" + value);
+        }
+
+        assertNotNull(dateType.getNormalizedValue(now), "value=" + now);
+        assertEquals(dateType.getNormalizedValue(now), now, "value=" + now);
+        assertNotNull(dateType.getNormalizedValue(strNow), "value=" + strNow);
+        assertEquals(dateType.getNormalizedValue(now), now, "value=" + now);
+
+        for (Object value : negativeValues) {
+            Date normalizedValue = dateType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, new Date(-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(dateType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testDateTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(dateType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        assertTrue(dateType.validateValue(now, "testObj", messages));
+        assertEquals(messages.size(), 0, "value=" + now);
+        assertTrue(dateType.validateValue(strNow, "testObj", messages));
+        assertEquals(messages.size(), 0, "value=" + strNow);
+
+        for (Object value : negativeValues) {
+            assertTrue(dateType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(dateType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasDoubleType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasDoubleType.java
new file mode 100644
index 0000000..1b1e013
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasDoubleType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasDoubleType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasDoubleType {
+    private final AtlasDoubleType doubleType  = new AtlasDoubleType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", "12ab", "abcd", "-12ab", };
+
+
+    @Test
+    public void testDoubleTypeDefaultValue() {
+        Double defValue = doubleType.createDefaultValue();
+
+        assertEquals(defValue, Double.valueOf(0));
+    }
+
+    @Test
+    public void testDoubleTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(doubleType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(doubleType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(doubleType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testDoubleTypeGetNormalizedValue() {
+        assertNull(doubleType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Double normalizedValue = doubleType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Double.valueOf(1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            Double normalizedValue = doubleType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Double.valueOf(-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(doubleType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testDoubleTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(doubleType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(doubleType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(doubleType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java
new file mode 100644
index 0000000..8139fd4
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java
@@ -0,0 +1,125 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import java.util.*;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasEntityType {
+    private final AtlasEntityType entityType;
+    private final List<Object>    validValues   = new ArrayList<Object>();
+    private final List<Object>    invalidValues = new ArrayList<Object>();
+
+    {
+        entityType = getEntityType(ModelTestUtil.getEntityDefWithSuperTypes());
+
+        AtlasEntity         invalidValue1 = entityType.createDefaultValue();
+        AtlasEntity         invalidValue2 = entityType.createDefaultValue();
+        Map<String, Object> invalidValue3 = entityType.createDefaultValue().getAttributes();
+
+        // invalid value for int
+        invalidValue1.setAttribute(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_INT), "xyz");
+        // invalid value for date
+        invalidValue2.setAttribute(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_DATE), "xyz");
+        // invalid value for bigint
+        invalidValue3.put(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER), "xyz");
+
+        validValues.add(null);
+        validValues.add(entityType.createDefaultValue());
+        validValues.add(entityType.createDefaultValue().getAttributes()); // Map<String, Object>
+        invalidValues.add(invalidValue1);
+        invalidValues.add(invalidValue2);
+        invalidValues.add(invalidValue3);
+        invalidValues.add(new AtlasEntity());             // no values for mandatory attributes
+        invalidValues.add(new HashMap<Object, Object>()); // no values for mandatory attributes
+        invalidValues.add(1);               // incorrect datatype
+        invalidValues.add(new HashSet());   // incorrect datatype
+        invalidValues.add(new ArrayList()); // incorrect datatype
+        invalidValues.add(new String[] {}); // incorrect datatype
+    }
+
+    @Test
+    public void testEntityTypeDefaultValue() {
+        AtlasEntity defValue = entityType.createDefaultValue();
+
+        assertNotNull(defValue);
+        assertEquals(defValue.getTypeName(), entityType.getTypeName());
+    }
+
+    @Test
+    public void testEntityTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(entityType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(entityType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testEntityTypeGetNormalizedValue() {
+        assertNull(entityType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Object normalizedValue = entityType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(entityType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testEntityTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(entityType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(entityType.validateValue(value, "testObj", messages));
+            assertTrue(messages.size() > 0, "value=" + value);
+            messages.clear();
+        }
+    }
+
+    private static AtlasEntityType getEntityType(AtlasEntityDef entityDef) {
+        try {
+            return new AtlasEntityType(entityDef, ModelTestUtil.getTypesRegistry());
+        } catch (AtlasBaseException excp) {
+            return null;
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasFloatType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasFloatType.java
new file mode 100644
index 0000000..dbfcf1d
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasFloatType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasFloatType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasFloatType {
+    private final AtlasFloatType floatType  = new AtlasFloatType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", "12ab", "abcd", "-12ab", };
+
+
+    @Test
+    public void testFloatTypeDefaultValue() {
+        Float defValue = floatType.createDefaultValue();
+
+        assertEquals(defValue, Float.valueOf(0));
+    }
+
+    @Test
+    public void testFloatTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(floatType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(floatType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(floatType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testFloatTypeGetNormalizedValue() {
+        assertNull(floatType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Float normalizedValue = floatType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Float.valueOf(1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            Float normalizedValue = floatType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Float.valueOf(-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(floatType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testFloatTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(floatType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(floatType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(floatType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasIntType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasIntType.java
new file mode 100644
index 0000000..f6f6041
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasIntType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasIntType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasIntType {
+    private final AtlasIntType intType = new AtlasIntType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues = { "", "12ab", "abcd", "-12ab", };
+
+
+    @Test
+    public void testIntTypeDefaultValue() {
+        Integer defValue = intType.createDefaultValue();
+
+        assertEquals(defValue, Integer.valueOf(0));
+    }
+
+    @Test
+    public void testIntTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(intType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(intType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(intType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testIntTypeGetNormalizedValue() {
+        assertNull(intType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Integer normalizedValue = intType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Integer.valueOf(1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            Integer normalizedValue = intType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Integer.valueOf(-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(intType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testIntTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(intType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(intType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(intType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasLongType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasLongType.java
new file mode 100644
index 0000000..b9fb089
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasLongType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasLongType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasLongType {
+    private final AtlasLongType longType = new AtlasLongType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", "12ab", "abcd", "-12ab", };
+
+
+    @Test
+    public void testLongTypeDefaultValue() {
+        Long defValue = longType.createDefaultValue();
+
+        assertEquals(defValue, Long.valueOf(0));
+    }
+
+    @Test
+    public void testLongTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(longType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(longType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(longType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testLongTypeGetNormalizedValue() {
+        assertNull(longType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Long normalizedValue = longType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Long.valueOf(1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            Long normalizedValue = longType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Long.valueOf(-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(longType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testLongTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(longType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(longType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(longType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasMapType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasMapType.java
new file mode 100644
index 0000000..6f75d54
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasMapType.java
@@ -0,0 +1,116 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasIntType;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasMapType {
+    private final AtlasMapType intIntMapType = new AtlasMapType(new AtlasIntType(), new AtlasIntType());
+    private final Object[]     validValues;
+    private final Object[]     invalidValues;
+
+    {
+        Map<String, Integer>  strIntMap     = new HashMap<String, Integer>();
+        Map<String, Double>   strDoubleMap  = new HashMap<String, Double>();
+        Map<String, String>   strStringMap  = new HashMap<String, String>();
+        Map<Integer, Integer> intIntMap     = new HashMap<Integer, Integer>();
+        Map<Object, Object>   objObjMap     = new HashMap<Object, Object>();
+        Map<Object, Object>   invObjObjMap1 = new HashMap<Object, Object>();
+        Map<Object, Object>   invObjObjMap2 = new HashMap<Object, Object>();
+
+        for (int i = 0; i < 10; i++) {
+            strIntMap.put(Integer.toString(i), i);
+            strDoubleMap.put(Integer.toString(i), Double.valueOf(i));
+            strStringMap.put(Integer.toString(i), Integer.toString(i));
+            intIntMap.put(i, i);
+            objObjMap.put(i, i);
+        }
+
+        invObjObjMap1.put("xyz", "123"); // invalid key
+        invObjObjMap2.put("123", "xyz"); // invalid value
+
+        validValues = new Object[] {
+            null, new HashMap<String, Integer>(), new HashMap<Object, Object>(), strIntMap, strDoubleMap, strStringMap,
+            intIntMap, objObjMap,
+        };
+
+        invalidValues = new Object[] { invObjObjMap1, invObjObjMap2, };
+    }
+
+
+    @Test
+    public void testMapTypeDefaultValue() {
+        Map<Object, Object> defValue = intIntMapType.createDefaultValue();
+
+        assertEquals(defValue.size(), 1);
+    }
+
+    @Test
+    public void testMapTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(intIntMapType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(intIntMapType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testMapTypeGetNormalizedValue() {
+        assertNull(intIntMapType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Map<Object, Object> normalizedValue = intIntMapType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(intIntMapType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testMapTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(intIntMapType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(intIntMapType.validateValue(value, "testObj", messages));
+            assertTrue(messages.size() > 0, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasObjectIdType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasObjectIdType.java
new file mode 100644
index 0000000..61f9146
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasObjectIdType.java
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.model.instance.AtlasObjectId;
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasObjectIdType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasObjectIdType {
+    private final AtlasObjectIdType objectIdType = new AtlasObjectIdType();
+    private final Object[] validValues;
+    private final Object[] invalidValues;
+
+    {
+        Map<String, String> objectId1 = new HashMap<String, String>();
+        Map<Object, Object> objectId2 = new HashMap<Object, Object>();
+        Map<Object, Object> objectId3 = new HashMap<Object, Object>();
+        Map<Object, Object> objectId4 = new HashMap<Object, Object>();
+        Map<Object, Object> objectId5 = new HashMap<Object, Object>();
+
+        objectId1.put(AtlasObjectId.KEY_TYPENAME, "testType");
+        objectId1.put(AtlasObjectId.KEY_GUID, "guid-1234");
+        objectId2.put(AtlasObjectId.KEY_TYPENAME, "testType");
+        objectId2.put(AtlasObjectId.KEY_GUID, 1234);
+        objectId3.put(AtlasObjectId.KEY_TYPENAME, "testType"); // no guid
+        objectId4.put(AtlasObjectId.KEY_GUID, "guid-1234");    // no typeName
+        objectId4.put(AtlasObjectId.KEY_TYPENAME + "-invalid", "testType");
+        objectId5.put(AtlasObjectId.KEY_GUID + "-invalid", "guid-1234");
+
+
+        validValues = new Object[] {
+            null, objectId1, objectId2, new AtlasObjectId(), new AtlasObjectId("testType", "guid-1234"), };
+
+        invalidValues = new Object[] {
+            objectId3, objectId4, objectId5, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1),
+            Long.valueOf(1L), Float.valueOf(1), Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+            "", "12ab", "abcd", "-12ab",
+        };
+    }
+
+    @Test
+    public void testObjectIdTypeDefaultValue() {
+        AtlasObjectId defValue = objectIdType.createDefaultValue();
+
+        assertNotNull(defValue);
+    }
+
+    @Test
+    public void testObjectIdTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(objectIdType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(objectIdType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testObjectIdTypeGetNormalizedValue() {
+        assertNull(objectIdType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            AtlasObjectId normalizedValue = objectIdType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+
+            if (value instanceof AtlasObjectId) {
+                assertEquals(normalizedValue, value, "value=" + value);
+            } else if (value instanceof Map) {
+                assertEquals(normalizedValue.getTypeName(), ((Map)value).get(AtlasObjectId.KEY_TYPENAME).toString(),
+                             "value=" + value);
+                assertEquals(normalizedValue.getGuid(), ((Map)value).get(AtlasObjectId.KEY_GUID).toString(),
+                             "value=" + value);
+            }
+        }
+    }
+
+    @Test
+    public void testObjectIdTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(objectIdType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(objectIdType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasShortType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasShortType.java
new file mode 100644
index 0000000..a266305
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasShortType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasShortType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasShortType {
+    private final AtlasShortType shortType = new AtlasShortType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1",
+    };
+
+    private final Object[] negativeValues = {
+        Byte.valueOf((byte)-1), Short.valueOf((short)-1), Integer.valueOf(-1), Long.valueOf(-1L), Float.valueOf(-1),
+        Double.valueOf(-1), BigInteger.valueOf(-1), BigDecimal.valueOf(-1), "-1",
+    };
+
+    private final Object[] invalidValues  = { "", "12ab", "abcd", "-12ab", };
+
+
+    @Test
+    public void testShortTypeDefaultValue() {
+        Short defValue = shortType.createDefaultValue();
+
+        assertEquals(defValue, Short.valueOf((short)0));
+    }
+
+    @Test
+    public void testShortTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(shortType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(shortType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(shortType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testShortTypeGetNormalizedValue() {
+        assertNull(shortType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Short normalizedValue = shortType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Short.valueOf((short)1), "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            Short normalizedValue = shortType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, Short.valueOf((short)-1), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(shortType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testShortTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(shortType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : negativeValues) {
+            assertTrue(shortType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(shortType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasStringType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasStringType.java
new file mode 100644
index 0000000..c171d98
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasStringType.java
@@ -0,0 +1,90 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import org.apache.atlas.type.AtlasBuiltInTypes.AtlasStringType;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasStringType {
+    private final AtlasStringType stringType = new AtlasStringType();
+
+    private final Object[] validValues = {
+        null, Byte.valueOf((byte)1), Short.valueOf((short)1), Integer.valueOf(1), Long.valueOf(1L), Float.valueOf(1),
+        Double.valueOf(1), BigInteger.valueOf(1), BigDecimal.valueOf(1), "1", "", "12ab", "abcd", "-12ab",
+    };
+
+    private final Object[] invalidValues = { };
+
+
+    @Test
+    public void testStringTypeDefaultValue() {
+        String defValue = stringType.createDefaultValue();
+
+        assertEquals(defValue, "");
+    }
+
+    @Test
+    public void testStringTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(stringType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(stringType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testStringTypeGetNormalizedValue() {
+        assertNull(stringType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            String normalizedValue = stringType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+            assertEquals(normalizedValue, value.toString(), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testStringTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(stringType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(stringType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 1, "value=" + value);
+            messages.clear();
+        }
+    }
+}
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java
new file mode 100644
index 0000000..1a15232
--- /dev/null
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java
@@ -0,0 +1,183 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.type;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.instance.AtlasStruct;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DATE;
+import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER;
+
+import org.apache.atlas.model.typedef.AtlasStructDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+
+public class TestAtlasStructType {
+    private static final String MULTI_VAL_ATTR_NAME_MIN_MAX = "multiValMinMax";
+    private static final String MULTI_VAL_ATTR_NAME_MIN     = "multiValMin";
+    private static final String MULTI_VAL_ATTR_NAME_MAX     = "multiValMax";
+    private static final int    MULTI_VAL_ATTR_MIN_COUNT    = 2;
+    private static final int    MULTI_VAL_ATTR_MAX_COUNT    = 5;
+
+    private final AtlasStructType structType;
+    private final List<Object>    validValues;
+    private final List<Object>    invalidValues;
+
+    {
+        AtlasAttributeDef multiValuedAttribMinMax = new AtlasAttributeDef(MULTI_VAL_ATTR_NAME_MIN_MAX, ATLAS_TYPE_INT);
+        AtlasAttributeDef multiValuedAttribMin    = new AtlasAttributeDef(MULTI_VAL_ATTR_NAME_MIN, ATLAS_TYPE_INT);
+        AtlasAttributeDef multiValuedAttribMax    = new AtlasAttributeDef(MULTI_VAL_ATTR_NAME_MAX, ATLAS_TYPE_INT);
+
+        multiValuedAttribMinMax.setCardinality(Cardinality.LIST);
+        multiValuedAttribMinMax.setValuesMinCount(MULTI_VAL_ATTR_MIN_COUNT);
+        multiValuedAttribMinMax.setValuesMaxCount(MULTI_VAL_ATTR_MAX_COUNT);
+
+        multiValuedAttribMinMax.setCardinality(Cardinality.SET);
+        multiValuedAttribMin.setValuesMinCount(MULTI_VAL_ATTR_MIN_COUNT);
+
+        multiValuedAttribMinMax.setCardinality(Cardinality.LIST);
+        multiValuedAttribMax.setValuesMaxCount(MULTI_VAL_ATTR_MAX_COUNT);
+
+        AtlasStructDef structDef = ModelTestUtil.newStructDef();
+
+        structDef.addAttribute(multiValuedAttribMinMax);
+        structDef.addAttribute(multiValuedAttribMin);
+        structDef.addAttribute(multiValuedAttribMax);
+
+        structType    = getStructType(structDef);
+        validValues   = new ArrayList<Object>();
+        invalidValues = new ArrayList<Object>();
+
+        AtlasStruct invalidValue1 = structType.createDefaultValue();
+        AtlasStruct invalidValue2 = structType.createDefaultValue();
+        AtlasStruct invalidValue3 = structType.createDefaultValue();
+        AtlasStruct invalidValue4 = structType.createDefaultValue();
+        AtlasStruct invalidValue5 = structType.createDefaultValue();
+        AtlasStruct invalidValue6 = structType.createDefaultValue();
+        AtlasStruct invalidValue7 = structType.createDefaultValue();
+
+        // invalid value for int
+        invalidValue1.setAttribute(ModelTestUtil.getDefaultAttributeName(ATLAS_TYPE_INT), "xyz");
+
+        // invalid value for date
+        invalidValue2.setAttribute(ModelTestUtil.getDefaultAttributeName(ATLAS_TYPE_DATE), "xyz");
+
+        // invalid value for bigint
+        invalidValue3.setAttribute(ModelTestUtil.getDefaultAttributeName(ATLAS_TYPE_BIGINTEGER), "xyz");
+
+        // minCount is less than required
+        invalidValue4.setAttribute(MULTI_VAL_ATTR_NAME_MIN_MAX, new Integer[] { 1 });
+
+        // maxCount is more than allowed
+        invalidValue5.setAttribute(MULTI_VAL_ATTR_NAME_MIN_MAX, new Integer[] { 1, 2, 3, 4, 5, 6 });
+
+        // minCount is less than required
+        invalidValue6.setAttribute(MULTI_VAL_ATTR_NAME_MIN, new Integer[] { });
+
+        // maxCount is more than allowed
+        invalidValue7.setAttribute(MULTI_VAL_ATTR_NAME_MAX, new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
+
+        validValues.add(null);
+        validValues.add(structType.createDefaultValue());
+        validValues.add(structType.createDefaultValue().getAttributes()); // Map<String, Object>
+        invalidValues.add(invalidValue1);
+        invalidValues.add(invalidValue2);
+        invalidValues.add(invalidValue3);
+        invalidValues.add(invalidValue4);
+        invalidValues.add(invalidValue5);
+        invalidValues.add(invalidValue6);
+        invalidValues.add(invalidValue7);
+        invalidValues.add(new AtlasStruct());             // no values for mandatory attributes
+        invalidValues.add(new HashMap<Object, Object>()); // no values for mandatory attributes
+        invalidValues.add(1);               // incorrect datatype
+        invalidValues.add(new HashSet());   // incorrect datatype
+        invalidValues.add(new ArrayList()); // incorrect datatype
+        invalidValues.add(new String[] {}); // incorrect datatype
+    }
+
+    @Test
+    public void testStructTypeDefaultValue() {
+        AtlasStruct defValue = structType.createDefaultValue();
+
+        assertNotNull(defValue);
+        assertEquals(defValue.getTypeName(), structType.getTypeName());
+    }
+
+    @Test
+    public void testStructTypeIsValidValue() {
+        for (Object value : validValues) {
+            assertTrue(structType.isValidValue(value), "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(structType.isValidValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testStructTypeGetNormalizedValue() {
+        assertNull(structType.getNormalizedValue(null), "value=" + null);
+
+        for (Object value : validValues) {
+            if (value == null) {
+                continue;
+            }
+
+            Object normalizedValue = structType.getNormalizedValue(value);
+
+            assertNotNull(normalizedValue, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertNull(structType.getNormalizedValue(value), "value=" + value);
+        }
+    }
+
+    @Test
+    public void testStructTypeValidateValue() {
+        List<String> messages = new ArrayList<String>();
+        for (Object value : validValues) {
+            assertTrue(structType.validateValue(value, "testObj", messages));
+            assertEquals(messages.size(), 0, "value=" + value);
+        }
+
+        for (Object value : invalidValues) {
+            assertFalse(structType.validateValue(value, "testObj", messages));
+            assertTrue(messages.size() > 0, "value=" + value);
+            messages.clear();
+        }
+    }
+
+    private static AtlasStructType getStructType(AtlasStructDef structDef) {
+        try {
+            return new AtlasStructType(structDef, ModelTestUtil.getTypesRegistry());
+        } catch (AtlasBaseException excp) {
+            return null;
+        }
+    }
+}
diff --git a/pom.xml b/pom.xml
index ac5b042..5f1285a 100755
--- a/pom.xml
+++ b/pom.xml
@@ -429,6 +429,7 @@
         <javax.servlet.version>3.1.0</javax.servlet.version>
         <!-- Needed for hooks -->
         <aopalliance.version>1.0</aopalliance.version>
+        <codehaus.jackson.version>1.9.13</codehaus.jackson.version>
         <commons-conf.version>1.10</commons-conf.version>
         <commons-collections.version>3.2.2</commons-collections.version>
         <commons-logging.version>1.1.3</commons-logging.version>
@@ -501,6 +502,7 @@
     </profiles>
 
     <modules>
+        <module>intg</module>
         <module>common</module>
         <module>typesystem</module>
         <module>server-api</module>
@@ -999,6 +1001,12 @@
             <!--  atlas modules -->
             <dependency>
                 <groupId>org.apache.atlas</groupId>
+                <artifactId>atlas-intg</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.atlas</groupId>
                 <artifactId>atlas-typesystem</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/release-log.txt b/release-log.txt
index 9e185c7..85ceaa4 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -9,6 +9,7 @@ ATLAS-1060 Add composite indexes for exact match performance improvements for al
 ATLAS-1127 Modify creation and modification timestamps to Date instead of Long(sumasai)
 
 ALL CHANGES:
+ATLAS-1171 Structured, high-level public APIs (mneethiraj via shwethags)
 ATLAS-247 Hive Column level lineage (rhbutani,svimal2106 via shwethags)
 ATLAS-1184 ReservedTypesRegistrar checks for existence of 1st class type (svimal2106 via shwethags)
 ATLAS-1199 Atlas UI not loading after fresh build due to jquery-asBreadcrumbs plugin upgrade (kevalbhatt via shwethags)
diff --git a/src/build/checkstyle.xml b/src/build/checkstyle.xml
index b7b7711..5442317 100755
--- a/src/build/checkstyle.xml
+++ b/src/build/checkstyle.xml
@@ -115,7 +115,9 @@
             <property name="max" value="120"/>
         </module>
         <module name="MethodLength"/>
-        <module name="ParameterNumber"/>
+        <module name="ParameterNumber">
+            <property name="tokens" value="METHOD_DEF"/>
+        </module>
         <module name="OuterTypeNumber"/>
 
         <!-- Checks for whitespace                               -->
diff --git a/webapp/pom.xml b/webapp/pom.xml
index 5ef1a7f..8fe4b9b 100755
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -125,6 +125,11 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.atlas</groupId>
+            <artifactId>atlas-intg</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.hadoop</groupId>
             <artifactId>hadoop-common</artifactId>
         </dependency>
diff --git a/webapp/src/main/java/org/apache/atlas/web/rest/TypesREST.java b/webapp/src/main/java/org/apache/atlas/web/rest/TypesREST.java
new file mode 100644
index 0000000..42cfd42
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/rest/TypesREST.java
@@ -0,0 +1,371 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.web.rest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+
+import org.apache.atlas.api.PList;
+import org.apache.atlas.api.SearchFilter;
+import org.apache.atlas.model.typedef.AtlasClassificationDef;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.apache.atlas.model.typedef.AtlasEnumDef;
+import org.apache.atlas.model.typedef.AtlasStructDef;
+import org.apache.atlas.web.util.Servlets;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@Path("types")
+public class TypesREST {
+    private static final Logger LOG = LoggerFactory.getLogger(TypesREST.class);
+
+    @POST
+    @Path("/enumdef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEnumDef createEnumDef(AtlasEnumDef enumDef) throws Exception {
+        AtlasEnumDef ret = null;
+
+        // TODO: ret = store.createEnumDef()
+
+        return ret;
+    }
+
+    @GET
+    @Path("/enumdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEnumDef getEnumDefByName(@PathParam("name") String name) throws Exception {
+        AtlasEnumDef ret = null;
+
+        // TODO: ret = store.getEnumDefByName(name)
+
+        return ret;
+    }
+
+    @GET
+    @Path("/enumdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEnumDef getEnumDefByGuid(@PathParam("guid") String guid) throws Exception {
+        AtlasEnumDef ret = null;
+
+        // TODO: ret = store.getEnumDefByGuid(guid)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/enumdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEnumDef updateEnumDefByName(@PathParam("name") String name, AtlasEnumDef enumDef) throws Exception {
+        AtlasEnumDef ret = null;
+
+        // TODO: ret = store.updateEnumDefByName(name, enumDef)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/enumdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEnumDef updateEnumDefByGuid(@PathParam("guid") String guid, AtlasEnumDef enumDef) throws Exception {
+        AtlasEnumDef ret = null;
+
+        // TODO: ret = store.updateEnumDefByGuid(guid, enumDef)
+
+        return ret;
+    }
+
+    @DELETE
+    @Path("/enumdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteEnumDefByName(@PathParam("name") String name) throws Exception {
+        // TODO: store.deleteEnumDefByName(name)
+    }
+
+    @DELETE
+    @Path("/enumdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteEnumDefByGuid(@PathParam("guid") String guid) throws Exception {
+        // TODO: store.deleteEnumDefByGuid(guid)
+    }
+
+    @GET
+    @Path("/enumdef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public PList<AtlasEnumDef> searchEnumDefs(@Context HttpServletRequest request) throws Exception {
+        PList<AtlasEnumDef> ret = null;
+
+        // TODO: SearchFilter filter = getSearchFilter(request);
+        // TODO: ret = store.searchEnumDefs(filter);
+
+        return ret;
+    }
+
+
+    @POST
+    @Path("/structdef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasStructDef createStructDef(AtlasStructDef structDef) throws Exception {
+        AtlasStructDef ret = null;
+
+        // TODO: ret = store.createStructDef()
+
+        return ret;
+    }
+
+    @GET
+    @Path("/structdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasStructDef getStructDefByName(@PathParam("name") String name) throws Exception {
+        AtlasStructDef ret = null;
+
+        // TODO: ret = store.getStructDefByName(name)
+
+        return ret;
+    }
+
+    @GET
+    @Path("/structdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasStructDef getStructDefByGuid(@PathParam("guid") String guid) throws Exception {
+        AtlasStructDef ret = null;
+
+        // TODO: ret = store.getStructDefByGuid(guid)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/structdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasStructDef updateStructDefByName(@PathParam("name") String name, AtlasStructDef structDef) throws Exception {
+        AtlasStructDef ret = null;
+
+        // TODO: ret = store.updateStructDefByName(name, structDef)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/structdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasStructDef updateStructDefByGuid(@PathParam("guid") String guid, AtlasStructDef structDef) throws Exception {
+        AtlasStructDef ret = null;
+
+        // TODO: ret = store.updateStructDefByGuid(guid, structDef)
+
+        return ret;
+    }
+
+    @DELETE
+    @Path("/structdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteStructDefByName(@PathParam("name") String name) throws Exception {
+        // TODO: store.deleteStructDefByName(name)
+    }
+
+    @DELETE
+    @Path("/structdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteStructDefByGuid(@PathParam("guid") String guid) throws Exception {
+        // TODO: store.deleteStructDefByGuid(guid)
+    }
+
+    @GET
+    @Path("/structdef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public PList<AtlasStructDef> searchStructDefs(@Context HttpServletRequest request) throws Exception {
+        PList<AtlasStructDef> ret = null;
+
+        // TODO: SearchFilter filter = getSearchFilter(request);
+        // TODO: ret = store.searchStructDefs(filter);
+
+        return ret;
+    }
+
+
+    @POST
+    @Path("/classificationdef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasClassificationDef createClassificationDef(AtlasClassificationDef classificationDef) throws Exception {
+        AtlasClassificationDef ret = null;
+
+        // TODO: ret = store.createClassificationDef()
+
+        return ret;
+    }
+
+    @GET
+    @Path("/classificationdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasClassificationDef getClassificationDefByName(@PathParam("name") String name) throws Exception {
+        AtlasClassificationDef ret = null;
+
+        // TODO: ret = store.getClassificationDefByName(name)
+
+        return ret;
+    }
+
+    @GET
+    @Path("/classificationdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasClassificationDef getClassificationDefByGuid(@PathParam("guid") String guid) throws Exception {
+        AtlasClassificationDef ret = null;
+
+        // TODO: ret = store.getClassificationDefByGuid(guid)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/classificationdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasClassificationDef updateClassificationDefByName(@PathParam("name") String name, AtlasClassificationDef classificationDef) throws Exception {
+        AtlasClassificationDef ret = null;
+
+        // TODO: ret = store.updateClassificationDefByName(name, classificationDef)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/classificationdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasClassificationDef updateClassificationDefByGuid(@PathParam("guid") String guid, AtlasClassificationDef classificationDef) throws Exception {
+        AtlasClassificationDef ret = null;
+
+        // TODO: ret = store.updateClassificationDefByGuid(guid, classificationDef)
+
+        return ret;
+    }
+
+    @DELETE
+    @Path("/classificationdef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteClassificationDefByName(@PathParam("name") String name) throws Exception {
+        // TODO: store.deleteClassificationDefByName(name)
+    }
+
+    @DELETE
+    @Path("/classificationdef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteClassificationDefByGuid(@PathParam("guid") String guid) throws Exception {
+        // TODO: store.deleteClassificationDefByGuid(guid)
+    }
+
+    @GET
+    @Path("/classificationdef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public PList<AtlasClassificationDef> searchClassificationDefs(SearchFilter filter) throws Exception {
+        PList<AtlasClassificationDef> ret = null;
+
+        // TODO: SearchFilter filter = getSearchFilter(request);
+        // TODO: ret = store.searchClassificationDefs(filter);
+
+        return ret;
+    }
+
+
+    @POST
+    @Path("/entitydef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEntityDef createEntityDef(AtlasEntityDef entityDef) throws Exception {
+        AtlasEntityDef ret = null;
+
+        // TODO: ret = store.createEntityDef()
+
+        return ret;
+    }
+
+    @GET
+    @Path("/entitydef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEntityDef getEntityDefByName(@PathParam("name") String name) throws Exception {
+        AtlasEntityDef ret = null;
+
+        // TODO: ret = store.getEntityDefByName(name)
+
+        return ret;
+    }
+
+    @GET
+    @Path("/entitydef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEntityDef getEntityDefByIdByGuid(@PathParam("guid") String guid) throws Exception {
+        AtlasEntityDef ret = null;
+
+        // TODO: ret = store.getEntityDefByGuid(guid)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/entitydef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEntityDef updateEntityDefByName(@PathParam("name") String name, AtlasEntityDef entityDef) throws Exception {
+        AtlasEntityDef ret = null;
+
+        // TODO: ret = store.updateEntityDefByName(name, entityDef)
+
+        return ret;
+    }
+
+    @PUT
+    @Path("/entitydef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasEntityDef updateEntityDefByGuid(@PathParam("guid") String guid, AtlasEntityDef entityDef) throws Exception {
+        AtlasEntityDef ret = null;
+
+        // TODO: ret = store.updateEntityDefByGuid(guid, entityDef)
+
+        return ret;
+    }
+
+    @DELETE
+    @Path("/entitydef/name/{name}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteEntityDef(@PathParam("name") String name) throws Exception {
+        // TODO: store.deleteEntityDefByName(name)
+    }
+
+    @DELETE
+    @Path("/entitydef/guid/{guid}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public void deleteEntityDefByGuid(@PathParam("guid") String guid) throws Exception {
+        // TODO: store.deleteEntityDefByGuid(guid)
+    }
+
+    @GET
+    @Path("/entitydef")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public PList<AtlasEntityDef> searchEntityDefs(SearchFilter filter) throws Exception {
+        PList<AtlasEntityDef> ret = null;
+
+        // TODO: SearchFilter filter = getSearchFilter(request);
+        // TODO: ret = store.searchEntityDefs(filter);
+
+        return ret;
+    }
+}
--
libgit2 0.27.1