diff --git a/lang/cs/Org.Apache.REEF.Client.Tests/JobResourceUploaderTests.cs b/lang/cs/Org.Apache.REEF.Client.Tests/JobResourceUploaderTests.cs
index 5f75d59..cb163f7 100644
--- a/lang/cs/Org.Apache.REEF.Client.Tests/JobResourceUploaderTests.cs
+++ b/lang/cs/Org.Apache.REEF.Client.Tests/JobResourceUploaderTests.cs
@@ -41,7 +41,7 @@
         private const string AnyJobFileResourceAbsoluteUri = AnyScheme + AnyHost + AnyJobFileResourcePath;
         private const string AnyLocalArchivePath = @"Any\Local\Archive\Path.zip";
         private const string AnyLocalJobFilePath = @"Any\Local\Folder\Path\job-submission-params.json";
-        private const long AnyModificationTime = 1447413621;
+        private const long AnyModificationTime = 1447413621000;
         private const long AnyResourceSize = 53092;
         private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
 
@@ -116,9 +116,9 @@
             {
                 var injector = TangFactory.GetTang().NewInjector();
                 FileSystem.GetFileStatus(new Uri(AnyUploadedResourceAbsoluteUri))
-                    .Returns(new FileStatus(Epoch + TimeSpan.FromSeconds(AnyModificationTime), AnyResourceSize));
+                    .Returns(new FileStatus(Epoch + TimeSpan.FromMilliseconds(AnyModificationTime), AnyResourceSize));
                 FileSystem.GetFileStatus(new Uri(AnyJobFileResourceAbsoluteUri))
-                    .Returns(new FileStatus(Epoch + TimeSpan.FromSeconds(AnyModificationTime), AnyResourceSize));
+                    .Returns(new FileStatus(Epoch + TimeSpan.FromMilliseconds(AnyModificationTime), AnyResourceSize));
                 ResourceArchiveFileGenerator.CreateArchiveToUpload(AnyDriverLocalFolderPath)
                     .Returns(AnyLocalArchivePath);
                 FileSystem.CreateUriForPath(AnyDriverResourceUploadPath)
diff --git a/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj b/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
index babf263..aefc5fe 100644
--- a/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
+++ b/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
@@ -99,6 +99,14 @@
     <Compile Include="Local\Parameters\LocalRuntimeDirectory.cs" />
     <Compile Include="Local\Parameters\NumberOfEvaluators.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="YARN\HDI\HDInsightClientConfiguration.cs" />
+    <Compile Include="YARN\HDI\HDInsightCommandLineEnvironment.cs" />
+    <Compile Include="YARN\HDI\HDInsightCredential.cs" />
+    <Compile Include="YARN\HDI\HDInsightResourceFileRemoteUrlToClusterUrlConverter.cs" />
+    <Compile Include="YARN\HDI\HDInsightUrlProvider.cs" />
+    <Compile Include="YARN\HDI\NamedParameters.cs" />
+    <Compile Include="YARN\IdentityResourceFileRemoteUrlToClusterUrlConverter.cs" />
+    <Compile Include="YARN\IResourceFileRemoteUrlToClusterUrlConverter.cs" />
     <Compile Include="YARN\IYarnCommandLineEnvironment.cs" />
     <Compile Include="YARN\IYarnJobCommandProvider.cs" />
     <Compile Include="YARN\IJobResourceUploader.cs" />
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightClientConfiguration.cs b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightClientConfiguration.cs
new file mode 100644
index 0000000..4b91146
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightClientConfiguration.cs
@@ -0,0 +1,82 @@
+﻿// 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.
+
+using System.Security;
+using Org.Apache.REEF.Client.API;
+using Org.Apache.REEF.Client.Yarn;
+using Org.Apache.REEF.Client.Yarn.RestClient;
+using Org.Apache.REEF.Client.YARN.Parameters;
+using Org.Apache.REEF.Client.YARN.RestClient;
+using Org.Apache.REEF.IO.FileSystem.AzureBlob;
+using Org.Apache.REEF.Tang.Formats;
+using Org.Apache.REEF.Tang.Util;
+
+namespace Org.Apache.REEF.Client.YARN.HDI
+{
+    public class HDInsightClientConfiguration : ConfigurationModuleBuilder
+    {
+        public static readonly RequiredParameter<string> HDInsightUsernameParameter = new RequiredParameter<string>();
+        public static readonly RequiredParameter<string> HDInsightUrlParameter = new RequiredParameter<string>();
+
+        // Required because user needs to provide the correct path which includes the container name for their 
+        // blob storage account where they want to upload the resource files. This container should be the container that
+        // HDInsight is using.
+        public static readonly RequiredParameter<string> JobSubmissionDirectoryPrefix = new RequiredParameter<string>();
+
+        public static readonly OptionalParameter<string> HDInsightPasswordParameter = new OptionalParameter<string>();
+
+        public static readonly OptionalParameter<SecureString> HDInsightSecurePasswordParameter =
+            new OptionalParameter<SecureString>();
+
+        /// <summary>
+        /// Provides <see cref="ConfigurationModule"/> to be used to obtain <see cref="IREEFClient"/> to
+        /// submit REEF application to HDInsight.
+        /// Sample usage:
+        /// <code>
+        /// <![CDATA[
+        /// const string connectionString = "ConnString";
+        /// var config = HDInsightClientConfiguration.GetConfigurationModule(azureBlockBlobConfig)
+        ///              .Set(AzureBlockBlobFileSystemConfiguration.ConnectionString, connectionString)
+        ///              .Set(HDInsightClientConfiguration.HDInsightUsernameParameter, @"foo")
+        ///              .Set(HDInsightClientConfiguration.HDInsightUrlParameter, @"https://bar.azurehdinsight.net/")
+        ///              ...;
+        /// var client = TangFactory.GetTang().NewInjector(config).GetInstance<IREEFClient>();
+        /// ]]>
+        /// </code>
+        /// </summary>
+        public static ConfigurationModule ConfigurationModule = new HDInsightClientConfiguration()
+            .BindNamedParameter(GenericType<HDInsightUrl>.Class, HDInsightUrlParameter)
+            .BindNamedParameter(GenericType<HDInsightUserName>.Class, HDInsightUsernameParameter)
+            .BindNamedParameter(GenericType<HDInsightPasswordSecureString>.Class,
+                HDInsightSecurePasswordParameter)
+            .BindNamedParameter(GenericType<JobSubmissionDirectoryPrefixParameter>.Class,
+                JobSubmissionDirectoryPrefix)
+            .BindNamedParameter(GenericType<HDInsightPasswordString>.Class, HDInsightPasswordParameter)
+            .BindImplementation(GenericType<IREEFClient>.Class, GenericType<YarnREEFDotNetClient>.Class)
+            .BindImplementation(GenericType<IYarnRestClientCredential>.Class,
+                GenericType<HDInsightCredential>.Class)
+            .BindImplementation(GenericType<IUrlProvider>.Class, GenericType<HDInsightUrlProvider>.Class)
+            .BindImplementation(GenericType<IJobResourceUploader>.Class,
+                GenericType<FileSystemJobResourceUploader>.Class)
+            .BindImplementation(GenericType<IYarnCommandLineEnvironment>.Class,
+                GenericType<HDInsightCommandLineEnvironment>.Class)
+            .BindImplementation(GenericType<IResourceFileRemoteUrlToClusterUrlConverter>.Class,
+                GenericType<HDInsightResourceFileRemoteUrlToClusterUrlConverter>.Class)
+            .Merge(AzureBlockBlobFileSystemConfiguration.ConfigurationModule)
+            .Build();
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightCommandLineEnvironment.cs b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightCommandLineEnvironment.cs
new file mode 100644
index 0000000..e7852c6
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightCommandLineEnvironment.cs
@@ -0,0 +1,53 @@
+﻿// 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.
+
+using System.Collections.Generic;
+using Org.Apache.REEF.Client.Yarn;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.Client.YARN.HDI
+{
+    /// <summary>
+    /// Provides YARN classpath for HDInsight environment
+    /// </summary>
+    public sealed class HDInsightCommandLineEnvironment : IYarnCommandLineEnvironment
+    {
+        [Inject]
+        private HDInsightCommandLineEnvironment()
+        {
+        }
+
+        public IReadOnlyList<string> GetYarnClasspathList()
+        {
+            return new List<string>
+            {
+                "%HADOOP_HOME%/etc/hadoop",
+                "%HADOOP_HOME%/share/hadoop/common/lib/*",
+                "%HADOOP_HOME%/share/hadoop/common/*",
+                "%HADOOP_HOME%/share/hadoop/hdfs",
+                "%HADOOP_HOME%/share/hadoop/hdfs/lib/*",
+                "%HADOOP_HOME%/share/hadoop/hdfs/*",
+                "%HADOOP_HOME%/share/hadoop/yarn/lib/*",
+                "%HADOOP_HOME%/share/hadoop/yarn/*",
+                "%HADOOP_HOME%/share/hadoop/mapreduce/lib/*",
+                "%HADOOP_HOME%/share/hadoop/mapreduce/*",
+                "%HADOOP_HOME%/share/hadoop/yarn/*",
+                "%HADOOP_HOME%/share/hadoop/yarn/lib/*"
+            };
+        }
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightCredential.cs b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightCredential.cs
new file mode 100644
index 0000000..6f723cf
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightCredential.cs
@@ -0,0 +1,53 @@
+﻿// 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.
+
+using System.Net;
+using System.Security;
+using Org.Apache.REEF.Client.YARN.RestClient;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.Client.YARN.HDI
+{
+    /// <summary>
+    /// Provides a container around ICredential to capture HDInsight credential
+    /// </summary>
+    internal sealed class HDInsightCredential : IYarnRestClientCredential
+    {
+        private readonly ICredentials _credentials;
+
+        [Inject]
+        private HDInsightCredential(
+            [Parameter(typeof(HDInsightUserName))] string userName,
+            [Parameter(typeof(HDInsightPasswordSecureString))] SecureString password)
+        {
+            _credentials = new NetworkCredential(userName, password);
+        }
+
+        [Inject]
+        private HDInsightCredential(
+            [Parameter(typeof(HDInsightUserName))] string userName,
+            [Parameter(typeof(HDInsightPasswordString))] string password)
+        {
+            _credentials = new NetworkCredential(userName, password);
+        }
+
+        public ICredentials Credentials
+        {
+            get { return _credentials; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightResourceFileRemoteUrlToClusterUrlConverter.cs b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightResourceFileRemoteUrlToClusterUrlConverter.cs
new file mode 100644
index 0000000..0332e81
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightResourceFileRemoteUrlToClusterUrlConverter.cs
@@ -0,0 +1,41 @@
+﻿// 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.
+
+using System;
+using System.Linq;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.Client.YARN.HDI
+{
+    internal class HDInsightResourceFileRemoteUrlToClusterUrlConverter : IResourceFileRemoteUrlToClusterUrlConverter
+    {
+        [Inject]
+        private HDInsightResourceFileRemoteUrlToClusterUrlConverter()
+        {
+        }
+
+        public string ConvertToLocalUrl(Uri uri)
+        {
+            // [uri]"https://reefhdi.blob.core.windows.net/reefdev/tmp/foo.json"
+            // Authority      : reefhdi.blob.core.windows.net
+            // Segments       : {/, reefdev/, tmp/, foo.json}
+            var container = uri.Segments[1].Trim('/');
+            var path = string.Join(string.Empty, uri.Segments.Skip(2));
+            return string.Format("wasb://{0}@{1}/{2}", container, uri.Authority, path);
+        }
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightUrlProvider.cs b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightUrlProvider.cs
new file mode 100644
index 0000000..d8647ee
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/HDInsightUrlProvider.cs
@@ -0,0 +1,42 @@
+﻿// 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.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Org.Apache.REEF.Client.Yarn.RestClient;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.Client.YARN.HDI
+{
+    internal sealed class HDInsightUrlProvider : IUrlProvider
+    {
+        private readonly string _url;
+
+        [Inject]
+        private HDInsightUrlProvider([Parameter(typeof(HDInsightUrl))] string url)
+        {
+            _url = url;
+        }
+
+        public Task<IEnumerable<Uri>> GetUrlAsync()
+        {
+            return Task.FromResult(Enumerable.Repeat(new Uri(_url), 1));
+        }
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/HDI/NamedParameters.cs b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/NamedParameters.cs
new file mode 100644
index 0000000..1f18691
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/HDI/NamedParameters.cs
@@ -0,0 +1,42 @@
+﻿// 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.
+
+using System.Security;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.Client.YARN.HDI
+{
+    [NamedParameter("User name for HDInsight cluster.")]
+    public sealed class HDInsightUserName : Name<string>
+    {
+    }
+
+    [NamedParameter("Password for HDInsight cluster.")]
+    public sealed class HDInsightPasswordString : Name<string>
+    {
+    }
+
+    [NamedParameter("Password for HDInsight cluster.")]
+    public sealed class HDInsightPasswordSecureString : Name<SecureString>
+    {
+    }
+
+    [NamedParameter("URL for HDInsight cluster like https://foo.azurehdinsight.net/.")]
+    public sealed class HDInsightUrl : Name<string>
+    {
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/IResourceFileRemoteUrlToClusterUrlConverter.cs b/lang/cs/Org.Apache.REEF.Client/YARN/IResourceFileRemoteUrlToClusterUrlConverter.cs
new file mode 100644
index 0000000..dc60d05
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/IResourceFileRemoteUrlToClusterUrlConverter.cs
@@ -0,0 +1,40 @@
+﻿// 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.
+
+using System;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.Client.YARN
+{
+    /// <summary>
+    /// For certain filesystem there might be two different URLs for the same resouce,
+    /// depending on access using an external endpoint or from within the system.
+    /// One such example is AzureBlockBlobStorageFileSystem
+    /// https://reefhdi.blob.core.windows.net/reefdev/tmp/foo.txt is the external URL whereas
+    /// when accessing this file from within HDInsight the URL is
+    /// wasb://reefdev@reefhdi.blob.core.windows.net/tmp/foo.txt
+    /// This creates a problem with Job resource upload where SubmitApplication request to YARN
+    /// needs to use the local path whereas resource upload uses external URL.
+    /// This interface allows users to specify logic for the conversion between external URL 
+    /// and local URL
+    /// </summary>
+    [DefaultImplementation(typeof(IdentityResourceFileRemoteUrlToClusterUrlConverter))]
+    internal interface IResourceFileRemoteUrlToClusterUrlConverter
+    {
+        string ConvertToLocalUrl(Uri url);
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/IdentityResourceFileRemoteUrlToClusterUrlConverter.cs b/lang/cs/Org.Apache.REEF.Client/YARN/IdentityResourceFileRemoteUrlToClusterUrlConverter.cs
new file mode 100644
index 0000000..a1fe2a9
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/IdentityResourceFileRemoteUrlToClusterUrlConverter.cs
@@ -0,0 +1,35 @@
+﻿// 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.
+
+using System;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.Client.YARN
+{
+    internal class IdentityResourceFileRemoteUrlToClusterUrlConverter : IResourceFileRemoteUrlToClusterUrlConverter
+    {
+        [Inject]
+        private IdentityResourceFileRemoteUrlToClusterUrlConverter()
+        {
+        }
+
+        public string ConvertToLocalUrl(Uri url)
+        {
+            return url.AbsoluteUri;
+        }
+    }
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/FileSystemJobResourceUploader.cs b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/FileSystemJobResourceUploader.cs
index 83e5ff1..8414475 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/FileSystemJobResourceUploader.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/FileSystemJobResourceUploader.cs
@@ -16,7 +16,6 @@
 // under the License.
 
 using System;
-using System.Collections.Generic;
 using System.IO;
 using Org.Apache.REEF.Client.Common;
 using Org.Apache.REEF.Client.Yarn;
@@ -40,19 +39,22 @@
         private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
         private readonly IResourceArchiveFileGenerator _resourceArchiveFileGenerator;
         private readonly IFileSystem _fileSystem;
-        private readonly REEFFileNames _reefFileNames;
         private readonly IFile _file;
+        private readonly REEFFileNames _reefFileNames;
+        private readonly IResourceFileRemoteUrlToClusterUrlConverter _urlConverter;
 
         [Inject]
         private FileSystemJobResourceUploader(
             IResourceArchiveFileGenerator resourceArchiveFileGenerator,
             IFileSystem fileSystem,
             REEFFileNames reefFileNames,
-            IFile file)
+            IFile file,
+            IResourceFileRemoteUrlToClusterUrlConverter urlConverter)
         {
+            _urlConverter = urlConverter;
+            _reefFileNames = reefFileNames;
             _fileSystem = fileSystem;
             _resourceArchiveFileGenerator = resourceArchiveFileGenerator;
-            _reefFileNames = reefFileNames;
             _file = file;
         }
 
@@ -66,7 +68,7 @@
             _fileSystem.CreateDirectory(parentDirectoryUri);
 
             var archivePath = _resourceArchiveFileGenerator.CreateArchiveToUpload(driverLocalFolderPath);
-            return GetJobResource(archivePath, ResourceType.ARCHIVE, driverUploadPath);
+            return GetJobResource(archivePath, ResourceType.ARCHIVE, driverUploadPath, _reefFileNames.GetReefFolderName());
         }
 
         public JobResource UploadFileResource(string fileLocalPath, string remoteUploadDirectoryPath)
@@ -78,7 +80,7 @@
             return GetJobResource(fileLocalPath, ResourceType.FILE, remoteUploadDirectoryPath);
         }
 
-        private JobResource GetJobResource(string filePath, ResourceType resourceType, string driverUploadPath)
+        private JobResource GetJobResource(string filePath, ResourceType resourceType, string driverUploadPath, string localizedName = null)
         {
             if (!_file.Exists(filePath))
             {
@@ -97,9 +99,9 @@
 
             return new JobResource
             {
-                Name = Path.GetFileNameWithoutExtension(filePath),
+                Name = localizedName ?? Path.GetFileName(filePath),
                 LastModificationUnixTimestamp = DateTimeToUnixTimestamp(fileStatus.ModificationTime),
-                RemoteUploadPath = remoteFileUri.AbsoluteUri,
+                RemoteUploadPath = _urlConverter.ConvertToLocalUrl(remoteFileUri),
                 ResourceSize = fileStatus.LengthBytes,
                 ResourceType = resourceType
             };
@@ -107,7 +109,7 @@
 
         private static long DateTimeToUnixTimestamp(DateTime dateTime)
         {
-            return (long)(dateTime - Epoch).TotalSeconds;
+            return (long)(dateTime - Epoch).TotalMilliseconds;
         }
     }
 }
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IUrlProvider.cs b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IUrlProvider.cs
index dd1e8ab..7fae0c4 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IUrlProvider.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IUrlProvider.cs
@@ -26,7 +26,10 @@
     public interface IUrlProvider
     {
         /// <summary>
-        /// Returns available Yarn resourcemanager web address for the environment
+        /// Returns list of available Yarn resourcemanager addresses for the environment
+        /// For environments with single endpoint/single RM this will be list of size 1.
+        /// For environments with multiple RMs with different endpoints this is list of all 
+        /// RMs. Client will try all endpoints until successful/the list is exhausted.
         /// </summary>
         /// <returns></returns>
         Task<IEnumerable<Uri>> GetUrlAsync();
diff --git a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEF.cs b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEF.cs
index 8c63953..575a13f 100644
--- a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEF.cs
+++ b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEF.cs
@@ -19,12 +19,13 @@
 using Org.Apache.REEF.Client.API;
 using Org.Apache.REEF.Client.Local;
 using Org.Apache.REEF.Client.Yarn;
+using Org.Apache.REEF.Client.YARN.HDI;
 using Org.Apache.REEF.Driver;
+using Org.Apache.REEF.IO.FileSystem.AzureBlob;
 using Org.Apache.REEF.Tang.Annotations;
 using Org.Apache.REEF.Tang.Implementations.Tang;
 using Org.Apache.REEF.Tang.Interface;
 using Org.Apache.REEF.Tang.Util;
-using Org.Apache.REEF.Utilities.Logging;
 
 namespace Org.Apache.REEF.Examples.HelloREEF
 {
@@ -33,10 +34,10 @@
     /// </summary>
     public sealed class HelloREEF
     {
-        private static readonly Logger Logger = Logger.GetLogger(typeof(HelloREEF));
         private const string Local = "local";
         private const string YARN = "yarn";
         private const string YARNRest = "yarnrest";
+        private const string HDInsight = "hdi";
         private readonly IREEFClient _reefClient;
         private readonly JobRequestBuilder _jobRequestBuilder;
 
@@ -84,6 +85,19 @@
                     return YARNClientConfiguration.ConfigurationModule.Build();
                 case YARNRest:
                     return YARNClientConfiguration.ConfigurationModuleYARNRest.Build();
+                case HDInsight:
+                    // To run against HDInsight please replace placeholders below, with actual values for
+                    // connection string, container name (available at Azure portal) and HDInsight 
+                    // credentials (username and password)
+                    const string connectionString = "ConnString";
+                    const string continerName = "foo";
+                    return HDInsightClientConfiguration.ConfigurationModule
+                        .Set(HDInsightClientConfiguration.HDInsightPasswordParameter, @"pwd")
+                        .Set(HDInsightClientConfiguration.HDInsightUsernameParameter, @"foo")
+                        .Set(HDInsightClientConfiguration.HDInsightUrlParameter, @"https://foo.azurehdinsight.net/")
+                        .Set(HDInsightClientConfiguration.JobSubmissionDirectoryPrefix, string.Format(@"/{0}/tmp", continerName))
+                        .Set(AzureBlockBlobFileSystemConfiguration.ConnectionString, connectionString)
+                        .Build();
                 default:
                     throw new Exception("Unknown runtime: " + name);
             }
diff --git a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj
index 825170f..c044163 100644
--- a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj
+++ b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj
@@ -66,6 +66,10 @@
       <Project>{cdfb3464-4041-42b1-9271-83af24cd5008}</Project>
       <Name>Org.Apache.REEF.Wake</Name>
     </ProjectReference>
+    <ProjectReference Include="..\Org.Apache.REEF.IO\Org.Apache.REEF.IO.csproj">
+      <Project>{DEC0F0A8-DBEF-4EBF-B69C-E2369C15ABF1}</Project>
+      <Name>Org.Apache.REEF.IO</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
@@ -76,4 +80,4 @@
     </PropertyGroup>
     <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
   </Target>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.sln.DotSettings b/lang/cs/Org.Apache.REEF.sln.DotSettings
index 00610d9..c937155 100644
--- a/lang/cs/Org.Apache.REEF.sln.DotSettings
+++ b/lang/cs/Org.Apache.REEF.sln.DotSettings
@@ -49,12 +49,14 @@
 specific language governing permissions and limitations&#xD;
 under the License.&#xD;
 </s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HD/@EntryIndexedValue">HDI</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MB/@EntryIndexedValue">MB</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MB/@EntryIndexedValue">GB</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=REEF/@EntryIndexedValue">REEF</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=REST/@EntryIndexedValue">REST</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RM/@EntryIndexedValue">RM</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=URL/@EntryIndexedValue">URL</s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YARN/@EntryIndexedValue">YARN</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YARNNM/@EntryIndexedValue">YARNNM</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YARNREST/@EntryIndexedValue">YARNREST</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YARNRM/@EntryIndexedValue">YARNRM</s:String>
