diff --git a/Core/RenderDetail.cpp b/Core/RenderDetail.cpp
index 9d906eb6559c7eac0bcc2edec6f7eb4019799f61..bfad60dc631b7107cd1a4721f5f2f0f556ef32df 100644
--- a/Core/RenderDetail.cpp
+++ b/Core/RenderDetail.cpp
@@ -438,3 +438,24 @@ void RenderDetail::addShaderAttribute(int shaderType, const std::string &attribu
 }
 
 
+//---------------------------------------------------------------------------
+void RenderDetail::addTexture(const std::string &textureName, const std::string &filename, const std::string &shaderBinding, const std::string &shaderProgramName){
+	textures[textureName].textureName = textureName;
+	textures[textureName].fileName = filename;
+	textures[textureName].shaderBinding = shaderBinding;
+	textures[textureName].shaderProgramName = shaderProgramName;
+	textures[textureName].shaderUniformGL = -1; //not defined intially
+	
+
+}
+
+std::map<std::string, TextureDetail>  &RenderDetail::getTextures() 
+{
+	return this->textures;
+
+
+
+}
+int RenderDetail::getNumberOfTextures(){
+	return this->textures.size();
+}
diff --git a/Core/RenderDetail.h b/Core/RenderDetail.h
index 67558b2ba95b32c06f0b963f97b04335593e8cc4..5d511f26c055bc07a9973f7c4f972c212d38ed66 100644
--- a/Core/RenderDetail.h
+++ b/Core/RenderDetail.h
@@ -32,11 +32,19 @@
 #include <string>
 #include <map>
 #include <array>
+
+
+
+
 class VisualArtifact;
 class CoreClass;
 class Model;
 struct UnifiedId;
 
+class vtkOpenGLTexture;
+
+
+
 ///
 /// \brief Hold a pointer to a source of geometry that render details can use for drawing.
 /// 
@@ -87,6 +95,17 @@ struct GeometrySource
     }
 };
 
+
+struct TextureDetail {
+	std::string textureName;
+	std::string fileName;
+	std::string shaderBinding;
+	std::string shaderProgramName;
+	GLint shaderUniformGL;
+	vtkOpenGLTexture* vtexture;
+
+};
+
 /// \brief RenderDetail has rendering options and features.
 ///It shows how the mesh should be rendered
 struct RenderDetail
@@ -210,6 +229,17 @@ public:
     ///
     void setTextureFilename(const std::string &filename);
     const std::string &getTextureFilename() const;
+
+	///
+	/// \brief Set/Get the binding texture filename for a shader. shaderBinding is for texture name in the shader name 
+	///
+	void addTexture(const std::string &textureName, const std::string &filename, const std::string &shaderBinding, const std::string &shaderProgramName);
+	//const std::string &getTextureFilename() const;
+	std::map<std::string, TextureDetail>& RenderDetail::getTextures();
+	int getNumberOfTextures();
+
+
+
     
     ///
     /// \brief Returns true if you want to draw texture map
@@ -322,6 +352,7 @@ private:
     std::vector<std::shared_ptr<UnifiedId>> shaders; // attached shaders
     std::vector<std::shared_ptr<UnifiedId>> VAOs; // stores  VAO IDs
 	std::map<std::string,int> shaderAttributes;
+	std::map<std::string, TextureDetail> textures;
 };
 
 #endif // SMRENDERDETAIL_H
diff --git a/Examples/AVMNidus/main.cpp b/Examples/AVMNidus/main.cpp
index 91e9924831cc8e7723523b1685e675ba3292c079..4daa6632cfb5668ddca41da1e3e0c385800a849c 100644
--- a/Examples/AVMNidus/main.cpp
+++ b/Examples/AVMNidus/main.cpp
@@ -92,6 +92,9 @@ int main(int ac, char **av)
     // Set shader porograms
     meshRenderDetail->addShaderProgram(vtkShader::Vertex,"shaders/wet_vert.glsl");
     meshRenderDetail->addShaderProgram(vtkShader::Fragment,"shaders/wet_frag.glsl");
+	meshRenderDetail->addTexture("decal", "textures/cube2.jpg", "textureDecal", "wet_frag.glsl");
+	meshRenderDetail->addTexture("bump", "textures/usertile34.bmp", "textureSpecular", "wet_frag.glsl");
+	meshRenderDetail->addTexture("specular", "textures/2.png", "textureBump", "wet_frag.glsl");
     meshRenderDetail->setTextureFilename("textures/cube.jpg");
 
    // auto renderingMesh = femObject->getVolumetricMesh()->getRenderingMesh();
diff --git a/VTKRendering/VTKMeshRenderDelegate.cpp b/VTKRendering/VTKMeshRenderDelegate.cpp
index 21b82669305e8b67b17a8fa988111947858d6a52..9deb779d2908abc925a0299f4814c11849c57921 100644
--- a/VTKRendering/VTKMeshRenderDelegate.cpp
+++ b/VTKRendering/VTKMeshRenderDelegate.cpp
@@ -44,6 +44,7 @@
 #include <vtkCellArray.h>
 #include <vtkGeometryFilter.h>
 #include <vtkPolyDataNormals.h>
