diff --git a/Base/Geometry/imstkCube.cpp b/Base/Geometry/Analytic/imstkCube.cpp
similarity index 100%
rename from Base/Geometry/imstkCube.cpp
rename to Base/Geometry/Analytic/imstkCube.cpp
diff --git a/Base/Geometry/imstkCube.h b/Base/Geometry/Analytic/imstkCube.h
similarity index 100%
rename from Base/Geometry/imstkCube.h
rename to Base/Geometry/Analytic/imstkCube.h
diff --git a/Base/Geometry/imstkPlane.cpp b/Base/Geometry/Analytic/imstkPlane.cpp
similarity index 100%
rename from Base/Geometry/imstkPlane.cpp
rename to Base/Geometry/Analytic/imstkPlane.cpp
diff --git a/Base/Geometry/imstkPlane.h b/Base/Geometry/Analytic/imstkPlane.h
similarity index 100%
rename from Base/Geometry/imstkPlane.h
rename to Base/Geometry/Analytic/imstkPlane.h
diff --git a/Base/Geometry/imstkSphere.cpp b/Base/Geometry/Analytic/imstkSphere.cpp
similarity index 100%
rename from Base/Geometry/imstkSphere.cpp
rename to Base/Geometry/Analytic/imstkSphere.cpp
diff --git a/Base/Geometry/imstkSphere.h b/Base/Geometry/Analytic/imstkSphere.h
similarity index 100%
rename from Base/Geometry/imstkSphere.h
rename to Base/Geometry/Analytic/imstkSphere.h
diff --git a/Base/Geometry/imstkGeometryMap.cpp b/Base/Geometry/Map/imstkGeometryMap.cpp
similarity index 100%
rename from Base/Geometry/imstkGeometryMap.cpp
rename to Base/Geometry/Map/imstkGeometryMap.cpp
diff --git a/Base/Geometry/imstkGeometryMap.h b/Base/Geometry/Map/imstkGeometryMap.h
similarity index 100%
rename from Base/Geometry/imstkGeometryMap.h
rename to Base/Geometry/Map/imstkGeometryMap.h
diff --git a/Base/Geometry/imstkIdentityMap.cpp b/Base/Geometry/Map/imstkIdentityMap.cpp
similarity index 100%
rename from Base/Geometry/imstkIdentityMap.cpp
rename to Base/Geometry/Map/imstkIdentityMap.cpp
diff --git a/Base/Geometry/imstkIdentityMap.h b/Base/Geometry/Map/imstkIdentityMap.h
similarity index 100%
rename from Base/Geometry/imstkIdentityMap.h
rename to Base/Geometry/Map/imstkIdentityMap.h
diff --git a/Base/Geometry/imstkIsometricMap.cpp b/Base/Geometry/Map/imstkIsometricMap.cpp
similarity index 100%
rename from Base/Geometry/imstkIsometricMap.cpp
rename to Base/Geometry/Map/imstkIsometricMap.cpp
diff --git a/Base/Geometry/imstkIsometricMap.h b/Base/Geometry/Map/imstkIsometricMap.h
similarity index 100%
rename from Base/Geometry/imstkIsometricMap.h
rename to Base/Geometry/Map/imstkIsometricMap.h
diff --git a/Base/Geometry/imstkTetraTriangleMap.cpp b/Base/Geometry/Map/imstkTetraTriangleMap.cpp
similarity index 100%
rename from Base/Geometry/imstkTetraTriangleMap.cpp
rename to Base/Geometry/Map/imstkTetraTriangleMap.cpp
diff --git a/Base/Geometry/imstkTetraTriangleMap.h b/Base/Geometry/Map/imstkTetraTriangleMap.h
similarity index 100%
rename from Base/Geometry/imstkTetraTriangleMap.h
rename to Base/Geometry/Map/imstkTetraTriangleMap.h
diff --git a/Base/Geometry/imstkHexahedralMesh.cpp b/Base/Geometry/Mesh/imstkHexahedralMesh.cpp
similarity index 100%
rename from Base/Geometry/imstkHexahedralMesh.cpp
rename to Base/Geometry/Mesh/imstkHexahedralMesh.cpp
diff --git a/Base/Geometry/imstkHexahedralMesh.h b/Base/Geometry/Mesh/imstkHexahedralMesh.h
similarity index 100%
rename from Base/Geometry/imstkHexahedralMesh.h
rename to Base/Geometry/Mesh/imstkHexahedralMesh.h
diff --git a/Base/Geometry/imstkMesh.cpp b/Base/Geometry/Mesh/imstkMesh.cpp
similarity index 100%
rename from Base/Geometry/imstkMesh.cpp
rename to Base/Geometry/Mesh/imstkMesh.cpp
diff --git a/Base/Geometry/imstkMesh.h b/Base/Geometry/Mesh/imstkMesh.h
similarity index 100%
rename from Base/Geometry/imstkMesh.h
rename to Base/Geometry/Mesh/imstkMesh.h
diff --git a/Base/Geometry/imstkSurfaceMesh.cpp b/Base/Geometry/Mesh/imstkSurfaceMesh.cpp
similarity index 100%
rename from Base/Geometry/imstkSurfaceMesh.cpp
rename to Base/Geometry/Mesh/imstkSurfaceMesh.cpp
diff --git a/Base/Geometry/imstkSurfaceMesh.h b/Base/Geometry/Mesh/imstkSurfaceMesh.h
similarity index 100%
rename from Base/Geometry/imstkSurfaceMesh.h
rename to Base/Geometry/Mesh/imstkSurfaceMesh.h
diff --git a/Base/Geometry/imstkTetrahedralMesh.cpp b/Base/Geometry/Mesh/imstkTetrahedralMesh.cpp
similarity index 100%
rename from Base/Geometry/imstkTetrahedralMesh.cpp
rename to Base/Geometry/Mesh/imstkTetrahedralMesh.cpp
diff --git a/Base/Geometry/imstkTetrahedralMesh.h b/Base/Geometry/Mesh/imstkTetrahedralMesh.h
similarity index 100%
rename from Base/Geometry/imstkTetrahedralMesh.h
rename to Base/Geometry/Mesh/imstkTetrahedralMesh.h
diff --git a/Base/Geometry/imstkVolumetricMesh.cpp b/Base/Geometry/Mesh/imstkVolumetricMesh.cpp
similarity index 100%
rename from Base/Geometry/imstkVolumetricMesh.cpp
rename to Base/Geometry/Mesh/imstkVolumetricMesh.cpp
diff --git a/Base/Geometry/imstkVolumetricMesh.h b/Base/Geometry/Mesh/imstkVolumetricMesh.h
similarity index 100%
rename from Base/Geometry/imstkVolumetricMesh.h
rename to Base/Geometry/Mesh/imstkVolumetricMesh.h
diff --git a/Base/Rendering/imstkCubeRenderDelegate.cpp b/Base/Rendering/RenderDelegate/imstkCubeRenderDelegate.cpp
similarity index 100%
rename from Base/Rendering/imstkCubeRenderDelegate.cpp
rename to Base/Rendering/RenderDelegate/imstkCubeRenderDelegate.cpp
diff --git a/Base/Rendering/imstkCubeRenderDelegate.h b/Base/Rendering/RenderDelegate/imstkCubeRenderDelegate.h
similarity index 100%
rename from Base/Rendering/imstkCubeRenderDelegate.h
rename to Base/Rendering/RenderDelegate/imstkCubeRenderDelegate.h
diff --git a/Base/Rendering/imstkPlaneRenderDelegate.cpp b/Base/Rendering/RenderDelegate/imstkPlaneRenderDelegate.cpp
similarity index 100%
rename from Base/Rendering/imstkPlaneRenderDelegate.cpp
rename to Base/Rendering/RenderDelegate/imstkPlaneRenderDelegate.cpp
diff --git a/Base/Rendering/imstkPlaneRenderDelegate.h b/Base/Rendering/RenderDelegate/imstkPlaneRenderDelegate.h
similarity index 100%
rename from Base/Rendering/imstkPlaneRenderDelegate.h
rename to Base/Rendering/RenderDelegate/imstkPlaneRenderDelegate.h
diff --git a/Base/Rendering/imstkRenderDelegate.cpp b/Base/Rendering/RenderDelegate/imstkRenderDelegate.cpp
similarity index 100%
rename from Base/Rendering/imstkRenderDelegate.cpp
rename to Base/Rendering/RenderDelegate/imstkRenderDelegate.cpp
diff --git a/Base/Rendering/imstkRenderDelegate.h b/Base/Rendering/RenderDelegate/imstkRenderDelegate.h
similarity index 100%
rename from Base/Rendering/imstkRenderDelegate.h
rename to Base/Rendering/RenderDelegate/imstkRenderDelegate.h
diff --git a/Base/Rendering/imstkSphereRenderDelegate.cpp b/Base/Rendering/RenderDelegate/imstkSphereRenderDelegate.cpp
similarity index 100%
rename from Base/Rendering/imstkSphereRenderDelegate.cpp
rename to Base/Rendering/RenderDelegate/imstkSphereRenderDelegate.cpp
diff --git a/Base/Rendering/imstkSphereRenderDelegate.h b/Base/Rendering/RenderDelegate/imstkSphereRenderDelegate.h
similarity index 100%
rename from Base/Rendering/imstkSphereRenderDelegate.h
rename to Base/Rendering/RenderDelegate/imstkSphereRenderDelegate.h
diff --git a/Base/Scene/imstkCamera.cpp b/Base/Scene/Camera/imstkCamera.cpp
similarity index 100%
rename from Base/Scene/imstkCamera.cpp
rename to Base/Scene/Camera/imstkCamera.cpp
diff --git a/Base/Scene/imstkCamera.h b/Base/Scene/Camera/imstkCamera.h
similarity index 100%
rename from Base/Scene/imstkCamera.h
rename to Base/Scene/Camera/imstkCamera.h
diff --git a/Base/Scene/imstkLight.cpp b/Base/Scene/Light/imstkLight.cpp
similarity index 100%
rename from Base/Scene/imstkLight.cpp
rename to Base/Scene/Light/imstkLight.cpp
diff --git a/Base/Scene/imstkLight.h b/Base/Scene/Light/imstkLight.h
similarity index 100%
rename from Base/Scene/imstkLight.h
rename to Base/Scene/Light/imstkLight.h
diff --git a/Base/Scene/imstkSceneObject.cpp b/Base/Scene/Object/imstkSceneObject.cpp
similarity index 100%
rename from Base/Scene/imstkSceneObject.cpp
rename to Base/Scene/Object/imstkSceneObject.cpp
diff --git a/Base/Scene/imstkSceneObject.h b/Base/Scene/Object/imstkSceneObject.h
similarity index 100%
rename from Base/Scene/imstkSceneObject.h
rename to Base/Scene/Object/imstkSceneObject.h
diff --git a/CMake/Utilities/imstkAddLibrary.cmake b/CMake/Utilities/imstkAddLibrary.cmake
index 642f6ff3e9c3f6c7d99a9713f1a7755f361c7ae0..b7999646062ae6158f43055997d25399017d43e3 100644
--- a/CMake/Utilities/imstkAddLibrary.cmake
+++ b/CMake/Utilities/imstkAddLibrary.cmake
@@ -1,3 +1,15 @@
+macro(imstk_subdir_list result curdir)
+  file(GLOB children RELATIVE ${curdir} ${curdir}/*)
+  set(dirlist "")
+  foreach(child ${children})
+    if(IS_DIRECTORY ${curdir}/${child})
+      list(APPEND dirlist ${child})
+    endif()
+  endforeach()
+  set(${result} ${dirlist})
+endmacro()
+
+
 function(imstk_add_library target)
 
   set(options VERBOSE)
@@ -18,10 +30,11 @@ function(imstk_add_library target)
   endif()
 
   #-----------------------------------------------------------------------------
-  # Create target (library)
+  # Get files and directories
   #-----------------------------------------------------------------------------
-  file(GLOB target_H_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
-  file(GLOB target_CPP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
+  file(GLOB_RECURSE target_H_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
+  file(GLOB_RECURSE target_CPP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
+  imstk_subdir_list(target_SUBDIR_LIST ${CMAKE_CURRENT_SOURCE_DIR})
 
   #-----------------------------------------------------------------------------
   # Create target (library)
@@ -41,8 +54,13 @@ function(imstk_add_library target)
   #-----------------------------------------------------------------------------
   # Include directories
   #-----------------------------------------------------------------------------
+  list(APPEND target_BUILD_INTERFACE_LIST "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
+  foreach(subdir ${target_SUBDIR_LIST})
+    list(APPEND target_BUILD_INTERFACE_LIST "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${subdir}>")
+  endforeach()
+
   target_include_directories( ${target} PUBLIC
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+    ${target_BUILD_INTERFACE_LIST}
     $<INSTALL_INTERFACE:${iMSTK_INSTALL_INCLUDE_DIR}>
     )