diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/ImageTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/ImageTagHelper.cs
new file mode 100644
index 0000000000..7cb42ddf71
--- /dev/null
+++ b/src/Microsoft.AspNet.Mvc.TagHelpers/ImageTagHelper.cs
@@ -0,0 +1,84 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNet.Hosting;
+using Microsoft.AspNet.Mvc.TagHelpers.Internal;
+using Microsoft.AspNet.Razor.Runtime.TagHelpers;
+using Microsoft.Framework.Caching.Memory;
+
+namespace Microsoft.AspNet.Mvc.TagHelpers
+{
+ ///
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ImageTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ImageTagHelperTest.cs
new file mode 100644
index 0000000000..e3298d2854
--- /dev/null
+++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ImageTagHelperTest.cs
@@ -0,0 +1,288 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNet.FileProviders;
+using Microsoft.AspNet.Hosting;
+using Microsoft.AspNet.Http.Internal;
+using Microsoft.AspNet.Mvc.ModelBinding;
+using Microsoft.AspNet.Mvc.Rendering;
+using Microsoft.AspNet.Razor.Runtime.TagHelpers;
+using Microsoft.AspNet.Routing;
+using Microsoft.Framework.Caching;
+using Microsoft.Framework.Caching.Memory;
+using Moq;
+using Xunit;
+
+namespace Microsoft.AspNet.Mvc.TagHelpers
+{
+ public class ImageTagHelperTest
+ {
+
+ [Fact]
+ public void PreservesOrderOfSourceAttributesWhenRun()
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("alt text") },
+ { "data-extra", new HtmlString("something") },
+ { "title", new HtmlString("Image title") },
+ { "src", "testimage.png" },
+ { "asp-file-version", "true" }
+ });
+ var output = MakeImageTagHelperOutput(
+ attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("alt text") },
+ { "data-extra", new HtmlString("something") },
+ { "title", new HtmlString("Image title") },
+ });
+
+ var expectedOutput = MakeImageTagHelperOutput(
+ attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("alt text") },
+ { "data-extra", new HtmlString("something") },
+ { "title", new HtmlString("Image title") },
+ { "src", "testimage.png?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk" }
+ });
+
+ var hostingEnvironment = MakeHostingEnvironment();
+ var viewContext = MakeViewContext();
+ var helper = new ImageTagHelper
+ {
+ HostingEnvironment = hostingEnvironment,
+ ViewContext = viewContext,
+ Src = "testimage.png",
+ FileVersion = true,
+ Cache = MakeCache(),
+ };
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal(expectedOutput.TagName, output.TagName);
+ Assert.Equal(4, output.Attributes.Count);
+
+ for(int i=0; i < expectedOutput.Attributes.Count; i++)
+ {
+ var expectedAtribute = expectedOutput.Attributes[i];
+ var actualAttribute = output.Attributes[i];
+ Assert.Equal(expectedAtribute.Name, actualAttribute.Name);
+ Assert.Equal(expectedAtribute.Value.ToString(), actualAttribute.Value.ToString());
+ }
+ }
+
+ [Fact]
+ public void RendersImageTag_AddsFileVersion()
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("Alt image text") },
+ { "src", "/images/test-image.png" },
+ { "asp-file-version", "true" }
+ });
+ var output = MakeImageTagHelperOutput(attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("Alt image text") },
+ });
+ var hostingEnvironment = MakeHostingEnvironment();
+ var viewContext = MakeViewContext();
+ var helper = new ImageTagHelper
+ {
+ HostingEnvironment = hostingEnvironment,
+ ViewContext = viewContext,
+ Src = "/images/test-image.png",
+ FileVersion = true,
+ Cache = MakeCache(),
+ };
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.True(output.Content.IsEmpty);
+ Assert.Equal("img", output.TagName);
+ Assert.Equal(2, output.Attributes.Count);
+ var srcAttribute = Assert.Single(output.Attributes, attr => attr.Name.Equals("src"));
+ Assert.Equal("/images/test-image.png?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", srcAttribute.Value);
+ }
+
+ [Fact]
+ public void RendersImageTag_DoesNotAddFileVersion()
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("Alt image text") },
+ { "src", "/images/test-image.png" },
+ { "asp-file-version", "false" }
+ });
+ var output = MakeImageTagHelperOutput(attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("Alt image text") },
+ });
+ var hostingEnvironment = MakeHostingEnvironment();
+ var viewContext = MakeViewContext();
+ var helper = new ImageTagHelper
+ {
+ HostingEnvironment = hostingEnvironment,
+ ViewContext = viewContext,
+ Src = "/images/test-image.png",
+ FileVersion = false,
+ Cache = MakeCache(),
+ };
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.True(output.Content.IsEmpty);
+ Assert.Equal("img", output.TagName);
+ Assert.Equal(2, output.Attributes.Count);
+ var srcAttribute = Assert.Single(output.Attributes, attr => attr.Name.Equals("src"));
+ Assert.Equal("/images/test-image.png", srcAttribute.Value);
+ }
+
+ [Fact]
+ public void RendersImageTag_AddsFileVersion_WithRequestPathBase()
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("alt text") },
+ { "src", "/bar/images/image.jpg" },
+ { "asp-file-version", "true" },
+ });
+ var output = MakeImageTagHelperOutput(attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("alt text") },
+ });
+ var hostingEnvironment = MakeHostingEnvironment();
+ var viewContext = MakeViewContext("/bar");
+ var helper = new ImageTagHelper
+ {
+ HostingEnvironment = hostingEnvironment,
+ ViewContext = viewContext,
+ Src = "/bar/images/image.jpg",
+ FileVersion = true,
+ Cache = MakeCache(),
+ };
+
+ // Act
+ helper.Process(context, output);
+ // Assert
+ Assert.True(output.Content.IsEmpty);
+ Assert.Equal("img", output.TagName);
+ Assert.Equal(2, output.Attributes.Count);
+ var srcAttribute = Assert.Single(output.Attributes, attr => attr.Name.Equals("src"));
+ Assert.Equal("/bar/images/image.jpg?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", srcAttribute.Value);
+ }
+
+ private static ViewContext MakeViewContext(string requestPathBase = null)
+ {
+ var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
+ if (requestPathBase != null)
+ {
+ actionContext.HttpContext.Request.PathBase = new Http.PathString(requestPathBase);
+ }
+
+ var metadataProvider = new EmptyModelMetadataProvider();
+ var viewData = new ViewDataDictionary(metadataProvider);
+ var viewContext = new ViewContext(
+ actionContext,
+ Mock.Of