You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@reef.apache.org by we...@apache.org on 2015/01/29 21:42:56 UTC

[12/31] incubator-reef git commit: [REEF-97] Add the REEF.NET code base

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Types/IPackageNode.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Types/IPackageNode.cs b/lang/cs/Source/TANG/Tang/Types/IPackageNode.cs
new file mode 100644
index 0000000..9c4e0e4
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Types/IPackageNode.cs
@@ -0,0 +1,24 @@
+/**
+ * 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.
+ */
+namespace Org.Apache.Reef.Tang.Types
+{
+    public interface IPackageNode : INode
+    {
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Types/ITraversable.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Types/ITraversable.cs b/lang/cs/Source/TANG/Tang/Types/ITraversable.cs
new file mode 100644
index 0000000..cd7c3c8
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Types/ITraversable.cs
@@ -0,0 +1,27 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Types
+{
+    public interface ITraversable<T> where T : ITraversable<T>
+    {
+        ICollection<T> GetChildren();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/AbstractMonotonicMultiMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/AbstractMonotonicMultiMap.cs b/lang/cs/Source/TANG/Tang/Util/AbstractMonotonicMultiMap.cs
new file mode 100644
index 0000000..3019d93
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/AbstractMonotonicMultiMap.cs
@@ -0,0 +1,263 @@
+/**
+ * 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;
+using Org.Apache.Reef.Utilities.Logging;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public abstract class AbstractMonotonicMultiMap<K, V> : ICollection<KeyValuePair<K, V>>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(AbstractMonotonicMultiMap<K, V>));
+
+        private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+        private IDictionary<K, ISet<V>> map;
+
+        private int size = 0;
+
+        public AbstractMonotonicMultiMap(IDictionary<K, ISet<V>> map)
+        {
+            this.map = map;
+        }
+
+        public ICollection<K> Keys
+        {
+            get { return map.Keys; }
+        }
+
+        public int Count
+        {
+            get { return size; }
+        }
+
+        public bool IsReadOnly
+        {
+            get { throw new NotImplementedException(); }
+        }
+
+        public void Add(K key, V val)
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                ISet<V> vals;
+                map.TryGetValue(key, out vals);
+
+                if (vals == null)
+                {
+                    vals = new MonotonicHashSet<V>();
+                    map.Add(key, vals);
+                }
+                vals.Add(val);
+                size++;
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+        }
+
+        public ISet<V> GetValuesForKey(K key)
+        {
+            _lock.EnterReadLock();
+            try
+            {
+                ISet<V> ret;
+                map.TryGetValue(key, out ret);
+                if (ret == null)
+                {
+                    return new MonotonicHashSet<V>();
+                }
+                return ret;
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        public bool Contains(K key, V val)
+        {
+            _lock.EnterReadLock();
+            try
+            {
+                ISet<V> vals;
+                map.TryGetValue(key, out vals);
+
+                if (vals != null)
+                {
+                    return vals.Contains(val);
+                }
+                return false;
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        public bool Add(KeyValuePair<K, V> e)
+        {
+            Add(e.Key, e.Value);
+            return true;
+        }
+
+        public bool AddAll(ICollection<KeyValuePair<K, V>> c) // where T : KeyValuePair<K, V>
+        {
+            bool ret = false;
+            foreach (KeyValuePair<K, V> e in c) 
+            {
+                Add(e);
+                ret = true;
+            }
+            return ret;
+        }
+
+        public void Clear()
+        {
+            throw new NotSupportedException("MonotonicMultiMap cannot be cleared!");
+        }
+
+        public bool Contains(object o) 
+        {
+            KeyValuePair<K, V> e = (KeyValuePair<K, V>)o;
+            return Contains((K)e.Key, (V)e.Value);
+        }
+
+        public bool ContainsAll<T>(ICollection<T> c) 
+        {
+            foreach (object o in c) 
+            {
+                if (!Contains(o)) 
+                { 
+                    return false; 
+                }
+            }
+            return true;
+        }
+
+        public bool IsEmpty()
+        {
+            return size == 0;
+        }
+
+        public ISet<V> Values() 
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                ISet<V> s = new HashSet<V>();
+                foreach (KeyValuePair<K, V> e in this)
+                {
+                    s.Add(e.Value);
+                }
+                return s;
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        public int Size()
+        {
+            return size;
+        }
+
+        public bool ContainsKey(K k)
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                if (map.ContainsKey(k))
+                {
+                    return (GetValuesForKey(k).Count != 0);
+                }
+                return false;
+            }
+            finally 
+            {                
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        void ICollection<KeyValuePair<K, V>>.Add(KeyValuePair<K, V> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void CopyTo(KeyValuePair<K, V>[] array, int arrayIndex)
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool Remove(KeyValuePair<K, V> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool Contains(KeyValuePair<K, V> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        public IEnumerator<KeyValuePair<K, V>> GetEnumerator()
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                return map.SelectMany(kvp => kvp.Value, (kvp, v) => new KeyValuePair<K, V>(kvp.Key, v)).GetEnumerator();
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/AssemblyLoader.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/AssemblyLoader.cs b/lang/cs/Source/TANG/Tang/Util/AssemblyLoader.cs
new file mode 100644
index 0000000..8f9175c
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/AssemblyLoader.cs
@@ -0,0 +1,70 @@
+/**
+ * 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.Reflection;
+using Org.Apache.Reef.Utilities.Logging;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class AssemblyLoader
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(AssemblyLoader));
+
+        public IList<Assembly> Assemblies { get; set; }
+
+        public AssemblyLoader(string[] files)
+        {
+            Assemblies = new List<Assembly>();
+            foreach (var a in files)
+            {
+                Assemblies.Add(Assembly.Load(a));
+            }
+        }
+
+        public Type GetType(string name)
+        {           
+            Type t = Type.GetType(name);
+            if (t == null)
+            {
+                foreach (var a in Assemblies)
+                {
+                    t = a.GetType(name);
+                    if (t != null)
+                    {
+                        return t;
+                    }
+                }
+
+                foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
+                {
+                    t = a.GetType(name);
+                    if (t != null)
+                        break;
+                }
+            }
+
+            if (t == null)
+            {
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Not able to get Type from the name provided: " + name), LOGGER);
+            }
+            return t;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/GenericType.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/GenericType.cs b/lang/cs/Source/TANG/Tang/Util/GenericType.cs
new file mode 100644
index 0000000..d6a4ea0
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/GenericType.cs
@@ -0,0 +1,49 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class GenericType<T>
+    {
+        public static readonly GenericType<T> Class = null;
+
+        public Type TypeT 
+        {
+            get { return typeof(T); }
+        }
+
+        public override bool Equals(object obj)
+        {
+            GenericType<T> other = obj as GenericType<T>;
+            if (other == null)
+            {
+                return false;
+            }
+
+            return TypeT == other.TypeT;
+        }
+
+        public override int GetHashCode()
+        {
+            return TypeT.GetHashCode();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/MonotonicHashMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/MonotonicHashMap.cs b/lang/cs/Source/TANG/Tang/Util/MonotonicHashMap.cs
new file mode 100644
index 0000000..0d1deb5
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/MonotonicHashMap.cs
@@ -0,0 +1,83 @@
+/**
+ * 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 Org.Apache.Reef.Utilities.Logging;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class MonotonicHashMap<T, U> : Dictionary<T, U>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicHashMap<T, U>));
+
+        public new void Add(T key, U value)
+        {
+            U old;
+            TryGetValue(key, out old);
+            if (old != null)
+            {
+                var ex = new ArgumentException("Attempt to re-add: [" + key + "] old value: " + old + " new value " + value);
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+            }
+            base.Add(key, value);
+        }
+
+        public void AddAll(IDictionary<T, U> m) 
+        {
+            foreach (T t in m.Keys) 
+            {
+                if (ContainsKey(t)) 
+                {
+                   U old;
+                   m.TryGetValue(t, out old);
+                   Add(t, old); // guaranteed to throw.
+                }
+            }
+            foreach (T t in m.Keys) 
+            {
+                U old;
+                m.TryGetValue(t, out old);
+                Add(t, old);
+            }
+        }
+
+        public bool IsEmpty()
+        {
+            return Count == 0;
+        }
+
+        public U Get(T key)
+        {
+            U val;
+            TryGetValue(key, out val);
+            return val;
+        }
+
+        public new void Clear() 
+        {
+            throw new NotSupportedException();
+        }
+
+        public new bool Remove(T key)
+        {
+            throw new NotSupportedException();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/MonotonicHashSet.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/MonotonicHashSet.cs b/lang/cs/Source/TANG/Tang/Util/MonotonicHashSet.cs
new file mode 100644
index 0000000..20706ef
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/MonotonicHashSet.cs
@@ -0,0 +1,131 @@
+/**
+ * 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;
+using Org.Apache.Reef.Utilities.Logging;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class MonotonicHashSet<T> : HashSet<T>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicHashSet<T>));
+        private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+        public MonotonicHashSet()
+        {           
+        }
+
+        public MonotonicHashSet(IEnumerable<T> collection)
+            : base(collection)
+        {
+        }
+
+        public MonotonicHashSet(T[] collection)
+            : base(collection.ToList())
+        {
+        }
+
+        public new bool Add(T e)
+        {
+            _lock.EnterWriteLock();
+
+            try
+            {
+                if (Contains(e))
+                {
+                    var ex = new ArgumentException("Attempt to re-add " + e
+                                                   + " to MonotonicSet!");
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                return base.Add(e);
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+        }
+
+        public bool AddAll(ICollection<T> c)
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                foreach (T t in c)
+                {
+                    if (Contains(t))
+                    {
+                        var ex = new ArgumentException("Attempt to re-add " + t
+                                                       + " to MonotonicSet!");
+                        Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                    }
+                    base.Add(t);
+                }
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+            return c.Count != 0;
+        }
+
+        public bool ContainsAll(ICollection<T> c)
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                foreach (T t in c)
+                {
+                    if (!Contains(t))
+                    {
+                        return false;
+                    }
+                }
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+            return true;
+        }
+
+        public new void Clear() 
+        {
+            Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to clear MonotonicSet!"), LOGGER);
+        }
+ 
+        public bool Remove(object o) 
+        {
+            Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to remove " + o + " from MonotonicSet!"), LOGGER);
+            return false;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/MonotonicMultiHashMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/MonotonicMultiHashMap.cs b/lang/cs/Source/TANG/Tang/Util/MonotonicMultiHashMap.cs
new file mode 100644
index 0000000..cc039aa
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/MonotonicMultiHashMap.cs
@@ -0,0 +1,30 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class MonotonicMultiHashMap<K, V> : AbstractMonotonicMultiMap<K, V> 
+    {
+        public MonotonicMultiHashMap() : base(new MonotonicHashMap<K, ISet<V>>())
+        {
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/MonotonicMultiMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/MonotonicMultiMap.cs b/lang/cs/Source/TANG/Tang/Util/MonotonicMultiMap.cs
new file mode 100644
index 0000000..50d4c6a
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/MonotonicMultiMap.cs
@@ -0,0 +1,30 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class MonotonicMultiMap<K, V> : AbstractMonotonicMultiMap<K, V> 
+    {
+        public MonotonicMultiMap() : base(new MonotonicTreeMap<K, ISet<V>>())
+        {
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/MonotonicSet.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/MonotonicSet.cs b/lang/cs/Source/TANG/Tang/Util/MonotonicSet.cs
new file mode 100644
index 0000000..2d52d0f
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/MonotonicSet.cs
@@ -0,0 +1,106 @@
+/**
+ * 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 Org.Apache.Reef.Utilities.Logging;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class MonotonicSet<T> : SortedSet<T>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicSet<T>));
+
+        //private static readonly long serialVersionUID = 1L;
+        public MonotonicSet() : base()
+        {
+        }
+
+        //public MonotonicSet(SortedSet<T> c) : base(c.Comparer)
+        //{
+        //    AddAll(c);
+        //}
+
+        public MonotonicSet(ICollection<T> c)
+            : base(c)
+        {
+        }
+
+        public MonotonicSet(IComparer<T> c)
+            : base(c)
+        {
+        }
+
+        public new bool Add(T e) //TODO
+        {
+            if (this.Contains(e))
+            {
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ArgumentException("Attempt to re-add " + e
+                    + " to MonotonicSet!"), LOGGER);
+            }
+            return base.Add(e);
+        }
+
+        public bool AddAll(ICollection<T> c)
+        {
+            foreach (T t in c)
+            {
+                this.Add(t);
+            }
+            return c.Count != 0;
+        }
+
+        public bool ContainsAll(ICollection<T> c)
+        {
+            foreach (T t in c)
+            {
+                if (!this.Contains(t))
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public bool AddAllIgnoreDuplicates(ICollection<T> c) 
+        {
+            bool ret = false;
+            foreach (T t in c) 
+            {
+                if (!Contains(t)) 
+                {
+                    Add(t);
+                    ret = true;
+                }
+            }
+            return ret;
+        }
+
+        public override void Clear() 
+        {
+            Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to clear MonotonicSet!"), LOGGER);
+        }
+
+        public bool Remove(Object o)
+        {
+            Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to remove " + o
+                + " from MonotonicSet!"), LOGGER);
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/MonotonicTreeMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/MonotonicTreeMap.cs b/lang/cs/Source/TANG/Tang/Util/MonotonicTreeMap.cs
new file mode 100644
index 0000000..623f249
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/MonotonicTreeMap.cs
@@ -0,0 +1,68 @@
+/**
+ * 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.Threading;
+using Org.Apache.Reef.Utilities.Logging;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class MonotonicTreeMap<TKey, TVal> : SortedDictionary<TKey, TVal> 
+    {
+        private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicTreeMap<TKey, TVal>));
+
+        public new void Add(TKey key, TVal value) 
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                TVal val;
+                if (base.TryGetValue(key, out val))
+                {
+                    var ex = new ArgumentException("Attempt to re-add: [" + key
+                                                   + "]\n old value: " + val + " new value " + value);
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                else
+                {
+                    base.Add(key, value);
+                }
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+        }
+
+        public new void Clear() //TODO
+        {
+            throw new NotSupportedException();
+        }
+
+        public new void Remove(TKey key) //TODO
+        {
+            throw new NotSupportedException();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/ReflectionUtilities.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/ReflectionUtilities.cs b/lang/cs/Source/TANG/Tang/Util/ReflectionUtilities.cs
new file mode 100644
index 0000000..fec364d
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/ReflectionUtilities.cs
@@ -0,0 +1,594 @@
+/**
+ * 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.Globalization;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Org.Apache.Reef.Utilities.Logging;
+using Org.Apache.Reef.Tang.Annotations;
+using Org.Apache.Reef.Tang.Exceptions;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    public class ReflectionUtilities
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(ReflectionUtilities));
+
+        public static readonly string Regexp = "[\\.\\+]";
+
+        /// <summary>
+        /// Gets the AssemblyQualifiedName from the Type. This name is used in ClassHierarchy
+        /// as a key when add a node as a child to parent. THe name is used as FullName in a Node
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ArgumentException">null is passed in FullName() in ReflectionUtilities</exception>
+        public static string GetAssemblyQualifiedName(Type name)
+        {
+            if (name == null)
+            {
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ArgumentException("null is passed in FullName() in ReflectionUtilities"), LOGGER);
+            }
+
+            Type t = EnsureInterfaceType(name);
+
+            if (t.AssemblyQualifiedName == null && t.Name == null && t.FullName == null)
+            {
+                LOGGER.Log(Level.Warning, "The type's name is null: " + t.ToString());
+            }
+
+            if (t.AssemblyQualifiedName == null && t.Name != null)
+            {
+                    return t.Name;
+            }
+
+            return t.AssemblyQualifiedName;
+        }
+
+        /// <summary>
+        /// It returns Type.FullName. This name is used as Name in a Node. 
+        /// It is not unique for a generic type with different type of arguments.
+        /// It is used for toString or debug info as AssemblyQualifiedName is really long
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        public static string GetName(Type name)
+        {
+            if (name.FullName != null)
+            {
+                return name.FullName;
+            }
+
+            //The following lines should be not reached by C# syntax definition. However, it happens  for some generic type such as AbstractObserver<T>
+            //It results in name as null. When null name in the class node gets deserialzed, as name is required filed in class hierarchy proto buffer schame,
+            //it causes exception during deserialization. The code below is to use first portion of AssemblyQualifiedName for the name of the node node in case type.name is null. 
+            string[] parts = GetAssemblyQualifiedName(name).Split(',');
+            return parts[0];
+        }
+
+        /// <summary>
+        /// Gets the interface target.
+        // Foo<T> ,  given Foo<T> and Foo return T
+        // example class Foo : Bar<U>, Bas<T>
+        // iface: Bar, type: Foo, return U
+        // iface: Bas, type: Foo, return T
+        // class ACons implements IExternalConstructor<A> 
+        // iface: IExternalConstructor<>, type: ACons return A
+        /// </summary>
+        /// <param name="iface">The iface.</param>
+        /// <param name="type">The type.</param>
+        /// <returns></returns>
+        public static Type GetInterfaceTarget(Type iface, Type type)
+        {
+            foreach (Type t in ReflectionUtilities.ClassAndAncestors(type))
+            {
+                if (IsGenericTypeof(iface, t))
+                {
+                    return t.GetGenericArguments()[0]; //verify it
+                }
+            }
+            return null;
+        }
+
+        public static Type GetInterfaceTargetForType(Type iface, Type type)
+        {
+            if (IsGenericTypeof(iface, type))
+            {
+                return type.GetGenericArguments()[0]; //verify it
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// Determines whether [is generic typeof] [the specified iface].
+        /// </summary>
+        /// <param name="iface">The iface.</param>
+        /// <param name="type">The type.</param>
+        /// <returns>
+        ///   <c>true</c> if [is generic typeof] [the specified iface]; otherwise, <c>false</c>.
+        /// </returns>
+        /// <exception cref="System.ApplicationException"></exception>
+        public static bool IsGenericTypeof(Type iface, Type type)
+        {
+            if (iface == null || type == null)
+            {
+                var ex = new ApplicationException(string.Format(CultureInfo.CurrentCulture,
+                                                             "The type passed in IsGenericTypeof is null: iface : {0} type: {1}. ",
+                                                             iface, type));
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+            }
+            if (type.IsGenericType)
+            {
+                if (GetAssemblyQualifiedName(iface).Equals(GetAssemblyQualifiedNameForGeneric(type)))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Classes the and ancestors.
+        /// </summary>
+        /// <param name="c">The c.</param>
+        /// <returns></returns>
+        public static IEnumerable<Type> ClassAndAncestors(Type c)
+        {
+            List<Type> workQueue = new List<Type>();
+            workQueue.Add(c); //including itself
+
+            foreach (Type t in c.GetInterfaces())
+            {
+                workQueue.Add(t);
+            }
+
+            Type b = c.BaseType;
+            while (b != null)
+            {
+                workQueue.Add(b);
+                b = b.BaseType;
+            }
+
+            if (c.IsInterface)
+            {
+                workQueue.Add(typeof (object));
+            }
+
+            return workQueue;
+        }
+
+        public static IEnumerable<Type> ClassAndAncestorsExcludeSelf(Type c)
+        {
+            List<Type> workQueue = new List<Type>();
+            //workQueue.Add(c); //including itself
+
+            foreach (Type t in c.GetInterfaces())
+            {
+                workQueue.Add(t);
+            }
+
+            Type b = c.BaseType;
+            while (b != null)
+            {
+                workQueue.Add(b);
+                b = b.BaseType;
+            }
+
+            if (c.IsInterface)
+            {
+                workQueue.Add(typeof(object));
+            }
+
+            return workQueue;
+        }
+
+        /// <summary>
+        /// Boxes the class.
+        /// </summary>
+        /// <param name="c">The c.</param>
+        /// <returns></returns>
+        /// <exception cref="System.NotSupportedException">Encountered unknown primitive type!</exception>
+        public static Type BoxClass(Type c)
+        {
+            if (c.IsPrimitive && c != typeof (Type))
+            {
+                if (c == typeof (bool))
+                {
+                    return typeof (Boolean);
+                }
+                else if (c == typeof (byte))
+                {
+                    return typeof (Byte);
+                }
+                else if (c == typeof (char))
+                {
+                    return typeof (Char);
+                }
+                else if (c == typeof (short))
+                {
+                    return typeof (Int16);
+                }
+                else if (c == typeof (int))
+                {
+                    return typeof (Int32);
+                }
+                else if (c == typeof (long))
+                {
+                    return typeof (Int64);
+                }
+                else if (c == typeof (float))
+                {
+                    return typeof (Single);
+                }
+                else if (c == typeof (double))
+                {
+                    return typeof (Double);
+                }
+                else
+                {
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException(
+                        "Encountered unknown primitive type!"), LOGGER);
+                    return c;
+                }
+            }
+            else
+            {
+                return c;
+            }
+        }
+
+        /// <summary>
+        /// Determines whether the specified to is coercable.
+        //  public static boolean isCoercable(Class<?> to, Class<?> from) castable from to both are numbers and from has a few bits or subclass relationship
+        /// </summary>
+        /// <param name="to">To.</param>
+        /// <param name="from">From.</param>
+        /// <returns>
+        ///   <c>true</c> if the specified to is coercable; otherwise, <c>false</c>.
+        /// </returns>
+        public static bool IsCoercable(Type to, Type from)
+        {
+            to = BoxClass(to);
+            from = BoxClass(from);
+            //TODO
+            //if (Number.class.isAssignableFrom(to)
+            //    && Number.class.isAssignableFrom(from)) {
+            //return sizeof.get(from) <= sizeof.get(to);
+            return to.IsAssignableFrom(from);
+            //return IsAssignableFromIgnoreGeneric(to, from);
+        }
+
+        /// <summary>
+        /// Determines whether [is assignable from ignore generic] [the specified to].
+        /// </summary>
+        /// <param name="to">To.</param>
+        /// <param name="from">From.</param>
+        /// <returns>
+        ///   <c>true</c> if [is assignable from ignore generic] [the specified to]; otherwise, <c>false</c>.
+        /// </returns>
+        public static bool IsAssignableFromIgnoreGeneric(Type to, Type from)
+        {
+            var f = ClassAndAncestors(from);
+            foreach (Type t in f)
+            {
+                if (GetAssemblyQualifiedName(to).Equals(GetAssemblyQualifiedNameForGeneric(t)))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Ensures the type of the interface. For generic types, full name could be null. In this case, we need to 
+        /// get GetGenericTypeDefinition for the type so that to rerain all teh type information
+        /// </summary>
+        /// <param name="interf">The interf.</param>
+        /// <returns></returns>
+        public static Type EnsureInterfaceType(Type interf)
+        {
+            if (interf != null && interf.IsGenericType && null == interf.FullName)
+            {
+                return interf.GetGenericTypeDefinition(); //this is to test if this line is ever reached
+            }
+            return interf;
+        }
+
+        /// <summary>
+        /// Gets the assembly qualified name for generic.
+        /// </summary>
+        /// <param name="t">The t.</param>
+        /// <returns></returns>
+        public static string GetAssemblyQualifiedNameForGeneric(Type t)
+        {
+            Type t1 = t;
+            if (t.IsGenericType)
+            {
+                t1 = t.GetGenericTypeDefinition();
+            }
+            return t1.AssemblyQualifiedName;
+        }
+
+        /// <summary>
+        /// Determines whether [is instance of generic] [the specified p].
+        /// </summary>
+        /// <param name="p">The p.</param>
+        /// <param name="t">The t.</param>
+        /// <returns>
+        ///   <c>true</c> if [is instance of generic] [the specified p]; otherwise, <c>false</c>.
+        /// </returns>
+        public static bool IsInstanceOfGeneric(object p, Type t)
+        {
+            foreach (var g in ReflectionUtilities.ClassAndAncestors(p.GetType()))
+            {
+                if (GetAssemblyQualifiedNameForGeneric(t).Equals(GetAssemblyQualifiedNameForGeneric(g)))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Gets the name of the type by.
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ApplicationException">Not able to get Type from the name provided:  +  name</exception>
+        public static Type GetTypeByName(string name)
+        {
+            Type t = null;
+
+            t = Type.GetType(name);
+
+            if (t == null)
+            {
+                foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
+                {
+                    t = a.GetType(name);
+                    if (t != null)
+                        break;
+                }
+            }
+            if (t == null)
+            {
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Not able to get Type from the name provided: " + name), LOGGER);
+            }
+
+            return t;
+        }
+
+        /// <summary>
+        /// Gets the enclosing classes.
+        /// </summary>
+        /// <param name="t">The t.</param>
+        /// <returns></returns>
+        public static Type[] GetEnclosingClasses(Type t)
+        {
+            IList<Type> l = new List<Type>();
+            l.Add(t);
+            Type current = t.DeclaringType;
+            while (current != null)
+            {
+                l.Add(current);
+                current = current.DeclaringType;
+            }
+            return l.Reverse().ToArray();
+        }
+
+        /// <summary>
+        /// Gets the enclosing class names.
+        /// </summary>
+        /// <param name="t">The t.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ApplicationException">The Type passed to GetEnclosingClassShortNames is null</exception>
+        public static string[] GetEnclosingClassNames(Type t)
+        {
+            if (t == null)
+            {
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("The Type passed to GetEnclosingClassShortNames is null"), LOGGER);
+            }
+            Type[] ts = GetEnclosingClasses(t);
+            string[] result = new string[ts.Length];
+            for (int i = 0; i < ts.Length; i++)
+            {
+                result[i] = GetAssemblyQualifiedName(ts[i]);
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// Gets the enclosing class names.
+        /// </summary>
+        /// <param name="fullName">The full name.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ApplicationException">The name passed to GetEnclosingClassShortNames is null</exception>
+        public static string[] GetEnclosingClassNames(string fullName)
+        {
+            if (fullName == null)
+            {
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("The name passed to GetEnclosingClassShortNames is null"), LOGGER);
+            }
+            Type t = ReflectionUtilities.GetTypeByName(fullName);
+            return GetEnclosingClassNames(t);
+        }
+
+        /// <summary>
+        /// Gets the named parameter target or null.
+        /// </summary>
+        /// <param name="type">The type.</param>
+        /// <returns></returns>
+        /// <exception cref="ClassHierarchyException">Named parameter  + GetName(type) +  implements 
+        ///                                   + multiple interfaces.  It is only allowed to implement Name</exception>
+        public static Type GetNamedParameterTargetOrNull(Type type)
+        {
+            var npAnnotation = type.GetCustomAttribute<NamedParameterAttribute>();
+            if (npAnnotation != null)
+            {
+                Type[] intfs = type.GetInterfaces();
+                if (intfs.Length > 1)
+                {
+                    var ex = new ClassHierarchyException("Named parameter " + GetName(type) + " implements "
+                                  + "multiple interfaces.  It is only allowed to implement Name<T>");
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+
+                }
+                else if (intfs.Length == 0 || !IsName(intfs[0]))
+                {
+                    var ex = new ClassHierarchyException("Found illegal [NamedParameter " + GetName(type)
+                                  + " does not implement Name<T>");
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                Type[] args = intfs[0].GetGenericArguments();
+                if (args.Length > 1)
+                {
+                    var ex = new ClassHierarchyException("Found illegal [NamedParameter " + GetName(type)
+                        + " that has more than one arguments");
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                if (args.Length == 0)
+                {
+                    var ex = new ClassHierarchyException("Found illegal [NamedParameter " + GetName(type)
+                        + " that has no argument");
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                if (HasConstructor(type) || HasInjectableConstructor(type))
+                {
+                    var ex = new ClassHierarchyException("Named parameter " + GetName(type) + " has "
+                                  + (HasInjectableConstructor(type) ? "an injectable" : "a") + " constructor. "
+                                  + " Named parameters must not declare any constructors.");
+                    Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+
+                return args[0];               
+            }
+
+            if (ImplementName(type)) //Implement Name<> but no  [NamedParameter] attribute
+            {
+                var ex = new ClassHierarchyException("Named parameter " + GetName(type)
+                                  + " is missing its [NamedParameter] attribute.");
+                Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+            }
+            return null;
+        }
+
+        public static IEnumerable<Type> GetInterfaces(Type type, bool includeInherited)
+        {
+            if (includeInherited || type.BaseType == null)
+                return type.GetInterfaces();
+            else
+                return type.GetInterfaces().Except(type.BaseType.GetInterfaces());
+        }
+
+        // Here is a more elaborate hack to test for annonymous type:
+        // http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous
+        // compiler generated classes are always recreatable and need not additional references to check for.
+        public static bool IsAnnonymousType(Type type)
+        {
+            if (type != null)
+            {
+                // HACK: The only way to detect anonymous types right now.
+                return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
+                       && type.IsGenericType && type.Name.Contains("AnonymousType")
+                       && (type.Name.StartsWith("<>", true, CultureInfo.CurrentCulture) || type.Name.StartsWith("VB$", true, CultureInfo.CurrentCulture))
+                       && (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic;
+            }
+            return false;
+        }
+
+        private static bool ImplementName(Type type)
+        {
+            foreach (Type t in type.GetInterfaces())
+            {
+                if (IsName(t))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private static bool IsName(Type t)
+        {
+            if (t.IsGenericType)
+            {
+                return t.GetGenericTypeDefinition().AssemblyQualifiedName.Equals(typeof (Name<>).AssemblyQualifiedName);
+            }
+            return false;
+        }
+
+        private static bool HasConstructor(Type type)
+        {
+            bool hasConstructor = false;
+
+            ConstructorInfo[] constructors =
+                type.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+            if (constructors.Length > 1)
+            {
+                hasConstructor = true;
+            }
+
+            if (constructors.Length == 1)
+            {
+                ConstructorInfo c = constructors[0];
+                ParameterInfo[] p = c.GetParameters();
+                if (p.Length > 1)
+                {
+                    // Multiple args. Definitely not implicit.
+                    hasConstructor = true;
+                }
+                else if (p.Length == 1)
+                {
+                    // One arg. Could be an inner class, in which case the compiler
+                    // included an implicit one parameter constructor that takes the
+                    // enclosing type.
+                    if (p[0].ParameterType != type.DeclaringType)
+                    {
+                        hasConstructor = true;
+                    }
+                }
+            }
+            return hasConstructor;
+        }
+
+        private static bool HasInjectableConstructor(Type type)
+        {
+            bool isInjectable = false;
+
+            ConstructorInfo[] constructors =
+                type.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+            foreach (ConstructorInfo c in constructors)
+            {
+                foreach (Attribute a in c.GetCustomAttributes())
+                {
+                    if (a is InjectAttribute)
+                    {
+                        isInjectable = true;
+                    }
+                }
+            }
+            return isInjectable;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Util/SetValuedKey.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Util/SetValuedKey.cs b/lang/cs/Source/TANG/Tang/Util/SetValuedKey.cs
new file mode 100644
index 0000000..4c3090e
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Util/SetValuedKey.cs
@@ -0,0 +1,62 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Util
+{
+    class SetValuedKey
+    {
+        public IList<object> key;
+
+        public SetValuedKey(object[] ts, object[] us)
+        {
+            key = ts.ToList<object>();
+            foreach (var o in us)
+            {
+                key.Add(o);
+            }
+        }
+
+        public override int GetHashCode()
+        {
+            int i = 0;
+            foreach (object t in key)
+            {
+                i += t.GetHashCode();
+            }
+            return i;
+        }
+
+        public override bool Equals(Object o)
+        {
+            SetValuedKey other = (SetValuedKey)o;
+            if (other.key.Count != this.key.Count) { return false; }
+            for (int i = 0; i < this.key.Count; i++)
+            {
+                if (this.key[i].Equals(other.key[i]))
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/packages.config
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/packages.config b/lang/cs/Source/TANG/Tang/packages.config
new file mode 100644
index 0000000..933b7e1
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/packages.config
@@ -0,0 +1,24 @@
+<?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.
+-->
+<packages>
+  <package id="Microsoft.Hadoop.Avro" version="1.4.0.0" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
+  <package id="protobuf-net" version="2.0.0.668" targetFramework="net45" />
+</packages>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Tools/ClassHierarchyBuilder/ClassHierarchyBuilder.csproj
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Tools/ClassHierarchyBuilder/ClassHierarchyBuilder.csproj b/lang/cs/Source/Tools/ClassHierarchyBuilder/ClassHierarchyBuilder.csproj
new file mode 100644
index 0000000..c3ddf65
--- /dev/null
+++ b/lang/cs/Source/Tools/ClassHierarchyBuilder/ClassHierarchyBuilder.csproj
@@ -0,0 +1,90 @@
+<?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 ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{34A9CD98-0D15-4CA0-AEA5-E53593A31047}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Org.Apache.Reef.Tools.ClassHierarchyBuilder</RootNamespace>
+    <AssemblyName>Org.Apache.Reef.Tools.ClassHierarchyBuilder</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\Org.Apache.Reef.Tools.ClassHierarchyBuilder\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\Microsoft.Reef.Tools.ClassHierarchyBuilder</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\REEF\reef-common\ReefCommon\ReefCommon.csproj">
+      <Project>{545a0582-4105-44ce-b99c-b1379514a630}</Project>
+      <Name>ReefCommon</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\REEF\reef-tasks\Tasks\Tasks.csproj">
+      <Project>{75503f90-7b82-4762-9997-94b5c68f15db}</Project>
+      <Name>Tasks</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Tang\Tang\Tang.csproj">
+      <Project>{97dbb573-3994-417a-9f69-ffa25f00d2a6}</Project>
+      <Name>Tang</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Tools/ClassHierarchyBuilder/Program.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Tools/ClassHierarchyBuilder/Program.cs b/lang/cs/Source/Tools/ClassHierarchyBuilder/Program.cs
new file mode 100644
index 0000000..32a85d0
--- /dev/null
+++ b/lang/cs/Source/Tools/ClassHierarchyBuilder/Program.cs
@@ -0,0 +1,97 @@
+/**
+ * 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 Org.Apache.Reef.Tasks;
+using Org.Apache.Reef.Tang.Implementations;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Protobuf;
+using Org.Apache.Reef.Tang.Types;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+
+namespace Org.Apache.Reef.Tools
+{
+    public class ClassHierarchyBuilder
+    {
+        /// <summary>
+        /// This program generates class hierarchy bin file for the list of dlls, plus a defalut list
+        /// The default list include: ITask, StreamTask1, HelloTask and ShellTask, please remove if not needed
+        /// </summary>
+        /// <param name="args"> additional dlls needed to build class hierarchy </param>
+        public static void Main(string[] args)
+        {
+            const string DllSubfix = ".dll";
+            const string ClassHierarchyBinFileName = "task.bin";
+
+            List<string> taskDlls = new List<string>();
+
+            foreach (string arg in args)
+            {
+                string assemblyName = arg;
+                if (!arg.EndsWith(DllSubfix, StringComparison.OrdinalIgnoreCase))
+                {
+                    assemblyName += DllSubfix;
+                }
+                if (!File.Exists(assemblyName))
+                {
+                    throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "invalid argument: assembly {0} cannot be found", assemblyName));
+                }
+                taskDlls.Add(arg);
+            }
+
+            taskDlls.Add(GetAssemblyName(typeof(ITask)));
+            taskDlls.Add(GetAssemblyName(typeof(HelloTask)));
+            taskDlls.Add(GetAssemblyName(typeof(ShellTask)));
+            taskDlls.Add(GetAssemblyName(typeof(StreamTask1)));
+
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(taskDlls.ToArray());
+
+            // the following is verification only
+            // to verify that a class indeeded has been added to the class hierarchy, check the class name
+            IClassNode streamTaskClassNode = (IClassNode)ns.GetNode(typeof(StreamTask1).AssemblyQualifiedName);
+            IClassNode helloTaskClassNode = (IClassNode)ns.GetNode(typeof(HelloTask).AssemblyQualifiedName);
+            IClassNode shellTaskClassNode = (IClassNode)ns.GetNode(typeof(ShellTask).AssemblyQualifiedName);
+
+            ProtocolBufferClassHierarchy.Serialize(ClassHierarchyBinFileName, ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize(ClassHierarchyBinFileName);
+
+            IClassNode retrievedStreamTaskClassNode = (IClassNode)ch.GetNode(typeof(StreamTask1).AssemblyQualifiedName);
+            IClassNode retrievedHelloTaskClassNode = (IClassNode)ch.GetNode(typeof(HelloTask).AssemblyQualifiedName);
+            IClassNode retrievedShellTaskClassNode = (IClassNode)ch.GetNode(typeof(ShellTask).AssemblyQualifiedName);
+
+            if (!streamTaskClassNode.GetFullName().Equals(retrievedStreamTaskClassNode.GetFullName()) ||
+                !helloTaskClassNode.GetFullName().Equals(retrievedHelloTaskClassNode.GetFullName()) ||
+                !shellTaskClassNode.GetFullName().Equals(retrievedShellTaskClassNode.GetFullName()))              
+            {
+                Console.WriteLine("Node deseriliazed is not equal");
+            }
+            else
+            {
+                Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "Class hierarchy written to [{0}].", Directory.GetCurrentDirectory()));
+            }
+        }
+
+        private static string GetAssemblyName(Type type)
+        {
+            return type.Assembly.GetName().Name;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Tools/ClassHierarchyBuilder/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Tools/ClassHierarchyBuilder/Properties/AssemblyInfo.cs b/lang/cs/Source/Tools/ClassHierarchyBuilder/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..02de849
--- /dev/null
+++ b/lang/cs/Source/Tools/ClassHierarchyBuilder/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+/**
+ * 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ClassHierarchyBuilder")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ClassHierarchyBuilder")]
+[assembly: AssemblyCopyright("Copyright ©  2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8a034f16-c6c7-497a-b3c0-f8cfea1635e9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Tools/ReefAll/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Tools/ReefAll/Properties/AssemblyInfo.cs b/lang/cs/Source/Tools/ReefAll/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..2fb7d69
--- /dev/null
+++ b/lang/cs/Source/Tools/ReefAll/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+/**
+ * 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ReefAll")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ReefAll")]
+[assembly: AssemblyCopyright("Copyright ©  2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("def59cbf-1539-414c-a518-486d1553077c")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Tools/ReefAll/ReefAll.csproj
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Tools/ReefAll/ReefAll.csproj b/lang/cs/Source/Tools/ReefAll/ReefAll.csproj
new file mode 100644
index 0000000..4f60fe6
--- /dev/null
+++ b/lang/cs/Source/Tools/ReefAll/ReefAll.csproj
@@ -0,0 +1,102 @@
+<?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 ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{4C137C79-3A28-47D2-BFB9-A3CAB1EEDACE}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Org.Apache.Reef.All</RootNamespace>
+    <AssemblyName>Org.Apache.Reef.All</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\Org.Apache.Reef.All\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\Microsoft.Reef.All\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\REEF\reef-applications\Evaluator\Evaluator.csproj">
+      <Project>{1b983182-9c30-464c-948d-f87eb93a8240}</Project>
+      <Name>Evaluator</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\REEF\reef-common\ReefCommon\ReefCommon.csproj">
+      <Project>{545a0582-4105-44ce-b99c-b1379514a630}</Project>
+      <Name>ReefCommon</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\REEF\reef-common\ReefDriver\ReefDriver.csproj">
+      <Project>{a6baa2a7-f52f-4329-884e-1bcf711d6805}</Project>
+      <Name>ReefDriver</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\REEF\reef-io\NetWork\NetWork.csproj">
+      <Project>{883ce800-6a6a-4e0a-b7fe-c054f4f2c1dc}</Project>
+      <Name>NetWork</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Tang\Tang\Tang.csproj">
+      <Project>{97dbb573-3994-417a-9f69-ffa25f00d2a6}</Project>
+      <Name>Tang</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Utilities\Utilities.csproj">
+      <Project>{79e7f89a-1dfb-45e1-8d43-d71a954aeb98}</Project>
+      <Name>Utilities</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\WAKE\Wake\Wake.csproj">
+      <Project>{cdfb3464-4041-42b1-9271-83af24cd5008}</Project>
+      <Name>Wake</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Utilities/AvroUtils.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Utilities/AvroUtils.cs b/lang/cs/Source/Utilities/AvroUtils.cs
new file mode 100644
index 0000000..1db652d
--- /dev/null
+++ b/lang/cs/Source/Utilities/AvroUtils.cs
@@ -0,0 +1,61 @@
+/**
+ * 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.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Hadoop.Avro;
+
+namespace Org.Apache.Reef.Utilities
+{
+    public class AvroUtils
+    {
+        /// <summary>
+        /// Convert an object to byte array using Avro serializiation
+        /// </summary>
+        /// <param name="obj">The object to serialize</param>
+        /// <returns>The serialized object in a byte array</returns>
+        public static byte[] AvroSerialize<T>(T obj)
+        {
+            IAvroSerializer<T> serializer = AvroSerializer.Create<T>();
+            using (MemoryStream stream = new MemoryStream())
+            {
+                serializer.Serialize(stream, obj);
+                return stream.GetBuffer();
+            }
+        }
+
+        /// <summary>
+        /// Converts a byte array to an object using Avro deserialization.
+        /// </summary>
+        /// <param name="data">The byte array to deserialize</param>
+        /// <returns>The deserialized object</returns>
+        public static T AvroDeserialize<T>(byte[] data)
+        {
+            IAvroSerializer<T> deserializer = AvroSerializer.Create<T>();
+            using (MemoryStream stream = new MemoryStream(data))
+            {
+                return deserializer.Deserialize(stream);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Utilities/ByteUtilities.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Utilities/ByteUtilities.cs b/lang/cs/Source/Utilities/ByteUtilities.cs
new file mode 100644
index 0000000..655e9d2
--- /dev/null
+++ b/lang/cs/Source/Utilities/ByteUtilities.cs
@@ -0,0 +1,45 @@
+/**
+ * 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.Text;
+
+namespace Org.Apache.Reef.Utilities
+{
+    public class ByteUtilities
+    {
+        public static byte[] StringToByteArrays(string s)
+        {
+            return Encoding.UTF8.GetBytes(s);
+        }
+
+        public static string ByteArrarysToString(byte[] b)
+        {
+            return Encoding.UTF8.GetString(b);
+        }
+
+        public static byte[] CopyBytesFrom(byte[] from)
+        {
+            int length = Buffer.ByteLength(from);
+            byte[] to = new byte[length];
+            Buffer.BlockCopy(from, 0, to, 0, length);
+            return to;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/Utilities/Diagnostics/DiagnosticsMessages.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/Utilities/Diagnostics/DiagnosticsMessages.cs b/lang/cs/Source/Utilities/Diagnostics/DiagnosticsMessages.cs
new file mode 100644
index 0000000..c0a4d6e
--- /dev/null
+++ b/lang/cs/Source/Utilities/Diagnostics/DiagnosticsMessages.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.Text;
+using System.Threading.Tasks;
+
+namespace Org.Apache.Reef.Utilities.Diagnostics
+{
+    public class DiagnosticsMessages
+    {
+        public const string ExceptionThrowing = "ExceptionThrowing";
+
+        public const string ExceptionCaught = "ExceptionCaught";
+
+        public const string DumperTimeout = "DumperTimeout";
+
+        public const string DumperError = "DumperError";
+
+        public const string CallingDumper = "CallingDumper";
+
+        public const string DumperException = "DumperException";
+    }
+}