+
 #include <vtkFloatArray.h>
 #include <vtkTexture.h>
 #include <vtkOpenGLPolyDataMapper.h>
@@ -54,6 +55,11 @@
 #include <vtkXMLImageDataReader.h>
 #include <vtkImageReader.h>
 #include <vtkImageReader2Factory.h>
+#include "RenderDetail.h"
+#include "vtkTextureObject.h"
+#include "vtkOpenGLTexture.h"
+#include "vtkOpenGLRenderWindow.h"
+#include "vtkIndent.h"
 
 vtkStandardNewMacro(CustomGLPolyDataMapper)
 
@@ -150,26 +156,45 @@ void MeshRenderDelegate::initDraw()
         actor->GetProperty()->SetInterpolationToPhong();
     }
 
-    vtkSmartPointer<vtkTexture> texture;
-    if(renderDetail && renderDetail->renderTexture())
+    //vtkSmartPointer<vtkTexture> texture;
+	vtkOpenGLTexture* texture;
+	
+	
+	int nbrTextures = renderDetail->getNumberOfTextures();
+	if ((renderDetail && renderDetail->renderTexture()) || nbrTextures>0)
     {
 		// Read texture file
 		vtkSmartPointer<vtkImageReader2Factory> readerFactory =
 			vtkSmartPointer<vtkImageReader2Factory>::New();
-		vtkImageReader2 *imageReader =
-			readerFactory->CreateImageReader2(mesh->getRenderDetail()->getTextureFilename().c_str());
-		cout << mesh->getRenderDetail()->getTextureFilename() << endl;
-		imageReader->SetFileName(mesh->getRenderDetail()->getTextureFilename().c_str());
-		if (imageReader == NULL)
-		{
-			cout << "Error in opening the file" << endl;
+		std::map<std::string, TextureDetail>&  textures = renderDetail->getTextures();
 		
+		for (auto &t : textures){
+			TextureDetail &textureDetail = t.second;
+			//textureDetail.fileName
+			vtkSmartPointer<vtkImageReader2> imageReader =
+				readerFactory->CreateImageReader2(textureDetail.fileName.c_str());
+			if (imageReader == NULL)
+			{
+				cout << "Error in opening the file" << endl;
+				continue;
+			}
+			imageReader->SetFileName(textureDetail.fileName.c_str());
+			imageReader->Update();
+			texture = vtkOpenGLTexture::New();
+			//vtkTextureObject *textureObject = vtkTextureObject::New();
+		
+			texture->SetInputConnection(imageReader->GetOutputPort());
+			
+			//texture->SetTextureObject(textureObject);
+			//textureObject->Create2D
+			textureDetail.vtexture = texture;
+			cout << "Image File Loaded"<<textureDetail.fileName.c_str() << endl;
 		}
-		imageReader->Update();
-
-
-        texture = vtkTexture::New();
-      	texture->SetInputConnection(imageReader->GetOutputPort());
+		
+		//vtkSmartPointer<vtkImageReader2> imageReader =
+		///	readerFactory->CreateImageReader2(mesh->getRenderDetail()->getTextureFilename().c_str());
+		//cout << mesh->getRenderDetail()->getTextureFilename() << endl;
+		//imageReader->SetFileName(mesh->getRenderDetail()->getTextureFilename().c_str());
 
         vtkNew<vtkFloatArray> textureCoordinates;
         textureCoordinates->SetNumberOfComponents(3);
@@ -202,6 +227,9 @@ void MeshRenderDelegate::initDraw()
         normals->AutoOrientNormalsOn();
 
 		mapper = CustomGLPolyDataMapper::New();
+
+
+		///The tangent computation needs to go out of the this block..tansel
         mapper->SetInputConnection(normals->GetOutputPort());
 		auto mapperCustom = CustomGLPolyDataMapper::SafeDownCast(mapper);
 		mapperCustom->renderDetail = renderDetail;
@@ -231,9 +259,9 @@ void MeshRenderDelegate::initDraw()
         mapper->SetInputDataObject(unstructuredMesh.GetPointer());
     }
 
-    if(texture.GetPointer())
+    if(texture)
     {
-        actor->SetTexture(texture);
+		actor->SetTexture(texture);
     }
     actor->SetMapper(mapper.GetPointer());
 }
@@ -288,6 +316,20 @@ void CustomGLPolyDataMapper::SetMapperShaderParameters(vtkOpenGLHelper &cellBO,
 	program->SetUniformf("TestColor1", testColor1);
 	program->SetUniformf("TestColor2", testColor2);
 	program->SetUniformf("TestColor3", testColor3);
+
+	std::map<std::string, TextureDetail>&  textures = renderDetail->getTextures();
+	
+	
+	for (auto &t : textures){
+		TextureDetail &textureDetail = t.second;
+		textureDetail.vtexture->GetTextureObject();
+		long a = textureDetail.vtexture->GetIndex();
+		textureDetail.vtexture->Load(ren);
+	
+		
+		program->SetUniformi(textureDetail.shaderBinding.c_str(), textureDetail.vtexture->GetTextureUnit());
+
+	}
 	cellBO.VAO->Bind();
 	
 	if (!cellBO.VAO->AddAttributeArray(cellBO.Program, this->tangentsBuffer,