You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@heron.apache.org by nl...@apache.org on 2018/04/11 18:08:41 UTC

[incubator-heron] branch master updated: package rename and related fixes (#2853)

This is an automated email from the ASF dual-hosted git repository.

nlu90 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-heron.git


The following commit(s) were added to refs/heads/master by this push:
     new 6029c28  package rename and related fixes (#2853)
6029c28 is described below

commit 6029c28943b7ad85be6fa175d20e0e908fb199b6
Author: SreeV <44...@users.noreply.github.com>
AuthorDate: Wed Apr 11 11:08:38 2018 -0700

    package rename and related fixes (#2853)
    
    * rename com.twitter to org.apache and related. breaking change. [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * long line > 100, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * order of imports, checkstyle error [https://github.com/apache/incubator-heron/issues/2828]
    
    * package rename from com.twitter to org.apache [https://github.com/apache/incubator-heron/issues/2828]
    
    * add missed imports [https://github.com/apache/incubator-heron/issues/2828]
    
    * package rename from com.twitter to org.apache; fix merge issues [https://github.com/apache/incubator-heron/issues/2828]
    
    * incorporate review changes, fix merges, on package rename
    
    * fix merge conflicts, from another PR and package rename
    
    * Resolve merge conflict errors
    
    * removed three inconsistent integration tests to pass the build
---
 ADOPTERS.md                                        |   2 +-
 deploy/docker/README.md                            |   8 +-
 deploy/docker/sandbox.sh                           |   2 +-
 deploy/kubernetes/general/README.md                |  16 +-
 deploy/kubernetes/general/apiserver.yaml           |   2 +-
 deploy/kubernetes/gke/gcs-apiserver.yaml           |   2 +-
 deploy/kubernetes/helm/Chart.yaml.template         |   4 +-
 deploy/kubernetes/helm/templates/NOTES.txt         |   2 +-
 deploy/kubernetes/helm/templates/tools.yaml        |   2 +-
 deploy/kubernetes/minikube/README.md               |  12 +-
 deploy/kubernetes/minikube/apiserver.yaml          |   2 +-
 docker/Readme.md                                   |   2 +-
 eco-heron-examples/src/java/BUILD                  |   2 +-
 .../twitter/heron/examples/eco/EvenAndOddBolt.java |  77 --
 .../twitter/heron/examples/eco/LogInfoBolt.java    |  41 --
 .../twitter/heron/examples/eco/RandomString.java   |  51 --
 .../heron/examples/eco/StatefulConsumerBolt.java   |  66 --
 .../heron/examples/eco/StatefulNumberSpout.java    |  83 ---
 .../heron/examples/eco/StatefulRandomIntSpout.java |  73 --
 .../heron/examples/eco/StatefulWindowSumBolt.java  |  67 --
 .../heron/examples/eco/TestFibonacciSpout.java     |  65 --
 .../heron/examples/eco/TestIBasicPrintBolt.java    |  68 --
 .../heron/examples/eco/TestNameCounter.java        |  61 --
 .../twitter/heron/examples/eco/TestNameSpout.java  |  81 ---
 .../twitter/heron/examples/eco/TestPrintBolt.java  |  33 -
 .../heron/examples/eco/TestPropertyHolder.java     |  48 --
 .../com/twitter/heron/examples/eco/TestUnits.java  |  33 -
 .../twitter/heron/examples/eco/TestWindowBolt.java |  46 --
 .../com/twitter/heron/examples/eco/WordSpout.java  |  64 --
 .../examples/eco/heron-stateful-windowing.yaml     |  52 --
 .../examples/eco/heron-stateful-word-count.yaml    |  38 -
 .../heron/examples/eco/heron_fibonacci.yaml        |  75 --
 .../heron/examples/eco/heron_windowing.yaml        |  66 --
 .../heron/examples/eco/heron_wordcount.yaml        |  73 --
 .../apache/heron/examples/eco/EvenAndOddBolt.java  |  76 ++
 .../org/apache/heron/examples/eco/LogInfoBolt.java |  41 ++
 .../apache/heron/examples/eco/RandomString.java    |  51 ++
 .../heron/examples/eco/StatefulConsumerBolt.java   |  66 ++
 .../heron/examples/eco/StatefulNumberSpout.java    |  83 +++
 .../heron/examples/eco/StatefulRandomIntSpout.java |  73 ++
 .../heron/examples/eco/StatefulWindowSumBolt.java  |  67 ++
 .../heron/examples/eco/TestFibonacciSpout.java     |  64 ++
 .../heron/examples/eco/TestIBasicPrintBolt.java    |  68 ++
 .../apache/heron/examples/eco/TestNameCounter.java |  62 ++
 .../apache/heron/examples/eco/TestNameSpout.java   |  81 +++
 .../apache/heron/examples/eco/TestPrintBolt.java   |  33 +
 .../heron/examples/eco/TestPropertyHolder.java     |  48 ++
 .../org/apache/heron/examples/eco/TestUnits.java   |  33 +
 .../apache/heron/examples/eco/TestWindowBolt.java  |  46 ++
 .../org/apache/heron/examples/eco/WordSpout.java   |  64 ++
 .../examples/eco/heron-stateful-windowing.yaml     |  52 ++
 .../examples/eco/heron-stateful-word-count.yaml    |  38 +
 .../apache/heron/examples/eco/heron_fibonacci.yaml |  75 ++
 .../apache/heron/examples/eco/heron_windowing.yaml |  66 ++
 .../apache/heron/examples/eco/heron_wordcount.yaml |  73 ++
 .../apache}/heron/examples/eco/sample.properties   |   0
 eco-storm-examples/src/java/BUILD                  |   2 +-
 .../twitter/heron/examples/eco/EvenAndOddBolt.java |  77 --
 .../twitter/heron/examples/eco/LogInfoBolt.java    |  41 --
 .../heron/examples/eco/TestFibonacciSpout.java     |  64 --
 .../heron/examples/eco/TestIBasicPrintBolt.java    |  68 --
 .../heron/examples/eco/TestNameCounter.java        |  61 --
 .../twitter/heron/examples/eco/TestNameSpout.java  |  81 ---
 .../twitter/heron/examples/eco/TestPrintBolt.java  |  33 -
 .../heron/examples/eco/TestPropertyHolder.java     |  48 --
 .../com/twitter/heron/examples/eco/TestUnits.java  |  33 -
 .../twitter/heron/examples/eco/TestWindowBolt.java |  46 --
 .../com/twitter/heron/examples/eco/fibonacci.yaml  |  74 --
 .../heron/examples/eco/simple_windowing.yaml       |  65 --
 .../heron/examples/eco/simple_wordcount.yaml       |  72 --
 .../apache/heron/examples/eco/EvenAndOddBolt.java  |  76 ++
 .../org/apache/heron/examples/eco/LogInfoBolt.java |  41 ++
 .../heron/examples/eco/TestFibonacciSpout.java     |  64 ++
 .../heron/examples/eco/TestIBasicPrintBolt.java    |  68 ++
 .../apache/heron/examples/eco/TestNameCounter.java |  62 ++
 .../apache/heron/examples/eco/TestNameSpout.java   |  81 +++
 .../apache/heron/examples/eco/TestPrintBolt.java   |  33 +
 .../heron/examples/eco/TestPropertyHolder.java     |  48 ++
 .../org/apache/heron/examples/eco/TestUnits.java   |  33 +
 .../apache/heron/examples/eco/TestWindowBolt.java  |  46 ++
 .../org/apache/heron/examples/eco/fibonacci.yaml   |  74 ++
 .../apache}/heron/examples/eco/sample.properties   |   0
 .../heron/examples/eco/simple_windowing.yaml       |  65 ++
 .../heron/examples/eco/simple_wordcount.yaml       |  72 ++
 eco/src/java/BUILD                                 |  14 +-
 eco/src/java/com/twitter/heron/eco/Eco.java        | 230 ------
 .../com/twitter/heron/eco/builder/BoltBuilder.java |  35 -
 .../twitter/heron/eco/builder/BuilderUtility.java  | 116 ---
 .../heron/eco/builder/ComponentBuilder.java        |  36 -
 .../twitter/heron/eco/builder/ConfigBuilder.java   | 202 ------
 .../twitter/heron/eco/builder/ObjectBuilder.java   | 311 --------
 .../heron/eco/builder/heron/EcoBuilder.java        |  79 --
 .../heron/eco/builder/heron/SpoutBuilder.java      |  43 --
 .../heron/eco/builder/heron/StreamBuilder.java     | 129 ----
 .../heron/eco/builder/storm/EcoBuilder.java        |  79 --
 .../heron/eco/builder/storm/SpoutBuilder.java      |  43 --
 .../heron/eco/builder/storm/StreamBuilder.java     | 129 ----
 .../heron/eco/definition/BeanDefinition.java       |  27 -
 .../heron/eco/definition/BeanListReference.java    |  30 -
 .../heron/eco/definition/BeanReference.java        |  30 -
 .../heron/eco/definition/BoltDefinition.java       |  17 -
 .../heron/eco/definition/ComponentStream.java      |  67 --
 .../definition/ConfigurationMethodDefinition.java  |  64 --
 .../heron/eco/definition/EcoExecutionContext.java  | 112 ---
 .../eco/definition/EcoTopologyDefinition.java      | 124 ----
 .../heron/eco/definition/GroupingDefinition.java   |  65 --
 .../heron/eco/definition/ObjectDefinition.java     | 106 ---
 .../heron/eco/definition/PropertyDefinition.java   |  55 --
 .../heron/eco/definition/SpoutDefinition.java      |  17 -
 .../heron/eco/definition/StreamDefinition.java     |  63 --
 .../com/twitter/heron/eco/parser/EcoParser.java    |  94 ---
 .../com/twitter/heron/eco/submit/EcoSubmitter.java |  39 -
 eco/src/java/org/apache/heron/eco/Eco.java         | 228 ++++++
 .../org/apache/heron/eco/builder/BoltBuilder.java  |  35 +
 .../apache/heron/eco/builder/BuilderUtility.java   | 116 +++
 .../apache/heron/eco/builder/ComponentBuilder.java |  36 +
 .../apache/heron/eco/builder/ConfigBuilder.java    | 201 ++++++
 .../apache/heron/eco/builder/ObjectBuilder.java    | 311 ++++++++
 .../apache/heron/eco/builder/heron/EcoBuilder.java |  77 ++
 .../heron/eco/builder/heron/SpoutBuilder.java      |  40 ++
 .../heron/eco/builder/heron/StreamBuilder.java     | 127 ++++
 .../apache/heron/eco/builder/storm/EcoBuilder.java |  76 ++
 .../heron/eco/builder/storm/SpoutBuilder.java      |  40 ++
 .../heron/eco/builder/storm/StreamBuilder.java     | 127 ++++
 .../heron/eco/definition/BeanDefinition.java       |  27 +
 .../heron/eco/definition/BeanListReference.java    |  30 +
 .../apache/heron/eco/definition/BeanReference.java |  30 +
 .../heron/eco/definition/BoltDefinition.java       |  17 +
 .../heron/eco/definition/ComponentStream.java      |  67 ++
 .../definition/ConfigurationMethodDefinition.java  |  64 ++
 .../heron/eco/definition/EcoExecutionContext.java  | 111 +++
 .../eco/definition/EcoTopologyDefinition.java      | 124 ++++
 .../heron/eco/definition/GroupingDefinition.java   |  65 ++
 .../heron/eco/definition/ObjectDefinition.java     | 105 +++
 .../heron/eco/definition/PropertyDefinition.java   |  55 ++
 .../heron/eco/definition/SpoutDefinition.java      |  17 +
 .../heron/eco/definition/StreamDefinition.java     |  63 ++
 .../org/apache/heron/eco/parser/EcoParser.java     |  94 +++
 .../org/apache/heron/eco/submit/EcoSubmitter.java  |  37 +
 eco/tests/java/BUILD                               |  28 +-
 eco/tests/java/com/twitter/heron/eco/EcoTest.java  |  98 ---
 .../twitter/heron/eco/builder/BoltBuilderTest.java |  89 ---
 .../heron/eco/builder/BuilderUtilityTest.java      | 139 ----
 .../heron/eco/builder/ComponentBuilderTest.java    |  89 ---
 .../heron/eco/builder/ConfigBuilderTest.java       | 341 ---------
 .../heron/eco/builder/ObjectBuilderTest.java       | 159 -----
 .../eco/builder/heron/HeronEcoBuilderTest.java     | 133 ----
 .../eco/builder/heron/HeronSpoutBuilderTest.java   | 161 -----
 .../eco/builder/heron/HeronStreamBuilderTest.java  | 370 ----------
 .../eco/builder/storm/StormEcoBuilderTest.java     | 132 ----
 .../eco/builder/storm/StormSpoutBuilderTest.java   | 161 -----
 .../eco/builder/storm/StormStreamBuilderTest.java  | 372 ----------
 .../twitter/heron/eco/parser/EcoParserTest.java    | 477 -------------
 .../twitter/heron/eco/submit/EcoSubmitterTest.java |  74 --
 eco/tests/java/org/apache/heron/eco/EcoTest.java   |  98 +++
 .../apache/heron/eco/builder/BoltBuilderTest.java  |  89 +++
 .../heron/eco/builder/BuilderUtilityTest.java      | 137 ++++
 .../heron/eco/builder/ComponentBuilderTest.java    |  89 +++
 .../heron/eco/builder/ConfigBuilderTest.java       | 341 +++++++++
 .../heron/eco/builder/ObjectBuilderTest.java       | 158 ++++
 .../eco/builder/heron/HeronEcoBuilderTest.java     | 131 ++++
 .../eco/builder/heron/HeronSpoutBuilderTest.java   | 160 +++++
 .../eco/builder/heron/HeronStreamBuilderTest.java  | 369 ++++++++++
 .../eco/builder/storm/StormEcoBuilderTest.java     | 131 ++++
 .../eco/builder/storm/StormSpoutBuilderTest.java   | 160 +++++
 .../eco/builder/storm/StormStreamBuilderTest.java  | 371 ++++++++++
 .../org/apache/heron/eco/parser/EcoParserTest.java | 479 +++++++++++++
 .../apache/heron/eco/submit/EcoSubmitterTest.java  |  73 ++
 examples/src/java/BUILD                            |   4 +-
 .../twitter/heron/examples/api/AckingTopology.java | 170 -----
 .../examples/api/ComponentJVMOptionsTopology.java  | 122 ----
 .../heron/examples/api/CustomGroupingTopology.java | 109 ---
 .../heron/examples/api/ExampleResources.java       |  37 -
 .../heron/examples/api/ExclamationTopology.java    | 136 ----
 .../api/MultiSpoutExclamationTopology.java         | 111 ---
 .../examples/api/MultiStageAckingTopology.java     | 184 -----
 .../examples/api/SentenceWordCountTopology.java    | 190 -----
 .../heron/examples/api/SlidingWindowTopology.java  | 113 ---
 .../api/StatefulSlidingWindowTopology.java         | 175 -----
 .../examples/api/StatefulWordCountTopology.java    | 215 ------
 .../heron/examples/api/TaskHookTopology.java       | 288 --------
 .../examples/api/WindowedWordCountTopology.java    | 134 ----
 .../heron/examples/api/WordCountTopology.java      | 194 -----
 .../heron/examples/api/bolt/PrinterBolt.java       |  34 -
 .../examples/api/bolt/SlidingWindowSumBolt.java    |  78 --
 .../examples/api/spout/RandomIntegerSpout.java     |  70 --
 .../heron/examples/api/spout/TestWordSpout.java    |  75 --
 .../examples/streamlet/FilesystemSinkTopology.java | 141 ----
 .../streamlet/FormattedOutputTopology.java         | 113 ---
 .../streamlet/ImpressionsAndClicksTopology.java    | 197 -----
 .../streamlet/IntegerProcessingTopology.java       |  73 --
 .../examples/streamlet/RepartitionTopology.java    | 111 ---
 .../streamlet/SimplePulsarSourceTopology.java      | 126 ----
 .../examples/streamlet/SmartWatchTopology.java     | 123 ----
 .../examples/streamlet/StreamletCloneTopology.java | 158 ----
 .../examples/streamlet/TransformsTopology.java     | 122 ----
 .../streamlet/WindowedWordCountTopology.java       |  96 ---
 .../examples/streamlet/WireRequestsTopology.java   | 193 -----
 .../examples/streamlet/utils/StreamletUtils.java   |  69 --
 .../apache/heron/examples/api/AckingTopology.java  | 170 +++++
 .../examples/api/ComponentJVMOptionsTopology.java  | 122 ++++
 .../heron/examples/api/CustomGroupingTopology.java | 109 +++
 .../heron/examples/api/ExampleResources.java       |  37 +
 .../heron/examples/api/ExclamationTopology.java    | 136 ++++
 .../api/MultiSpoutExclamationTopology.java         | 111 +++
 .../examples/api/MultiStageAckingTopology.java     | 184 +++++
 .../examples/api/SentenceWordCountTopology.java    | 190 +++++
 .../heron/examples/api/SlidingWindowTopology.java  | 113 +++
 .../api/StatefulSlidingWindowTopology.java         | 175 +++++
 .../examples/api/StatefulWordCountTopology.java    | 215 ++++++
 .../heron/examples/api/TaskHookTopology.java       | 288 ++++++++
 .../examples/api/WindowedWordCountTopology.java    | 134 ++++
 .../heron/examples/api/WordCountTopology.java      | 194 +++++
 .../heron/examples/api/bolt/PrinterBolt.java       |  34 +
 .../examples/api/bolt/SlidingWindowSumBolt.java    |  78 ++
 .../examples/api/spout/RandomIntegerSpout.java     |  70 ++
 .../heron/examples/api/spout/TestWordSpout.java    |  75 ++
 .../examples/streamlet/FilesystemSinkTopology.java | 141 ++++
 .../streamlet/FormattedOutputTopology.java         | 113 +++
 .../streamlet/ImpressionsAndClicksTopology.java    | 197 +++++
 .../streamlet/IntegerProcessingTopology.java       |  73 ++
 .../examples/streamlet/RepartitionTopology.java    | 111 +++
 .../streamlet/SimplePulsarSourceTopology.java      | 125 ++++
 .../examples/streamlet/SmartWatchTopology.java     | 123 ++++
 .../examples/streamlet/StreamletCloneTopology.java | 158 ++++
 .../examples/streamlet/TransformsTopology.java     | 122 ++++
 .../streamlet/WindowedWordCountTopology.java       |  96 +++
 .../examples/streamlet/WireRequestsTopology.java   | 193 +++++
 .../examples/streamlet/utils/StreamletUtils.java   |  69 ++
 examples/src/scala/BUILD                           |   4 +-
 .../com/twitter/heron/examples/SomeHeronBolt.scala |  60 --
 .../com/twitter/heron/examples/SomeStormBolt.scala |  60 --
 .../scala/ScalaClassicalMusicTopology.scala        | 105 ---
 .../scala/ScalaIntegerProcessingTopology.scala     |  71 --
 .../streamlet/scala/ScalaRepartitionTopology.scala |  82 ---
 .../scala/ScalaTransformsAndCloneTopology.scala    | 105 ---
 .../scala/ScalaWindowedWordCountTopology.scala     |  80 ---
 .../scala/common/ScalaTopologyExampleUtils.scala   |  32 -
 examples/src/scala/compile.sh                      |   2 +-
 .../org/apache/heron/examples/SomeHeronBolt.scala  |  60 ++
 .../org/apache/heron/examples/SomeStormBolt.scala  |  60 ++
 .../scala/ScalaClassicalMusicTopology.scala        | 105 +++
 .../scala/ScalaIntegerProcessingTopology.scala     |  71 ++
 .../streamlet/scala/ScalaRepartitionTopology.scala |  82 +++
 .../scala/ScalaTransformsAndCloneTopology.scala    | 105 +++
 .../scala/ScalaWindowedWordCountTopology.scala     |  80 +++
 .../scala/common/ScalaTopologyExampleUtils.scala   |  32 +
 .../services/javax.annotation.processing.Processor |   2 +-
 heron/api/src/cpp/spout/ispout.h                   |   2 +-
 heron/api/src/java/BUILD                           |  12 +-
 .../api/src/java/com/twitter/heron/api/Config.java | 793 ---------------------
 .../src/java/com/twitter/heron/api/Constants.java  |  42 --
 .../java/com/twitter/heron/api/HeronSubmitter.java | 157 ----
 .../java/com/twitter/heron/api/HeronTopology.java  | 115 ---
 heron/api/src/java/com/twitter/heron/api/Pair.java | 126 ----
 .../com/twitter/heron/api/bolt/BaseBasicBolt.java  |  52 --
 .../com/twitter/heron/api/bolt/BaseRichBolt.java   |  44 --
 .../heron/api/bolt/BaseStatefulWindowedBolt.java   | 153 ----
 .../twitter/heron/api/bolt/BaseWindowedBolt.java   | 360 ----------
 .../twitter/heron/api/bolt/BasicBoltExecutor.java  | 106 ---
 .../heron/api/bolt/BasicOutputCollector.java       |  77 --
 .../com/twitter/heron/api/bolt/IBasicBolt.java     |  53 --
 .../heron/api/bolt/IBasicOutputCollector.java      |  44 --
 .../src/java/com/twitter/heron/api/bolt/IBolt.java | 102 ---
 .../com/twitter/heron/api/bolt/IErrorReporter.java |  38 -
 .../twitter/heron/api/bolt/IOutputCollector.java   |  52 --
 .../java/com/twitter/heron/api/bolt/IRichBolt.java |  45 --
 .../heron/api/bolt/IStatefulWindowedBolt.java      |  23 -
 .../com/twitter/heron/api/bolt/IWindowedBolt.java  |  69 --
 .../twitter/heron/api/bolt/OutputCollector.java    | 246 -------
 .../api/bolt/StatefulWindowedBoltExecutor.java     |  57 --
 .../heron/api/bolt/WindowedBoltExecutor.java       | 496 -------------
 .../heron/api/exception/AlreadyAliveException.java |  38 -
 .../heron/api/exception/FailedException.java       |  54 --
 .../api/exception/InvalidTopologyException.java    |  46 --
 .../api/exception/ReportedFailedException.java     |  54 --
 .../api/exception/TopologySubmissionException.java |  31 -
 .../heron/api/grouping/CustomStreamGrouping.java   |  63 --
 .../com/twitter/heron/api/hooks/BaseTaskHook.java  |  78 --
 .../com/twitter/heron/api/hooks/ITaskHook.java     |  87 ---
 .../twitter/heron/api/hooks/info/BoltAckInfo.java  |  62 --
 .../heron/api/hooks/info/BoltExecuteInfo.java      |  62 --
 .../twitter/heron/api/hooks/info/BoltFailInfo.java |  62 --
 .../com/twitter/heron/api/hooks/info/EmitInfo.java |  67 --
 .../twitter/heron/api/hooks/info/SpoutAckInfo.java |  60 --
 .../heron/api/hooks/info/SpoutFailInfo.java        |  60 --
 .../twitter/heron/api/metric/AssignableMetric.java |  51 --
 .../twitter/heron/api/metric/CombinedMetric.java   |  55 --
 .../heron/api/metric/ConcurrentCountMetric.java    |  56 --
 .../com/twitter/heron/api/metric/CountMetric.java  |  60 --
 .../heron/api/metric/CountStatAndMetric.java       | 231 ------
 .../twitter/heron/api/metric/GlobalMetrics.java    | 124 ----
 .../com/twitter/heron/api/metric/ICombiner.java    |  44 --
 .../java/com/twitter/heron/api/metric/IMetric.java |  42 --
 .../twitter/heron/api/metric/IMetricsRegister.java |  47 --
 .../com/twitter/heron/api/metric/IReducer.java     |  48 --
 .../heron/api/metric/LatencyStatAndMetric.java     | 286 --------
 .../com/twitter/heron/api/metric/MeanReducer.java  |  54 --
 .../twitter/heron/api/metric/MeanReducerState.java |  39 -
 .../twitter/heron/api/metric/MetricStatTimer.java  |  48 --
 .../heron/api/metric/MultiAssignableMetric.java    |  76 --
 .../twitter/heron/api/metric/MultiCountMetric.java |  61 --
 .../heron/api/metric/MultiReducedMetric.java       |  71 --
 .../twitter/heron/api/metric/ReducedMetric.java    |  61 --
 .../heron/api/serializer/IPluggableSerializer.java |  44 --
 .../heron/api/serializer/JavaSerializer.java       |  72 --
 .../com/twitter/heron/api/spout/BaseRichSpout.java |  60 --
 .../heron/api/spout/IMultiSchemableSpout.java      |  40 --
 .../com/twitter/heron/api/spout/IRichSpout.java    |  45 --
 .../twitter/heron/api/spout/ISchemableSpout.java   |  41 --
 .../java/com/twitter/heron/api/spout/ISpout.java   | 123 ----
 .../heron/api/spout/ISpoutOutputCollector.java     |  48 --
 .../com/twitter/heron/api/spout/MultiScheme.java   |  45 --
 .../twitter/heron/api/spout/RawMultiScheme.java    |  55 --
 .../com/twitter/heron/api/spout/RawScheme.java     |  52 --
 .../java/com/twitter/heron/api/spout/Scheme.java   |  46 --
 .../heron/api/spout/SchemeAsMultiScheme.java       |  63 --
 .../heron/api/spout/SpoutOutputCollector.java      | 153 ----
 .../com/twitter/heron/api/state/HashMapState.java  |  45 --
 .../java/com/twitter/heron/api/state/State.java    |  45 --
 .../twitter/heron/api/topology/BaseComponent.java  |  45 --
 .../heron/api/topology/BaseComponentDeclarer.java  |  83 ---
 .../api/topology/BaseConfigurationDeclarer.java    |  63 --
 .../twitter/heron/api/topology/BoltDeclarer.java   | 202 ------
 .../topology/ComponentConfigurationDeclarer.java   |  46 --
 .../heron/api/topology/GeneralTopologyContext.java | 128 ----
 .../com/twitter/heron/api/topology/IComponent.java |  59 --
 .../heron/api/topology/IStatefulComponent.java     |  66 --
 .../com/twitter/heron/api/topology/IUpdatable.java |  48 --
 .../heron/api/topology/OutputFieldsDeclarer.java   |  49 --
 .../heron/api/topology/OutputFieldsGetter.java     |  78 --
 .../twitter/heron/api/topology/SpoutDeclarer.java  |  75 --
 .../heron/api/topology/TopologyBuilder.java        | 299 --------
 .../heron/api/topology/TopologyContext.java        | 127 ----
 .../java/com/twitter/heron/api/tuple/Fields.java   | 119 ----
 .../java/com/twitter/heron/api/tuple/Tuple.java    | 198 -----
 .../java/com/twitter/heron/api/tuple/Values.java   |  54 --
 .../api/utils/DefaultMaxSpoutPendingTuner.java     | 204 ------
 .../com/twitter/heron/api/utils/TopologyUtils.java | 361 ----------
 .../com/twitter/heron/api/utils/TupleUtils.java    |  48 --
 .../java/com/twitter/heron/api/utils/Utils.java    | 172 -----
 .../api/windowing/DefaultEvictionContext.java      |  97 ---
 .../com/twitter/heron/api/windowing/Event.java     |  66 --
 .../com/twitter/heron/api/windowing/EventImpl.java |  66 --
 .../heron/api/windowing/EvictionContext.java       |  70 --
 .../heron/api/windowing/EvictionPolicy.java        | 118 ---
 .../heron/api/windowing/TimestampExtractor.java    |  50 --
 .../heron/api/windowing/TriggerHandler.java        |  46 --
 .../twitter/heron/api/windowing/TriggerPolicy.java | 111 ---
 .../windowing/TupleFieldTimestampExtractor.java    |  61 --
 .../twitter/heron/api/windowing/TupleWindow.java   |  42 --
 .../heron/api/windowing/TupleWindowImpl.java       | 118 ---
 .../heron/api/windowing/WaterMarkEvent.java        |  57 --
 .../api/windowing/WaterMarkEventGenerator.java     | 127 ----
 .../com/twitter/heron/api/windowing/Window.java    |  83 ---
 .../api/windowing/WindowLifecycleListener.java     |  62 --
 .../twitter/heron/api/windowing/WindowManager.java | 376 ----------
 .../heron/api/windowing/WindowingConfigs.java      | 176 -----
 .../windowing/evictors/CountEvictionPolicy.java    | 114 ---
 .../api/windowing/evictors/TimeEvictionPolicy.java | 129 ----
 .../evictors/WatermarkCountEvictionPolicy.java     | 143 ----
 .../evictors/WatermarkTimeEvictionPolicy.java      | 104 ---
 .../triggers/AbstractBaseTriggerPolicy.java        | 107 ---
 .../api/windowing/triggers/CountTriggerPolicy.java |  95 ---
 .../api/windowing/triggers/TimeTriggerPolicy.java  | 104 ---
 .../triggers/WatermarkCountTriggerPolicy.java      | 106 ---
 .../triggers/WatermarkTimeTriggerPolicy.java       | 141 ----
 .../classification/HeronAnnotationProcessor.java   |  65 --
 .../heron/classification/InterfaceAudience.java    |  71 --
 .../heron/classification/InterfaceStability.java   |  62 --
 .../java/com/twitter/heron/streamlet/Builder.java  |  42 --
 .../java/com/twitter/heron/streamlet/Config.java   | 278 --------
 .../java/com/twitter/heron/streamlet/Context.java  |  66 --
 .../java/com/twitter/heron/streamlet/JoinType.java |  43 --
 .../java/com/twitter/heron/streamlet/KeyValue.java |  59 --
 .../com/twitter/heron/streamlet/KeyedWindow.java   |  48 --
 .../java/com/twitter/heron/streamlet/Runner.java   |  46 --
 .../heron/streamlet/SerializableBiFunction.java    |  29 -
 .../streamlet/SerializableBinaryOperator.java      |  25 -
 .../heron/streamlet/SerializableConsumer.java      |  28 -
 .../heron/streamlet/SerializableFunction.java      |  29 -
 .../heron/streamlet/SerializablePredicate.java     |  28 -
 .../heron/streamlet/SerializableSupplier.java      |  28 -
 .../heron/streamlet/SerializableTransformer.java   |  30 -
 .../src/java/com/twitter/heron/streamlet/Sink.java |  29 -
 .../java/com/twitter/heron/streamlet/Source.java   |  30 -
 .../com/twitter/heron/streamlet/Streamlet.java     | 220 ------
 .../java/com/twitter/heron/streamlet/Window.java   |  56 --
 .../com/twitter/heron/streamlet/WindowConfig.java  |  81 ---
 .../twitter/heron/streamlet/impl/BuilderImpl.java  |  76 --
 .../twitter/heron/streamlet/impl/ContextImpl.java  |  86 ---
 .../heron/streamlet/impl/KryoSerializer.java       | 105 ---
 .../heron/streamlet/impl/StreamletImpl.java        | 491 -------------
 .../heron/streamlet/impl/WindowConfigImpl.java     |  73 --
 .../impl/groupings/JoinCustomGrouping.java         |  53 --
 .../ReduceByKeyAndWindowCustomGrouping.java        |  55 --
 .../impl/groupings/RemapCustomGrouping.java        |  55 --
 .../streamlet/impl/operators/FilterOperator.java   |  56 --
 .../streamlet/impl/operators/FlatMapOperator.java  |  58 --
 .../GeneralReduceByKeyAndWindowOperator.java       |  94 ---
 .../streamlet/impl/operators/JoinOperator.java     | 199 ------
 .../streamlet/impl/operators/MapOperator.java      |  54 --
 .../operators/ReduceByKeyAndWindowOperator.java    |  96 ---
 .../impl/operators/StreamletOperator.java          |  50 --
 .../impl/operators/StreamletWindowOperator.java    |  39 -
 .../impl/operators/TransformOperator.java          |  73 --
 .../streamlet/impl/operators/UnionOperator.java    |  48 --
 .../heron/streamlet/impl/sinks/ComplexSink.java    |  64 --
 .../heron/streamlet/impl/sinks/ConsumerSink.java   |  51 --
 .../heron/streamlet/impl/sinks/LogSink.java        |  50 --
 .../streamlet/impl/sources/ComplexSource.java      |  68 --
 .../streamlet/impl/sources/StreamletSource.java    |  51 --
 .../streamlet/impl/sources/SupplierSource.java     |  49 --
 .../impl/streamlets/ConsumerStreamlet.java         |  46 --
 .../streamlet/impl/streamlets/FilterStreamlet.java |  45 --
 .../impl/streamlets/FlatMapStreamlet.java          |  48 --
 .../GeneralReduceByKeyAndWindowStreamlet.java      |  69 --
 .../streamlet/impl/streamlets/JoinStreamlet.java   |  93 ---
 .../streamlet/impl/streamlets/LogStreamlet.java    |  43 --
 .../streamlet/impl/streamlets/MapStreamlet.java    |  45 --
 .../streamlets/ReduceByKeyAndWindowStreamlet.java  |  69 --
 .../streamlet/impl/streamlets/RemapStreamlet.java  |  52 --
 .../streamlet/impl/streamlets/SinkStreamlet.java   |  46 --
 .../streamlet/impl/streamlets/SourceStreamlet.java |  43 --
 .../impl/streamlets/SupplierStreamlet.java         |  43 --
 .../impl/streamlets/TransformStreamlet.java        |  48 --
 .../streamlet/impl/streamlets/UnionStreamlet.java  |  49 --
 .../api/src/java/org/apache/heron/api/Config.java  | 793 +++++++++++++++++++++
 .../src/java/org/apache/heron/api/Constants.java   |  42 ++
 .../java/org/apache/heron/api/HeronSubmitter.java  | 157 ++++
 .../java/org/apache/heron/api/HeronTopology.java   | 115 +++
 heron/api/src/java/org/apache/heron/api/Pair.java  | 126 ++++
 .../org/apache/heron/api/bolt/BaseBasicBolt.java   |  52 ++
 .../org/apache/heron/api/bolt/BaseRichBolt.java    |  44 ++
 .../heron/api/bolt/BaseStatefulWindowedBolt.java   | 153 ++++
 .../apache/heron/api/bolt/BaseWindowedBolt.java    | 360 ++++++++++
 .../apache/heron/api/bolt/BasicBoltExecutor.java   | 106 +++
 .../heron/api/bolt/BasicOutputCollector.java       |  77 ++
 .../java/org/apache/heron/api/bolt/IBasicBolt.java |  53 ++
 .../heron/api/bolt/IBasicOutputCollector.java      |  44 ++
 .../src/java/org/apache/heron/api/bolt/IBolt.java  | 102 +++
 .../org/apache/heron/api/bolt/IErrorReporter.java  |  38 +
 .../apache/heron/api/bolt/IOutputCollector.java    |  52 ++
 .../java/org/apache/heron/api/bolt/IRichBolt.java  |  45 ++
 .../heron/api/bolt/IStatefulWindowedBolt.java      |  23 +
 .../org/apache/heron/api/bolt/IWindowedBolt.java   |  69 ++
 .../org/apache/heron/api/bolt/OutputCollector.java | 246 +++++++
 .../api/bolt/StatefulWindowedBoltExecutor.java     |  57 ++
 .../heron/api/bolt/WindowedBoltExecutor.java       | 496 +++++++++++++
 .../heron/api/exception/AlreadyAliveException.java |  38 +
 .../heron/api/exception/FailedException.java       |  54 ++
 .../api/exception/InvalidTopologyException.java    |  46 ++
 .../api/exception/ReportedFailedException.java     |  54 ++
 .../api/exception/TopologySubmissionException.java |  31 +
 .../heron/api/grouping/CustomStreamGrouping.java   |  63 ++
 .../org/apache/heron/api/hooks/BaseTaskHook.java   |  78 ++
 .../java/org/apache/heron/api/hooks/ITaskHook.java |  87 +++
 .../apache/heron/api/hooks/info/BoltAckInfo.java   |  62 ++
 .../heron/api/hooks/info/BoltExecuteInfo.java      |  62 ++
 .../apache/heron/api/hooks/info/BoltFailInfo.java  |  62 ++
 .../org/apache/heron/api/hooks/info/EmitInfo.java  |  67 ++
 .../apache/heron/api/hooks/info/SpoutAckInfo.java  |  60 ++
 .../apache/heron/api/hooks/info/SpoutFailInfo.java |  60 ++
 .../apache/heron/api/metric/AssignableMetric.java  |  51 ++
 .../apache/heron/api/metric/CombinedMetric.java    |  55 ++
 .../heron/api/metric/ConcurrentCountMetric.java    |  56 ++
 .../org/apache/heron/api/metric/CountMetric.java   |  60 ++
 .../heron/api/metric/CountStatAndMetric.java       | 231 ++++++
 .../org/apache/heron/api/metric/GlobalMetrics.java | 124 ++++
 .../org/apache/heron/api/metric/ICombiner.java     |  44 ++
 .../java/org/apache/heron/api/metric/IMetric.java  |  42 ++
 .../apache/heron/api/metric/IMetricsRegister.java  |  47 ++
 .../java/org/apache/heron/api/metric/IReducer.java |  48 ++
 .../heron/api/metric/LatencyStatAndMetric.java     | 286 ++++++++
 .../org/apache/heron/api/metric/MeanReducer.java   |  54 ++
 .../apache/heron/api/metric/MeanReducerState.java  |  39 +
 .../apache/heron/api/metric/MetricStatTimer.java   |  48 ++
 .../heron/api/metric/MultiAssignableMetric.java    |  76 ++
 .../apache/heron/api/metric/MultiCountMetric.java  |  61 ++
 .../heron/api/metric/MultiReducedMetric.java       |  71 ++
 .../org/apache/heron/api/metric/ReducedMetric.java |  61 ++
 .../heron/api/serializer/IPluggableSerializer.java |  44 ++
 .../heron/api/serializer/JavaSerializer.java       |  72 ++
 .../org/apache/heron/api/spout/BaseRichSpout.java  |  60 ++
 .../heron/api/spout/IMultiSchemableSpout.java      |  40 ++
 .../org/apache/heron/api/spout/IRichSpout.java     |  45 ++
 .../apache/heron/api/spout/ISchemableSpout.java    |  41 ++
 .../java/org/apache/heron/api/spout/ISpout.java    | 123 ++++
 .../heron/api/spout/ISpoutOutputCollector.java     |  48 ++
 .../org/apache/heron/api/spout/MultiScheme.java    |  45 ++
 .../org/apache/heron/api/spout/RawMultiScheme.java |  55 ++
 .../java/org/apache/heron/api/spout/RawScheme.java |  52 ++
 .../java/org/apache/heron/api/spout/Scheme.java    |  46 ++
 .../heron/api/spout/SchemeAsMultiScheme.java       |  63 ++
 .../heron/api/spout/SpoutOutputCollector.java      | 153 ++++
 .../org/apache/heron/api/state/HashMapState.java   |  45 ++
 .../src/java/org/apache/heron/api/state/State.java |  45 ++
 .../apache/heron/api/topology/BaseComponent.java   |  45 ++
 .../heron/api/topology/BaseComponentDeclarer.java  |  83 +++
 .../api/topology/BaseConfigurationDeclarer.java    |  63 ++
 .../apache/heron/api/topology/BoltDeclarer.java    | 202 ++++++
 .../topology/ComponentConfigurationDeclarer.java   |  46 ++
 .../heron/api/topology/GeneralTopologyContext.java | 128 ++++
 .../org/apache/heron/api/topology/IComponent.java  |  59 ++
 .../heron/api/topology/IStatefulComponent.java     |  66 ++
 .../org/apache/heron/api/topology/IUpdatable.java  |  48 ++
 .../heron/api/topology/OutputFieldsDeclarer.java   |  49 ++
 .../heron/api/topology/OutputFieldsGetter.java     |  78 ++
 .../apache/heron/api/topology/SpoutDeclarer.java   |  75 ++
 .../apache/heron/api/topology/TopologyBuilder.java | 299 ++++++++
 .../apache/heron/api/topology/TopologyContext.java | 127 ++++
 .../java/org/apache/heron/api/tuple/Fields.java    | 119 ++++
 .../src/java/org/apache/heron/api/tuple/Tuple.java | 198 +++++
 .../java/org/apache/heron/api/tuple/Values.java    |  54 ++
 .../api/utils/DefaultMaxSpoutPendingTuner.java     | 204 ++++++
 .../org/apache/heron/api/utils/TopologyUtils.java  | 361 ++++++++++
 .../org/apache/heron/api/utils/TupleUtils.java     |  48 ++
 .../src/java/org/apache/heron/api/utils/Utils.java | 172 +++++
 .../api/windowing/DefaultEvictionContext.java      |  97 +++
 .../java/org/apache/heron/api/windowing/Event.java |  66 ++
 .../org/apache/heron/api/windowing/EventImpl.java  |  66 ++
 .../heron/api/windowing/EvictionContext.java       |  70 ++
 .../apache/heron/api/windowing/EvictionPolicy.java | 118 +++
 .../heron/api/windowing/TimestampExtractor.java    |  50 ++
 .../apache/heron/api/windowing/TriggerHandler.java |  46 ++
 .../apache/heron/api/windowing/TriggerPolicy.java  | 111 +++
 .../windowing/TupleFieldTimestampExtractor.java    |  61 ++
 .../apache/heron/api/windowing/TupleWindow.java    |  42 ++
 .../heron/api/windowing/TupleWindowImpl.java       | 118 +++
 .../apache/heron/api/windowing/WaterMarkEvent.java |  57 ++
 .../api/windowing/WaterMarkEventGenerator.java     | 127 ++++
 .../org/apache/heron/api/windowing/Window.java     |  83 +++
 .../api/windowing/WindowLifecycleListener.java     |  62 ++
 .../apache/heron/api/windowing/WindowManager.java  | 376 ++++++++++
 .../heron/api/windowing/WindowingConfigs.java      | 176 +++++
 .../windowing/evictors/CountEvictionPolicy.java    | 114 +++
 .../api/windowing/evictors/TimeEvictionPolicy.java | 129 ++++
 .../evictors/WatermarkCountEvictionPolicy.java     | 143 ++++
 .../evictors/WatermarkTimeEvictionPolicy.java      | 104 +++
 .../triggers/AbstractBaseTriggerPolicy.java        | 107 +++
 .../api/windowing/triggers/CountTriggerPolicy.java |  95 +++
 .../api/windowing/triggers/TimeTriggerPolicy.java  | 104 +++
 .../triggers/WatermarkCountTriggerPolicy.java      | 106 +++
 .../triggers/WatermarkTimeTriggerPolicy.java       | 141 ++++
 .../classification/HeronAnnotationProcessor.java   |  65 ++
 .../heron/classification/InterfaceAudience.java    |  71 ++
 .../heron/classification/InterfaceStability.java   |  62 ++
 .../java/org/apache/heron/streamlet/Builder.java   |  42 ++
 .../java/org/apache/heron/streamlet/Config.java    | 278 ++++++++
 .../java/org/apache/heron/streamlet/Context.java   |  66 ++
 .../java/org/apache/heron/streamlet/JoinType.java  |  43 ++
 .../java/org/apache/heron/streamlet/KeyValue.java  |  59 ++
 .../org/apache/heron/streamlet/KeyedWindow.java    |  48 ++
 .../java/org/apache/heron/streamlet/Runner.java    |  46 ++
 .../heron/streamlet/SerializableBiFunction.java    |  29 +
 .../streamlet/SerializableBinaryOperator.java      |  25 +
 .../heron/streamlet/SerializableConsumer.java      |  28 +
 .../heron/streamlet/SerializableFunction.java      |  29 +
 .../heron/streamlet/SerializablePredicate.java     |  28 +
 .../heron/streamlet/SerializableSupplier.java      |  28 +
 .../heron/streamlet/SerializableTransformer.java   |  30 +
 .../src/java/org/apache/heron/streamlet/Sink.java  |  29 +
 .../java/org/apache/heron/streamlet/Source.java    |  30 +
 .../java/org/apache/heron/streamlet/Streamlet.java | 220 ++++++
 .../java/org/apache/heron/streamlet/Window.java    |  56 ++
 .../org/apache/heron/streamlet/WindowConfig.java   |  81 +++
 .../apache/heron/streamlet/impl/BuilderImpl.java   |  76 ++
 .../apache/heron/streamlet/impl/ContextImpl.java   |  86 +++
 .../heron/streamlet/impl/KryoSerializer.java       | 105 +++
 .../apache/heron/streamlet/impl/StreamletImpl.java | 491 +++++++++++++
 .../heron/streamlet/impl/WindowConfigImpl.java     |  73 ++
 .../impl/groupings/JoinCustomGrouping.java         |  53 ++
 .../ReduceByKeyAndWindowCustomGrouping.java        |  55 ++
 .../impl/groupings/RemapCustomGrouping.java        |  55 ++
 .../streamlet/impl/operators/FilterOperator.java   |  56 ++
 .../streamlet/impl/operators/FlatMapOperator.java  |  58 ++
 .../GeneralReduceByKeyAndWindowOperator.java       |  94 +++
 .../streamlet/impl/operators/JoinOperator.java     | 199 ++++++
 .../streamlet/impl/operators/MapOperator.java      |  54 ++
 .../operators/ReduceByKeyAndWindowOperator.java    |  96 +++
 .../impl/operators/StreamletOperator.java          |  50 ++
 .../impl/operators/StreamletWindowOperator.java    |  39 +
 .../impl/operators/TransformOperator.java          |  73 ++
 .../streamlet/impl/operators/UnionOperator.java    |  48 ++
 .../heron/streamlet/impl/sinks/ComplexSink.java    |  64 ++
 .../heron/streamlet/impl/sinks/ConsumerSink.java   |  51 ++
 .../apache/heron/streamlet/impl/sinks/LogSink.java |  50 ++
 .../streamlet/impl/sources/ComplexSource.java      |  68 ++
 .../streamlet/impl/sources/StreamletSource.java    |  51 ++
 .../streamlet/impl/sources/SupplierSource.java     |  49 ++
 .../impl/streamlets/ConsumerStreamlet.java         |  46 ++
 .../streamlet/impl/streamlets/FilterStreamlet.java |  45 ++
 .../impl/streamlets/FlatMapStreamlet.java          |  48 ++
 .../GeneralReduceByKeyAndWindowStreamlet.java      |  69 ++
 .../streamlet/impl/streamlets/JoinStreamlet.java   |  93 +++
 .../streamlet/impl/streamlets/LogStreamlet.java    |  43 ++
 .../streamlet/impl/streamlets/MapStreamlet.java    |  45 ++
 .../streamlets/ReduceByKeyAndWindowStreamlet.java  |  69 ++
 .../streamlet/impl/streamlets/RemapStreamlet.java  |  52 ++
 .../streamlet/impl/streamlets/SinkStreamlet.java   |  46 ++
 .../streamlet/impl/streamlets/SourceStreamlet.java |  43 ++
 .../impl/streamlets/SupplierStreamlet.java         |  43 ++
 .../impl/streamlets/TransformStreamlet.java        |  48 ++
 .../streamlet/impl/streamlets/UnionStreamlet.java  |  49 ++
 heron/api/src/java/shade.conf                      |   2 +-
 heron/api/src/scala/BUILD                          |   2 +-
 .../twitter/heron/streamlet/scala/Builder.scala    |  50 --
 .../com/twitter/heron/streamlet/scala/Runner.scala |  51 --
 .../streamlet/scala/SerializableTransformer.scala  |  31 -
 .../com/twitter/heron/streamlet/scala/Sink.scala   |  33 -
 .../com/twitter/heron/streamlet/scala/Source.scala |  34 -
 .../twitter/heron/streamlet/scala/Streamlet.scala  | 244 -------
 .../scala/converter/ScalaToJavaConverter.scala     | 130 ----
 .../heron/streamlet/scala/impl/BuilderImpl.scala   |  43 --
 .../heron/streamlet/scala/impl/StreamletImpl.scala | 374 ----------
 .../org/apache/heron/streamlet/scala/Builder.scala |  50 ++
 .../org/apache/heron/streamlet/scala/Runner.scala  |  51 ++
 .../streamlet/scala/SerializableTransformer.scala  |  33 +
 .../org/apache/heron/streamlet/scala/Sink.scala    |  33 +
 .../org/apache/heron/streamlet/scala/Source.scala  |  34 +
 .../apache/heron/streamlet/scala/Streamlet.scala   | 244 +++++++
 .../scala/converter/ScalaToJavaConverter.scala     | 130 ++++
 .../heron/streamlet/scala/impl/BuilderImpl.scala   |  43 ++
 .../heron/streamlet/scala/impl/StreamletImpl.scala | 374 ++++++++++
 heron/api/tests/java/BUILD                         |  24 +-
 .../java/com/twitter/heron/api/ConfigTest.java     |  49 --
 .../com/twitter/heron/api/HeronSubmitterTest.java  | 213 ------
 .../heron/api/bolt/BaseWindowedBoltTest.java       | 276 -------
 .../heron/api/bolt/WindowedBoltExecutorTest.java   | 241 -------
 .../heron/api/metric/CountStatAndMetricTest.java   |  83 ---
 .../heron/api/metric/LatencyStatAndMetricTest.java |  81 ---
 .../api/windowing/WaterMarkEventGeneratorTest.java | 118 ---
 .../heron/api/windowing/WindowManagerTest.java     | 674 -----------------
 .../heron/streamlet/impl/StreamletImplTest.java    | 396 ----------
 .../GeneralReduceByKeyAndWindowOperatorTest.java   | 174 -----
 .../streamlet/impl/operators/JoinOperatorTest.java | 380 ----------
 .../ReduceByKeyAndWindowOperatorTest.java          | 172 -----
 .../java/org/apache/heron/api/ConfigTest.java      |  49 ++
 .../org/apache/heron/api/HeronSubmitterTest.java   | 213 ++++++
 .../heron/api/bolt/BaseWindowedBoltTest.java       | 276 +++++++
 .../heron/api/bolt/WindowedBoltExecutorTest.java   | 243 +++++++
 .../heron/api/metric/CountStatAndMetricTest.java   |  83 +++
 .../heron/api/metric/LatencyStatAndMetricTest.java |  81 +++
 .../api/windowing/WaterMarkEventGeneratorTest.java | 120 ++++
 .../heron/api/windowing/WindowManagerTest.java     | 674 +++++++++++++++++
 .../heron/streamlet/impl/StreamletImplTest.java    | 399 +++++++++++
 .../GeneralReduceByKeyAndWindowOperatorTest.java   | 174 +++++
 .../streamlet/impl/operators/JoinOperatorTest.java | 380 ++++++++++
 .../ReduceByKeyAndWindowOperatorTest.java          | 172 +++++
 heron/api/tests/scala/BUILD                        |   2 +-
 .../twitter/heron/streamlet/scala/SinkTest.scala   |  54 --
 .../twitter/heron/streamlet/scala/SourceTest.scala |  54 --
 .../streamlet/scala/common/BaseFunSuite.scala      |  22 -
 .../heron/streamlet/scala/common/TestContext.scala |  50 --
 .../TestIncrementSerializableTransformer.scala     |  29 -
 .../scala/common/TestListBufferSink.scala          |  30 -
 .../scala/converter/ScalaToJavaConverterTest.scala | 180 -----
 .../streamlet/scala/impl/BuilderImplTest.scala     |  67 --
 .../streamlet/scala/impl/StreamletImplTest.scala   | 471 ------------
 .../apache/heron/streamlet/scala/SinkTest.scala    |  54 ++
 .../apache/heron/streamlet/scala/SourceTest.scala  |  54 ++
 .../streamlet/scala/common/BaseFunSuite.scala      |  22 +
 .../heron/streamlet/scala/common/TestContext.scala |  50 ++
 .../TestIncrementSerializableTransformer.scala     |  29 +
 .../scala/common/TestListBufferSink.scala          |  30 +
 .../scala/converter/ScalaToJavaConverterTest.scala | 180 +++++
 .../streamlet/scala/impl/BuilderImplTest.scala     |  67 ++
 .../streamlet/scala/impl/StreamletImplTest.scala   | 471 ++++++++++++
 .../twitter/heron/ckptmgr/CheckpointManager.java   | 247 -------
 .../heron/ckptmgr/CheckpointManagerConfig.java     | 199 ------
 .../heron/ckptmgr/CheckpointManagerConfigKey.java  | 177 -----
 .../heron/ckptmgr/CheckpointManagerException.java  |  30 -
 .../heron/ckptmgr/CheckpointManagerServer.java     | 319 ---------
 .../apache/heron/ckptmgr/CheckpointManager.java    | 246 +++++++
 .../heron/ckptmgr/CheckpointManagerConfig.java     | 199 ++++++
 .../heron/ckptmgr/CheckpointManagerConfigKey.java  | 177 +++++
 .../heron/ckptmgr/CheckpointManagerException.java  |  30 +
 .../heron/ckptmgr/CheckpointManagerServer.java     | 319 +++++++++
 heron/ckptmgr/src/java/shade.conf                  |   4 +-
 heron/ckptmgr/tests/java/BUILD                     |   2 +-
 .../heron/ckptmgr/CheckpointManagerServerTest.java | 257 -------
 .../heron/ckptmgr/CheckpointManagerServerTest.java | 257 +++++++
 heron/common/src/cpp/basics/mempool.cpp            |   2 +-
 .../twitter/heron/common/basics/ByteAmount.java    | 242 -------
 .../twitter/heron/common/basics/Communicator.java  | 271 -------
 .../heron/common/basics/DryRunFormatType.java      |  29 -
 .../com/twitter/heron/common/basics/FileUtils.java | 154 ----
 .../heron/common/basics/ISelectHandler.java        |  58 --
 .../com/twitter/heron/common/basics/NIOLooper.java | 273 -------
 .../twitter/heron/common/basics/PackageType.java   |  33 -
 .../java/com/twitter/heron/common/basics/Pair.java |  93 ---
 .../heron/common/basics/SingletonRegistry.java     |  84 ---
 .../twitter/heron/common/basics/SlaveLooper.java   |  92 ---
 .../com/twitter/heron/common/basics/SysUtils.java  |  76 --
 .../com/twitter/heron/common/basics/TypeUtils.java | 131 ----
 .../heron/common/basics/WakeableLooper.java        | 231 ------
 .../twitter/heron/common/config/ConfigReader.java  | 113 ---
 .../twitter/heron/common/config/SystemConfig.java  | 365 ----------
 .../heron/common/config/SystemConfigKey.java       | 449 ------------
 .../twitter/heron/common/network/HeronClient.java  | 419 -----------
 .../twitter/heron/common/network/HeronServer.java  | 315 --------
 .../heron/common/network/HeronSocketOptions.java   |  78 --
 .../heron/common/network/IncomingPacket.java       | 136 ----
 .../heron/common/network/OutgoingPacket.java       | 107 ---
 .../com/twitter/heron/common/network/REQID.java    |  90 ---
 .../heron/common/network/SocketChannelHelper.java  | 282 --------
 .../twitter/heron/common/network/StatusCode.java   |  26 -
 .../common/testhelpers/CommunicatorTestHelper.java |  49 --
 .../common/testhelpers/HeronServerTester.java      | 314 --------
 .../utils/logging/ErrorReportLoggingHandler.java   | 178 -----
 .../heron/common/utils/logging/LoggingHelper.java  | 252 -------
 .../heron/common/utils/metrics/BoltMetrics.java    | 116 ---
 .../common/utils/metrics/ComponentMetrics.java     |  28 -
 .../common/utils/metrics/FullBoltMetrics.java      | 185 -----
 .../common/utils/metrics/FullSpoutMetrics.java     | 145 ----
 .../heron/common/utils/metrics/JVMMetrics.java     | 458 ------------
 .../common/utils/metrics/MetricsCollector.java     | 185 -----
 .../heron/common/utils/metrics/SpoutMetrics.java   | 127 ----
 .../utils/misc/CustomStreamGroupingHelper.java     | 100 ---
 .../common/utils/misc/PhysicalPlanHelper.java      | 330 ---------
 .../utils/misc/SerializeDeSerializeHelper.java     |  59 --
 .../heron/common/utils/misc/ThreadNames.java       |  26 -
 .../heron/common/utils/misc/TupleKeyGenerator.java |  34 -
 .../utils/topology/GeneralTopologyContextImpl.java | 270 -------
 .../common/utils/topology/TopologyContextImpl.java | 304 --------
 .../heron/common/utils/topology/TopologyTests.java | 122 ----
 .../heron/common/utils/tuple/TickTuple.java        | 210 ------
 .../heron/common/utils/tuple/TupleImpl.java        | 261 -------
 .../org/apache/heron/common/basics/ByteAmount.java | 242 +++++++
 .../apache/heron/common/basics/Communicator.java   | 271 +++++++
 .../heron/common/basics/DryRunFormatType.java      |  29 +
 .../org/apache/heron/common/basics/FileUtils.java  | 154 ++++
 .../apache/heron/common/basics/ISelectHandler.java |  58 ++
 .../org/apache/heron/common/basics/NIOLooper.java  | 273 +++++++
 .../apache/heron/common/basics/PackageType.java    |  33 +
 .../java/org/apache/heron/common/basics/Pair.java  |  93 +++
 .../heron/common/basics/SingletonRegistry.java     |  84 +++
 .../apache/heron/common/basics/SlaveLooper.java    |  92 +++
 .../org/apache/heron/common/basics/SysUtils.java   |  76 ++
 .../org/apache/heron/common/basics/TypeUtils.java  | 131 ++++
 .../apache/heron/common/basics/WakeableLooper.java | 231 ++++++
 .../apache/heron/common/config/ConfigReader.java   | 113 +++
 .../apache/heron/common/config/SystemConfig.java   | 365 ++++++++++
 .../heron/common/config/SystemConfigKey.java       | 449 ++++++++++++
 .../apache/heron/common/network/HeronClient.java   | 419 +++++++++++
 .../apache/heron/common/network/HeronServer.java   | 315 ++++++++
 .../heron/common/network/HeronSocketOptions.java   |  78 ++
 .../heron/common/network/IncomingPacket.java       | 136 ++++
 .../heron/common/network/OutgoingPacket.java       | 107 +++
 .../org/apache/heron/common/network/REQID.java     |  90 +++
 .../heron/common/network/SocketChannelHelper.java  | 282 ++++++++
 .../apache/heron/common/network/StatusCode.java    |  26 +
 .../common/testhelpers/CommunicatorTestHelper.java |  49 ++
 .../common/testhelpers/HeronServerTester.java      | 314 ++++++++
 .../utils/logging/ErrorReportLoggingHandler.java   | 178 +++++
 .../heron/common/utils/logging/LoggingHelper.java  | 252 +++++++
 .../heron/common/utils/metrics/BoltMetrics.java    | 116 +++
 .../common/utils/metrics/ComponentMetrics.java     |  28 +
 .../common/utils/metrics/FullBoltMetrics.java      | 185 +++++
 .../common/utils/metrics/FullSpoutMetrics.java     | 145 ++++
 .../heron/common/utils/metrics/JVMMetrics.java     | 458 ++++++++++++
 .../common/utils/metrics/MetricsCollector.java     | 185 +++++
 .../heron/common/utils/metrics/SpoutMetrics.java   | 127 ++++
 .../utils/misc/CustomStreamGroupingHelper.java     | 100 +++
 .../common/utils/misc/PhysicalPlanHelper.java      | 330 +++++++++
 .../utils/misc/SerializeDeSerializeHelper.java     |  60 ++
 .../heron/common/utils/misc/ThreadNames.java       |  26 +
 .../heron/common/utils/misc/TupleKeyGenerator.java |  34 +
 .../utils/topology/GeneralTopologyContextImpl.java | 270 +++++++
 .../common/utils/topology/TopologyContextImpl.java | 304 ++++++++
 .../heron/common/utils/topology/TopologyTests.java | 122 ++++
 .../apache/heron/common/utils/tuple/TickTuple.java | 210 ++++++
 .../apache/heron/common/utils/tuple/TupleImpl.java | 261 +++++++
 heron/common/tests/java/BUILD                      |  22 +-
 .../heron/common/basics/ByteAmountTest.java        | 211 ------
 .../heron/common/basics/CommunicatorTest.java      | 156 ----
 .../twitter/heron/common/basics/FileUtilsTest.java | 190 -----
 .../heron/common/basics/PackageTypeTest.java       |  44 --
 .../twitter/heron/common/basics/SysUtilsTest.java  |  67 --
 .../heron/common/basics/WakeableLooperTest.java    | 241 -------
 .../heron/common/config/ConfigReaderTest.java      |  71 --
 .../heron/common/config/SystemConfigTest.java      |  53 --
 .../com/twitter/heron/common/test/EchoTest.java    | 181 -----
 .../twitter/heron/common/test/HeronServerTest.java | 509 -------------
 .../heron/common/utils/TopologyUtilsTest.java      | 249 -------
 .../apache/heron/common/basics/ByteAmountTest.java | 211 ++++++
 .../heron/common/basics/CommunicatorTest.java      | 156 ++++
 .../apache/heron/common/basics/FileUtilsTest.java  | 190 +++++
 .../heron/common/basics/PackageTypeTest.java       |  44 ++
 .../apache/heron/common/basics/SysUtilsTest.java   |  67 ++
 .../heron/common/basics/WakeableLooperTest.java    | 241 +++++++
 .../heron/common/config/ConfigReaderTest.java      |  72 ++
 .../heron/common/config/SystemConfigTest.java      |  53 ++
 .../org/apache/heron/common/test/EchoTest.java     | 181 +++++
 .../apache/heron/common/test/HeronServerTest.java  | 509 +++++++++++++
 .../heron/common/utils/TopologyUtilsTest.java      | 249 +++++++
 heron/common/tests/resources/defaults.yaml         |   2 +-
 .../config/src/yaml/conf/aurora/metrics_sinks.yaml |  14 +-
 heron/config/src/yaml/conf/aurora/packing.yaml     |   4 +-
 heron/config/src/yaml/conf/aurora/scheduler.yaml   |   4 +-
 heron/config/src/yaml/conf/aurora/stateful.yaml    |   2 +-
 heron/config/src/yaml/conf/aurora/statemgr.yaml    |   2 +-
 heron/config/src/yaml/conf/aurora/uploader.yaml    |   2 +-
 .../src/yaml/conf/examples/aurora_scheduler.yaml   |   4 +-
 .../src/yaml/conf/examples/local_scheduler.yaml    |   4 +-
 .../src/yaml/conf/examples/local_stateful.yaml     |   2 +-
 .../src/yaml/conf/examples/metrics_sinks.yaml      |  16 +-
 .../src/yaml/conf/kubernetes/metrics_sinks.yaml    |  14 +-
 heron/config/src/yaml/conf/kubernetes/packing.yaml |   4 +-
 .../config/src/yaml/conf/kubernetes/scheduler.yaml |   4 +-
 .../config/src/yaml/conf/kubernetes/stateful.yaml  |   2 +-
 .../config/src/yaml/conf/kubernetes/statemgr.yaml  |   2 +-
 .../config/src/yaml/conf/kubernetes/uploader.yaml  |   2 +-
 heron/config/src/yaml/conf/local/healthmgr.yaml    |   6 +-
 .../config/src/yaml/conf/local/metrics_sinks.yaml  |  14 +-
 heron/config/src/yaml/conf/local/packing.yaml      |   4 +-
 heron/config/src/yaml/conf/local/scheduler.yaml    |   4 +-
 heron/config/src/yaml/conf/local/stateful.yaml     |   2 +-
 heron/config/src/yaml/conf/local/statemgr.yaml     |   2 +-
 heron/config/src/yaml/conf/local/uploader.yaml     |   2 +-
 .../src/yaml/conf/localzk/metrics_sinks.yaml       |  14 +-
 heron/config/src/yaml/conf/localzk/packing.yaml    |   4 +-
 heron/config/src/yaml/conf/localzk/scheduler.yaml  |   4 +-
 heron/config/src/yaml/conf/localzk/stateful.yaml   |   2 +-
 heron/config/src/yaml/conf/localzk/statemgr.yaml   |   2 +-
 heron/config/src/yaml/conf/localzk/uploader.yaml   |   2 +-
 .../src/yaml/conf/marathon/metrics_sinks.yaml      |  14 +-
 heron/config/src/yaml/conf/marathon/packing.yaml   |   4 +-
 heron/config/src/yaml/conf/marathon/scheduler.yaml |   4 +-
 heron/config/src/yaml/conf/marathon/stateful.yaml  |   2 +-
 heron/config/src/yaml/conf/marathon/statemgr.yaml  |   2 +-
 heron/config/src/yaml/conf/marathon/uploader.yaml  |   2 +-
 .../config/src/yaml/conf/mesos/metrics_sinks.yaml  |  14 +-
 heron/config/src/yaml/conf/mesos/packing.yaml      |   4 +-
 heron/config/src/yaml/conf/mesos/scheduler.yaml    |   4 +-
 heron/config/src/yaml/conf/mesos/stateful.yaml     |   2 +-
 heron/config/src/yaml/conf/mesos/statemgr.yaml     |   2 +-
 heron/config/src/yaml/conf/mesos/uploader.yaml     |   2 +-
 .../config/src/yaml/conf/nomad/metrics_sinks.yaml  |  14 +-
 heron/config/src/yaml/conf/nomad/packing.yaml      |   4 +-
 heron/config/src/yaml/conf/nomad/scheduler.yaml    |   4 +-
 heron/config/src/yaml/conf/nomad/stateful.yaml     |   2 +-
 heron/config/src/yaml/conf/nomad/statemgr.yaml     |   2 +-
 heron/config/src/yaml/conf/nomad/uploader.yaml     |   2 +-
 heron/config/src/yaml/conf/sandbox/healthmgr.yaml  |   6 +-
 .../src/yaml/conf/sandbox/metrics_sinks.yaml       |  14 +-
 heron/config/src/yaml/conf/sandbox/packing.yaml    |   4 +-
 heron/config/src/yaml/conf/sandbox/scheduler.yaml  |   4 +-
 heron/config/src/yaml/conf/sandbox/stateful.yaml   |   2 +-
 heron/config/src/yaml/conf/sandbox/statemgr.yaml   |   2 +-
 heron/config/src/yaml/conf/sandbox/uploader.yaml   |   2 +-
 .../config/src/yaml/conf/slurm/metrics_sinks.yaml  |  14 +-
 heron/config/src/yaml/conf/slurm/packing.yaml      |   4 +-
 heron/config/src/yaml/conf/slurm/scheduler.yaml    |   4 +-
 heron/config/src/yaml/conf/slurm/stateful.yaml     |   2 +-
 heron/config/src/yaml/conf/slurm/statemgr.yaml     |   2 +-
 heron/config/src/yaml/conf/slurm/uploader.yaml     |   2 +-
 .../src/yaml/conf/standalone/metrics_sinks.yaml    |  14 +-
 heron/config/src/yaml/conf/standalone/packing.yaml |   4 +-
 .../config/src/yaml/conf/standalone/scheduler.yaml |   4 +-
 .../config/src/yaml/conf/standalone/stateful.yaml  |   2 +-
 .../config/src/yaml/conf/standalone/statemgr.yaml  |   2 +-
 .../standalone/templates/apiserver.template.hcl    |   2 +-
 .../standalone/templates/scheduler.template.yaml   |   4 +-
 .../standalone/templates/statemgr.template.yaml    |   2 +-
 .../standalone/templates/uploader.template.yaml    |   2 +-
 .../config/src/yaml/conf/standalone/uploader.yaml  |   2 +-
 .../src/yaml/conf/test/test_metrics_sinks.yaml     |  16 +-
 heron/config/src/yaml/conf/yarn/healthmgr.yaml     |   4 +-
 heron/config/src/yaml/conf/yarn/metrics_sinks.yaml |  14 +-
 heron/config/src/yaml/conf/yarn/packing.yaml       |   4 +-
 heron/config/src/yaml/conf/yarn/scheduler.yaml     |   4 +-
 heron/config/src/yaml/conf/yarn/stateful.yaml      |   2 +-
 heron/config/src/yaml/conf/yarn/statemgr.yaml      |   2 +-
 heron/config/src/yaml/conf/yarn/uploader.yaml      |   2 +-
 heron/downloaders/src/java/BUILD                   |   2 +-
 .../com/twitter/heron/downloader/DLDownloader.java |  75 --
 .../twitter/heron/downloader/DownloadRunner.java   |  47 --
 .../com/twitter/heron/downloader/Downloader.java   |  21 -
 .../com/twitter/heron/downloader/Extractor.java    |  56 --
 .../twitter/heron/downloader/FileDownloader.java   |  30 -
 .../twitter/heron/downloader/HttpDownloader.java   |  27 -
 .../com/twitter/heron/downloader/Registry.java     |  60 --
 .../org/apache/heron/downloader/DLDownloader.java  |  74 ++
 .../apache/heron/downloader/DownloadRunner.java    |  47 ++
 .../org/apache/heron/downloader/Downloader.java    |  21 +
 .../org/apache/heron/downloader/Extractor.java     |  56 ++
 .../apache/heron/downloader/FileDownloader.java    |  30 +
 .../apache/heron/downloader/HttpDownloader.java    |  27 +
 .../java/org/apache/heron/downloader/Registry.java |  60 ++
 heron/downloaders/tests/java/BUILD                 |   2 +-
 .../twitter/heron/downloader/DLDownloaderTest.java | 110 ---
 .../twitter/heron/downloader/ExtractorTests.java   | 131 ----
 .../com/twitter/heron/downloader/RegistryTest.java |  37 -
 .../apache/heron/downloader/DLDownloaderTest.java  | 110 +++
 .../apache/heron/downloader/ExtractorTests.java    | 131 ++++
 .../org/apache/heron/downloader/RegistryTest.java  |  37 +
 heron/executor/src/python/heron_executor.py        |  12 +-
 .../tests/python/heron_executor_unittest.py        |   8 +-
 .../com/twitter/heron/healthmgr/HealthManager.java | 528 --------------
 .../heron/healthmgr/HealthManagerMetrics.java      | 181 -----
 .../heron/healthmgr/HealthPolicyConfig.java        |  56 --
 .../heron/healthmgr/HealthPolicyConfigReader.java  |  96 ---
 .../healthmgr/common/HealthManagerEvents.java      |  41 --
 .../healthmgr/common/InvalidStateException.java    |  26 -
 .../heron/healthmgr/common/MetricsStats.java       |  36 -
 .../healthmgr/common/PackingPlanProvider.java      | 107 ---
 .../healthmgr/common/PhysicalPlanProvider.java     |  85 ---
 .../heron/healthmgr/common/TopologyProvider.java   |  96 ---
 .../healthmgr/detectors/BackPressureDetector.java  |  81 ---
 .../heron/healthmgr/detectors/BaseDetector.java    |  51 --
 .../detectors/GrowingWaitQueueDetector.java        | 102 ---
 .../detectors/LargeWaitQueueDetector.java          |  80 ---
 .../detectors/ProcessingRateSkewDetector.java      |  32 -
 .../heron/healthmgr/detectors/SkewDetector.java    | 114 ---
 .../healthmgr/detectors/WaitQueueSkewDetector.java |  32 -
 .../heron/healthmgr/diagnosers/BaseDiagnoser.java  |  50 --
 .../healthmgr/diagnosers/DataSkewDiagnoser.java    |  88 ---
 .../diagnosers/SlowInstanceDiagnoser.java          |  87 ---
 .../diagnosers/UnderProvisioningDiagnoser.java     |  70 --
 .../AutoRestartBackpressureContainerPolicy.java    |  75 --
 .../policy/DynamicResourceAllocationPolicy.java    | 111 ---
 .../resolvers/RestartContainerResolver.java        | 108 ---
 .../heron/healthmgr/resolvers/ScaleUpResolver.java | 221 ------
 .../healthmgr/sensors/BackPressureSensor.java      |  93 ---
 .../heron/healthmgr/sensors/BaseSensor.java        | 102 ---
 .../heron/healthmgr/sensors/BufferSizeSensor.java  |  89 ---
 .../healthmgr/sensors/ExecuteCountSensor.java      |  53 --
 .../sensors/MetricsCacheMetricsProvider.java       | 193 -----
 .../healthmgr/sensors/TrackerMetricsProvider.java  | 132 ----
 .../org/apache/heron/healthmgr/HealthManager.java  | 527 ++++++++++++++
 .../heron/healthmgr/HealthManagerMetrics.java      | 181 +++++
 .../apache/heron/healthmgr/HealthPolicyConfig.java |  56 ++
 .../heron/healthmgr/HealthPolicyConfigReader.java  |  96 +++
 .../healthmgr/common/HealthManagerEvents.java      |  41 ++
 .../healthmgr/common/InvalidStateException.java    |  26 +
 .../heron/healthmgr/common/MetricsStats.java       |  36 +
 .../healthmgr/common/PackingPlanProvider.java      | 107 +++
 .../healthmgr/common/PhysicalPlanProvider.java     |  85 +++
 .../heron/healthmgr/common/TopologyProvider.java   |  96 +++
 .../healthmgr/detectors/BackPressureDetector.java  |  81 +++
 .../heron/healthmgr/detectors/BaseDetector.java    |  51 ++
 .../detectors/GrowingWaitQueueDetector.java        | 102 +++
 .../detectors/LargeWaitQueueDetector.java          |  80 +++
 .../detectors/ProcessingRateSkewDetector.java      |  32 +
 .../heron/healthmgr/detectors/SkewDetector.java    | 114 +++
 .../healthmgr/detectors/WaitQueueSkewDetector.java |  32 +
 .../heron/healthmgr/diagnosers/BaseDiagnoser.java  |  50 ++
 .../healthmgr/diagnosers/DataSkewDiagnoser.java    |  88 +++
 .../diagnosers/SlowInstanceDiagnoser.java          |  87 +++
 .../diagnosers/UnderProvisioningDiagnoser.java     |  70 ++
 .../AutoRestartBackpressureContainerPolicy.java    |  75 ++
 .../policy/DynamicResourceAllocationPolicy.java    | 111 +++
 .../resolvers/RestartContainerResolver.java        | 108 +++
 .../heron/healthmgr/resolvers/ScaleUpResolver.java | 221 ++++++
 .../healthmgr/sensors/BackPressureSensor.java      |  93 +++
 .../apache/heron/healthmgr/sensors/BaseSensor.java | 102 +++
 .../heron/healthmgr/sensors/BufferSizeSensor.java  |  89 +++
 .../healthmgr/sensors/ExecuteCountSensor.java      |  53 ++
 .../sensors/MetricsCacheMetricsProvider.java       | 193 +++++
 .../healthmgr/sensors/TrackerMetricsProvider.java  | 132 ++++
 .../twitter/heron/healthmgr/HealthManagerTest.java | 113 ---
 .../healthmgr/HealthPolicyConfigReaderTest.java    |  59 --
 .../healthmgr/common/PackingPlanProviderTest.java  |  98 ---
 .../healthmgr/common/TopologyProviderTest.java     | 103 ---
 .../detectors/BackPressureDetectorTest.java        |  96 ---
 .../detectors/GrowingWaitQueueDetectorTest.java    | 102 ---
 .../detectors/LargeWaitQueueDetectorTest.java      |  78 --
 .../detectors/ProcessingRateSkewDetectorTest.java  | 187 -----
 .../detectors/WaitQueueSkewDetectorTest.java       |  88 ---
 .../diagnosers/DataSkewDiagnoserTest.java          | 135 ----
 .../diagnosers/SlowInstanceDiagnoserTest.java      | 112 ---
 .../diagnosers/UnderProvisioningDiagnoserTest.java |  96 ---
 .../healthmgr/resolvers/ScaleUpResolverTest.java   | 185 -----
 .../healthmgr/sensors/BackPressureSensorTest.java  | 100 ---
 .../healthmgr/sensors/BufferSizeSensorTest.java    |  82 ---
 .../healthmgr/sensors/ExecuteCountSensorTest.java  |  79 --
 .../sensors/MetricsCacheMetricsProviderTest.java   | 303 --------
 .../sensors/TrackerMetricsProviderTest.java        | 207 ------
 .../apache/heron/healthmgr/HealthManagerTest.java  | 113 +++
 .../healthmgr/HealthPolicyConfigReaderTest.java    |  59 ++
 .../healthmgr/common/PackingPlanProviderTest.java  |  98 +++
 .../healthmgr/common/TopologyProviderTest.java     | 103 +++
 .../detectors/BackPressureDetectorTest.java        |  96 +++
 .../detectors/GrowingWaitQueueDetectorTest.java    | 102 +++
 .../detectors/LargeWaitQueueDetectorTest.java      |  78 ++
 .../detectors/ProcessingRateSkewDetectorTest.java  | 187 +++++
 .../detectors/WaitQueueSkewDetectorTest.java       |  88 +++
 .../diagnosers/DataSkewDiagnoserTest.java          | 135 ++++
 .../diagnosers/SlowInstanceDiagnoserTest.java      | 112 +++
 .../diagnosers/UnderProvisioningDiagnoserTest.java |  96 +++
 .../healthmgr/resolvers/ScaleUpResolverTest.java   | 185 +++++
 .../healthmgr/sensors/BackPressureSensorTest.java  | 100 +++
 .../healthmgr/sensors/BufferSizeSensorTest.java    |  82 +++
 .../healthmgr/sensors/ExecuteCountSensorTest.java  |  79 ++
 .../sensors/MetricsCacheMetricsProviderTest.java   | 304 ++++++++
 .../sensors/TrackerMetricsProviderTest.java        | 207 ++++++
 heron/instance/src/java/BUILD                      |   2 +-
 .../heron/instance/AbstractOutputCollector.java    | 182 -----
 .../java/com/twitter/heron/instance/Gateway.java   | 169 -----
 .../com/twitter/heron/instance/HeronInstance.java  | 461 ------------
 .../java/com/twitter/heron/instance/IInstance.java |  90 ---
 .../twitter/heron/instance/InstanceControlMsg.java |  89 ---
 .../heron/instance/OutgoingTupleCollection.java    | 227 ------
 .../src/java/com/twitter/heron/instance/Slave.java | 379 ----------
 .../twitter/heron/instance/bolt/BoltInstance.java  | 325 ---------
 .../instance/bolt/BoltOutputCollectorImpl.java     | 190 -----
 .../heron/instance/spout/RootTupleInfo.java        |  54 --
 .../heron/instance/spout/SpoutInstance.java        | 468 ------------
 .../instance/spout/SpoutOutputCollectorImpl.java   | 183 -----
 .../twitter/heron/instance/util/InstanceUtils.java |  43 --
 .../twitter/heron/instance/util/JvmVersion.java    |  26 -
 .../com/twitter/heron/metrics/GatewayMetrics.java  | 177 -----
 .../heron/network/MetricsManagerClient.java        | 204 ------
 .../twitter/heron/network/StreamManagerClient.java | 377 ----------
 .../heron/instance/AbstractOutputCollector.java    | 182 +++++
 .../java/org/apache/heron/instance/Gateway.java    | 169 +++++
 .../org/apache/heron/instance/HeronInstance.java   | 460 ++++++++++++
 .../java/org/apache/heron/instance/IInstance.java  |  90 +++
 .../apache/heron/instance/InstanceControlMsg.java  |  89 +++
 .../heron/instance/OutgoingTupleCollection.java    | 227 ++++++
 .../src/java/org/apache/heron/instance/Slave.java  | 379 ++++++++++
 .../apache/heron/instance/bolt/BoltInstance.java   | 325 +++++++++
 .../instance/bolt/BoltOutputCollectorImpl.java     | 190 +++++
 .../apache/heron/instance/spout/RootTupleInfo.java |  54 ++
 .../apache/heron/instance/spout/SpoutInstance.java | 468 ++++++++++++
 .../instance/spout/SpoutOutputCollectorImpl.java   | 183 +++++
 .../apache/heron/instance/util/InstanceUtils.java  |  43 ++
 .../org/apache/heron/instance/util/JvmVersion.java |  26 +
 .../org/apache/heron/metrics/GatewayMetrics.java   | 177 +++++
 .../apache/heron/network/MetricsManagerClient.java | 204 ++++++
 .../apache/heron/network/StreamManagerClient.java  | 377 ++++++++++
 heron/instance/src/java/shade.conf                 |   6 +-
 heron/instance/tests/java/BUILD                    |  22 +-
 .../heron/grouping/AbstractTupleRoutingTest.java   | 235 ------
 .../twitter/heron/grouping/CustomGroupingTest.java |  77 --
 .../twitter/heron/grouping/EmitDirectBoltTest.java |  48 --
 .../heron/grouping/EmitDirectRoundRobinBolt.java   |  70 --
 .../heron/grouping/EmitDirectRoundRobinSpout.java  |  61 --
 .../heron/grouping/EmitDirectSpoutTest.java        |  46 --
 .../twitter/heron/instance/CommunicatorTester.java | 118 ---
 .../com/twitter/heron/instance/SlaveTester.java    |  51 --
 .../heron/instance/bolt/BoltInstanceTest.java      | 140 ----
 .../instance/spout/ActivateDeactivateTest.java     |  89 ---
 .../heron/instance/spout/SpoutInstanceTest.java    | 344 ---------
 .../twitter/heron/metrics/GlobalMetricsTest.java   |  74 --
 .../heron/metrics/MultiAssignableMetricTest.java   |  48 --
 .../twitter/heron/network/AbstractNetworkTest.java | 193 -----
 .../com/twitter/heron/network/ConnectTest.java     |  90 ---
 .../com/twitter/heron/network/HandleReadTest.java  | 135 ----
 .../com/twitter/heron/network/HandleWriteTest.java |  99 ---
 .../java/com/twitter/heron/resource/Constants.java |  54 --
 .../java/com/twitter/heron/resource/TestBolt.java  |  97 ---
 .../java/com/twitter/heron/resource/TestSpout.java | 124 ----
 .../com/twitter/heron/resource/UnitTestHelper.java | 194 -----
 .../heron/grouping/AbstractTupleRoutingTest.java   | 235 ++++++
 .../apache/heron/grouping/CustomGroupingTest.java  |  77 ++
 .../apache/heron/grouping/EmitDirectBoltTest.java  |  48 ++
 .../heron/grouping/EmitDirectRoundRobinBolt.java   |  70 ++
 .../heron/grouping/EmitDirectRoundRobinSpout.java  |  61 ++
 .../apache/heron/grouping/EmitDirectSpoutTest.java |  46 ++
 .../apache/heron/instance/CommunicatorTester.java  | 118 +++
 .../org/apache/heron/instance/SlaveTester.java     |  51 ++
 .../heron/instance/bolt/BoltInstanceTest.java      | 140 ++++
 .../instance/spout/ActivateDeactivateTest.java     |  89 +++
 .../heron/instance/spout/SpoutInstanceTest.java    | 344 +++++++++
 .../apache/heron/metrics/GlobalMetricsTest.java    |  74 ++
 .../heron/metrics/MultiAssignableMetricTest.java   |  48 ++
 .../apache/heron/network/AbstractNetworkTest.java  | 193 +++++
 .../java/org/apache/heron/network/ConnectTest.java |  90 +++
 .../org/apache/heron/network/HandleReadTest.java   | 135 ++++
 .../org/apache/heron/network/HandleWriteTest.java  |  99 +++
 .../java/org/apache/heron/resource/Constants.java  |  54 ++
 .../java/org/apache/heron/resource/TestBolt.java   |  97 +++
 .../java/org/apache/heron/resource/TestSpout.java  | 124 ++++
 .../org/apache/heron/resource/UnitTestHelper.java  | 194 +++++
 heron/io/dlog/src/java/BUILD                       |   2 +-
 .../java/com/twitter/heron/dlog/DLInputStream.java | 140 ----
 .../com/twitter/heron/dlog/DLOutputStream.java     |  68 --
 .../dlog/src/java/com/twitter/heron/dlog/Util.java | 144 ----
 .../java/org/apache/heron/dlog/DLInputStream.java  | 140 ++++
 .../java/org/apache/heron/dlog/DLOutputStream.java |  68 ++
 .../dlog/src/java/org/apache/heron/dlog/Util.java  | 143 ++++
 .../com/twitter/heron/dlog/DLInputStreamTest.java  |  99 ---
 .../com/twitter/heron/dlog/DLOutputStreamTest.java |  69 --
 .../org/apache/heron/dlog/DLInputStreamTest.java   |  99 +++
 .../org/apache/heron/dlog/DLOutputStreamTest.java  |  70 ++
 heron/metricscachemgr/src/java/BUILD               |   2 +-
 .../heron/metricscachemgr/MetricsCacheManager.java | 426 -----------
 .../MetricsCacheManagerHttpServer.java             | 212 ------
 .../metricscachemgr/MetricsCacheManagerServer.java | 101 ---
 .../metricscachemgr/metricscache/CacheCore.java    | 570 ---------------
 .../metricscachemgr/metricscache/MetricsCache.java | 207 ------
 .../metricscache/MetricsCacheQueryUtils.java       | 215 ------
 .../metricscache/query/ExceptionDatum.java         | 105 ---
 .../metricscache/query/ExceptionRequest.java       |  62 --
 .../metricscache/query/ExceptionResponse.java      |  32 -
 .../metricscache/query/MetricDatum.java            |  55 --
 .../metricscache/query/MetricGranularity.java      |  21 -
 .../metricscache/query/MetricRequest.java          | 127 ----
 .../metricscache/query/MetricResponse.java         |  32 -
 .../metricscache/query/MetricTimeRangeValue.java   |  69 --
 .../metricscache/store/ExceptionDatapoint.java     |  69 --
 .../metricscache/store/MetricDatapoint.java        |  57 --
 .../heron/metricscachemgr/MetricsCacheManager.java | 425 +++++++++++
 .../MetricsCacheManagerHttpServer.java             | 212 ++++++
 .../metricscachemgr/MetricsCacheManagerServer.java | 101 +++
 .../metricscachemgr/metricscache/CacheCore.java    | 570 +++++++++++++++
 .../metricscachemgr/metricscache/MetricsCache.java | 207 ++++++
 .../metricscache/MetricsCacheQueryUtils.java       | 215 ++++++
 .../metricscache/query/ExceptionDatum.java         | 105 +++
 .../metricscache/query/ExceptionRequest.java       |  62 ++
 .../metricscache/query/ExceptionResponse.java      |  32 +
 .../metricscache/query/MetricDatum.java            |  55 ++
 .../metricscache/query/MetricGranularity.java      |  21 +
 .../metricscache/query/MetricRequest.java          | 127 ++++
 .../metricscache/query/MetricResponse.java         |  32 +
 .../metricscache/query/MetricTimeRangeValue.java   |  69 ++
 .../metricscache/store/ExceptionDatapoint.java     |  69 ++
 .../metricscache/store/MetricDatapoint.java        |  57 ++
 heron/metricscachemgr/tests/java/BUILD             |   6 +-
 .../metricscache/CacheCoreTest.java                | 713 ------------------
 .../metricscache/MetricsCacheQueryUtilsTest.java   | 287 --------
 .../metricscache/MetricsCacheTest.java             |  69 --
 .../metricscache/CacheCoreTest.java                | 713 ++++++++++++++++++
 .../metricscache/MetricsCacheQueryUtilsTest.java   | 289 ++++++++
 .../metricscache/MetricsCacheTest.java             |  69 ++
 .../twitter/heron/metricsmgr/MetricsManager.java   | 592 ---------------
 .../heron/metricsmgr/MetricsManagerServer.java     | 366 ----------
 .../heron/metricsmgr/MetricsSinksConfig.java       |  80 ---
 .../com/twitter/heron/metricsmgr/MetricsUtil.java  |  41 --
 .../heron/metricsmgr/executor/SinkExecutor.java    | 144 ----
 .../heron/metricsmgr/sink/AbstractWebSink.java     | 172 -----
 .../twitter/heron/metricsmgr/sink/FileSink.java    | 189 -----
 .../heron/metricsmgr/sink/GraphiteSink.java        | 238 -------
 .../heron/metricsmgr/sink/PrometheusSink.java      | 273 -------
 .../heron/metricsmgr/sink/SinkContextImpl.java     |  89 ---
 .../com/twitter/heron/metricsmgr/sink/WebSink.java | 143 ----
 .../sink/metricscache/MetricsCacheClient.java      | 123 ----
 .../sink/metricscache/MetricsCacheSink.java        | 430 -----------
 .../heron/metricsmgr/sink/scribe/ScribeSink.java   | 276 -------
 .../metricsmgr/sink/tmaster/TMasterClient.java     | 118 ---
 .../heron/metricsmgr/sink/tmaster/TMasterSink.java | 419 -----------
 .../apache/heron/metricsmgr/MetricsManager.java    | 591 +++++++++++++++
 .../heron/metricsmgr/MetricsManagerServer.java     | 366 ++++++++++
 .../heron/metricsmgr/MetricsSinksConfig.java       |  80 +++
 .../org/apache/heron/metricsmgr/MetricsUtil.java   |  41 ++
 .../heron/metricsmgr/executor/SinkExecutor.java    | 144 ++++
 .../heron/metricsmgr/sink/AbstractWebSink.java     | 171 +++++
 .../org/apache/heron/metricsmgr/sink/FileSink.java | 189 +++++
 .../apache/heron/metricsmgr/sink/GraphiteSink.java | 238 +++++++
 .../heron/metricsmgr/sink/PrometheusSink.java      | 273 +++++++
 .../heron/metricsmgr/sink/SinkContextImpl.java     |  89 +++
 .../org/apache/heron/metricsmgr/sink/WebSink.java  | 142 ++++
 .../sink/metricscache/MetricsCacheClient.java      | 123 ++++
 .../sink/metricscache/MetricsCacheSink.java        | 430 +++++++++++
 .../heron/metricsmgr/sink/scribe/ScribeSink.java   | 275 +++++++
 .../metricsmgr/sink/tmaster/TMasterClient.java     | 118 +++
 .../heron/metricsmgr/sink/tmaster/TMasterSink.java | 419 +++++++++++
 heron/metricsmgr/tests/java/BUILD                  |  18 +-
 .../metricsmgr/HandleTMasterLocationTest.java      | 180 -----
 .../heron/metricsmgr/LatchedMultiCountMetric.java  | 117 ---
 .../heron/metricsmgr/MetricsManagerServerTest.java | 202 ------
 .../twitter/heron/metricsmgr/MetricsUtilTests.java |  52 --
 .../metricsmgr/executor/SinkExecutorTest.java      | 262 -------
 .../heron/metricsmgr/sink/FileSinkTest.java        | 113 ---
 .../heron/metricsmgr/sink/PrometheusSinkTests.java | 205 ------
 .../twitter/heron/metricsmgr/sink/WebSinkTest.java | 260 -------
 .../sink/metricscache/MetricsCacheSinkTest.java    | 186 -----
 .../metricsmgr/sink/tmaster/TMasterSinkTest.java   | 185 -----
 .../metricsmgr/HandleTMasterLocationTest.java      | 180 +++++
 .../heron/metricsmgr/LatchedMultiCountMetric.java  | 117 +++
 .../heron/metricsmgr/MetricsManagerServerTest.java | 202 ++++++
 .../apache/heron/metricsmgr/MetricsUtilTests.java  |  52 ++
 .../metricsmgr/executor/SinkExecutorTest.java      | 262 +++++++
 .../apache/heron/metricsmgr/sink/FileSinkTest.java | 113 +++
 .../heron/metricsmgr/sink/PrometheusSinkTests.java | 205 ++++++
 .../apache/heron/metricsmgr/sink/WebSinkTest.java  | 260 +++++++
 .../sink/metricscache/MetricsCacheSinkTest.java    | 186 +++++
 .../metricsmgr/sink/tmaster/TMasterSinkTest.java   | 185 +++++
 .../com/twitter/heron/packing/RamRequirement.java  |  60 --
 .../heron/packing/ResourceExceededException.java   |  29 -
 .../binpacking/FirstFitDecreasingPacking.java      | 328 ---------
 .../twitter/heron/packing/builder/Container.java   | 194 -----
 .../heron/packing/builder/ContainerIdScorer.java   |  58 --
 .../heron/packing/builder/HomogeneityScorer.java   |  64 --
 .../heron/packing/builder/InstanceCountScorer.java |  29 -
 .../heron/packing/builder/PackingPlanBuilder.java  | 483 -------------
 .../com/twitter/heron/packing/builder/Scorer.java  |  42 --
 .../roundrobin/ResourceCompliantRRPacking.java     | 387 ----------
 .../packing/roundrobin/RoundRobinPacking.java      | 391 ----------
 .../twitter/heron/packing/utils/PackingUtils.java  | 162 -----
 .../org/apache/heron/packing/RamRequirement.java   |  60 ++
 .../heron/packing/ResourceExceededException.java   |  29 +
 .../binpacking/FirstFitDecreasingPacking.java      | 328 +++++++++
 .../apache/heron/packing/builder/Container.java    | 194 +++++
 .../heron/packing/builder/ContainerIdScorer.java   |  58 ++
 .../heron/packing/builder/HomogeneityScorer.java   |  64 ++
 .../heron/packing/builder/InstanceCountScorer.java |  29 +
 .../heron/packing/builder/PackingPlanBuilder.java  | 483 +++++++++++++
 .../org/apache/heron/packing/builder/Scorer.java   |  42 ++
 .../roundrobin/ResourceCompliantRRPacking.java     | 387 ++++++++++
 .../packing/roundrobin/RoundRobinPacking.java      | 391 ++++++++++
 .../apache/heron/packing/utils/PackingUtils.java   | 162 +++++
 heron/packing/tests/java/BUILD                     |   2 +-
 .../com/twitter/heron/packing/AssertPacking.java   | 177 -----
 .../twitter/heron/packing/CommonPackingTests.java  | 350 ---------
 .../twitter/heron/packing/PackingTestHelper.java   | 113 ---
 .../binpacking/FirstFitDecreasingPackingTest.java  | 511 -------------
 .../packing/builder/PackingPlanBuilderTest.java    | 291 --------
 .../twitter/heron/packing/builder/ScorerTest.java  |  99 ---
 .../roundrobin/ResourceCompliantRRPackingTest.java | 553 --------------
 .../packing/roundrobin/RoundRobinPackingTest.java  | 397 -----------
 .../heron/packing/utils/PackingUtilsTest.java      | 134 ----
 .../org/apache/heron/packing/AssertPacking.java    | 177 +++++
 .../apache/heron/packing/CommonPackingTests.java   | 350 +++++++++
 .../apache/heron/packing/PackingTestHelper.java    | 113 +++
 .../binpacking/FirstFitDecreasingPackingTest.java  | 511 +++++++++++++
 .../packing/builder/PackingPlanBuilderTest.java    | 291 ++++++++
 .../apache/heron/packing/builder/ScorerTest.java   |  99 +++
 .../roundrobin/ResourceCompliantRRPackingTest.java | 553 ++++++++++++++
 .../packing/roundrobin/RoundRobinPackingTest.java  | 397 +++++++++++
 .../heron/packing/utils/PackingUtilsTest.java      | 134 ++++
 heron/proto/ckptmgr.proto                          |   2 +-
 heron/proto/common.proto                           |   2 +-
 heron/proto/execution_state.proto                  |   2 +-
 heron/proto/metrics.proto                          |   2 +-
 heron/proto/networktests.proto                     |   2 +-
 heron/proto/packing_plan.proto                     |   2 +-
 heron/proto/physical_plan.proto                    |   2 +-
 heron/proto/scheduler.proto                        |   2 +-
 heron/proto/stats.proto                            |   2 +-
 heron/proto/stmgr.proto                            |   2 +-
 heron/proto/tmaster.proto                          |   2 +-
 heron/proto/topology.proto                         |   2 +-
 heron/proto/tuple.proto                            |   2 +-
 .../java/com/twitter/heron/scheduler/Command.java  |  33 -
 .../com/twitter/heron/scheduler/ExecutorFlag.java  |  73 --
 .../com/twitter/heron/scheduler/LaunchRunner.java  | 176 -----
 .../heron/scheduler/RuntimeManagerMain.java        | 506 -------------
 .../heron/scheduler/RuntimeManagerRunner.java      | 443 ------------
 .../com/twitter/heron/scheduler/SchedulerMain.java | 430 -----------
 .../com/twitter/heron/scheduler/SubmitterMain.java | 551 --------------
 .../TopologyRuntimeManagementException.java        |  30 -
 .../scheduler/TopologySubmissionException.java     |  30 -
 .../heron/scheduler/UpdateTopologyManager.java     | 409 -----------
 .../client/HttpServiceSchedulerClient.java         | 121 ----
 .../heron/scheduler/client/ISchedulerClient.java   |  46 --
 .../scheduler/client/LibrarySchedulerClient.java   |  80 ---
 .../scheduler/client/SchedulerClientFactory.java   |  77 --
 .../heron/scheduler/dryrun/DryRunRender.java       |  31 -
 .../heron/scheduler/dryrun/DryRunResponse.java     |  44 --
 .../heron/scheduler/dryrun/FormatterUtils.java     | 515 -------------
 .../heron/scheduler/dryrun/JsonFormatterUtils.java |  87 ---
 .../scheduler/dryrun/SubmitDryRunResponse.java     |  32 -
 .../scheduler/dryrun/SubmitJsonDryRunRenderer.java |  44 --
 .../scheduler/dryrun/SubmitRawDryRunRenderer.java  |  38 -
 .../dryrun/SubmitTableDryRunRenderer.java          |  64 --
 .../scheduler/dryrun/UpdateDryRunResponse.java     |  43 --
 .../scheduler/dryrun/UpdateJsonDryRunRenderer.java |  57 --
 .../scheduler/dryrun/UpdateRawDryRunRenderer.java  |  40 --
 .../dryrun/UpdateTableDryRunRenderer.java          | 190 -----
 .../server/ExceptionalRequestHandler.java          |  80 ---
 .../heron/scheduler/server/KillRequestHandler.java |  52 --
 .../scheduler/server/RestartRequestHandler.java    |  49 --
 .../heron/scheduler/server/SchedulerServer.java    |  85 ---
 .../server/TerminateSchedulerException.java        |  25 -
 .../scheduler/server/UpdateRequestHandler.java     |  48 --
 .../heron/scheduler/utils/DryRunRenders.java       |  61 --
 .../heron/scheduler/utils/LauncherUtils.java       | 164 -----
 .../com/twitter/heron/scheduler/utils/Runtime.java |  83 ---
 .../scheduler/utils/SchedulerConfigUtils.java      |  87 ---
 .../heron/scheduler/utils/SchedulerUtils.java      | 570 ---------------
 .../twitter/heron/scheduler/utils/Shutdown.java    |  47 --
 .../heron/scheduler/utils/SubmitterUtils.java      |  48 --
 .../java/org/apache/heron/scheduler/Command.java   |  33 +
 .../org/apache/heron/scheduler/ExecutorFlag.java   |  73 ++
 .../org/apache/heron/scheduler/LaunchRunner.java   | 176 +++++
 .../apache/heron/scheduler/RuntimeManagerMain.java | 505 +++++++++++++
 .../heron/scheduler/RuntimeManagerRunner.java      | 442 ++++++++++++
 .../org/apache/heron/scheduler/SchedulerMain.java  | 429 +++++++++++
 .../org/apache/heron/scheduler/SubmitterMain.java  | 550 ++++++++++++++
 .../TopologyRuntimeManagementException.java        |  30 +
 .../scheduler/TopologySubmissionException.java     |  30 +
 .../heron/scheduler/UpdateTopologyManager.java     | 409 +++++++++++
 .../client/HttpServiceSchedulerClient.java         | 121 ++++
 .../heron/scheduler/client/ISchedulerClient.java   |  46 ++
 .../scheduler/client/LibrarySchedulerClient.java   |  80 +++
 .../scheduler/client/SchedulerClientFactory.java   |  77 ++
 .../heron/scheduler/dryrun/DryRunRender.java       |  31 +
 .../heron/scheduler/dryrun/DryRunResponse.java     |  44 ++
 .../heron/scheduler/dryrun/FormatterUtils.java     | 515 +++++++++++++
 .../heron/scheduler/dryrun/JsonFormatterUtils.java |  87 +++
 .../scheduler/dryrun/SubmitDryRunResponse.java     |  32 +
 .../scheduler/dryrun/SubmitJsonDryRunRenderer.java |  44 ++
 .../scheduler/dryrun/SubmitRawDryRunRenderer.java  |  38 +
 .../dryrun/SubmitTableDryRunRenderer.java          |  64 ++
 .../scheduler/dryrun/UpdateDryRunResponse.java     |  43 ++
 .../scheduler/dryrun/UpdateJsonDryRunRenderer.java |  57 ++
 .../scheduler/dryrun/UpdateRawDryRunRenderer.java  |  40 ++
 .../dryrun/UpdateTableDryRunRenderer.java          | 190 +++++
 .../server/ExceptionalRequestHandler.java          |  80 +++
 .../heron/scheduler/server/KillRequestHandler.java |  52 ++
 .../scheduler/server/RestartRequestHandler.java    |  49 ++
 .../heron/scheduler/server/SchedulerServer.java    |  85 +++
 .../server/TerminateSchedulerException.java        |  25 +
 .../scheduler/server/UpdateRequestHandler.java     |  48 ++
 .../heron/scheduler/utils/DryRunRenders.java       |  60 ++
 .../heron/scheduler/utils/LauncherUtils.java       | 164 +++++
 .../org/apache/heron/scheduler/utils/Runtime.java  |  83 +++
 .../scheduler/utils/SchedulerConfigUtils.java      |  87 +++
 .../heron/scheduler/utils/SchedulerUtils.java      | 570 +++++++++++++++
 .../org/apache/heron/scheduler/utils/Shutdown.java |  47 ++
 .../heron/scheduler/utils/SubmitterUtils.java      |  48 ++
 heron/scheduler-core/tests/java/BUILD              |  30 +-
 .../twitter/heron/scheduler/LaunchRunnerTest.java  | 312 --------
 .../heron/scheduler/RuntimeManagerMainTest.java    | 348 ---------
 .../heron/scheduler/RuntimeManagerRunnerTest.java  | 359 ----------
 .../twitter/heron/scheduler/SchedulerMainTest.java | 259 -------
 .../twitter/heron/scheduler/SubmitterMainTest.java | 214 ------
 .../heron/scheduler/UpdateTopologyManagerTest.java | 281 --------
 .../client/HttpServiceSchedulerClientTest.java     | 144 ----
 .../client/LibrarySchedulerClientTest.java         |  82 ---
 .../client/SchedulerClientFactoryTest.java         | 120 ----
 .../scheduler/dryrun/JsonFormatterUtilsTest.java   |  70 --
 .../scheduler/dryrun/SubmitDryRunRenderTest.java   |  92 ---
 .../scheduler/dryrun/UpdateDryRunRenderTest.java   | 133 ----
 .../scheduler/server/SchedulerServerTest.java      |  39 -
 .../heron/scheduler/utils/LauncherUtilsTest.java   | 108 ---
 .../heron/scheduler/utils/SchedulerUtilsTest.java  | 171 -----
 .../apache/heron/scheduler/LaunchRunnerTest.java   | 312 ++++++++
 .../heron/scheduler/RuntimeManagerMainTest.java    | 348 +++++++++
 .../heron/scheduler/RuntimeManagerRunnerTest.java  | 359 ++++++++++
 .../apache/heron/scheduler/SchedulerMainTest.java  | 259 +++++++
 .../apache/heron/scheduler/SubmitterMainTest.java  | 214 ++++++
 .../heron/scheduler/UpdateTopologyManagerTest.java | 280 ++++++++
 .../client/HttpServiceSchedulerClientTest.java     | 144 ++++
 .../client/LibrarySchedulerClientTest.java         |  82 +++
 .../client/SchedulerClientFactoryTest.java         | 120 ++++
 .../scheduler/dryrun/JsonFormatterUtilsTest.java   |  70 ++
 .../scheduler/dryrun/SubmitDryRunRenderTest.java   |  90 +++
 .../scheduler/dryrun/UpdateDryRunRenderTest.java   | 132 ++++
 .../scheduler/server/SchedulerServerTest.java      |  39 +
 .../heron/scheduler/utils/LauncherUtilsTest.java   | 108 +++
 .../heron/scheduler/utils/SchedulerUtilsTest.java  | 171 +++++
 .../resources/JsonFormatterUtilsExpectedJson.txt   |   2 +-
 .../tests/resources/SubmitDryRunOutputATable.txt   |   2 +-
 .../resources/SubmitDryRunOutputATableNonRich.txt  |   2 +-
 .../tests/resources/UpdateDryRunOutputATable.txt   |   2 +-
 .../resources/UpdateDryRunOutputATableNonRich.txt  |   2 +-
 .../tests/resources/UpdateDryRunOutputBTable.txt   |   2 +-
 .../resources/UpdateDryRunOutputBTableNonRich.txt  |   2 +-
 heron/schedulers/src/java/BUILD                    |  18 +-
 .../com/twitter/heron/scheduler/NullLauncher.java  |  38 -
 .../com/twitter/heron/scheduler/NullScheduler.java |  62 --
 .../scheduler/aurora/AuroraCLIController.java      | 198 -----
 .../heron/scheduler/aurora/AuroraContext.java      |  48 --
 .../heron/scheduler/aurora/AuroraController.java   |  37 -
 .../heron/scheduler/aurora/AuroraField.java        |  33 -
 .../aurora/AuroraHeronShellController.java         | 127 ----
 .../heron/scheduler/aurora/AuroraLauncher.java     |  53 --
 .../heron/scheduler/aurora/AuroraScheduler.java    | 279 --------
 .../kubernetes/AppsV1beta1Controller.java          | 464 ------------
 .../scheduler/kubernetes/KubernetesCompat.java     |  59 --
 .../scheduler/kubernetes/KubernetesConstants.java  | 104 ---
 .../scheduler/kubernetes/KubernetesContext.java    | 134 ----
 .../scheduler/kubernetes/KubernetesController.java |  73 --
 .../scheduler/kubernetes/KubernetesLauncher.java   |  56 --
 .../scheduler/kubernetes/KubernetesScheduler.java  | 187 -----
 .../scheduler/kubernetes/KubernetesUtils.java      |  71 --
 .../heron/scheduler/kubernetes/Volumes.java        | 109 ---
 .../heron/scheduler/local/LocalContext.java        |  27 -
 .../twitter/heron/scheduler/local/LocalKey.java    |  65 --
 .../heron/scheduler/local/LocalLauncher.java       | 157 ----
 .../heron/scheduler/local/LocalScheduler.java      | 348 ---------
 .../scheduler/marathon/MarathonConstants.java      |  83 ---
 .../heron/scheduler/marathon/MarathonContext.java  |  41 --
 .../scheduler/marathon/MarathonController.java     | 197 -----
 .../heron/scheduler/marathon/MarathonLauncher.java |  52 --
 .../scheduler/marathon/MarathonScheduler.java      | 223 ------
 .../heron/scheduler/mesos/MesosContext.java        |  55 --
 .../heron/scheduler/mesos/MesosLauncher.java       | 146 ----
 .../heron/scheduler/mesos/MesosScheduler.java      | 274 -------
 .../scheduler/mesos/framework/BaseContainer.java   |  98 ---
 .../scheduler/mesos/framework/LaunchableTask.java  | 225 ------
 .../scheduler/mesos/framework/MesosFramework.java  | 575 ---------------
 .../scheduler/mesos/framework/TaskResources.java   | 151 ----
 .../heron/scheduler/mesos/framework/TaskUtils.java |  57 --
 .../heron/scheduler/nomad/NomadConstants.java      | 113 ---
 .../heron/scheduler/nomad/NomadContext.java        |  93 ---
 .../twitter/heron/scheduler/nomad/NomadKey.java    |  61 --
 .../heron/scheduler/nomad/NomadLauncher.java       |  52 --
 .../heron/scheduler/nomad/NomadScheduler.java      | 607 ----------------
 .../heron/scheduler/slurm/SlurmContext.java        |  39 -
 .../heron/scheduler/slurm/SlurmController.java     | 166 -----
 .../heron/scheduler/slurm/SlurmLauncher.java       | 108 ---
 .../heron/scheduler/slurm/SlurmScheduler.java      | 146 ----
 .../heron/scheduler/utils/HttpJsonClient.java      | 134 ----
 .../scheduler/yarn/HeronClientConfiguration.java   |  29 -
 .../scheduler/yarn/HeronConfigurationOptions.java  |  64 --
 .../scheduler/yarn/HeronDriverConfiguration.java   |  62 --
 .../heron/scheduler/yarn/HeronExecutorTask.java    | 200 ------
 .../heron/scheduler/yarn/HeronMasterDriver.java    | 725 -------------------
 .../scheduler/yarn/HeronMasterDriverProvider.java  |  47 --
 .../heron/scheduler/yarn/HeronReefUtils.java       |  41 --
 .../scheduler/yarn/HeronTaskConfiguration.java     |  59 --
 .../scheduler/yarn/ReefClientSideHandlers.java     |  94 ---
 .../twitter/heron/scheduler/yarn/YarnContext.java  |  34 -
 .../com/twitter/heron/scheduler/yarn/YarnKey.java  |  67 --
 .../twitter/heron/scheduler/yarn/YarnLauncher.java | 193 -----
 .../heron/scheduler/yarn/YarnScheduler.java        | 125 ----
 .../org/apache/heron/scheduler/NullLauncher.java   |  38 +
 .../org/apache/heron/scheduler/NullScheduler.java  |  62 ++
 .../scheduler/aurora/AuroraCLIController.java      | 198 +++++
 .../heron/scheduler/aurora/AuroraContext.java      |  48 ++
 .../heron/scheduler/aurora/AuroraController.java   |  37 +
 .../apache/heron/scheduler/aurora/AuroraField.java |  33 +
 .../aurora/AuroraHeronShellController.java         | 127 ++++
 .../heron/scheduler/aurora/AuroraLauncher.java     |  53 ++
 .../heron/scheduler/aurora/AuroraScheduler.java    | 279 ++++++++
 .../kubernetes/AppsV1beta1Controller.java          | 464 ++++++++++++
 .../scheduler/kubernetes/KubernetesCompat.java     |  59 ++
 .../scheduler/kubernetes/KubernetesConstants.java  | 104 +++
 .../scheduler/kubernetes/KubernetesContext.java    | 134 ++++
 .../scheduler/kubernetes/KubernetesController.java |  73 ++
 .../scheduler/kubernetes/KubernetesLauncher.java   |  56 ++
 .../scheduler/kubernetes/KubernetesScheduler.java  | 187 +++++
 .../scheduler/kubernetes/KubernetesUtils.java      |  71 ++
 .../apache/heron/scheduler/kubernetes/Volumes.java | 109 +++
 .../apache/heron/scheduler/local/LocalContext.java |  27 +
 .../org/apache/heron/scheduler/local/LocalKey.java |  65 ++
 .../heron/scheduler/local/LocalLauncher.java       | 157 ++++
 .../heron/scheduler/local/LocalScheduler.java      | 348 +++++++++
 .../scheduler/marathon/MarathonConstants.java      |  83 +++
 .../heron/scheduler/marathon/MarathonContext.java  |  41 ++
 .../scheduler/marathon/MarathonController.java     | 197 +++++
 .../heron/scheduler/marathon/MarathonLauncher.java |  52 ++
 .../scheduler/marathon/MarathonScheduler.java      | 223 ++++++
 .../apache/heron/scheduler/mesos/MesosContext.java |  55 ++
 .../heron/scheduler/mesos/MesosLauncher.java       | 146 ++++
 .../heron/scheduler/mesos/MesosScheduler.java      | 273 +++++++
 .../scheduler/mesos/framework/BaseContainer.java   |  98 +++
 .../scheduler/mesos/framework/LaunchableTask.java  | 224 ++++++
 .../scheduler/mesos/framework/MesosFramework.java  | 574 +++++++++++++++
 .../scheduler/mesos/framework/TaskResources.java   | 151 ++++
 .../heron/scheduler/mesos/framework/TaskUtils.java |  57 ++
 .../heron/scheduler/nomad/NomadConstants.java      | 113 +++
 .../apache/heron/scheduler/nomad/NomadContext.java |  93 +++
 .../org/apache/heron/scheduler/nomad/NomadKey.java |  61 ++
 .../heron/scheduler/nomad/NomadLauncher.java       |  52 ++
 .../heron/scheduler/nomad/NomadScheduler.java      | 607 ++++++++++++++++
 .../apache/heron/scheduler/slurm/SlurmContext.java |  39 +
 .../heron/scheduler/slurm/SlurmController.java     | 166 +++++
 .../heron/scheduler/slurm/SlurmLauncher.java       | 108 +++
 .../heron/scheduler/slurm/SlurmScheduler.java      | 146 ++++
 .../heron/scheduler/utils/HttpJsonClient.java      | 134 ++++
 .../scheduler/yarn/HeronClientConfiguration.java   |  29 +
 .../scheduler/yarn/HeronConfigurationOptions.java  |  64 ++
 .../scheduler/yarn/HeronDriverConfiguration.java   |  61 ++
 .../heron/scheduler/yarn/HeronExecutorTask.java    | 199 ++++++
 .../heron/scheduler/yarn/HeronMasterDriver.java    | 724 +++++++++++++++++++
 .../scheduler/yarn/HeronMasterDriverProvider.java  |  47 ++
 .../heron/scheduler/yarn/HeronReefUtils.java       |  41 ++
 .../scheduler/yarn/HeronTaskConfiguration.java     |  58 ++
 .../scheduler/yarn/ReefClientSideHandlers.java     |  94 +++
 .../apache/heron/scheduler/yarn/YarnContext.java   |  34 +
 .../org/apache/heron/scheduler/yarn/YarnKey.java   |  67 ++
 .../apache/heron/scheduler/yarn/YarnLauncher.java  | 192 +++++
 .../apache/heron/scheduler/yarn/YarnScheduler.java | 125 ++++
 heron/schedulers/tests/java/BUILD                  |  54 +-
 .../scheduler/aurora/AuroraCLIControllerTest.java  | 194 -----
 .../heron/scheduler/aurora/AuroraContextTest.java  |  43 --
 .../heron/scheduler/aurora/AuroraLauncherTest.java |  73 --
 .../scheduler/aurora/AuroraSchedulerTest.java      | 360 ----------
 .../kubernetes/KubernetesControllerTest.java       |  86 ---
 .../kubernetes/KubernetesLauncherTest.java         |  76 --
 .../kubernetes/KubernetesSchedulerTest.java        | 238 -------
 .../heron/scheduler/kubernetes/VolumesTests.java   |  79 --
 .../heron/scheduler/local/LocalLauncherTest.java   |  86 ---
 .../heron/scheduler/local/LocalSchedulerTest.java  | 331 ---------
 .../scheduler/marathon/MarathonControllerTest.java | 349 ---------
 .../scheduler/marathon/MarathonLauncherTest.java   |  76 --
 .../scheduler/marathon/MarathonSchedulerTest.java  | 163 -----
 .../heron/scheduler/mesos/MesosLauncherTest.java   |  97 ---
 .../heron/scheduler/mesos/MesosSchedulerTest.java  | 157 ----
 .../mesos/framework/LaunchableTaskTest.java        | 186 -----
 .../mesos/framework/MesosFrameworkTest.java        | 334 ---------
 .../mesos/framework/TaskResourcesTest.java         |  97 ---
 .../scheduler/mesos/framework/TaskUtilsTest.java   |  43 --
 .../heron/scheduler/nomad/NomadSchedulerTest.java  | 531 --------------
 .../heron/scheduler/slurm/SlurmControllerTest.java |  97 ---
 .../heron/scheduler/slurm/SlurmLauncherTest.java   | 110 ---
 .../heron/scheduler/slurm/SlurmSchedulerTest.java  | 159 -----
 .../scheduler/yarn/HeronExecutorTaskTest.java      | 165 -----
 .../scheduler/yarn/HeronMasterDriverTest.java      | 491 -------------
 .../heron/scheduler/yarn/YarnLauncherTest.java     | 134 ----
 .../heron/scheduler/yarn/YarnSchedulerTest.java    |  52 --
 .../scheduler/aurora/AuroraCLIControllerTest.java  | 194 +++++
 .../heron/scheduler/aurora/AuroraContextTest.java  |  43 ++
 .../heron/scheduler/aurora/AuroraLauncherTest.java |  73 ++
 .../scheduler/aurora/AuroraSchedulerTest.java      | 360 ++++++++++
 .../kubernetes/KubernetesControllerTest.java       |  86 +++
 .../kubernetes/KubernetesLauncherTest.java         |  76 ++
 .../kubernetes/KubernetesSchedulerTest.java        | 238 +++++++
 .../heron/scheduler/kubernetes/VolumesTests.java   |  79 ++
 .../heron/scheduler/local/LocalLauncherTest.java   |  86 +++
 .../heron/scheduler/local/LocalSchedulerTest.java  | 331 +++++++++
 .../scheduler/marathon/MarathonControllerTest.java | 349 +++++++++
 .../scheduler/marathon/MarathonLauncherTest.java   |  76 ++
 .../scheduler/marathon/MarathonSchedulerTest.java  | 163 +++++
 .../heron/scheduler/mesos/MesosLauncherTest.java   |  97 +++
 .../heron/scheduler/mesos/MesosSchedulerTest.java  | 157 ++++
 .../mesos/framework/LaunchableTaskTest.java        | 186 +++++
 .../mesos/framework/MesosFrameworkTest.java        | 334 +++++++++
 .../mesos/framework/TaskResourcesTest.java         |  98 +++
 .../scheduler/mesos/framework/TaskUtilsTest.java   |  43 ++
 .../heron/scheduler/nomad/NomadSchedulerTest.java  | 531 ++++++++++++++
 .../heron/scheduler/slurm/SlurmControllerTest.java |  97 +++
 .../heron/scheduler/slurm/SlurmLauncherTest.java   | 110 +++
 .../heron/scheduler/slurm/SlurmSchedulerTest.java  | 159 +++++
 .../scheduler/yarn/HeronExecutorTaskTest.java      | 165 +++++
 .../scheduler/yarn/HeronMasterDriverTest.java      | 491 +++++++++++++
 .../heron/scheduler/yarn/YarnLauncherTest.java     | 134 ++++
 .../heron/scheduler/yarn/YarnSchedulerTest.java    |  52 ++
 .../com/twitter/heron/simulator/Simulator.java     | 263 -------
 .../simulator/executors/InstanceExecutor.java      | 210 ------
 .../heron/simulator/executors/MetricsExecutor.java | 135 ----
 .../heron/simulator/executors/StreamExecutor.java  | 343 ---------
 .../heron/simulator/grouping/AllGrouping.java      |  31 -
 .../heron/simulator/grouping/CustomGrouping.java   |  33 -
 .../heron/simulator/grouping/FieldsGrouping.java   |  71 --
 .../twitter/heron/simulator/grouping/Grouping.java |  62 --
 .../heron/simulator/grouping/LowestGrouping.java   |  39 -
 .../heron/simulator/grouping/ShuffleGrouping.java  |  53 --
 .../heron/simulator/instance/BoltInstance.java     | 126 ----
 .../heron/simulator/instance/RootTupleInfo.java    |  55 --
 .../heron/simulator/instance/SpoutInstance.java    |  98 ---
 .../twitter/heron/simulator/utils/RotatingMap.java |  83 ---
 .../heron/simulator/utils/TopologyManager.java     | 256 -------
 .../twitter/heron/simulator/utils/TupleCache.java  | 191 -----
 .../twitter/heron/simulator/utils/XORManager.java  | 103 ---
 .../java/org/apache/heron/simulator/Simulator.java | 263 +++++++
 .../simulator/executors/InstanceExecutor.java      | 210 ++++++
 .../heron/simulator/executors/MetricsExecutor.java | 135 ++++
 .../heron/simulator/executors/StreamExecutor.java  | 343 +++++++++
 .../heron/simulator/grouping/AllGrouping.java      |  31 +
 .../heron/simulator/grouping/CustomGrouping.java   |  33 +
 .../heron/simulator/grouping/FieldsGrouping.java   |  71 ++
 .../apache/heron/simulator/grouping/Grouping.java  |  62 ++
 .../heron/simulator/grouping/LowestGrouping.java   |  39 +
 .../heron/simulator/grouping/ShuffleGrouping.java  |  53 ++
 .../heron/simulator/instance/BoltInstance.java     | 126 ++++
 .../apache}/heron/simulator/instance/README        |   0
 .../heron/simulator/instance/RootTupleInfo.java    |  55 ++
 .../heron/simulator/instance/SpoutInstance.java    |  98 +++
 .../apache/heron/simulator/utils/RotatingMap.java  |  83 +++
 .../heron/simulator/utils/TopologyManager.java     | 256 +++++++
 .../apache/heron/simulator/utils/TupleCache.java   | 191 +++++
 .../apache/heron/simulator/utils/XORManager.java   | 103 +++
 heron/simulator/tests/java/BUILD                   |  22 +-
 .../com/twitter/heron/simulator/SimulatorTest.java |  77 --
 .../simulator/executors/InstanceExecutorTest.java  | 128 ----
 .../heron/simulator/grouping/AllGroupingTest.java  |  62 --
 .../simulator/grouping/CustomGroupingTest.java     |  57 --
 .../simulator/grouping/FieldsGroupingTest.java     | 210 ------
 .../simulator/grouping/LowestGroupingTest.java     |  56 --
 .../simulator/grouping/ShuffleGroupingTest.java    | 105 ---
 .../heron/simulator/utils/RotatingMapTest.java     | 175 -----
 .../heron/simulator/utils/TopologyManagerTest.java | 232 ------
 .../heron/simulator/utils/TupleCacheTest.java      | 193 -----
 .../heron/simulator/utils/XORManagerTest.java      | 175 -----
 .../org/apache/heron/simulator/SimulatorTest.java  |  77 ++
 .../simulator/executors/InstanceExecutorTest.java  | 127 ++++
 .../heron/simulator/grouping/AllGroupingTest.java  |  62 ++
 .../simulator/grouping/CustomGroupingTest.java     |  57 ++
 .../simulator/grouping/FieldsGroupingTest.java     | 210 ++++++
 .../simulator/grouping/LowestGroupingTest.java     |  56 ++
 .../simulator/grouping/ShuffleGroupingTest.java    | 105 +++
 .../heron/simulator/utils/RotatingMapTest.java     | 175 +++++
 .../heron/simulator/utils/TopologyManagerTest.java | 232 ++++++
 .../heron/simulator/utils/TupleCacheTest.java      | 193 +++++
 .../heron/simulator/utils/XORManagerTest.java      | 175 +++++
 heron/spi/src/java/BUILD                           |   2 +-
 .../java/com/twitter/heron/spi/common/Config.java  | 360 ----------
 .../com/twitter/heron/spi/common/ConfigLoader.java |  95 ---
 .../java/com/twitter/heron/spi/common/Context.java | 351 ---------
 .../src/java/com/twitter/heron/spi/common/Key.java | 262 -------
 .../com/twitter/heron/spi/common/TokenSub.java     | 153 ----
 .../spi/metricsmgr/metrics/ExceptionInfo.java      |  87 ---
 .../spi/metricsmgr/metrics/MetricsFilter.java      |  79 --
 .../heron/spi/metricsmgr/metrics/MetricsInfo.java  |  52 --
 .../spi/metricsmgr/metrics/MetricsRecord.java      | 135 ----
 .../heron/spi/metricsmgr/sink/IMetricsSink.java    |  58 --
 .../heron/spi/metricsmgr/sink/SinkContext.java     |  39 -
 .../com/twitter/heron/spi/packing/IPacking.java    |  56 --
 .../com/twitter/heron/spi/packing/IRepacking.java  |  57 --
 .../com/twitter/heron/spi/packing/InstanceId.java  |  72 --
 .../heron/spi/packing/PackingException.java        |  29 -
 .../com/twitter/heron/spi/packing/PackingPlan.java | 322 ---------
 .../spi/packing/PackingPlanProtoDeserializer.java  |  67 --
 .../spi/packing/PackingPlanProtoSerializer.java    |  64 --
 .../com/twitter/heron/spi/packing/Resource.java    | 114 ---
 .../com/twitter/heron/spi/scheduler/ILauncher.java |  55 --
 .../com/twitter/heron/spi/scheduler/IScalable.java |  43 --
 .../twitter/heron/spi/scheduler/IScheduler.java    | 101 ---
 .../heron/spi/scheduler/LauncherException.java     |  30 -
 .../heron/spi/scheduler/SchedulerException.java    |  30 -
 .../heron/spi/statefulstorage/Checkpoint.java      |  65 --
 .../spi/statefulstorage/IStatefulStorage.java      |  52 --
 .../statefulstorage/StatefulStorageException.java  |  30 -
 .../twitter/heron/spi/statemgr/IStateManager.java  | 303 --------
 .../java/com/twitter/heron/spi/statemgr/Lock.java  |  33 -
 .../spi/statemgr/SchedulerStateManagerAdaptor.java | 300 --------
 .../twitter/heron/spi/statemgr/WatchCallback.java  |  39 -
 .../com/twitter/heron/spi/uploader/IUploader.java  |  65 --
 .../heron/spi/uploader/UploaderException.java      |  29 -
 .../com/twitter/heron/spi/utils/NetworkUtils.java  | 533 --------------
 .../twitter/heron/spi/utils/PackingTestUtils.java  | 119 ----
 .../twitter/heron/spi/utils/ReflectionUtils.java   |  36 -
 .../com/twitter/heron/spi/utils/ShellUtils.java    | 332 ---------
 .../twitter/heron/spi/utils/TMasterException.java  |  31 -
 .../com/twitter/heron/spi/utils/TMasterUtils.java  | 197 -----
 .../com/twitter/heron/spi/utils/UploaderUtils.java |  83 ---
 .../java/org/apache/heron/spi/common/Config.java   | 360 ++++++++++
 .../org/apache/heron/spi/common/ConfigLoader.java  |  95 +++
 .../java/org/apache/heron/spi/common/Context.java  | 351 +++++++++
 .../src/java/org/apache/heron/spi/common/Key.java  | 262 +++++++
 .../java/org/apache/heron/spi/common/TokenSub.java | 153 ++++
 .../spi/metricsmgr/metrics/ExceptionInfo.java      |  87 +++
 .../spi/metricsmgr/metrics/MetricsFilter.java      |  79 ++
 .../heron/spi/metricsmgr/metrics/MetricsInfo.java  |  52 ++
 .../spi/metricsmgr/metrics/MetricsRecord.java      | 135 ++++
 .../heron/spi/metricsmgr/sink/IMetricsSink.java    |  58 ++
 .../heron/spi/metricsmgr/sink/SinkContext.java     |  39 +
 .../org/apache/heron/spi/packing/IPacking.java     |  56 ++
 .../org/apache/heron/spi/packing/IRepacking.java   |  57 ++
 .../org/apache/heron/spi/packing/InstanceId.java   |  72 ++
 .../apache/heron/spi/packing/PackingException.java |  29 +
 .../org/apache/heron/spi/packing/PackingPlan.java  | 322 +++++++++
 .../spi/packing/PackingPlanProtoDeserializer.java  |  67 ++
 .../spi/packing/PackingPlanProtoSerializer.java    |  64 ++
 .../org/apache/heron/spi/packing/Resource.java     | 114 +++
 .../org/apache/heron/spi/scheduler/ILauncher.java  |  55 ++
 .../org/apache/heron/spi/scheduler/IScalable.java  |  43 ++
 .../org/apache/heron/spi/scheduler/IScheduler.java | 101 +++
 .../heron/spi/scheduler/LauncherException.java     |  30 +
 .../heron/spi/scheduler/SchedulerException.java    |  30 +
 .../heron/spi/statefulstorage/Checkpoint.java      |  65 ++
 .../spi/statefulstorage/IStatefulStorage.java      |  52 ++
 .../statefulstorage/StatefulStorageException.java  |  30 +
 .../apache/heron/spi/statemgr/IStateManager.java   | 303 ++++++++
 .../java/org/apache/heron/spi/statemgr/Lock.java   |  33 +
 .../spi/statemgr/SchedulerStateManagerAdaptor.java | 300 ++++++++
 .../apache/heron/spi/statemgr/WatchCallback.java   |  39 +
 .../org/apache/heron/spi/uploader/IUploader.java   |  65 ++
 .../heron/spi/uploader/UploaderException.java      |  29 +
 .../org/apache/heron/spi/utils/NetworkUtils.java   | 533 ++++++++++++++
 .../apache/heron/spi/utils/PackingTestUtils.java   | 119 ++++
 .../apache/heron/spi/utils/ReflectionUtils.java    |  36 +
 .../org/apache/heron/spi/utils/ShellUtils.java     | 332 +++++++++
 .../apache/heron/spi/utils/TMasterException.java   |  31 +
 .../org/apache/heron/spi/utils/TMasterUtils.java   | 197 +++++
 .../org/apache/heron/spi/utils/UploaderUtils.java  |  83 +++
 heron/spi/tests/java/BUILD                         |  22 +-
 .../twitter/heron/spi/common/ConfigLoaderTest.java | 197 -----
 .../com/twitter/heron/spi/common/ConfigTest.java   | 125 ----
 .../com/twitter/heron/spi/common/ContextTest.java  |  64 --
 .../com/twitter/heron/spi/common/KeysTest.java     | 169 -----
 .../com/twitter/heron/spi/common/TokenSubTest.java |  88 ---
 .../heron/spi/common/testdata/local/cluster.yaml   |  11 -
 .../heron/spi/common/testdata/local/healthmgr.yaml |  19 -
 .../heron/spi/common/testdata/local/packing.yaml   |   2 -
 .../heron/spi/common/testdata/local/scheduler.yaml |   5 -
 .../heron/spi/common/testdata/local/stateful.yaml  |   7 -
 .../heron/spi/common/testdata/local/statemgr.yaml  |   6 -
 .../heron/spi/common/testdata/local/uploader.yaml  |   6 -
 .../spi/metricsmgr/metrics/ExceptionInfoTest.java  | 102 ---
 .../spi/metricsmgr/metrics/MetricsInfoTest.java    |  64 --
 .../spi/metricsmgr/metrics/MetricsRecordTest.java  | 107 ---
 .../twitter/heron/spi/packing/PackingPlanTest.java | 155 ----
 .../twitter/heron/spi/packing/ResourceTest.java    |  64 --
 .../twitter/heron/spi/utils/NetworkUtilsTest.java  | 293 --------
 .../twitter/heron/spi/utils/ShellUtilsTest.java    | 124 ----
 .../twitter/heron/spi/utils/UploaderUtilsTest.java | 103 ---
 .../apache/heron/spi/common/ConfigLoaderTest.java  | 197 +++++
 .../org/apache/heron/spi/common/ConfigTest.java    | 125 ++++
 .../org/apache/heron/spi/common/ContextTest.java   |  64 ++
 .../java/org/apache/heron/spi/common/KeysTest.java | 169 +++++
 .../org/apache/heron/spi/common/TokenSubTest.java  |  88 +++
 .../heron/spi/common/testdata/local/cluster.yaml   |  11 +
 .../heron/spi/common/testdata/local/healthmgr.yaml |  19 +
 .../heron/spi/common/testdata/local/packing.yaml   |   2 +
 .../heron/spi/common/testdata/local/scheduler.yaml |   5 +
 .../heron/spi/common/testdata/local/stateful.yaml  |   7 +
 .../heron/spi/common/testdata/local/statemgr.yaml  |   6 +
 .../heron/spi/common/testdata/local/uploader.yaml  |   6 +
 .../spi/metricsmgr/metrics/ExceptionInfoTest.java  | 102 +++
 .../spi/metricsmgr/metrics/MetricsInfoTest.java    |  64 ++
 .../spi/metricsmgr/metrics/MetricsRecordTest.java  | 107 +++
 .../apache/heron/spi/packing/PackingPlanTest.java  | 155 ++++
 .../org/apache/heron/spi/packing/ResourceTest.java |  64 ++
 .../apache/heron/spi/utils/NetworkUtilsTest.java   | 293 ++++++++
 .../org/apache/heron/spi/utils/ShellUtilsTest.java | 124 ++++
 .../apache/heron/spi/utils/UploaderUtilsTest.java  | 103 +++
 .../heron/statefulstorage/dlog/DlogStorage.java    | 242 -------
 .../heron/statefulstorage/hdfs/HDFSStorage.java    | 190 -----
 .../localfs/LocalFileSystemStorage.java            | 142 ----
 .../heron/statefulstorage/dlog/DlogStorage.java    | 241 +++++++
 .../heron/statefulstorage/hdfs/HDFSStorage.java    | 189 +++++
 .../localfs/LocalFileSystemStorage.java            | 142 ++++
 heron/statefulstorages/tests/java/BUILD            |   4 +-
 .../StatefulStorageTestContext.java                |  58 --
 .../statefulstorage/dlog/DlogStorageTest.java      | 263 -------
 .../statefulstorage/hdfs/HDFSStorageTest.java      | 152 ----
 .../localfs/LocalFileSystemStorageTest.java        | 114 ---
 .../StatefulStorageTestContext.java                |  58 ++
 .../statefulstorage/dlog/DlogStorageTest.java      | 263 +++++++
 .../statefulstorage/hdfs/HDFSStorageTest.java      | 152 ++++
 .../localfs/LocalFileSystemStorageTest.java        | 114 +++
 heron/statemgrs/src/java/BUILD                     |   4 +-
 .../heron/statemgr/FileSystemStateManager.java     | 337 ---------
 .../twitter/heron/statemgr/NullStateManager.java   | 220 ------
 .../statemgr/localfs/LocalFileSystemContext.java   |  32 -
 .../heron/statemgr/localfs/LocalFileSystemKey.java |  32 -
 .../localfs/LocalFileSystemStateManager.java       | 252 -------
 .../heron/statemgr/zookeeper/ZkContext.java        |  52 --
 .../twitter/heron/statemgr/zookeeper/ZkUtils.java  |  84 ---
 .../statemgr/zookeeper/ZkWatcherCallback.java      |  57 --
 .../zookeeper/curator/CuratorStateManager.java     | 445 ------------
 .../heron/statemgr/FileSystemStateManager.java     | 337 +++++++++
 .../apache/heron/statemgr/NullStateManager.java    | 220 ++++++
 .../statemgr/localfs/LocalFileSystemContext.java   |  32 +
 .../heron/statemgr/localfs/LocalFileSystemKey.java |  32 +
 .../localfs/LocalFileSystemStateManager.java       | 252 +++++++
 .../apache/heron/statemgr/zookeeper/ZkContext.java |  52 ++
 .../apache/heron/statemgr/zookeeper/ZkUtils.java   |  84 +++
 .../statemgr/zookeeper/ZkWatcherCallback.java      |  56 ++
 .../zookeeper/curator/CuratorStateManager.java     | 444 ++++++++++++
 heron/statemgrs/src/python/configloader.py         |   4 +-
 .../localfs/LocalFileSystemStateManagerTest.java   | 264 -------
 .../heron/statemgr/zookeeper/ZkUtilsTest.java      | 109 ---
 .../zookeeper/curator/CuratorStateManagerTest.java | 328 ---------
 .../localfs/LocalFileSystemStateManagerTest.java   | 264 +++++++
 .../heron/statemgr/zookeeper/ZkUtilsTest.java      | 108 +++
 .../zookeeper/curator/CuratorStateManagerTest.java | 328 +++++++++
 heron/tools/apiserver/src/java/BUILD               |   2 +-
 .../com/twitter/heron/apiserver/Constants.java     |  39 -
 .../com/twitter/heron/apiserver/Resources.java     |  46 --
 .../java/com/twitter/heron/apiserver/Runtime.java  | 345 ---------
 .../twitter/heron/apiserver/actions/Action.java    |  18 -
 .../heron/apiserver/actions/ActionFactory.java     |  24 -
 .../heron/apiserver/actions/ActionFactoryImpl.java |  40 --
 .../heron/apiserver/actions/ActionType.java        |  30 -
 .../com/twitter/heron/apiserver/actions/Keys.java  |  27 -
 .../apiserver/actions/SubmitTopologyAction.java    |  35 -
 .../apiserver/actions/TopologyRuntimeAction.java   |  35 -
 .../apiserver/resources/ConfigurationResource.java |  57 --
 .../heron/apiserver/resources/FileResource.java    | 173 -----
 .../twitter/heron/apiserver/resources/Forms.java   |  58 --
 .../heron/apiserver/resources/HeronResource.java   |  99 ---
 .../resources/NotFoundExceptionHandler.java        |  51 --
 .../apiserver/resources/TopologyResource.java      | 573 ---------------
 .../twitter/heron/apiserver/utils/ConfigUtils.java | 169 -----
 .../twitter/heron/apiserver/utils/FileHelper.java  | 160 -----
 .../com/twitter/heron/apiserver/utils/Logging.java |  51 --
 .../com/twitter/heron/apiserver/utils/Utils.java   |  52 --
 .../java/org/apache/heron/apiserver/Constants.java |  39 +
 .../java/org/apache/heron/apiserver/Resources.java |  46 ++
 .../java/org/apache/heron/apiserver/Runtime.java   | 345 +++++++++
 .../org/apache/heron/apiserver/actions/Action.java |  18 +
 .../heron/apiserver/actions/ActionFactory.java     |  24 +
 .../heron/apiserver/actions/ActionFactoryImpl.java |  40 ++
 .../apache/heron/apiserver/actions/ActionType.java |  30 +
 .../org/apache/heron/apiserver/actions/Keys.java   |  27 +
 .../apiserver/actions/SubmitTopologyAction.java    |  35 +
 .../apiserver/actions/TopologyRuntimeAction.java   |  35 +
 .../apiserver/resources/ConfigurationResource.java |  57 ++
 .../heron/apiserver/resources/FileResource.java    | 173 +++++
 .../apache/heron/apiserver/resources/Forms.java    |  58 ++
 .../heron/apiserver/resources/HeronResource.java   |  99 +++
 .../resources/NotFoundExceptionHandler.java        |  51 ++
 .../apiserver/resources/TopologyResource.java      | 573 +++++++++++++++
 .../apache/heron/apiserver/utils/ConfigUtils.java  | 169 +++++
 .../apache/heron/apiserver/utils/FileHelper.java   | 160 +++++
 .../org/apache/heron/apiserver/utils/Logging.java  |  51 ++
 .../org/apache/heron/apiserver/utils/Utils.java    |  52 ++
 heron/tools/apiserver/tests/java/BUILD             |   4 +-
 .../apiserver/resources/TopologyResourceTests.java | 221 ------
 .../heron/apiserver/utils/ConfigUtilsTests.java    | 187 -----
 .../apiserver/resources/TopologyResourceTests.java | 220 ++++++
 .../heron/apiserver/utils/ConfigUtilsTests.java    | 186 +++++
 heron/tools/cli/src/python/cli_helper.py           |   2 +-
 heron/tools/cli/src/python/result.py               |   2 +-
 heron/tools/cli/src/python/submit.py               |   2 +-
 .../cli/tests/python/client_command_unittest.py    |   6 +-
 heron/tools/tracker/src/python/main.py             |   4 +-
 .../com/twitter/heron/uploader/NullUploader.java   |  43 --
 .../com/twitter/heron/uploader/dlog/Copier.java    |  23 -
 .../com/twitter/heron/uploader/dlog/DLContext.java |  37 -
 .../com/twitter/heron/uploader/dlog/DLCopier.java  |  36 -
 .../twitter/heron/uploader/dlog/DLUploader.java    | 213 ------
 .../com/twitter/heron/uploader/gcs/GcsContext.java |  31 -
 .../twitter/heron/uploader/gcs/GcsController.java  |  75 --
 .../twitter/heron/uploader/gcs/GcsUploader.java    | 222 ------
 .../twitter/heron/uploader/hdfs/HdfsContext.java   |  35 -
 .../heron/uploader/hdfs/HdfsController.java        |  48 --
 .../twitter/heron/uploader/hdfs/HdfsUploader.java  | 115 ---
 .../twitter/heron/uploader/http/HttpUploader.java  | 118 ---
 .../heron/uploader/http/HttpUploaderContext.java   |  26 -
 .../uploader/localfs/LocalFileSystemContext.java   |  27 -
 .../heron/uploader/localfs/LocalFileSystemKey.java |  44 --
 .../uploader/localfs/LocalFileSystemUploader.java  | 158 ----
 .../com/twitter/heron/uploader/s3/S3Context.java   |  67 --
 .../com/twitter/heron/uploader/s3/S3Uploader.java  | 247 -------
 .../java/com/twitter/heron/uploader/s3/sample.yaml |  32 -
 .../com/twitter/heron/uploader/scp/ScpContext.java |  50 --
 .../twitter/heron/uploader/scp/ScpController.java  |  59 --
 .../twitter/heron/uploader/scp/ScpUploader.java    | 149 ----
 .../com/twitter/heron/uploader/scp/sample.yaml     |  18 -
 .../org/apache/heron/uploader/NullUploader.java    |  43 ++
 .../org/apache/heron/uploader/dlog/Copier.java     |  23 +
 .../org/apache/heron/uploader/dlog/DLContext.java  |  37 +
 .../org/apache/heron/uploader/dlog/DLCopier.java   |  36 +
 .../org/apache/heron/uploader/dlog/DLUploader.java | 212 ++++++
 .../org/apache/heron/uploader/gcs/GcsContext.java  |  31 +
 .../apache/heron/uploader/gcs/GcsController.java   |  75 ++
 .../org/apache/heron/uploader/gcs/GcsUploader.java | 222 ++++++
 .../apache/heron/uploader/hdfs/HdfsContext.java    |  35 +
 .../apache/heron/uploader/hdfs/HdfsController.java |  48 ++
 .../apache/heron/uploader/hdfs/HdfsUploader.java   | 115 +++
 .../apache}/heron/uploader/hdfs/sample.yaml        |   0
 .../apache/heron/uploader/http/HttpUploader.java   | 117 +++
 .../heron/uploader/http/HttpUploaderContext.java   |  26 +
 .../uploader/localfs/LocalFileSystemContext.java   |  27 +
 .../heron/uploader/localfs/LocalFileSystemKey.java |  44 ++
 .../uploader/localfs/LocalFileSystemUploader.java  | 158 ++++
 .../org/apache/heron/uploader/s3/S3Context.java    |  67 ++
 .../org/apache/heron/uploader/s3/S3Uploader.java   | 244 +++++++
 .../java/org/apache/heron/uploader/s3/sample.yaml  |  32 +
 .../org/apache/heron/uploader/scp/ScpContext.java  |  50 ++
 .../apache/heron/uploader/scp/ScpController.java   |  59 ++
 .../org/apache/heron/uploader/scp/ScpUploader.java | 149 ++++
 .../java/org/apache/heron/uploader/scp/sample.yaml |  18 +
 heron/uploaders/tests/java/BUILD                   |   6 +-
 .../heron/uploader/dlog/DlogUploaderTest.java      | 192 -----
 .../heron/uploader/gcs/GcsUploaderTests.java       | 133 ----
 .../heron/uploader/hdfs/HdfsUploaderTest.java      |  95 ---
 .../heron/uploader/http/HttpUploaderTest.java      | 234 ------
 .../localfs/LocalFileSystemConfigTest.java         | 127 ----
 .../localfs/LocalFileSystemConstantsTest.java      |  23 -
 .../localfs/LocalFileSystemContextTest.java        |  62 --
 .../localfs/LocalFileSystemUploaderTest.java       | 207 ------
 .../twitter/heron/uploader/s3/S3UploaderTest.java  | 198 -----
 .../heron/uploader/scp/ScpUploaderTest.java        | 150 ----
 .../heron/uploader/dlog/DlogUploaderTest.java      | 192 +++++
 .../heron/uploader/gcs/GcsUploaderTests.java       | 133 ++++
 .../heron/uploader/hdfs/HdfsUploaderTest.java      |  95 +++
 .../heron/uploader/http/HttpUploaderTest.java      | 234 ++++++
 .../localfs/LocalFileSystemConfigTest.java         | 127 ++++
 .../localfs/LocalFileSystemConstantsTest.java      |  23 +
 .../localfs/LocalFileSystemContextTest.java        |  62 ++
 .../localfs/LocalFileSystemUploaderTest.java       | 207 ++++++
 .../uploader/localfs/testdata/some-topology.tar    |   0
 .../apache/heron/uploader/s3/S3UploaderTest.java   | 198 +++++
 .../apache/heron/uploader/scp/ScpUploaderTest.java | 150 ++++
 integration_test/src/java/BUILD                    |  12 +-
 .../common/AbstractTestTopology.java               | 138 ----
 .../heron/integration_test/common/BasicConfig.java |  38 -
 .../heron/integration_test/common/HdfsHelper.java  |  46 --
 .../common/bolt/CountAggregatorBolt.java           |  55 --
 .../common/bolt/DoubleTuplesBolt.java              |  45 --
 .../integration_test/common/bolt/IdentityBolt.java |  50 --
 .../common/bolt/IncrementBolt.java                 |  57 --
 .../common/bolt/JSONTweetFilterBolt.java           | 100 ---
 .../common/bolt/LocalWriteBolt.java                |  97 ---
 .../common/bolt/MapAggregatorBolt.java             |  62 --
 .../common/bolt/PartialUniquerBolt.java            |  66 --
 .../common/bolt/TweetPropertyBolt.java             |  93 ---
 .../common/bolt/WordCountBolt.java                 |  68 --
 .../integration_test/common/spout/ABSpout.java     |  67 --
 .../common/spout/HdfsStringSpout.java              | 130 ----
 .../common/spout/LocalFileSpout.java               | 129 ----
 .../common/spout/PausedLocalFileSpout.java         | 141 ----
 .../integration_test/core/AggregatorBolt.java      |  97 ---
 .../heron/integration_test/core/BaseBatchBolt.java |  21 -
 .../heron/integration_test/core/Condition.java     |  23 -
 .../heron/integration_test/core/Constants.java     |  27 -
 .../core/EmitUntilConditionTestSpout.java          | 166 -----
 .../integration_test/core/HttpGetCondition.java    |  63 --
 .../heron/integration_test/core/HttpUtils.java     |  45 --
 .../heron/integration_test/core/IBatchBolt.java    |  26 -
 .../heron/integration_test/core/ITerminalBolt.java |  25 -
 .../integration_test/core/IntegrationTestBolt.java | 186 -----
 .../core/IntegrationTestSpout.java                 | 248 -------
 .../integration_test/core/LocalAggregatorBolt.java | 111 ---
 .../integration_test/core/MultiPhaseTestSpout.java |  59 --
 .../core/StatefulIntegrationTestBolt.java          |  42 --
 .../core/StatefulIntegrationTestSpout.java         |  42 --
 .../integration_test/core/TestTopologyBuilder.java | 279 --------
 .../integration_test/core/TestTopologyContext.java | 178 -----
 .../topology/all_grouping/AllGrouping.java         |  45 --
 .../BasicTopologyOneTask.java                      |  45 --
 .../BoltDoubleEmitTuples.java                      |  45 --
 .../topology/fields_grouping/FieldsGrouping.java   |  48 --
 .../topology/global_grouping/GlobalGrouping.java   |  44 --
 .../MultiSpoutsMultiTasks.java                     |  47 --
 .../topology/non_grouping/NonGrouping.java         |  45 --
 .../one_bolt_multi_tasks/OneBoltMultiTasks.java    |  46 --
 .../OneSpoutBoltMultiTasks.java                    |  45 --
 .../one_spout_multi_tasks/OneSpoutMultiTasks.java  |  45 --
 .../one_spout_two_bolts/OneSpoutTwoBolts.java      |  47 --
 .../topology/serialization/CustomCheckBolt.java    |  51 --
 .../topology/serialization/CustomObject.java       |  68 --
 .../topology/serialization/CustomSpout.java        |  57 --
 .../serialization/SerializationTopology.java       |  59 --
 .../topology/shuffle_grouping/ShuffleGrouping.java |  45 --
 .../topology/windowing/WindowTestBase.java         | 260 -------
 .../windowing/count/SlidingCountWindowTest1.java   |  34 -
 .../windowing/count/SlidingCountWindowTest2.java   |  34 -
 .../windowing/count/SlidingCountWindowTest3.java   |  34 -
 .../windowing/count/TumblingCountWindowTest1.java  |  33 -
 .../windowing/count/TumblingCountWindowTest2.java  |  33 -
 .../windowing/count/TumblingCountWindowTest3.java  |  33 -
 .../windowing/stateful/StatefulWindowingTest.java  | 211 ------
 .../windowing/time/SlidingTimeWindowTest1.java     |  32 -
 .../SlidingWatermarkEventTimeWindowTest1.java      |  36 -
 .../local_readwrite/LocalReadWriteTopology.java    |  58 --
 .../common/AbstractTestTopology.java               | 137 ++++
 .../heron/integration_test/common/BasicConfig.java |  38 +
 .../heron/integration_test/common/HdfsHelper.java  |  46 ++
 .../common/bolt/CountAggregatorBolt.java           |  55 ++
 .../common/bolt/DoubleTuplesBolt.java              |  45 ++
 .../integration_test/common/bolt/IdentityBolt.java |  50 ++
 .../common/bolt/IncrementBolt.java                 |  57 ++
 .../common/bolt/JSONTweetFilterBolt.java           | 100 +++
 .../common/bolt/LocalWriteBolt.java                |  97 +++
 .../common/bolt/MapAggregatorBolt.java             |  62 ++
 .../common/bolt/PartialUniquerBolt.java            |  66 ++
 .../common/bolt/TweetPropertyBolt.java             |  93 +++
 .../common/bolt/WordCountBolt.java                 |  68 ++
 .../integration_test/common/spout/ABSpout.java     |  67 ++
 .../common/spout/HdfsStringSpout.java              | 130 ++++
 .../common/spout/LocalFileSpout.java               | 129 ++++
 .../common/spout/PausedLocalFileSpout.java         | 141 ++++
 .../integration_test/core/AggregatorBolt.java      |  97 +++
 .../heron/integration_test/core/BaseBatchBolt.java |  21 +
 .../heron/integration_test/core/Condition.java     |  23 +
 .../heron/integration_test/core/Constants.java     |  27 +
 .../core/EmitUntilConditionTestSpout.java          | 166 +++++
 .../integration_test/core/HttpGetCondition.java    |  63 ++
 .../heron/integration_test/core/HttpUtils.java     |  45 ++
 .../heron/integration_test/core/IBatchBolt.java    |  26 +
 .../heron/integration_test/core/ITerminalBolt.java |  25 +
 .../integration_test/core/IntegrationTestBolt.java | 186 +++++
 .../core/IntegrationTestSpout.java                 | 248 +++++++
 .../integration_test/core/LocalAggregatorBolt.java | 111 +++
 .../integration_test/core/MultiPhaseTestSpout.java |  59 ++
 .../core/StatefulIntegrationTestBolt.java          |  42 ++
 .../core/StatefulIntegrationTestSpout.java         |  42 ++
 .../integration_test/core/TestTopologyBuilder.java | 279 ++++++++
 .../integration_test/core/TestTopologyContext.java | 177 +++++
 .../topology/all_grouping/AllGrouping.java         |  45 ++
 .../topology/all_grouping/AllGroupingResults.json  |   0
 .../BasicTopologyOneTask.java                      |  45 ++
 .../BasicTopologyOneTaskResults.json               |   0
 .../BoltDoubleEmitTuples.java                      |  45 ++
 .../BoltDoubleEmitTuplesResults.json               |   0
 .../topology/fields_grouping/FieldsGrouping.java   |  48 ++
 .../fields_grouping/FieldsGroupingResults.json     |   0
 .../topology/global_grouping/GlobalGrouping.java   |  44 ++
 .../global_grouping/GlobalGroupingResults.json     |   0
 .../MultiSpoutsMultiTasks.java                     |  47 ++
 .../MultiSpoutsMultiTasksResults.json              |   0
 .../topology/non_grouping/NonGrouping.java         |  45 ++
 .../topology/non_grouping/NonGroupingResults.json  |   0
 .../one_bolt_multi_tasks/OneBoltMultiTasks.java    |  46 ++
 .../OneBoltMultiTasksResults.json                  |   0
 .../OneSpoutBoltMultiTasks.java                    |  45 ++
 .../OneSpoutBoltMultiTasksResults.json             |   0
 .../one_spout_multi_tasks/OneSpoutMultiTasks.java  |  45 ++
 .../OneSpoutMultiTasksResults.json                 |   0
 .../one_spout_two_bolts/OneSpoutTwoBolts.java      |  47 ++
 .../OneSpoutTwoBoltsResults.json                   |   0
 .../topology/serialization/CustomCheckBolt.java    |  51 ++
 .../topology/serialization/CustomObject.java       |  68 ++
 .../topology/serialization/CustomSpout.java        |  57 ++
 .../serialization/SerializationTopology.java       |  59 ++
 .../SerializationTopologyResults.json              |   0
 .../topology/shuffle_grouping/ShuffleGrouping.java |  45 ++
 .../shuffle_grouping/ShuffleGroupingResults.json   |   0
 .../topology/windowing/WindowTestBase.java         | 260 +++++++
 .../windowing/count/SlidingCountWindowTest1.java   |  34 +
 .../count/SlidingCountWindowTest1Results.json      |   0
 .../windowing/count/SlidingCountWindowTest2.java   |  34 +
 .../count/SlidingCountWindowTest2Results.json      |   0
 .../windowing/count/SlidingCountWindowTest3.java   |  34 +
 .../count/SlidingCountWindowTest3Results.json      |   0
 .../windowing/count/TumblingCountWindowTest1.java  |  33 +
 .../count/TumblingCountWindowTest1Results.json     |   0
 .../windowing/count/TumblingCountWindowTest2.java  |  33 +
 .../count/TumblingCountWindowTest2Results.json     |   0
 .../windowing/count/TumblingCountWindowTest3.java  |  33 +
 .../count/TumblingCountWindowTest3Results.json     |   0
 .../windowing/stateful/StatefulWindowingTest.java  | 211 ++++++
 .../stateful/StatefulWindowingTestResults.json     |   0
 .../windowing/time/SlidingTimeWindowTest1.java     |  32 +
 .../time/SlidingTimeWindowTest1Results.json        |   0
 .../SlidingWatermarkEventTimeWindowTest1.java      |  36 +
 ...lidingWatermarkEventTimeWindowTest1Results.json |   0
 .../local_readwrite/LocalReadWriteTopology.java    |  58 ++
 .../python/local_test_runner/resources/test.conf   |   2 +-
 .../src/python/test_runner/resources/test.json     |  17 +-
 integration_test/src/scala/BUILD                   |   4 +-
 .../common/ScalaIntegrationTestBase.scala          |  32 -
 .../ScalaStreamletWithFilterAndTransform.scala     |  71 --
 .../common/ScalaIntegrationTestBase.scala          |  33 +
 .../ScalaStreamletWithFilterAndTransform.scala     |  74 ++
 ...calaStreamletWithFilterAndTransformResults.json |   0
 release/maven/heron-no-kryo.template.pom           |   2 +-
 release/maven/heron-with-kryo.template.pom         |   2 +-
 release/release-process.md                         |  10 +-
 scripts/packages/BUILD                             |   4 +-
 scripts/packages/heronpy/__apiinit__.py.template   |   2 +-
 .../packages/heronpy/__streamletinit__.py.template |   2 +-
 scripts/packages/heronpy/setup.py.template         |   2 +-
 scripts/resources/idea/codeStyleSettings.xml       |   2 +-
 scripts/run_integration_test.sh                    |   4 +-
 scripts/travis/check.sh                            |   2 +-
 .../storm/examples/SlidingWindowTopology.java      |   2 +-
 .../apache/storm/examples/TaskHookTopology.java    |  16 +-
 .../src/java/backtype/storm/LocalCluster.java      |   2 +-
 .../src/java/backtype/storm/StormSubmitter.java    |   8 +-
 .../backtype/storm/generated/StormTopology.java    |   2 +-
 .../grouping/CustomStreamGroupingDelegate.java     |   4 +-
 .../backtype/storm/hooks/ITaskHookDelegate.java    |  20 +-
 .../backtype/storm/hooks/info/BoltAckInfo.java     |   2 +-
 .../backtype/storm/hooks/info/BoltExecuteInfo.java |   2 +-
 .../backtype/storm/hooks/info/BoltFailInfo.java    |   2 +-
 .../java/backtype/storm/hooks/info/EmitInfo.java   |   2 +-
 .../backtype/storm/hooks/info/SpoutAckInfo.java    |   2 +-
 .../backtype/storm/hooks/info/SpoutFailInfo.java   |   2 +-
 .../storm/metric/api/AssignableMetric.java         |   4 +-
 .../backtype/storm/metric/api/CountMetric.java     |   4 +-
 .../backtype/storm/metric/api/GlobalMetrics.java   |   8 +-
 .../backtype/storm/metric/api/MeanReducer.java     |   2 +-
 .../backtype/storm/metric/api/MetricDelegate.java  |   2 +-
 .../HeronPluggableSerializerDelegate.java          |   2 +-
 .../storm/spout/SpoutOutputCollectorImpl.java      |   4 +-
 .../backtype/storm/task/BoltTopologyContext.java   |   2 +-
 .../storm/task/GeneralTopologyContext.java         |   4 +-
 .../backtype/storm/task/OutputCollectorImpl.java   |  16 +-
 .../backtype/storm/task/SpoutTopologyContext.java  |   2 +-
 .../java/backtype/storm/task/TopologyContext.java  |  14 +-
 .../backtype/storm/task/WorkerTopologyContext.java |   4 +-
 .../backtype/storm/topology/BasicBoltExecutor.java |   4 +-
 .../backtype/storm/topology/BoltDeclarerImpl.java  |   4 +-
 .../backtype/storm/topology/IRichBoltDelegate.java |  14 +-
 .../storm/topology/IRichSpoutDelegate.java         |  12 +-
 .../storm/topology/OutputFieldsGetter.java         |   4 +-
 .../backtype/storm/topology/SpoutDeclarerImpl.java |   4 +-
 .../backtype/storm/topology/TopologyBuilder.java   |  10 +-
 .../src/java/backtype/storm/tuple/Fields.java      |  10 +-
 .../src/java/backtype/storm/tuple/TupleImpl.java   |   6 +-
 .../src/java/backtype/storm/utils/ConfigUtils.java |  32 +-
 .../storm/utils/DefaultMaxSpoutPendingTuner.java   |   4 +-
 .../src/java/backtype/storm/utils/Utils.java       |  18 +-
 .../src/java/org/apache/storm/LocalCluster.java    |   3 +-
 .../src/java/org/apache/storm/StormSubmitter.java  |   9 +-
 .../src/java/org/apache/storm/generated/Bolt.java  |   2 +-
 .../java/org/apache/storm/generated/SpoutSpec.java |   2 +-
 .../org/apache/storm/generated/StormTopology.java  |   2 +-
 .../grouping/CustomStreamGroupingDelegate.java     |   4 +-
 .../org/apache/storm/hooks/ITaskHookDelegate.java  |  21 +-
 .../org/apache/storm/hooks/info/BoltAckInfo.java   |   2 +-
 .../apache/storm/hooks/info/BoltExecuteInfo.java   |   2 +-
 .../org/apache/storm/hooks/info/BoltFailInfo.java  |   2 +-
 .../java/org/apache/storm/hooks/info/EmitInfo.java |   2 +-
 .../org/apache/storm/hooks/info/SpoutAckInfo.java  |   2 +-
 .../org/apache/storm/hooks/info/SpoutFailInfo.java |   2 +-
 .../apache/storm/metric/api/AssignableMetric.java  |   4 +-
 .../org/apache/storm/metric/api/CountMetric.java   |   4 +-
 .../org/apache/storm/metric/api/GlobalMetrics.java |   8 +-
 .../org/apache/storm/metric/api/MeanReducer.java   |   2 +-
 .../apache/storm/metric/api/MetricDelegate.java    |   2 +-
 .../storm/metric/internal/CountStatAndMetric.java  |   4 +-
 .../metric/internal/LatencyStatAndMetric.java      |   4 +-
 .../HeronPluggableSerializerDelegate.java          |   2 +-
 .../storm/spout/SpoutOutputCollectorImpl.java      |   4 +-
 .../org/apache/storm/task/BoltTopologyContext.java |   2 +-
 .../apache/storm/task/GeneralTopologyContext.java  |  10 +-
 .../org/apache/storm/task/OutputCollectorImpl.java |  16 +-
 .../apache/storm/task/SpoutTopologyContext.java    |   2 +-
 .../org/apache/storm/task/TopologyContext.java     |  14 +-
 .../apache/storm/task/WorkerTopologyContext.java   |   4 +-
 .../apache/storm/topology/BasicBoltExecutor.java   |   5 +-
 .../apache/storm/topology/BoltDeclarerImpl.java    |   4 +-
 .../apache/storm/topology/IRichBoltDelegate.java   |  15 +-
 .../apache/storm/topology/IRichSpoutDelegate.java  |  13 +-
 .../storm/topology/IWindowedBoltDelegate.java      |  16 +-
 .../apache/storm/topology/OutputFieldsGetter.java  |   4 +-
 .../apache/storm/topology/SpoutDeclarerImpl.java   |   4 +-
 .../org/apache/storm/topology/TopologyBuilder.java |  13 +-
 .../storm/topology/base/BaseWindowedBolt.java      |  17 +-
 .../src/java/org/apache/storm/tuple/Fields.java    |  10 +-
 .../src/java/org/apache/storm/tuple/TupleImpl.java |   6 +-
 .../java/org/apache/storm/utils/ConfigUtils.java   |  35 +-
 .../storm/utils/DefaultMaxSpoutPendingTuner.java   |   4 +-
 .../src/java/org/apache/storm/utils/Utils.java     |  18 +-
 .../apache/storm/windowing/TupleWindowImpl.java    |   8 +-
 storm-compatibility/src/java/shade.conf            |   6 +-
 tools/cpp/BUILD                                    |   4 +-
 tools/java/BUILD                                   |   8 +-
 tools/java/src/com/twitter/bazel/checkstyle/BUILD  |  44 --
 .../twitter/bazel/checkstyle/CppCheckstyle.java    | 143 ----
 .../twitter/bazel/checkstyle/ExtraActionUtils.java |  46 --
 .../twitter/bazel/checkstyle/JavaCheckstyle.java   | 138 ----
 .../twitter/bazel/checkstyle/PythonCheckstyle.java | 140 ----
 .../bazel/checkstyle/apache_coding_style.xml       | 342 ---------
 .../bazel/checkstyle/heron_coding_style.xml        | 341 ---------
 tools/java/src/org/apache/bazel/checkstyle/BUILD   |  44 ++
 .../org/apache/bazel/checkstyle/CppCheckstyle.java | 143 ++++
 .../apache/bazel/checkstyle/ExtraActionUtils.java  |  46 ++
 .../apache/bazel/checkstyle/JavaCheckstyle.java    | 138 ++++
 .../apache/bazel/checkstyle/PythonCheckstyle.java  | 140 ++++
 .../bazel/checkstyle/apache_coding_style.xml       | 342 +++++++++
 .../apache}/bazel/checkstyle/apache_header.txt     |   0
 .../apache/bazel/checkstyle/heron_coding_style.xml | 341 +++++++++
 .../apache}/bazel/checkstyle/heron_header.txt      |   0
 .../apache}/bazel/checkstyle/suppressions.xml      |   0
 tools/python/BUILD                                 |   4 +-
 tools/rules/pex/pex_rules.bzl                      |   2 +-
 website/README.md                                  |   2 +-
 website/config.yaml                                |   6 +-
 website/content/docs/concepts/architecture.md      |   8 +-
 website/content/docs/concepts/streamlet-api.md     |  22 +-
 website/content/docs/contributors/codebase.md      |   8 +-
 website/content/docs/contributors/community.md     |   4 +-
 .../docs/contributors/custom-metrics-sink.md       |  32 +-
 .../content/docs/contributors/custom-scheduler.md  |  12 +-
 website/content/docs/contributors/roadmap.md       |   2 +-
 website/content/docs/contributors/support.md       |   4 +-
 website/content/docs/developers/compiling/linux.md |   4 +-
 website/content/docs/developers/compiling/mac.md   |   2 +-
 website/content/docs/developers/data-model.md      |  20 +-
 website/content/docs/developers/java/bolts.md      |   6 +-
 website/content/docs/developers/java/eco-api.mmark |  36 +-
 .../docs/developers/java/effectively-once.md       |  48 +-
 website/content/docs/developers/java/spouts.md     |   8 +-
 .../docs/developers/java/streamlet-api.mmark       |  20 +-
 website/content/docs/developers/java/topologies.md |  22 +-
 .../content/docs/developers/packing/ffdpacking.md  |  20 +-
 website/content/docs/developers/python/bolts.md    |   2 +-
 website/content/docs/developers/python/spouts.md   |   2 +-
 website/content/docs/developers/serialization.md   |   2 +-
 website/content/docs/developers/simulator-mode.md  |   2 +-
 .../docs/getting-started-troubleshooting.md        |   4 +-
 website/content/docs/getting-started.md            |   8 +-
 website/content/docs/migrate-storm-to-heron.md     |   6 +-
 .../docs/operators/deployment/configuration.md     |   8 +-
 .../deployment/schedulers/aurora-local-setup.md    |  10 +-
 .../docs/operators/deployment/schedulers/aurora.md |   8 +-
 .../docs/operators/deployment/schedulers/dcos.md   |  12 +-
 .../deployment/schedulers/kubernetes-helm.md       |   8 +-
 .../operators/deployment/schedulers/kubernetes.md  |  32 +-
 .../docs/operators/deployment/schedulers/local.md  |   8 +-
 .../deployment/schedulers/mesos-local-mac.md       |  10 +-
 .../docs/operators/deployment/schedulers/mesos.md  |   4 +-
 .../docs/operators/deployment/schedulers/nomad.md  |  12 +-
 .../docs/operators/deployment/schedulers/slurm.md  |  12 +-
 .../operators/deployment/schedulers/standalone.md  |   4 +-
 .../docs/operators/deployment/schedulers/yarn.md   |  18 +-
 .../operators/deployment/statemanagers/localfs.md  |   4 +-
 .../deployment/statemanagers/zookeeper.md          |   4 +-
 .../docs/operators/deployment/uploaders/hdfs.md    |   4 +-
 .../docs/operators/deployment/uploaders/http.md    |   6 +-
 .../docs/operators/deployment/uploaders/localfs.md |   4 +-
 .../docs/operators/deployment/uploaders/s3.md      |   4 +-
 .../docs/operators/deployment/uploaders/scp.md     |   4 +-
 website/content/docs/operators/heron-cli.md        |   2 +-
 .../docs/operators/observability/graphite.md       |   2 +-
 .../docs/operators/observability/prometheus.md     |   2 +-
 .../content/docs/operators/observability/scribe.md |   2 +-
 .../content/snippets/heron-on-kubernetes-config.md |  12 +-
 website/data/configs/kubernetes.yaml               |  12 +-
 website/layouts/404.ace                            |   2 +-
 website/scripts/javadocs.sh                        |   2 +-
 2186 files changed, 117562 insertions(+), 117641 deletions(-)

diff --git a/ADOPTERS.md b/ADOPTERS.md
index 1fcd797..75b7feb 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -1,6 +1,6 @@
 ## Heron Adopters
 
-Twitter isn't the only company using Heron. We're sure the following list isn't complete, so please [let us know](https://github.com/twitter/heron) if your company should be included, or if you'd like us to feature a link to a blog post or article about how you're using Heron. Or even better, add the links yourself (please use HTTPS URLs if possible) and [submit a pull request](https://github.com/twitter/heron)!
+Twitter isn't the only company using Heron. We're sure the following list isn't complete, so please [let us know](https://github.com/apache/incubator-heron) if your company should be included, or if you'd like us to feature a link to a blog post or article about how you're using Heron. Or even better, add the links yourself (please use HTTPS URLs if possible) and [submit a pull request](https://github.com/apache/incubator-heron)!
 
 * [Twitter](https://twitter.com/)
  * https://blog.twitter.com/2016/open-sourcing-twitter-heron
diff --git a/deploy/docker/README.md b/deploy/docker/README.md
index a261387..7c10373 100644
--- a/deploy/docker/README.md
+++ b/deploy/docker/README.md
@@ -8,7 +8,7 @@ It is recommended that docker gets 4 or more cores and 2 GB or more memory
 ### Download heron sandbox script
 
 ```shell
-$ curl -O https://raw.githubusercontent.com/twitter/heron/master/deploy/docker/sandbox.sh
+$ curl -O https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/docker/sandbox.sh
 $ chmod +x sandbox.sh
 ```
 
@@ -33,17 +33,17 @@ http://localhost:8889
 ```shell
 $ ./sandbox.sh shell
 Starting heron sandbox shell 
-root@16092325a696:/heron# heron submit sandbox /heron/examples/heron-api-examples.jar com.twitter.heron.examples.api.ExclamationTopology exclamation
+root@16092325a696:/heron# heron submit sandbox /heron/examples/heron-api-examples.jar org.apache.heron.examples.api.ExclamationTopology exclamation
 [2018-02-01 20:24:20 +0000] [INFO]: Using cluster definition in /heron/heron-tools/conf/sandbox
 [2018-02-01 20:24:20 +0000] [INFO]: Launching topology: 'exclamation'
 [2018-02-01 20:24:21 +0000] [INFO]: Successfully launched topology 'exclamation' 
 root@16092325a696:/heron# heron deactivate sandbox exclamation
 [2018-02-01 20:24:46 +0000] [INFO]: Using cluster definition in /heron/heron-tools/conf/sandbox
-[2018-02-01 20:24:47 +0000] [INFO] com.twitter.heron.spi.utils.TMasterUtils: Topology command DEACTIVATE completed successfully.  
+[2018-02-01 20:24:47 +0000] [INFO] org.apache.heron.spi.utils.TMasterUtils: Topology command DEACTIVATE completed successfully.
 [2018-02-01 20:24:47 +0000] [INFO]: Successfully deactivate topology: exclamation
 root@16092325a696:/heron# heron activate sandbox exclamation
 [2018-02-01 20:24:55 +0000] [INFO]: Using cluster definition in /heron/heron-tools/conf/sandbox
-[2018-02-01 20:24:56 +0000] [INFO] com.twitter.heron.spi.utils.TMasterUtils: Topology command ACTIVATE completed successfully.  
+[2018-02-01 20:24:56 +0000] [INFO] org.apache.heron.spi.utils.TMasterUtils: Topology command ACTIVATE completed successfully.
 [2018-02-01 20:24:56 +0000] [INFO]: Successfully activate topology: exclamation
 root@16092325a696:/heron# heron kill sandbox exclamation
 [2018-02-01 20:25:08 +0000] [INFO]: Using cluster definition in /heron/heron-tools/conf/sandbox
diff --git a/deploy/docker/sandbox.sh b/deploy/docker/sandbox.sh
index c3910f0..33aaf52 100755
--- a/deploy/docker/sandbox.sh
+++ b/deploy/docker/sandbox.sh
@@ -118,7 +118,7 @@ case $1 in
     echo "  "
 
     echo "  Then you can ${bold}submit${normal} a topology via the shell:"
-    echo "    heron submit sandbox /heron/examples/heron-api-examples.jar com.twitter.heron.examples.api.ExclamationTopology exclamation"
+    echo "    heron submit sandbox /heron/examples/heron-api-examples.jar org.apache.heron.examples.api.ExclamationTopology exclamation"
     echo "  "
 
     echo "  You can ${bold}deactivate${normal} the topology via the shell as well:"
diff --git a/deploy/kubernetes/general/README.md b/deploy/kubernetes/general/README.md
index 2132ee5..f6c0969 100644
--- a/deploy/kubernetes/general/README.md
+++ b/deploy/kubernetes/general/README.md
@@ -3,7 +3,7 @@
 ### Requirements:
 * Kubernetes cluster with 3 or more nodes
 * [kubectl](https://kubernetes.io/docs/tasks/kubectl/install/)
-* [heron client](https://twitter.github.io/heron/docs/getting-started/)
+* [heron client](https://apache.github.io/incubator-heron/docs/getting-started/)
 
 
 
@@ -12,7 +12,7 @@
 1. Start zookeeper:
 
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/general/zookeeper.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/general/zookeeper.yaml
 
 $ kubectl get pods
 NAME                                  READY     STATUS    RESTARTS   AGE
@@ -24,7 +24,7 @@ zk-0                                  1/1       Running   0          1m
 
 2. Start bookkeeper:
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/general/bookkeeper.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/general/bookkeeper.yaml
 ```
 
 This deploys bookkeeper in a `DaemonSet` and requires the ability of exposing `hostPort` for pods communication.
@@ -32,17 +32,17 @@ In some environments like K8S on DC/OS, `hostPort` is not well supported. You ca
 a `StatefulSet` with `Persistent Volumes` as below. Please see [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) for more details.
 
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/general/bookkeeper.statefulset.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/general/bookkeeper.statefulset.yaml
 ```
 
 3. Start heron tools:
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/general/tools.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/general/tools.yaml
 ```
 
 4. Start heron apiserver:
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/general/apiserver.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/general/apiserver.yaml
 ```
 
 ### Deploy via heron apiserver
@@ -73,13 +73,13 @@ $ curl http://localhost:8001/api/v1/proxy/namespaces/default/services/heron-apis
 ```shell
 $ heron config kubernetes \
 set service_url http://localhost:8001/api/v1/proxy/namespaces/default/services/heron-apiserver:9000 \
-com.twitter.heron.examples.api.AckingTopology acking
+org.apache.heron.examples.api.AckingTopology acking
 ```
 
 4. Submit an example topology:
 ```shell
 $ heron submit kubernetes ~/.heron/examples/heron-api-examples.jar \
-com.twitter.heron.examples.api.AckingTopology acking
+org.apache.heron.examples.api.AckingTopology acking
 ```
 
 5. View heron ui:
diff --git a/deploy/kubernetes/general/apiserver.yaml b/deploy/kubernetes/general/apiserver.yaml
index 083e3e2..31985a8 100644
--- a/deploy/kubernetes/general/apiserver.yaml
+++ b/deploy/kubernetes/general/apiserver.yaml
@@ -72,7 +72,7 @@ spec:
               -D heron.statemgr.connection.string=zookeeper:2181
               -D heron.kubernetes.scheduler.uri=http://localhost:8001
               -D heron.executor.docker.image=heron/heron:latest
-              -D heron.class.uploader=com.twitter.heron.uploader.dlog.DLUploader
+              -D heron.class.uploader=org.apache.heron.uploader.dlog.DLUploader
               -D heron.uploader.dlog.topologies.namespace.uri=distributedlog://zookeeper:2181/distributedlog
         - name: kubectl-proxy
           image: heron/kubectl:latest
diff --git a/deploy/kubernetes/gke/gcs-apiserver.yaml b/deploy/kubernetes/gke/gcs-apiserver.yaml
index b552b14..a820f64 100644
--- a/deploy/kubernetes/gke/gcs-apiserver.yaml
+++ b/deploy/kubernetes/gke/gcs-apiserver.yaml
@@ -76,7 +76,7 @@ spec:
               -D heron.statemgr.connection.string=zookeeper:2181
               -D heron.kubernetes.scheduler.uri=http://localhost:8001
               -D heron.executor.docker.image=heron/heron:latest
-              -D heron.class.uploader=com.twitter.heron.uploader.gcs.GcsUploader
+              -D heron.class.uploader=org.apache.heron.uploader.gcs.GcsUploader
               -D heron.uploader.gcs.bucket=$GCS_BUCKET
           volumeMounts:
             - name: google-cloud-key
diff --git a/deploy/kubernetes/helm/Chart.yaml.template b/deploy/kubernetes/helm/Chart.yaml.template
index 59e8000..7821c9c 100644
--- a/deploy/kubernetes/helm/Chart.yaml.template
+++ b/deploy/kubernetes/helm/Chart.yaml.template
@@ -3,10 +3,10 @@ description: Heron is a fast distributed streaming engine for processing large d
 name: heron
 version: VERSION
 appVersion: VERSION
-icon: https://twitter.github.io/heron/img/HeronTextLogo-small.png
+icon: https://apache.github.io/incubator-heron/img/HeronTextLogo-small.png
 home: http://heron.io
 sources:
-  - https://github.com/twitter/heron.git
+  - https://github.com/apache/incubator-heron.git
 maintainers:
   - name: Karthik Ramasamy
     email: kramasamy@gmail.com
diff --git a/deploy/kubernetes/helm/templates/NOTES.txt b/deploy/kubernetes/helm/templates/NOTES.txt
index 23f9cc1..9f89435 100644
--- a/deploy/kubernetes/helm/templates/NOTES.txt
+++ b/deploy/kubernetes/helm/templates/NOTES.txt
@@ -13,7 +13,7 @@ You can check the status of Heron by doing the following:
    heron config {{ .Release.Name }} set service_url http://localhost:8001/api/v1/proxy/namespaces/{{ .Release.Namespace }}/services/{{ .Release.Name }}-apiserver:9000
 
 5. Submit an example topology
-   heron submit {{ .Release.Name }} ~/.heron/examples/heron-api-examples.jar com.twitter.heron.examples.api.AckingTopology acking
+   heron submit {{ .Release.Name }} ~/.heron/examples/heron-api-examples.jar org.apache.heron.examples.api.AckingTopology acking
 
 6. Visit the heron ui and see if your example topology is running
    open http://localhost:8001/api/v1/proxy/namespaces/{{ .Release.Namespace }}/services/{{ .Release.Name }}-ui:8889
diff --git a/deploy/kubernetes/helm/templates/tools.yaml b/deploy/kubernetes/helm/templates/tools.yaml
index f128911..51907db 100644
--- a/deploy/kubernetes/helm/templates/tools.yaml
+++ b/deploy/kubernetes/helm/templates/tools.yaml
@@ -110,7 +110,7 @@ spec:
               -D heron.kubernetes.scheduler.uri=http://localhost:8001
               -D heron.kubernetes.scheduler.namespace={{ .Release.Namespace }}
               -D heron.executor.docker.image={{ .Values.image }}
-              -D heron.class.uploader=com.twitter.heron.uploader.dlog.DLUploader
+              -D heron.class.uploader=org.apache.heron.uploader.dlog.DLUploader
               -D heron.uploader.dlog.topologies.num.replicas={{ $jobReplicas }}
               -D heron.uploader.dlog.topologies.namespace.uri=distributedlog://{{ .Release.Name }}-zookeeper:2181/distributedlog
           envFrom:
diff --git a/deploy/kubernetes/minikube/README.md b/deploy/kubernetes/minikube/README.md
index 31410f6..07be086 100644
--- a/deploy/kubernetes/minikube/README.md
+++ b/deploy/kubernetes/minikube/README.md
@@ -4,7 +4,7 @@
 ### Requirements:
 * [minikube](https://kubernetes.io/docs/getting-started-guides/minikube/#installation)
 * [kubectl](https://kubernetes.io/docs/tasks/kubectl/install/)
-* [heron client](https://twitter.github.io/heron/docs/getting-started/)
+* [heron client](https://apache.github.io/incubator-heron/docs/getting-started/)
 
 
 ### Start minkube
@@ -19,7 +19,7 @@ $ minikube start --memory=7168 --cpus=5 --disk-size=20g
 1. Start zookeeper:
 
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/minikube/zookeeper.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/minikube/zookeeper.yaml
 
 $ kubectl get pods
 NAME                                  READY     STATUS    RESTARTS   AGE
@@ -31,17 +31,17 @@ zk-0                                  1/1       Running   0          1m
 
 2. Start bookkeeper:
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/minikube/bookkeeper.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/minikube/bookkeeper.yaml
 ```
 
 3. Start heron tools:
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/minikube/tools.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/minikube/tools.yaml
 ```
 
 4. Start heron apiserver:
 ```shell
-$ kubectl create -f https://raw.githubusercontent.com/twitter/heron/master/deploy/kubernetes/minikube/apiserver.yaml
+$ kubectl create -f https://raw.githubusercontent.com/apache/incubator-heron/master/deploy/kubernetes/minikube/apiserver.yaml
 ```
 
 ### Deploy via heron apiserver
@@ -77,7 +77,7 @@ set service_url http://localhost:8001/api/v1/proxy/namespaces/default/services/h
 4. Submit an example topology:
 ```shell
 $ heron submit kubernetes ~/.heron/examples/heron-api-examples.jar \
-com.twitter.heron.examples.api.AckingTopology acking
+org.apache.heron.examples.api.AckingTopology acking
 ```
 
 5. View heron ui:
diff --git a/deploy/kubernetes/minikube/apiserver.yaml b/deploy/kubernetes/minikube/apiserver.yaml
index e3efd69..89ae21a 100644
--- a/deploy/kubernetes/minikube/apiserver.yaml
+++ b/deploy/kubernetes/minikube/apiserver.yaml
@@ -58,7 +58,7 @@ spec:
               -D heron.statemgr.connection.string=zookeeper:2181
               -D heron.kubernetes.scheduler.uri=http://localhost:8001
               -D heron.executor.docker.image=heron/heron:latest
-              -D heron.class.uploader=com.twitter.heron.uploader.dlog.DLUploader
+              -D heron.class.uploader=org.apache.heron.uploader.dlog.DLUploader
               -D heron.uploader.dlog.topologies.num.replicas=1
               -D heron.uploader.dlog.topologies.namespace.uri=distributedlog://zookeeper:2181/distributedlog
         - name: kubectl-proxy
diff --git a/docker/Readme.md b/docker/Readme.md
index 84f5a8c..2bdee95 100644
--- a/docker/Readme.md
+++ b/docker/Readme.md
@@ -24,7 +24,7 @@
 ### To submit/activate/kill a topology:
 ```
 #To submit a topology:
-        docker exec heron_executor_1 heron submit local /usr/local/heron/examples/heron-examples.jar com.twitter.heron.examples.ExclamationTopology ExclamationTopology --deploy-deactivated
+        docker exec heron_executor_1 heron submit local /usr/local/heron/examples/heron-examples.jar org.apache.heron.examples.ExclamationTopology ExclamationTopology --deploy-deactivated
 #To activate a topology:
         docker exec -it heron_executor_1 heron activate local ExclamationTopology
 #To kill a topology:
diff --git a/eco-heron-examples/src/java/BUILD b/eco-heron-examples/src/java/BUILD
index 1051d32..5887941 100644
--- a/eco-heron-examples/src/java/BUILD
+++ b/eco-heron-examples/src/java/BUILD
@@ -7,7 +7,7 @@ filegroup(
 
 java_binary(
     name='eco-examples-unshaded',
-    srcs = glob(["com/twitter/heron/examples/eco/**/*.java"]),
+    srcs = glob(["org/apache/heron/examples/eco/**/*.java"]),
     deps = [
         "//heron/api/src/java:api-java-low-level",
         "//heron/api/src/java:api-java",
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/EvenAndOddBolt.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/EvenAndOddBolt.java
deleted file mode 100644
index bd60a49..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/EvenAndOddBolt.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-
-import java.util.Map;
-
-import com.twitter.heron.api.bolt.BasicOutputCollector;
-import com.twitter.heron.api.bolt.IBasicBolt;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Tuple;
-
-import static com.twitter.heron.api.utils.Utils.tuple;
-
-@SuppressWarnings({"serial", "rawtypes", "unchecked"})
-public class EvenAndOddBolt implements IBasicBolt {
-
-
-  @Override
-  public void prepare(Map stormConf, TopologyContext context) {
-
-  }
-
-  protected int getTupleValue(Tuple t, int idx) {
-    return (int) t.getValues().get(idx);
-  }
-
-  @Override
-  public void execute(Tuple input, BasicOutputCollector collector) {
-    int number = getTupleValue(input, 0);
-
-    if (number % 2 == 0) {
-      System.out.println("Emitting to evens stream: " + number);
-      collector.emit("evens", tuple(input.getValues().get(0)));
-
-    } else {
-      System.out.println("emitting to odds stream: " + number);
-      collector.emit("odds", tuple(input.getValues().get(0)));
-    }
-
-    collector.emit(tuple(input.getValues().get(0)));
-
-
-
-  }
-
-  @Override
-  public void cleanup() {
-
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declareStream("evens", new Fields("evens"));
-    declarer.declareStream("odds", new Fields("odds"));
-    declarer.declare(new Fields("number"));
-  }
-
-  @Override
-  public Map<String, Object> getComponentConfiguration() {
-    return null;
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/LogInfoBolt.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/LogInfoBolt.java
deleted file mode 100644
index d7be2c6..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/LogInfoBolt.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-
-import java.util.logging.Logger;
-
-import com.twitter.heron.api.bolt.BaseBasicBolt;
-import com.twitter.heron.api.bolt.BasicOutputCollector;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.tuple.Tuple;
-
-/**
- * Simple bolt that does nothing other than LOG.info() every tuple received.
- *
- */
-@SuppressWarnings("serial")
-public class LogInfoBolt extends BaseBasicBolt {
-  private static final Logger LOG = Logger.getLogger(LogInfoBolt.class.getName());
-
-  @Override
-  public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
-    LOG.info("{ }" + tuple);
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
-
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/RandomString.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/RandomString.java
deleted file mode 100644
index 6ece43c..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/RandomString.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Random;
-
-public class RandomString {
-  private  char[] symbols;
-
-  private Random random = new Random();
-
-  private char[] buf;
-
-  public RandomString(int length) {
-    // Construct the symbol set
-    StringBuilder tmp = new StringBuilder();
-    for (char ch = '0'; ch <= '9'; ++ch) {
-      tmp.append(ch);
-    }
-
-    for (char ch = 'a'; ch <= 'z'; ++ch) {
-      tmp.append(ch);
-    }
-
-    symbols = tmp.toString().toCharArray();
-    if (length < 1) {
-      throw new IllegalArgumentException("length < 1: " + length);
-    }
-
-    buf = new char[length];
-  }
-
-  public String nextString() {
-    for (int idx = 0; idx < buf.length; ++idx) {
-      buf[idx] = symbols[random.nextInt(symbols.length)];
-    }
-
-    return new String(buf);
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulConsumerBolt.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulConsumerBolt.java
deleted file mode 100644
index bd5cbfe..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulConsumerBolt.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-
-import com.twitter.heron.api.bolt.BaseRichBolt;
-import com.twitter.heron.api.bolt.OutputCollector;
-import com.twitter.heron.api.state.State;
-import com.twitter.heron.api.topology.IStatefulComponent;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Tuple;
-
-
-public class StatefulConsumerBolt extends BaseRichBolt
-    implements IStatefulComponent<Integer, Integer> {
-  private static final long serialVersionUID = -5470591933906954522L;
-
-  private OutputCollector collector;
-  private State<Integer, Integer> myState;
-
-  @Override
-  public void initState(State<Integer, Integer> state) {
-    this.myState = state;
-  }
-
-  @Override
-  public void preSave(String checkpointId) {
-    // Nothing really since we operate out of the system supplied state
-  }
-
-  @SuppressWarnings("rawtypes")
-  public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
-    collector = outputCollector;
-  }
-
-  @Override
-  public void execute(Tuple tuple) {
-    int key = tuple.getInteger(0);
-    System.out.println("looking in state for: " + key);
-    if (myState.get(key) == null) {
-      System.out.println("did not find " + key + " in state: ");
-      myState.put(key, 1);
-    } else {
-      System.out.println("found in state: " + key);
-      Integer val = myState.get(key);
-      myState.put(key, ++val);
-    }
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulNumberSpout.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulNumberSpout.java
deleted file mode 100644
index c3fb3db..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulNumberSpout.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-import java.util.Random;
-import java.util.logging.Logger;
-
-import com.twitter.heron.api.spout.BaseRichSpout;
-import com.twitter.heron.api.spout.SpoutOutputCollector;
-import com.twitter.heron.api.state.State;
-import com.twitter.heron.api.topology.IStatefulComponent;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Values;
-import com.twitter.heron.api.utils.Utils;
-
-@SuppressWarnings("HiddenField")
-public class StatefulNumberSpout extends BaseRichSpout
-    implements IStatefulComponent<String, Long> {
-  private static final Logger LOG = Logger.getLogger(StatefulNumberSpout.class.getName());
-  private static final long serialVersionUID = 5454291010750852782L;
-  private SpoutOutputCollector collector;
-  private Random rand;
-  private long msgId;
-  private State<String, Long> state;
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("value", "ts", "msgid"));
-  }
-
-  @Override
-  public void open(Map<String, Object> conf, TopologyContext context, SpoutOutputCollector
-      collector) {
-    this.collector = collector;
-    this.rand = new Random();
-  }
-
-  @Override
-  public void nextTuple() {
-    Utils.sleep(1000);
-    long val = msgId;
-    long randomNumber = System.currentTimeMillis() - (24 * 60 * 60 * 1000);
-    System.out.println("Emitting: " + val);
-    collector.emit(new Values(val,
-        randomNumber, msgId), msgId);
-    msgId++;
-  }
-
-  @Override
-  public void ack(Object msgId) {
-    LOG.fine("Got ACK for msgId : " + msgId);
-  }
-
-  @Override
-  public void fail(Object msgId) {
-    LOG.fine("Got FAIL for msgId : " + msgId);
-  }
-
-  @Override
-  public void initState(State<String, Long> state) {
-    this.state = state;
-    this.msgId = this.state.getOrDefault("msgId", 0L);
-  }
-
-  @Override
-  public void preSave(String checkpointId) {
-    this.state.put("msgId", msgId);
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulRandomIntSpout.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulRandomIntSpout.java
deleted file mode 100644
index e128840..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulRandomIntSpout.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-import java.util.concurrent.ThreadLocalRandom;
-
-import com.twitter.heron.api.spout.BaseRichSpout;
-import com.twitter.heron.api.spout.SpoutOutputCollector;
-import com.twitter.heron.api.state.State;
-import com.twitter.heron.api.topology.IStatefulComponent;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Values;
-
-import backtype.storm.utils.Utils;
-
-public class StatefulRandomIntSpout extends BaseRichSpout
-    implements IStatefulComponent<String, Integer> {
-  private SpoutOutputCollector spoutOutputCollector;
-  private State<String, Integer> count;
-
-  public StatefulRandomIntSpout() {
-  }
-
-  // Generates a random integer between 1 and 100
-  private int randomInt() {
-    return ThreadLocalRandom.current().nextInt(1, 101);
-  }
-
-  // These two methods are required to implement the IStatefulComponent interface
-  @Override
-  public void preSave(String checkpointId) {
-    System.out.println(String.format("Saving spout state at checkpoint %s", checkpointId));
-  }
-
-  @Override
-  public void initState(State<String, Integer> state) {
-    count = state;
-  }
-
-  // These three methods are required to extend the BaseRichSpout abstract class
-  @Override
-  public void open(Map<String, Object> map, TopologyContext ctx, SpoutOutputCollector collector) {
-    spoutOutputCollector = collector;
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("random-int"));
-  }
-
-  @Override
-  public void nextTuple() {
-    Utils.sleep(2000);
-    int randomInt = randomInt();
-    System.out.println("Emitting Value: " + randomInt);
-    spoutOutputCollector.emit(new Values(randomInt));
-  }
-}
-
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulWindowSumBolt.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulWindowSumBolt.java
deleted file mode 100644
index 8f721e4..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/StatefulWindowSumBolt.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-
-import com.twitter.heron.api.bolt.BaseStatefulWindowedBolt;
-import com.twitter.heron.api.bolt.OutputCollector;
-import com.twitter.heron.api.state.State;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Tuple;
-import com.twitter.heron.api.tuple.Values;
-import com.twitter.heron.api.windowing.TupleWindow;
-
-@SuppressWarnings("HiddenField")
-public class StatefulWindowSumBolt extends BaseStatefulWindowedBolt<String, Long> {
-  private static final long serialVersionUID = -539382497249834244L;
-  private State<String, Long> state;
-  private long sum;
-
-  private OutputCollector collector;
-
-  @Override
-  public void prepare(Map<String, Object> topoConf, TopologyContext context,
-                      OutputCollector collector) {
-    this.collector = collector;
-  }
-
-  @Override
-  public void initState(State<String, Long> state) {
-    this.state = state;
-    sum = state.getOrDefault("sum", 0L);
-  }
-
-  @Override
-  public void execute(TupleWindow inputWindow) {
-    for (Tuple tuple : inputWindow.get()) {
-      System.out.println("Adding to sum: " + tuple.getLongByField("value"));
-      sum += tuple.getLongByField("value");
-      System.out.println("Sum is now: " + sum);
-    }
-    collector.emit(new Values(sum));
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("sum"));
-  }
-
-  @Override
-  public void preSave(String checkpointId) {
-    state.put("sum", sum);
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestFibonacciSpout.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestFibonacciSpout.java
deleted file mode 100644
index fe19768..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestFibonacciSpout.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-import java.util.Random;
-import java.util.logging.Logger;
-
-import com.twitter.heron.api.spout.BaseRichSpout;
-import com.twitter.heron.api.spout.SpoutOutputCollector;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Values;
-import com.twitter.heron.api.utils.Utils;
-
-@SuppressWarnings({"serial", "rawtypes", "HiddenField"})
-public class TestFibonacciSpout extends BaseRichSpout {
-  private static final Logger LOG = Logger.getLogger(TestFibonacciSpout.class.getName());
-  private TestPropertyHolder holder;
-  private SpoutOutputCollector collector;
-
-  public TestFibonacciSpout(TestPropertyHolder holder) {
-    this.holder = holder;
-  }
-
-  @Override
-  public void open(Map<String, Object> conf, TopologyContext context,
-                   SpoutOutputCollector collector) {
-    this.collector = collector;
-  }
-
-  @Override
-  public void nextTuple() {
-    Utils.sleep(100);
-    final int[] words = new int[] {0, 1, 2, 3, 5, 8, 13, 21, 34};
-    final Random rand = new Random();
-    final int number = words[rand.nextInt(words.length)];
-    final String property = holder.getProperty();
-    final int numberProperty = holder.getNumberProperty();
-    final String publicProperty = holder.publicProperty;
-    LOG.info("Constructor Args: " + property);
-    LOG.info("Property set by setter: " + numberProperty);
-    LOG.info("Property set by public field: " + publicProperty);
-    LOG.info("Emitting: number " + number);
-    collector.emit(new Values(number));
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("number"));
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestIBasicPrintBolt.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestIBasicPrintBolt.java
deleted file mode 100644
index 4f23f4d..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestIBasicPrintBolt.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-
-import com.twitter.heron.api.bolt.BasicOutputCollector;
-import com.twitter.heron.api.bolt.IBasicBolt;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Tuple;
-
-import static com.twitter.heron.api.utils.Utils.tuple;
-
-@SuppressWarnings({"serial", "rawtypes", "unchecked", "HiddenField"})
-public class TestIBasicPrintBolt implements IBasicBolt {
-
-  public String someProperty = "set ";
-
-  public TestUnits testUnits;
-
-  @Override
-  public void prepare(Map stormConf, TopologyContext context) {
-
-  }
-
-  public void sampleConfigurationMethod(String someProperty, TestUnits testUnits) {
-    this.someProperty += someProperty;
-    this.testUnits = testUnits;
-  }
-
-  @Override
-  public void execute(Tuple input, BasicOutputCollector collector) {
-    System.out.println("The configuration method has set \"someProperty\" to : "
-        + this.someProperty);
-    System.out.println("The configuration method has set TestUnits to " + testUnits);
-    System.out.println("Emitting : " + input);
-    collector.emit(tuple(input.getValues().get(0)));
-
-  }
-
-  @Override
-  public void cleanup() {
-
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("ibasic-print"));
-  }
-
-  @Override
-  public Map<String, Object> getComponentConfiguration() {
-    return null;
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestNameCounter.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestNameCounter.java
deleted file mode 100644
index ba02368..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestNameCounter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.twitter.heron.api.bolt.BaseBasicBolt;
-import com.twitter.heron.api.bolt.BasicOutputCollector;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Tuple;
-
-import static com.twitter.heron.api.utils.Utils.tuple;
-@SuppressWarnings({"serial", "rawtypes"})
-public class TestNameCounter extends BaseBasicBolt {
-
-  private Map<String, Integer> counts;
-
-  @Override
-  public void prepare(Map map, TopologyContext topologyContext) {
-    counts = new HashMap<>();
-  }
-
-
-  protected String getTupleValue(Tuple t, int idx) {
-    return (String) t.getValues().get(idx);
-  }
-
-  public void execute(Tuple input, BasicOutputCollector collector) {
-    String word = getTupleValue(input, 0);
-    int count = 0;
-    if (counts.containsKey(word)) {
-      count = counts.get(word);
-    }
-    count++;
-    counts.put(word, count);
-    collector.emit(tuple(word, count));
-  }
-
-  public void cleanup() {
-
-  }
-
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("name", "count"));
-  }
-
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestNameSpout.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestNameSpout.java
deleted file mode 100644
index 355d9b1..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestNameSpout.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-import com.twitter.heron.api.Config;
-import com.twitter.heron.api.spout.BaseRichSpout;
-import com.twitter.heron.api.spout.SpoutOutputCollector;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Values;
-import com.twitter.heron.api.utils.Utils;
-
-@SuppressWarnings({"serial", "HiddenField"})
-public class TestNameSpout extends BaseRichSpout {
-  private boolean isdistributed;
-  private SpoutOutputCollector collector;
-
-  public TestNameSpout() {
-    this(true);
-  }
-
-  public TestNameSpout(boolean isDistributed) {
-    isdistributed = isDistributed;
-  }
-
-  public void open(Map<String, Object> conf, TopologyContext context,
-                   SpoutOutputCollector collector) {
-    this.collector = collector;
-  }
-
-  public void close() {
-
-  }
-
-  public void nextTuple() {
-    Utils.sleep(100);
-    final String[] words = new String[] {"marge", "homer", "bart", "simpson", "lisa"};
-    final Random rand = new Random();
-    final String word = words[rand.nextInt(words.length)];
-    collector.emit(new Values(word));
-  }
-
-  public void ack(Object msgId) {
-
-  }
-
-  public void fail(Object msgId) {
-
-  }
-
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("name"));
-  }
-
-  @Override
-  public Map<String, Object> getComponentConfiguration() {
-    if (!isdistributed) {
-      Map<String, Object> ret = new HashMap<String, Object>();
-      ret.put(Config.TOPOLOGY_STMGRS, 1);
-      return ret;
-    } else {
-      return null;
-    }
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestPrintBolt.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestPrintBolt.java
deleted file mode 100644
index b48cf31..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestPrintBolt.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import com.twitter.heron.api.bolt.BaseBasicBolt;
-import com.twitter.heron.api.bolt.BasicOutputCollector;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.tuple.Tuple;
-
-@SuppressWarnings("serial")
-public class TestPrintBolt extends BaseBasicBolt {
-
-  @Override
-  public void execute(Tuple tuple, BasicOutputCollector collector) {
-    System.out.println(tuple);
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer ofd) {
-  }
-
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestPropertyHolder.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestPropertyHolder.java
deleted file mode 100644
index 2020fe4..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestPropertyHolder.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.io.Serializable;
-
-@SuppressWarnings("serial")
-public class TestPropertyHolder implements Serializable {
-
-  private String property;
-
-  private int numberProperty;
-
-  public String publicProperty;
-
-
-  public TestPropertyHolder(String property) {
-    this.property = property;
-  }
-
-  public String getProperty() {
-    return property;
-  }
-
-  public void setProperty(String property) {
-    this.property = property;
-  }
-
-  public int getNumberProperty() {
-    return numberProperty;
-  }
-
-  public void setNumberProperty(int numberProperty) {
-    this.numberProperty = numberProperty;
-  }
-
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestUnits.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestUnits.java
deleted file mode 100644
index f1d469b..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestUnits.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-/**
- * Sample unit of measure enum
- */
-public enum TestUnits {
-  MB("MB"),
-  GB("GB"),
-  B("B");
-
-  private String value;
-
-  TestUnits(String value) {
-    this.value = value;
-  }
-
-  public String getValue() {
-    return value;
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestWindowBolt.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestWindowBolt.java
deleted file mode 100644
index 34d5c76..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/TestWindowBolt.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-
-import com.twitter.heron.api.bolt.BaseWindowedBolt;
-import com.twitter.heron.api.bolt.OutputCollector;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Values;
-import com.twitter.heron.api.windowing.TupleWindow;
-
-@SuppressWarnings({"serial", "HiddenField"})
-public class TestWindowBolt extends BaseWindowedBolt {
-  private OutputCollector collector;
-
-
-  @Override
-  public void prepare(Map<String, Object> topoConf, TopologyContext context,
-                      OutputCollector collector) {
-    this.collector = collector;
-  }
-
-  @Override
-  public void execute(TupleWindow inputWindow) {
-    collector.emit(new Values(inputWindow.get().size()));
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("count"));
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/WordSpout.java b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/WordSpout.java
deleted file mode 100644
index 3f3b6f1..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/WordSpout.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-import java.util.Random;
-
-import com.twitter.heron.api.spout.BaseRichSpout;
-import com.twitter.heron.api.spout.SpoutOutputCollector;
-import com.twitter.heron.api.topology.OutputFieldsDeclarer;
-import com.twitter.heron.api.topology.TopologyContext;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.tuple.Values;
-
-@SuppressWarnings("HiddenField")
-public class WordSpout extends BaseRichSpout {
-  private static final long serialVersionUID = 4322775001819135036L;
-
-  private static final int ARRAY_LENGTH = 128 * 1024;
-  private static final int WORD_LENGTH = 20;
-
-  private final String[] words = new String[ARRAY_LENGTH];
-
-  private final Random rnd = new Random(31);
-
-  private SpoutOutputCollector collector;
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
-    outputFieldsDeclarer.declare(new Fields("word"));
-  }
-
-  @Override
-  @SuppressWarnings("rawtypes")
-  public void open(Map map, TopologyContext topologyContext,
-                   SpoutOutputCollector spoutOutputCollector) {
-    System.out.println("open spout");
-    RandomString randomString = new RandomString(WORD_LENGTH);
-
-    for (int i = 0; i < ARRAY_LENGTH; i++) {
-      words[i] = randomString.nextString();
-    }
-
-    collector = spoutOutputCollector;
-  }
-
-  @Override
-  public void nextTuple() {
-    System.out.println("next tuple");
-    int nextInt = rnd.nextInt(ARRAY_LENGTH);
-    collector.emit(new Values(words[nextInt]));
-  }
-}
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron-stateful-windowing.yaml b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron-stateful-windowing.yaml
deleted file mode 100644
index 9c9d5cf..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron-stateful-windowing.yaml
+++ /dev/null
@@ -1,52 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
-name: "stateful-windowing"
-type: "heron"
-
-config:
-  topology.workers: 1
-  topology.reliability.mode: "EFFECTIVELY_ONCE"
-
-components:
-
-  - id: "windowLength"
-    className: "com.twitter.heron.api.bolt.BaseWindowedBolt$Count"
-    constructorArgs:
-      - 5
-
-  - id: "slidingInterval"
-    className: "com.twitter.heron.api.bolt.BaseWindowedBolt$Count"
-    constructorArgs:
-      - 3
-
-spouts:
-  - id: "integer-spout"
-    className: "com.twitter.heron.examples.eco.StatefulNumberSpout"
-    parallelism: 1
-
-bolts:
-  - id: "stateful-window-sum-bolt"
-    className: "com.twitter.heron.examples.eco.StatefulWindowSumBolt"
-    configMethods:
-      - name: "withWindow"
-        args: [ref: "windowLength", ref: "slidingInterval"]
-    parallelism: 1
-
-
-streams:
-  - from: "integer-spout"
-    to: "stateful-window-sum-bolt"
-    grouping:
-      type: SHUFFLE
\ No newline at end of file
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron-stateful-word-count.yaml b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron-stateful-word-count.yaml
deleted file mode 100644
index e5838af..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron-stateful-word-count.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
-name: "stateful-word-count"
-type: "heron"
-
-config:
-  topology.workers: 1
-  topology.reliability.mode: "EFFECTIVELY_ONCE"
-
-
-spouts:
-  - id: "int-spout"
-    className: "com.twitter.heron.examples.eco.StatefulRandomIntSpout"
-    parallelism: 1
-
-bolts:
-  - id: "stateful-consumer-bolt"
-    className: "com.twitter.heron.examples.eco.StatefulConsumerBolt"
-    parallelism: 1
-
-
-streams:
-  - from: "int-spout"
-    to: "stateful-consumer-bolt"
-    grouping:
-      type: SHUFFLE
\ No newline at end of file
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_fibonacci.yaml b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_fibonacci.yaml
deleted file mode 100644
index 7a9f9a2..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_fibonacci.yaml
+++ /dev/null
@@ -1,75 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
----
-
-name: "heron-fibonacci-topology"
-type: "heron"
-
-config:
-  topology.workers: 1
-
-components:
-  - id: "property-holder"
-    className: "com.twitter.heron.examples.eco.TestPropertyHolder"
-    constructorArgs:
-      - "some argument"
-    properties:
-      - name: "numberProperty"
-        value: 11
-      - name: "publicProperty"
-        value: "This is public property"
-
-spouts:
-  - id: "spout-1"
-    className: "com.twitter.heron.examples.eco.TestFibonacciSpout"
-    constructorArgs:
-      - ref: "property-holder"
-    parallelism: 1
-
-bolts:
-  - id: "even-and-odd-bolt"
-    className: "com.twitter.heron.examples.eco.EvenAndOddBolt"
-    parallelism: 1
-
-  - id: "ibasic-print-bolt"
-    className: "com.twitter.heron.examples.eco.TestIBasicPrintBolt"
-    parallelism: 1
-    configMethods:
-      - name: "sampleConfigurationMethod"
-        args:
-          - "${ecoPropertyOne}"
-          - MB
-
-  - id: "sys-out-bolt"
-    className: "com.twitter.heron.examples.eco.TestPrintBolt"
-    parallelism: 1
-
-streams:
-  - from: "spout-1"
-    to: "even-and-odd-bolt"
-    grouping:
-      type: SHUFFLE
-
-  - from: "even-and-odd-bolt"
-    to: "ibasic-print-bolt"
-    grouping:
-      type: SHUFFLE
-      streamId: "odds"
-
-  - from: "even-and-odd-bolt"
-    to: "sys-out-bolt"
-    grouping:
-      type: SHUFFLE
-      streamId: "evens"
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_windowing.yaml b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_windowing.yaml
deleted file mode 100644
index 49adf3c..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_windowing.yaml
+++ /dev/null
@@ -1,66 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
----
-
-name: "heron-sliding-window-topology"
-type: "heron"
-
-components:
-  - id: "windowLength"
-    className: "com.twitter.heron.api.bolt.BaseWindowedBolt$Count"
-    constructorArgs:
-      - 5
-  - id: "slidingInterval"
-    className: "com.twitter.heron.api.bolt.BaseWindowedBolt$Count"
-    constructorArgs:
-      - 3
-
-config:
-  topology.workers: 1
-
-# spout definitions
-spouts:
-  - id: "spout-1"
-    className: "com.twitter.heron.examples.eco.TestNameSpout"
-    parallelism: 1
-
-# bolt definitions
-bolts:
-  - id: "bolt-1"
-    className: "com.twitter.heron.examples.eco.TestWindowBolt"
-    configMethods:
-      - name: "withWindow"
-        args: [ref: "windowLength", ref: "slidingInterval"]
-    parallelism: 1
-  - id: "bolt-2"
-    className: "com.twitter.heron.examples.eco.TestPrintBolt"
-    parallelism: 1
-
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-streams:
-
-  - from: "spout-1"
-    to: "bolt-1"
-    grouping:
-      type: FIELDS
-      args: ["word"]
-
-  - from: "bolt-1"
-    to: "bolt-2"
-    grouping:
-      type: SHUFFLE
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_wordcount.yaml b/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_wordcount.yaml
deleted file mode 100644
index a195699..0000000
--- a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/heron_wordcount.yaml
+++ /dev/null
@@ -1,73 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
----
-
-# topology definition
-# name to be used when submitting
-name: "heron-simple-wordcount-topology"
-type: "heron"
-
-# topology configuration
-# this will be passed to the submitter as a map of config options
-#
-config:
-  topology.workers: 2
-  topology.component.resourcemap:
-
-    - id: "spout-1"
-      ram: 256MB # The minimum value for a component's specified ram is 256MB
-      cpu: 0.5
-      disk: 4GB
-
-    - id: "bolt-1"
-      ram: 256MB # The minimum value for a component's specified ram is 256MB
-      cpu: 0.5
-      disk: 2GB
-
-  topology.component.jvmoptions:
-
-   - id: "spout-1"
-     options: ["-XX:NewSize=300m", "-Xms2g"]
-
-# spout definitions
-spouts:
-  - id: "spout-1"
-    className: "com.twitter.heron.examples.eco.TestNameSpout"
-    parallelism: 1
-
-# bolt definitions
-bolts:
-  - id: "bolt-1"
-    className: "com.twitter.heron.examples.eco.TestNameCounter"
-    parallelism: 1
-
-  - id: "bolt-2"
-    className: "com.twitter.heron.examples.eco.LogInfoBolt"
-    parallelism: 1
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-streams:
-  - from: "spout-1"
-    to: "bolt-1"
-    grouping:
-      type: FIELDS
-      args: ["word"]
-
-  - from: "bolt-1"
-    to: "bolt-2"
-    grouping:
-      type: SHUFFLE
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/EvenAndOddBolt.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/EvenAndOddBolt.java
new file mode 100644
index 0000000..61918ce
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/EvenAndOddBolt.java
@@ -0,0 +1,76 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+
+import java.util.Map;
+
+import org.apache.heron.api.bolt.BasicOutputCollector;
+import org.apache.heron.api.bolt.IBasicBolt;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Tuple;
+
+import static org.apache.heron.api.utils.Utils.tuple;
+
+@SuppressWarnings({"serial", "rawtypes", "unchecked"})
+public class EvenAndOddBolt implements IBasicBolt {
+
+
+  @Override
+  public void prepare(Map stormConf, TopologyContext context) {
+
+  }
+
+  protected int getTupleValue(Tuple t, int idx) {
+    return (int) t.getValues().get(idx);
+  }
+
+  @Override
+  public void execute(Tuple input, BasicOutputCollector collector) {
+    int number = getTupleValue(input, 0);
+
+    if (number % 2 == 0) {
+      System.out.println("Emitting to evens stream: " + number);
+      collector.emit("evens", tuple(input.getValues().get(0)));
+
+    } else {
+      System.out.println("emitting to odds stream: " + number);
+      collector.emit("odds", tuple(input.getValues().get(0)));
+    }
+
+    collector.emit(tuple(input.getValues().get(0)));
+
+
+
+  }
+
+  @Override
+  public void cleanup() {
+
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declareStream("evens", new Fields("evens"));
+    declarer.declareStream("odds", new Fields("odds"));
+    declarer.declare(new Fields("number"));
+  }
+
+  @Override
+  public Map<String, Object> getComponentConfiguration() {
+    return null;
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/LogInfoBolt.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/LogInfoBolt.java
new file mode 100644
index 0000000..dba8f11
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/LogInfoBolt.java
@@ -0,0 +1,41 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+
+import java.util.logging.Logger;
+
+import org.apache.heron.api.bolt.BaseBasicBolt;
+import org.apache.heron.api.bolt.BasicOutputCollector;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.tuple.Tuple;
+
+/**
+ * Simple bolt that does nothing other than LOG.info() every tuple received.
+ *
+ */
+@SuppressWarnings("serial")
+public class LogInfoBolt extends BaseBasicBolt {
+  private static final Logger LOG = Logger.getLogger(LogInfoBolt.class.getName());
+
+  @Override
+  public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
+    LOG.info("{ }" + tuple);
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
+
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/RandomString.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/RandomString.java
new file mode 100644
index 0000000..2d794d6
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/RandomString.java
@@ -0,0 +1,51 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Random;
+
+public class RandomString {
+  private  char[] symbols;
+
+  private Random random = new Random();
+
+  private char[] buf;
+
+  public RandomString(int length) {
+    // Construct the symbol set
+    StringBuilder tmp = new StringBuilder();
+    for (char ch = '0'; ch <= '9'; ++ch) {
+      tmp.append(ch);
+    }
+
+    for (char ch = 'a'; ch <= 'z'; ++ch) {
+      tmp.append(ch);
+    }
+
+    symbols = tmp.toString().toCharArray();
+    if (length < 1) {
+      throw new IllegalArgumentException("length < 1: " + length);
+    }
+
+    buf = new char[length];
+  }
+
+  public String nextString() {
+    for (int idx = 0; idx < buf.length; ++idx) {
+      buf[idx] = symbols[random.nextInt(symbols.length)];
+    }
+
+    return new String(buf);
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulConsumerBolt.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulConsumerBolt.java
new file mode 100644
index 0000000..5831a53
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulConsumerBolt.java
@@ -0,0 +1,66 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+
+import org.apache.heron.api.bolt.BaseRichBolt;
+import org.apache.heron.api.bolt.OutputCollector;
+import org.apache.heron.api.state.State;
+import org.apache.heron.api.topology.IStatefulComponent;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Tuple;
+
+
+public class StatefulConsumerBolt extends BaseRichBolt
+    implements IStatefulComponent<Integer, Integer> {
+  private static final long serialVersionUID = -5470591933906954522L;
+
+  private OutputCollector collector;
+  private State<Integer, Integer> myState;
+
+  @Override
+  public void initState(State<Integer, Integer> state) {
+    this.myState = state;
+  }
+
+  @Override
+  public void preSave(String checkpointId) {
+    // Nothing really since we operate out of the system supplied state
+  }
+
+  @SuppressWarnings("rawtypes")
+  public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
+    collector = outputCollector;
+  }
+
+  @Override
+  public void execute(Tuple tuple) {
+    int key = tuple.getInteger(0);
+    System.out.println("looking in state for: " + key);
+    if (myState.get(key) == null) {
+      System.out.println("did not find " + key + " in state: ");
+      myState.put(key, 1);
+    } else {
+      System.out.println("found in state: " + key);
+      Integer val = myState.get(key);
+      myState.put(key, ++val);
+    }
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulNumberSpout.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulNumberSpout.java
new file mode 100644
index 0000000..aae0053
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulNumberSpout.java
@@ -0,0 +1,83 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+import java.util.Random;
+import java.util.logging.Logger;
+
+import org.apache.heron.api.spout.BaseRichSpout;
+import org.apache.heron.api.spout.SpoutOutputCollector;
+import org.apache.heron.api.state.State;
+import org.apache.heron.api.topology.IStatefulComponent;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Values;
+import org.apache.heron.api.utils.Utils;
+
+@SuppressWarnings("HiddenField")
+public class StatefulNumberSpout extends BaseRichSpout
+    implements IStatefulComponent<String, Long> {
+  private static final Logger LOG = Logger.getLogger(StatefulNumberSpout.class.getName());
+  private static final long serialVersionUID = 5454291010750852782L;
+  private SpoutOutputCollector collector;
+  private Random rand;
+  private long msgId;
+  private State<String, Long> state;
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("value", "ts", "msgid"));
+  }
+
+  @Override
+  public void open(Map<String, Object> conf, TopologyContext context, SpoutOutputCollector
+      collector) {
+    this.collector = collector;
+    this.rand = new Random();
+  }
+
+  @Override
+  public void nextTuple() {
+    Utils.sleep(1000);
+    long val = msgId;
+    long randomNumber = System.currentTimeMillis() - (24 * 60 * 60 * 1000);
+    System.out.println("Emitting: " + val);
+    collector.emit(new Values(val,
+        randomNumber, msgId), msgId);
+    msgId++;
+  }
+
+  @Override
+  public void ack(Object msgId) {
+    LOG.fine("Got ACK for msgId : " + msgId);
+  }
+
+  @Override
+  public void fail(Object msgId) {
+    LOG.fine("Got FAIL for msgId : " + msgId);
+  }
+
+  @Override
+  public void initState(State<String, Long> state) {
+    this.state = state;
+    this.msgId = this.state.getOrDefault("msgId", 0L);
+  }
+
+  @Override
+  public void preSave(String checkpointId) {
+    this.state.put("msgId", msgId);
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulRandomIntSpout.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulRandomIntSpout.java
new file mode 100644
index 0000000..5c8bfcf
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulRandomIntSpout.java
@@ -0,0 +1,73 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.apache.heron.api.spout.BaseRichSpout;
+import org.apache.heron.api.spout.SpoutOutputCollector;
+import org.apache.heron.api.state.State;
+import org.apache.heron.api.topology.IStatefulComponent;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Values;
+
+import backtype.storm.utils.Utils;
+
+public class StatefulRandomIntSpout extends BaseRichSpout
+    implements IStatefulComponent<String, Integer> {
+  private SpoutOutputCollector spoutOutputCollector;
+  private State<String, Integer> count;
+
+  public StatefulRandomIntSpout() {
+  }
+
+  // Generates a random integer between 1 and 100
+  private int randomInt() {
+    return ThreadLocalRandom.current().nextInt(1, 101);
+  }
+
+  // These two methods are required to implement the IStatefulComponent interface
+  @Override
+  public void preSave(String checkpointId) {
+    System.out.println(String.format("Saving spout state at checkpoint %s", checkpointId));
+  }
+
+  @Override
+  public void initState(State<String, Integer> state) {
+    count = state;
+  }
+
+  // These three methods are required to extend the BaseRichSpout abstract class
+  @Override
+  public void open(Map<String, Object> map, TopologyContext ctx, SpoutOutputCollector collector) {
+    spoutOutputCollector = collector;
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("random-int"));
+  }
+
+  @Override
+  public void nextTuple() {
+    Utils.sleep(2000);
+    int randomInt = randomInt();
+    System.out.println("Emitting Value: " + randomInt);
+    spoutOutputCollector.emit(new Values(randomInt));
+  }
+}
+
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulWindowSumBolt.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulWindowSumBolt.java
new file mode 100644
index 0000000..7d9b31f
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/StatefulWindowSumBolt.java
@@ -0,0 +1,67 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+
+import org.apache.heron.api.bolt.BaseStatefulWindowedBolt;
+import org.apache.heron.api.bolt.OutputCollector;
+import org.apache.heron.api.state.State;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Tuple;
+import org.apache.heron.api.tuple.Values;
+import org.apache.heron.api.windowing.TupleWindow;
+
+@SuppressWarnings("HiddenField")
+public class StatefulWindowSumBolt extends BaseStatefulWindowedBolt<String, Long> {
+  private static final long serialVersionUID = -539382497249834244L;
+  private State<String, Long> state;
+  private long sum;
+
+  private OutputCollector collector;
+
+  @Override
+  public void prepare(Map<String, Object> topoConf, TopologyContext context,
+                      OutputCollector collector) {
+    this.collector = collector;
+  }
+
+  @Override
+  public void initState(State<String, Long> state) {
+    this.state = state;
+    sum = state.getOrDefault("sum", 0L);
+  }
+
+  @Override
+  public void execute(TupleWindow inputWindow) {
+    for (Tuple tuple : inputWindow.get()) {
+      System.out.println("Adding to sum: " + tuple.getLongByField("value"));
+      sum += tuple.getLongByField("value");
+      System.out.println("Sum is now: " + sum);
+    }
+    collector.emit(new Values(sum));
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("sum"));
+  }
+
+  @Override
+  public void preSave(String checkpointId) {
+    state.put("sum", sum);
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestFibonacciSpout.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestFibonacciSpout.java
new file mode 100644
index 0000000..4bfd9c6
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestFibonacciSpout.java
@@ -0,0 +1,64 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+import java.util.Random;
+import java.util.logging.Logger;
+
+import org.apache.heron.api.spout.BaseRichSpout;
+import org.apache.heron.api.spout.SpoutOutputCollector;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Values;
+import org.apache.heron.api.utils.Utils;
+
+@SuppressWarnings({"serial", "rawtypes", "HiddenField"})
+public class TestFibonacciSpout extends BaseRichSpout {
+  private static final Logger LOG = Logger.getLogger(TestFibonacciSpout.class.getName());
+  private TestPropertyHolder holder;
+  private SpoutOutputCollector collector;
+
+  public TestFibonacciSpout(TestPropertyHolder holder) {
+    this.holder = holder;
+  }
+
+  @Override
+  public void open(Map<String, Object> conf, TopologyContext context,
+                   SpoutOutputCollector collector) {
+    this.collector = collector;
+  }
+
+  @Override
+  public void nextTuple() {
+    Utils.sleep(100);
+    final int[] words = new int[] {0, 1, 2, 3, 5, 8, 13, 21, 34};
+    final Random rand = new Random();
+    final int number = words[rand.nextInt(words.length)];
+    final String property = holder.getProperty();
+    final int numberProperty = holder.getNumberProperty();
+    final String publicProperty = holder.publicProperty;
+    LOG.info("Constructor Args: " + property);
+    LOG.info("Property set by setter: " + numberProperty);
+    LOG.info("Property set by public field: " + publicProperty);
+    LOG.info("Emitting: number " + number);
+    collector.emit(new Values(number));
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("number"));
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestIBasicPrintBolt.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestIBasicPrintBolt.java
new file mode 100644
index 0000000..05ad33f
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestIBasicPrintBolt.java
@@ -0,0 +1,68 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+
+import org.apache.heron.api.bolt.BasicOutputCollector;
+import org.apache.heron.api.bolt.IBasicBolt;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Tuple;
+
+import static org.apache.heron.api.utils.Utils.tuple;
+
+@SuppressWarnings({"serial", "rawtypes", "unchecked", "HiddenField"})
+public class TestIBasicPrintBolt implements IBasicBolt {
+
+  public String someProperty = "set ";
+
+  public TestUnits testUnits;
+
+  @Override
+  public void prepare(Map stormConf, TopologyContext context) {
+
+  }
+
+  public void sampleConfigurationMethod(String someProperty, TestUnits testUnits) {
+    this.someProperty += someProperty;
+    this.testUnits = testUnits;
+  }
+
+  @Override
+  public void execute(Tuple input, BasicOutputCollector collector) {
+    System.out.println("The configuration method has set \"someProperty\" to : "
+        + this.someProperty);
+    System.out.println("The configuration method has set TestUnits to " + testUnits);
+    System.out.println("Emitting : " + input);
+    collector.emit(tuple(input.getValues().get(0)));
+
+  }
+
+  @Override
+  public void cleanup() {
+
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("ibasic-print"));
+  }
+
+  @Override
+  public Map<String, Object> getComponentConfiguration() {
+    return null;
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestNameCounter.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestNameCounter.java
new file mode 100644
index 0000000..583f0a5
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestNameCounter.java
@@ -0,0 +1,62 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.heron.api.bolt.BaseBasicBolt;
+import org.apache.heron.api.bolt.BasicOutputCollector;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Tuple;
+
+import static org.apache.heron.api.utils.Utils.tuple;
+
+@SuppressWarnings({"serial", "rawtypes"})
+public class TestNameCounter extends BaseBasicBolt {
+
+  private Map<String, Integer> counts;
+
+  @Override
+  public void prepare(Map map, TopologyContext topologyContext) {
+    counts = new HashMap<>();
+  }
+
+
+  protected String getTupleValue(Tuple t, int idx) {
+    return (String) t.getValues().get(idx);
+  }
+
+  public void execute(Tuple input, BasicOutputCollector collector) {
+    String word = getTupleValue(input, 0);
+    int count = 0;
+    if (counts.containsKey(word)) {
+      count = counts.get(word);
+    }
+    count++;
+    counts.put(word, count);
+    collector.emit(tuple(word, count));
+  }
+
+  public void cleanup() {
+
+  }
+
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("name", "count"));
+  }
+
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestNameSpout.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestNameSpout.java
new file mode 100644
index 0000000..f31fabc
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestNameSpout.java
@@ -0,0 +1,81 @@
+//  Copyright 2017 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import org.apache.heron.api.Config;
+import org.apache.heron.api.spout.BaseRichSpout;
+import org.apache.heron.api.spout.SpoutOutputCollector;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Values;
+import org.apache.heron.api.utils.Utils;
+
+@SuppressWarnings({"serial", "HiddenField"})
+public class TestNameSpout extends BaseRichSpout {
+  private boolean isdistributed;
+  private SpoutOutputCollector collector;
+
+  public TestNameSpout() {
+    this(true);
+  }
+
+  public TestNameSpout(boolean isDistributed) {
+    isdistributed = isDistributed;
+  }
+
+  public void open(Map<String, Object> conf, TopologyContext context,
+                   SpoutOutputCollector collector) {
+    this.collector = collector;
+  }
+
+  public void close() {
+
+  }
+
+  public void nextTuple() {
+    Utils.sleep(100);
+    final String[] words = new String[] {"marge", "homer", "bart", "simpson", "lisa"};
+    final Random rand = new Random();
+    final String word = words[rand.nextInt(words.length)];
+    collector.emit(new Values(word));
+  }
+
+  public void ack(Object msgId) {
+
+  }
+
+  public void fail(Object msgId) {
+
+  }
+
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("name"));
+  }
+
+  @Override
+  public Map<String, Object> getComponentConfiguration() {
+    if (!isdistributed) {
+      Map<String, Object> ret = new HashMap<String, Object>();
+      ret.put(Config.TOPOLOGY_STMGRS, 1);
+      return ret;
+    } else {
+      return null;
+    }
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestPrintBolt.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestPrintBolt.java
new file mode 100644
index 0000000..35bd499
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestPrintBolt.java
@@ -0,0 +1,33 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import org.apache.heron.api.bolt.BaseBasicBolt;
+import org.apache.heron.api.bolt.BasicOutputCollector;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.tuple.Tuple;
+
+@SuppressWarnings("serial")
+public class TestPrintBolt extends BaseBasicBolt {
+
+  @Override
+  public void execute(Tuple tuple, BasicOutputCollector collector) {
+    System.out.println(tuple);
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer ofd) {
+  }
+
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestPropertyHolder.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestPropertyHolder.java
new file mode 100644
index 0000000..ff92a38
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestPropertyHolder.java
@@ -0,0 +1,48 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class TestPropertyHolder implements Serializable {
+
+  private String property;
+
+  private int numberProperty;
+
+  public String publicProperty;
+
+
+  public TestPropertyHolder(String property) {
+    this.property = property;
+  }
+
+  public String getProperty() {
+    return property;
+  }
+
+  public void setProperty(String property) {
+    this.property = property;
+  }
+
+  public int getNumberProperty() {
+    return numberProperty;
+  }
+
+  public void setNumberProperty(int numberProperty) {
+    this.numberProperty = numberProperty;
+  }
+
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestUnits.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestUnits.java
new file mode 100644
index 0000000..4df8b42
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestUnits.java
@@ -0,0 +1,33 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+/**
+ * Sample unit of measure enum
+ */
+public enum TestUnits {
+  MB("MB"),
+  GB("GB"),
+  B("B");
+
+  private String value;
+
+  TestUnits(String value) {
+    this.value = value;
+  }
+
+  public String getValue() {
+    return value;
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestWindowBolt.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestWindowBolt.java
new file mode 100644
index 0000000..5a45e20
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/TestWindowBolt.java
@@ -0,0 +1,46 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+
+import org.apache.heron.api.bolt.BaseWindowedBolt;
+import org.apache.heron.api.bolt.OutputCollector;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Values;
+import org.apache.heron.api.windowing.TupleWindow;
+
+@SuppressWarnings({"serial", "HiddenField"})
+public class TestWindowBolt extends BaseWindowedBolt {
+  private OutputCollector collector;
+
+
+  @Override
+  public void prepare(Map<String, Object> topoConf, TopologyContext context,
+                      OutputCollector collector) {
+    this.collector = collector;
+  }
+
+  @Override
+  public void execute(TupleWindow inputWindow) {
+    collector.emit(new Values(inputWindow.get().size()));
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("count"));
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/WordSpout.java b/eco-heron-examples/src/java/org/apache/heron/examples/eco/WordSpout.java
new file mode 100644
index 0000000..8ab4d31
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/WordSpout.java
@@ -0,0 +1,64 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+import java.util.Random;
+
+import org.apache.heron.api.spout.BaseRichSpout;
+import org.apache.heron.api.spout.SpoutOutputCollector;
+import org.apache.heron.api.topology.OutputFieldsDeclarer;
+import org.apache.heron.api.topology.TopologyContext;
+import org.apache.heron.api.tuple.Fields;
+import org.apache.heron.api.tuple.Values;
+
+@SuppressWarnings("HiddenField")
+public class WordSpout extends BaseRichSpout {
+  private static final long serialVersionUID = 4322775001819135036L;
+
+  private static final int ARRAY_LENGTH = 128 * 1024;
+  private static final int WORD_LENGTH = 20;
+
+  private final String[] words = new String[ARRAY_LENGTH];
+
+  private final Random rnd = new Random(31);
+
+  private SpoutOutputCollector collector;
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
+    outputFieldsDeclarer.declare(new Fields("word"));
+  }
+
+  @Override
+  @SuppressWarnings("rawtypes")
+  public void open(Map map, TopologyContext topologyContext,
+                   SpoutOutputCollector spoutOutputCollector) {
+    System.out.println("open spout");
+    RandomString randomString = new RandomString(WORD_LENGTH);
+
+    for (int i = 0; i < ARRAY_LENGTH; i++) {
+      words[i] = randomString.nextString();
+    }
+
+    collector = spoutOutputCollector;
+  }
+
+  @Override
+  public void nextTuple() {
+    System.out.println("next tuple");
+    int nextInt = rnd.nextInt(ARRAY_LENGTH);
+    collector.emit(new Values(words[nextInt]));
+  }
+}
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron-stateful-windowing.yaml b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron-stateful-windowing.yaml
new file mode 100644
index 0000000..d691950
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron-stateful-windowing.yaml
@@ -0,0 +1,52 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+name: "stateful-windowing"
+type: "heron"
+
+config:
+  topology.workers: 1
+  topology.reliability.mode: "EFFECTIVELY_ONCE"
+
+components:
+
+  - id: "windowLength"
+    className: "org.apache.heron.api.bolt.BaseWindowedBolt$Count"
+    constructorArgs:
+      - 5
+
+  - id: "slidingInterval"
+    className: "org.apache.heron.api.bolt.BaseWindowedBolt$Count"
+    constructorArgs:
+      - 3
+
+spouts:
+  - id: "integer-spout"
+    className: "org.apache.heron.examples.eco.StatefulNumberSpout"
+    parallelism: 1
+
+bolts:
+  - id: "stateful-window-sum-bolt"
+    className: "org.apache.heron.examples.eco.StatefulWindowSumBolt"
+    configMethods:
+      - name: "withWindow"
+        args: [ref: "windowLength", ref: "slidingInterval"]
+    parallelism: 1
+
+
+streams:
+  - from: "integer-spout"
+    to: "stateful-window-sum-bolt"
+    grouping:
+      type: SHUFFLE
\ No newline at end of file
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron-stateful-word-count.yaml b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron-stateful-word-count.yaml
new file mode 100644
index 0000000..ebc39bb
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron-stateful-word-count.yaml
@@ -0,0 +1,38 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+name: "stateful-word-count"
+type: "heron"
+
+config:
+  topology.workers: 1
+  topology.reliability.mode: "EFFECTIVELY_ONCE"
+
+
+spouts:
+  - id: "int-spout"
+    className: "org.apache.heron.examples.eco.StatefulRandomIntSpout"
+    parallelism: 1
+
+bolts:
+  - id: "stateful-consumer-bolt"
+    className: "org.apache.heron.examples.eco.StatefulConsumerBolt"
+    parallelism: 1
+
+
+streams:
+  - from: "int-spout"
+    to: "stateful-consumer-bolt"
+    grouping:
+      type: SHUFFLE
\ No newline at end of file
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_fibonacci.yaml b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_fibonacci.yaml
new file mode 100644
index 0000000..93dbd2f
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_fibonacci.yaml
@@ -0,0 +1,75 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+---
+
+name: "heron-fibonacci-topology"
+type: "heron"
+
+config:
+  topology.workers: 1
+
+components:
+  - id: "property-holder"
+    className: "org.apache.heron.examples.eco.TestPropertyHolder"
+    constructorArgs:
+      - "some argument"
+    properties:
+      - name: "numberProperty"
+        value: 11
+      - name: "publicProperty"
+        value: "This is public property"
+
+spouts:
+  - id: "spout-1"
+    className: "org.apache.heron.examples.eco.TestFibonacciSpout"
+    constructorArgs:
+      - ref: "property-holder"
+    parallelism: 1
+
+bolts:
+  - id: "even-and-odd-bolt"
+    className: "org.apache.heron.examples.eco.EvenAndOddBolt"
+    parallelism: 1
+
+  - id: "ibasic-print-bolt"
+    className: "org.apache.heron.examples.eco.TestIBasicPrintBolt"
+    parallelism: 1
+    configMethods:
+      - name: "sampleConfigurationMethod"
+        args:
+          - "${ecoPropertyOne}"
+          - MB
+
+  - id: "sys-out-bolt"
+    className: "org.apache.heron.examples.eco.TestPrintBolt"
+    parallelism: 1
+
+streams:
+  - from: "spout-1"
+    to: "even-and-odd-bolt"
+    grouping:
+      type: SHUFFLE
+
+  - from: "even-and-odd-bolt"
+    to: "ibasic-print-bolt"
+    grouping:
+      type: SHUFFLE
+      streamId: "odds"
+
+  - from: "even-and-odd-bolt"
+    to: "sys-out-bolt"
+    grouping:
+      type: SHUFFLE
+      streamId: "evens"
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_windowing.yaml b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_windowing.yaml
new file mode 100644
index 0000000..ec36d8b
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_windowing.yaml
@@ -0,0 +1,66 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+---
+
+name: "heron-sliding-window-topology"
+type: "heron"
+
+components:
+  - id: "windowLength"
+    className: "org.apache.heron.api.bolt.BaseWindowedBolt$Count"
+    constructorArgs:
+      - 5
+  - id: "slidingInterval"
+    className: "org.apache.heron.api.bolt.BaseWindowedBolt$Count"
+    constructorArgs:
+      - 3
+
+config:
+  topology.workers: 1
+
+# spout definitions
+spouts:
+  - id: "spout-1"
+    className: "org.apache.heron.examples.eco.TestNameSpout"
+    parallelism: 1
+
+# bolt definitions
+bolts:
+  - id: "bolt-1"
+    className: "org.apache.heron.examples.eco.TestWindowBolt"
+    configMethods:
+      - name: "withWindow"
+        args: [ref: "windowLength", ref: "slidingInterval"]
+    parallelism: 1
+  - id: "bolt-2"
+    className: "org.apache.heron.examples.eco.TestPrintBolt"
+    parallelism: 1
+
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+streams:
+
+  - from: "spout-1"
+    to: "bolt-1"
+    grouping:
+      type: FIELDS
+      args: ["word"]
+
+  - from: "bolt-1"
+    to: "bolt-2"
+    grouping:
+      type: SHUFFLE
diff --git a/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_wordcount.yaml b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_wordcount.yaml
new file mode 100644
index 0000000..dbd3f7b
--- /dev/null
+++ b/eco-heron-examples/src/java/org/apache/heron/examples/eco/heron_wordcount.yaml
@@ -0,0 +1,73 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+---
+
+# topology definition
+# name to be used when submitting
+name: "heron-simple-wordcount-topology"
+type: "heron"
+
+# topology configuration
+# this will be passed to the submitter as a map of config options
+#
+config:
+  topology.workers: 2
+  topology.component.resourcemap:
+
+    - id: "spout-1"
+      ram: 256MB # The minimum value for a component's specified ram is 256MB
+      cpu: 0.5
+      disk: 4GB
+
+    - id: "bolt-1"
+      ram: 256MB # The minimum value for a component's specified ram is 256MB
+      cpu: 0.5
+      disk: 2GB
+
+  topology.component.jvmoptions:
+
+   - id: "spout-1"
+     options: ["-XX:NewSize=300m", "-Xms2g"]
+
+# spout definitions
+spouts:
+  - id: "spout-1"
+    className: "org.apache.heron.examples.eco.TestNameSpout"
+    parallelism: 1
+
+# bolt definitions
+bolts:
+  - id: "bolt-1"
+    className: "org.apache.heron.examples.eco.TestNameCounter"
+    parallelism: 1
+
+  - id: "bolt-2"
+    className: "org.apache.heron.examples.eco.LogInfoBolt"
+    parallelism: 1
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+streams:
+  - from: "spout-1"
+    to: "bolt-1"
+    grouping:
+      type: FIELDS
+      args: ["word"]
+
+  - from: "bolt-1"
+    to: "bolt-2"
+    grouping:
+      type: SHUFFLE
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/sample.properties b/eco-heron-examples/src/java/org/apache/heron/examples/eco/sample.properties
similarity index 100%
rename from eco-storm-examples/src/java/com/twitter/heron/examples/eco/sample.properties
rename to eco-heron-examples/src/java/org/apache/heron/examples/eco/sample.properties
diff --git a/eco-storm-examples/src/java/BUILD b/eco-storm-examples/src/java/BUILD
index 6ef748d..3036344 100644
--- a/eco-storm-examples/src/java/BUILD
+++ b/eco-storm-examples/src/java/BUILD
@@ -7,7 +7,7 @@ filegroup(
 
 java_binary(
     name='storm-eco-examples-unshaded',
-    srcs = glob(["com/twitter/heron/examples/eco/**/*.java"]),
+    srcs = glob(["org/apache/heron/examples/eco/**/*.java"]),
     deps = [
         "//heron/api/src/java:api-java-low-level",
         "//heron/api/src/java:api-java",
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/EvenAndOddBolt.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/EvenAndOddBolt.java
deleted file mode 100644
index 65487f2..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/EvenAndOddBolt.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-
-import java.util.Map;
-
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.IBasicBolt;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-
-import static org.apache.storm.utils.Utils.tuple;
-
-@SuppressWarnings({"serial", "rawtypes", "unchecked"})
-public class EvenAndOddBolt implements IBasicBolt {
-
-
-  @Override
-  public void prepare(Map stormConf, TopologyContext context) {
-
-  }
-
-  protected int getTupleValue(Tuple t, int idx) {
-    return (int) t.getValues().get(idx);
-  }
-
-  @Override
-  public void execute(Tuple input, BasicOutputCollector collector) {
-    int number = getTupleValue(input, 0);
-
-    if (number % 2 == 0) {
-      System.out.println("Emitting to evens stream: " + number);
-      collector.emit("evens", tuple(input.getValues().get(0)));
-
-    } else {
-      System.out.println("emitting to odds stream: " + number);
-      collector.emit("odds", tuple(input.getValues().get(0)));
-    }
-
-    collector.emit(tuple(input.getValues().get(0)));
-
-
-
-  }
-
-  @Override
-  public void cleanup() {
-
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declareStream("evens", new Fields("evens"));
-    declarer.declareStream("odds", new Fields("odds"));
-    declarer.declare(new Fields("number"));
-  }
-
-  @Override
-  public Map<String, Object> getComponentConfiguration() {
-    return null;
-  }
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/LogInfoBolt.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/LogInfoBolt.java
deleted file mode 100644
index 3271178..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/LogInfoBolt.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-
-import java.util.logging.Logger;
-
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseBasicBolt;
-import org.apache.storm.tuple.Tuple;
-
-/**
- * Simple bolt that does nothing other than LOG.info() every tuple received.
- *
- */
-@SuppressWarnings("serial")
-public class LogInfoBolt extends BaseBasicBolt {
-  private static final Logger LOG = Logger.getLogger(LogInfoBolt.class.getName());
-
-  @Override
-  public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
-    LOG.info("{ }" + tuple);
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
-
-  }
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestFibonacciSpout.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestFibonacciSpout.java
deleted file mode 100644
index f3f11e4..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestFibonacciSpout.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-import java.util.Random;
-import java.util.logging.Logger;
-
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichSpout;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.utils.Utils;
-
-@SuppressWarnings({"serial", "rawtypes", "HiddenField"})
-public class TestFibonacciSpout extends BaseRichSpout {
-  private static final Logger LOG = Logger.getLogger(TestFibonacciSpout.class.getName());
-  private TestPropertyHolder holder;
-  private SpoutOutputCollector collector;
-
-  public TestFibonacciSpout(TestPropertyHolder holder) {
-    this.holder = holder;
-  }
-
-  @Override
-  public void open(Map<String, Object> conf, TopologyContext context,
-                   SpoutOutputCollector collector) {
-    this.collector = collector;
-  }
-
-  @Override
-  public void nextTuple() {
-    Utils.sleep(100);
-    final int[] words = new int[] {0, 1, 2, 3, 5, 8, 13, 21, 34};
-    final Random rand = new Random();
-    final int number = words[rand.nextInt(words.length)];
-    final String property = holder.getProperty();
-    final int numberProperty = holder.getNumberProperty();
-    final String publicProperty = holder.publicProperty;
-    LOG.info("Constructor Args: " + property);
-    LOG.info("Property set by setter: " + numberProperty);
-    LOG.info("Property set by public field: " + publicProperty);
-    LOG.info("Emitting: number " + number);
-    collector.emit(new Values(number));
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("number"));
-  }
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestIBasicPrintBolt.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestIBasicPrintBolt.java
deleted file mode 100644
index 8d5d4c9..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestIBasicPrintBolt.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.IBasicBolt;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-
-import static org.apache.storm.utils.Utils.tuple;
-
-@SuppressWarnings({"serial", "rawtypes", "unchecked", "HiddenField"})
-public class TestIBasicPrintBolt implements IBasicBolt {
-
-  public String someProperty = "set ";
-
-  public TestUnits testUnits;
-
-  @Override
-  public void prepare(Map stormConf, TopologyContext context) {
-
-  }
-
-  public void sampleConfigurationMethod(String someProperty, TestUnits testUnits) {
-    this.someProperty += someProperty;
-    this.testUnits = testUnits;
-  }
-
-  @Override
-  public void execute(Tuple input, BasicOutputCollector collector) {
-    System.out.println("The configuration method has set \"someProperty\" to : "
-        + this.someProperty);
-    System.out.println("The configuration method has set TestUnits to " + testUnits);
-    System.out.println("Emitting : " + input);
-    collector.emit(tuple(input.getValues().get(0)));
-
-  }
-
-  @Override
-  public void cleanup() {
-
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("ibasic-print"));
-  }
-
-  @Override
-  public Map<String, Object> getComponentConfiguration() {
-    return null;
-  }
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestNameCounter.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestNameCounter.java
deleted file mode 100644
index 00b5f64..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestNameCounter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseBasicBolt;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Tuple;
-
-import static com.twitter.heron.api.utils.Utils.tuple;
-@SuppressWarnings({"serial", "rawtypes"})
-public class TestNameCounter extends BaseBasicBolt {
-
-  private Map<String, Integer> counts;
-
-  @Override
-  public void prepare(Map map, TopologyContext topologyContext) {
-    counts = new HashMap<>();
-  }
-
-
-  protected String getTupleValue(Tuple t, int idx) {
-    return (String) t.getValues().get(idx);
-  }
-
-  public void execute(Tuple input, BasicOutputCollector collector) {
-    String word = getTupleValue(input, 0);
-    int count = 0;
-    if (counts.containsKey(word)) {
-      count = counts.get(word);
-    }
-    count++;
-    counts.put(word, count);
-    collector.emit(tuple(word, count));
-  }
-
-  public void cleanup() {
-
-  }
-
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("name", "count"));
-  }
-
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestNameSpout.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestNameSpout.java
deleted file mode 100644
index 4e7e8a5..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestNameSpout.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.storm.Config;
-import org.apache.storm.spout.SpoutOutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseRichSpout;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.utils.Utils;
-
-@SuppressWarnings({"serial", "HiddenField"})
-public class TestNameSpout extends BaseRichSpout {
-  private boolean isdistributed;
-  private SpoutOutputCollector collector;
-
-  public TestNameSpout() {
-    this(true);
-  }
-
-  public TestNameSpout(boolean isDistributed) {
-    isdistributed = isDistributed;
-  }
-
-  public void open(Map<String, Object> conf, TopologyContext context,
-                   SpoutOutputCollector collector) {
-    this.collector = collector;
-  }
-
-  public void close() {
-
-  }
-
-  public void nextTuple() {
-    Utils.sleep(100);
-    final String[] words = new String[] {"marge", "homer", "bart", "simpson", "lisa"};
-    final Random rand = new Random();
-    final String word = words[rand.nextInt(words.length)];
-    collector.emit(new Values(word));
-  }
-
-  public void ack(Object msgId) {
-
-  }
-
-  public void fail(Object msgId) {
-
-  }
-
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("name"));
-  }
-
-  @Override
-  public Map<String, Object> getComponentConfiguration() {
-    if (!isdistributed) {
-      Map<String, Object> ret = new HashMap<String, Object>();
-      ret.put(Config.TOPOLOGY_WORKERS, 1);
-      return ret;
-    } else {
-      return null;
-    }
-  }
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestPrintBolt.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestPrintBolt.java
deleted file mode 100644
index f9cb1d6..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestPrintBolt.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import org.apache.storm.topology.BasicOutputCollector;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseBasicBolt;
-import org.apache.storm.tuple.Tuple;
-
-@SuppressWarnings("serial")
-public class TestPrintBolt extends BaseBasicBolt {
-
-  @Override
-  public void execute(Tuple tuple, BasicOutputCollector collector) {
-    System.out.println(tuple);
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer ofd) {
-  }
-
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestPropertyHolder.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestPropertyHolder.java
deleted file mode 100644
index 2020fe4..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestPropertyHolder.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.io.Serializable;
-
-@SuppressWarnings("serial")
-public class TestPropertyHolder implements Serializable {
-
-  private String property;
-
-  private int numberProperty;
-
-  public String publicProperty;
-
-
-  public TestPropertyHolder(String property) {
-    this.property = property;
-  }
-
-  public String getProperty() {
-    return property;
-  }
-
-  public void setProperty(String property) {
-    this.property = property;
-  }
-
-  public int getNumberProperty() {
-    return numberProperty;
-  }
-
-  public void setNumberProperty(int numberProperty) {
-    this.numberProperty = numberProperty;
-  }
-
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestUnits.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestUnits.java
deleted file mode 100644
index f1d469b..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestUnits.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-/**
- * Sample unit of measure enum
- */
-public enum TestUnits {
-  MB("MB"),
-  GB("GB"),
-  B("B");
-
-  private String value;
-
-  TestUnits(String value) {
-    this.value = value;
-  }
-
-  public String getValue() {
-    return value;
-  }
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestWindowBolt.java b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestWindowBolt.java
deleted file mode 100644
index ef6046c..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/TestWindowBolt.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.examples.eco;
-
-import java.util.Map;
-
-import org.apache.storm.task.OutputCollector;
-import org.apache.storm.task.TopologyContext;
-import org.apache.storm.topology.OutputFieldsDeclarer;
-import org.apache.storm.topology.base.BaseWindowedBolt;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.tuple.Values;
-import org.apache.storm.windowing.TupleWindow;
-
-@SuppressWarnings({"serial", "HiddenField"})
-public class TestWindowBolt extends BaseWindowedBolt {
-  private OutputCollector collector;
-
-
-  @Override
-  public void prepare(Map<String, Object> topoConf, TopologyContext context,
-                      OutputCollector collector) {
-    this.collector = collector;
-  }
-
-  @Override
-  public void execute(TupleWindow inputWindow) {
-    collector.emit(new Values(inputWindow.get().size()));
-  }
-
-  @Override
-  public void declareOutputFields(OutputFieldsDeclarer declarer) {
-    declarer.declare(new Fields("count"));
-  }
-}
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/fibonacci.yaml b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/fibonacci.yaml
deleted file mode 100644
index 7ebb2d7..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/fibonacci.yaml
+++ /dev/null
@@ -1,74 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
----
-
-name: "fibonacci-topology"
-
-config:
-  topology.workers: 1
-
-components:
-  - id: "property-holder"
-    className: "com.twitter.heron.examples.eco.TestPropertyHolder"
-    constructorArgs:
-      - "some argument"
-    properties:
-      - name: "numberProperty"
-        value: 11
-      - name: "publicProperty"
-        value: "This is public property"
-
-spouts:
-  - id: "spout-1"
-    className: "com.twitter.heron.examples.eco.TestFibonacciSpout"
-    constructorArgs:
-      - ref: "property-holder"
-    parallelism: 1
-
-bolts:
-  - id: "even-and-odd-bolt"
-    className: "com.twitter.heron.examples.eco.EvenAndOddBolt"
-    parallelism: 1
-
-  - id: "ibasic-print-bolt"
-    className: "com.twitter.heron.examples.eco.TestIBasicPrintBolt"
-    parallelism: 1
-    configMethods:
-      - name: "sampleConfigurationMethod"
-        args:
-          - "${ecoPropertyOne}"
-          - MB
-
-  - id: "sys-out-bolt"
-    className: "com.twitter.heron.examples.eco.TestPrintBolt"
-    parallelism: 1
-
-streams:
-  - from: "spout-1"
-    to: "even-and-odd-bolt"
-    grouping:
-      type: SHUFFLE
-
-  - from: "even-and-odd-bolt"
-    to: "ibasic-print-bolt"
-    grouping:
-      type: SHUFFLE
-      streamId: "odds"
-
-  - from: "even-and-odd-bolt"
-    to: "sys-out-bolt"
-    grouping:
-      type: SHUFFLE
-      streamId: "evens"
\ No newline at end of file
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/simple_windowing.yaml b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/simple_windowing.yaml
deleted file mode 100644
index 777bfb6..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/simple_windowing.yaml
+++ /dev/null
@@ -1,65 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
----
-
-name: "sliding-window-topology"
-
-components:
-  - id: "windowLength"
-    className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
-    constructorArgs:
-      - 5
-  - id: "slidingInterval"
-    className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
-    constructorArgs:
-      - 3
-
-config:
-  topology.workers: 1
-
-# spout definitions
-spouts:
-  - id: "spout-1"
-    className: "com.twitter.heron.examples.eco.TestNameSpout"
-    parallelism: 1
-
-# bolt definitions
-bolts:
-  - id: "bolt-1"
-    className: "com.twitter.heron.examples.eco.TestWindowBolt"
-    configMethods:
-      - name: "withWindow"
-        args: [ref: "windowLength", ref: "slidingInterval"]
-    parallelism: 1
-  - id: "bolt-2"
-    className: "com.twitter.heron.examples.eco.TestPrintBolt"
-    parallelism: 1
-
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-streams:
-
-  - from: "spout-1"
-    to: "bolt-1"
-    grouping:
-      type: FIELDS
-      args: ["word"]
-
-  - from: "bolt-1"
-    to: "bolt-2"
-    grouping:
-      type: SHUFFLE
\ No newline at end of file
diff --git a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/simple_wordcount.yaml b/eco-storm-examples/src/java/com/twitter/heron/examples/eco/simple_wordcount.yaml
deleted file mode 100644
index 6d18b73..0000000
--- a/eco-storm-examples/src/java/com/twitter/heron/examples/eco/simple_wordcount.yaml
+++ /dev/null
@@ -1,72 +0,0 @@
-#  Copyright 2017 Twitter. All rights reserved.
-#
-#  Licensed 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.
-
----
-
-# topology definition
-# name to be used when submitting
-name: "simple-wordcount-topology"
-
-# topology configuration
-# this will be passed to the submitter as a map of config options
-#
-config:
-  topology.workers: 2
-  topology.component.resourcemap:
-
-    - id: "spout-1"
-      ram: 256MB # The minimum value for a component's specified ram is 256MB
-      cpu: 0.5
-      disk: 4GB
-
-    - id: "bolt-1"
-      ram: 256MB # The minimum value for a component's specified ram is 256MB
-      cpu: 0.5
-      disk: 2GB
-
-  topology.component.jvmoptions:
-
-   - id: "spout-1"
-     options: ["-XX:NewSize=300m", "-Xms2g"]
-
-# spout definitions
-spouts:
-  - id: "spout-1"
-    className: "com.twitter.heron.examples.eco.TestNameSpout"
-    parallelism: 1
-
-# bolt definitions
-bolts:
-  - id: "bolt-1"
-    className: "com.twitter.heron.examples.eco.TestNameCounter"
-    parallelism: 1
-
-  - id: "bolt-2"
-    className: "com.twitter.heron.examples.eco.LogInfoBolt"
-    parallelism: 1
-
-#stream definitions
-# stream definitions define connections between spouts and bolts.
-# note that such connections can be cyclical
-streams:
-  - from: "spout-1"
-    to: "bolt-1"
-    grouping:
-      type: FIELDS
-      args: ["word"]
-
-  - from: "bolt-1"
-    to: "bolt-2"
-    grouping:
-      type: SHUFFLE
\ No newline at end of file
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/EvenAndOddBolt.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/EvenAndOddBolt.java
new file mode 100644
index 0000000..ed6bd07
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/EvenAndOddBolt.java
@@ -0,0 +1,76 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+
+import java.util.Map;
+
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.IBasicBolt;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+
+import static org.apache.storm.utils.Utils.tuple;
+
+@SuppressWarnings({"serial", "rawtypes", "unchecked"})
+public class EvenAndOddBolt implements IBasicBolt {
+
+
+  @Override
+  public void prepare(Map stormConf, TopologyContext context) {
+
+  }
+
+  protected int getTupleValue(Tuple t, int idx) {
+    return (int) t.getValues().get(idx);
+  }
+
+  @Override
+  public void execute(Tuple input, BasicOutputCollector collector) {
+    int number = getTupleValue(input, 0);
+
+    if (number % 2 == 0) {
+      System.out.println("Emitting to evens stream: " + number);
+      collector.emit("evens", tuple(input.getValues().get(0)));
+
+    } else {
+      System.out.println("emitting to odds stream: " + number);
+      collector.emit("odds", tuple(input.getValues().get(0)));
+    }
+
+    collector.emit(tuple(input.getValues().get(0)));
+
+
+
+  }
+
+  @Override
+  public void cleanup() {
+
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declareStream("evens", new Fields("evens"));
+    declarer.declareStream("odds", new Fields("odds"));
+    declarer.declare(new Fields("number"));
+  }
+
+  @Override
+  public Map<String, Object> getComponentConfiguration() {
+    return null;
+  }
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/LogInfoBolt.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/LogInfoBolt.java
new file mode 100644
index 0000000..e506f8c
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/LogInfoBolt.java
@@ -0,0 +1,41 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+
+import java.util.logging.Logger;
+
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseBasicBolt;
+import org.apache.storm.tuple.Tuple;
+
+/**
+ * Simple bolt that does nothing other than LOG.info() every tuple received.
+ *
+ */
+@SuppressWarnings("serial")
+public class LogInfoBolt extends BaseBasicBolt {
+  private static final Logger LOG = Logger.getLogger(LogInfoBolt.class.getName());
+
+  @Override
+  public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
+    LOG.info("{ }" + tuple);
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
+
+  }
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestFibonacciSpout.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestFibonacciSpout.java
new file mode 100644
index 0000000..6c5376b
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestFibonacciSpout.java
@@ -0,0 +1,64 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+import java.util.Random;
+import java.util.logging.Logger;
+
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichSpout;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.utils.Utils;
+
+@SuppressWarnings({"serial", "rawtypes", "HiddenField"})
+public class TestFibonacciSpout extends BaseRichSpout {
+  private static final Logger LOG = Logger.getLogger(TestFibonacciSpout.class.getName());
+  private TestPropertyHolder holder;
+  private SpoutOutputCollector collector;
+
+  public TestFibonacciSpout(TestPropertyHolder holder) {
+    this.holder = holder;
+  }
+
+  @Override
+  public void open(Map<String, Object> conf, TopologyContext context,
+                   SpoutOutputCollector collector) {
+    this.collector = collector;
+  }
+
+  @Override
+  public void nextTuple() {
+    Utils.sleep(100);
+    final int[] words = new int[] {0, 1, 2, 3, 5, 8, 13, 21, 34};
+    final Random rand = new Random();
+    final int number = words[rand.nextInt(words.length)];
+    final String property = holder.getProperty();
+    final int numberProperty = holder.getNumberProperty();
+    final String publicProperty = holder.publicProperty;
+    LOG.info("Constructor Args: " + property);
+    LOG.info("Property set by setter: " + numberProperty);
+    LOG.info("Property set by public field: " + publicProperty);
+    LOG.info("Emitting: number " + number);
+    collector.emit(new Values(number));
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("number"));
+  }
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestIBasicPrintBolt.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestIBasicPrintBolt.java
new file mode 100644
index 0000000..0914677
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestIBasicPrintBolt.java
@@ -0,0 +1,68 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.IBasicBolt;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+
+import static org.apache.storm.utils.Utils.tuple;
+
+@SuppressWarnings({"serial", "rawtypes", "unchecked", "HiddenField"})
+public class TestIBasicPrintBolt implements IBasicBolt {
+
+  public String someProperty = "set ";
+
+  public TestUnits testUnits;
+
+  @Override
+  public void prepare(Map stormConf, TopologyContext context) {
+
+  }
+
+  public void sampleConfigurationMethod(String someProperty, TestUnits testUnits) {
+    this.someProperty += someProperty;
+    this.testUnits = testUnits;
+  }
+
+  @Override
+  public void execute(Tuple input, BasicOutputCollector collector) {
+    System.out.println("The configuration method has set \"someProperty\" to : "
+        + this.someProperty);
+    System.out.println("The configuration method has set TestUnits to " + testUnits);
+    System.out.println("Emitting : " + input);
+    collector.emit(tuple(input.getValues().get(0)));
+
+  }
+
+  @Override
+  public void cleanup() {
+
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("ibasic-print"));
+  }
+
+  @Override
+  public Map<String, Object> getComponentConfiguration() {
+    return null;
+  }
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestNameCounter.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestNameCounter.java
new file mode 100644
index 0000000..cde5bfd
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestNameCounter.java
@@ -0,0 +1,62 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseBasicBolt;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Tuple;
+
+import static org.apache.heron.api.utils.Utils.tuple;
+
+@SuppressWarnings({"serial", "rawtypes"})
+public class TestNameCounter extends BaseBasicBolt {
+
+  private Map<String, Integer> counts;
+
+  @Override
+  public void prepare(Map map, TopologyContext topologyContext) {
+    counts = new HashMap<>();
+  }
+
+
+  protected String getTupleValue(Tuple t, int idx) {
+    return (String) t.getValues().get(idx);
+  }
+
+  public void execute(Tuple input, BasicOutputCollector collector) {
+    String word = getTupleValue(input, 0);
+    int count = 0;
+    if (counts.containsKey(word)) {
+      count = counts.get(word);
+    }
+    count++;
+    counts.put(word, count);
+    collector.emit(tuple(word, count));
+  }
+
+  public void cleanup() {
+
+  }
+
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("name", "count"));
+  }
+
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestNameSpout.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestNameSpout.java
new file mode 100644
index 0000000..101051e
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestNameSpout.java
@@ -0,0 +1,81 @@
+//  Copyright 2017 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import org.apache.storm.Config;
+import org.apache.storm.spout.SpoutOutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseRichSpout;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.utils.Utils;
+
+@SuppressWarnings({"serial", "HiddenField"})
+public class TestNameSpout extends BaseRichSpout {
+  private boolean isdistributed;
+  private SpoutOutputCollector collector;
+
+  public TestNameSpout() {
+    this(true);
+  }
+
+  public TestNameSpout(boolean isDistributed) {
+    isdistributed = isDistributed;
+  }
+
+  public void open(Map<String, Object> conf, TopologyContext context,
+                   SpoutOutputCollector collector) {
+    this.collector = collector;
+  }
+
+  public void close() {
+
+  }
+
+  public void nextTuple() {
+    Utils.sleep(100);
+    final String[] words = new String[] {"marge", "homer", "bart", "simpson", "lisa"};
+    final Random rand = new Random();
+    final String word = words[rand.nextInt(words.length)];
+    collector.emit(new Values(word));
+  }
+
+  public void ack(Object msgId) {
+
+  }
+
+  public void fail(Object msgId) {
+
+  }
+
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("name"));
+  }
+
+  @Override
+  public Map<String, Object> getComponentConfiguration() {
+    if (!isdistributed) {
+      Map<String, Object> ret = new HashMap<String, Object>();
+      ret.put(Config.TOPOLOGY_WORKERS, 1);
+      return ret;
+    } else {
+      return null;
+    }
+  }
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestPrintBolt.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestPrintBolt.java
new file mode 100644
index 0000000..ef31403
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestPrintBolt.java
@@ -0,0 +1,33 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import org.apache.storm.topology.BasicOutputCollector;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseBasicBolt;
+import org.apache.storm.tuple.Tuple;
+
+@SuppressWarnings("serial")
+public class TestPrintBolt extends BaseBasicBolt {
+
+  @Override
+  public void execute(Tuple tuple, BasicOutputCollector collector) {
+    System.out.println(tuple);
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer ofd) {
+  }
+
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestPropertyHolder.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestPropertyHolder.java
new file mode 100644
index 0000000..ff92a38
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestPropertyHolder.java
@@ -0,0 +1,48 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class TestPropertyHolder implements Serializable {
+
+  private String property;
+
+  private int numberProperty;
+
+  public String publicProperty;
+
+
+  public TestPropertyHolder(String property) {
+    this.property = property;
+  }
+
+  public String getProperty() {
+    return property;
+  }
+
+  public void setProperty(String property) {
+    this.property = property;
+  }
+
+  public int getNumberProperty() {
+    return numberProperty;
+  }
+
+  public void setNumberProperty(int numberProperty) {
+    this.numberProperty = numberProperty;
+  }
+
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestUnits.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestUnits.java
new file mode 100644
index 0000000..4df8b42
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestUnits.java
@@ -0,0 +1,33 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+/**
+ * Sample unit of measure enum
+ */
+public enum TestUnits {
+  MB("MB"),
+  GB("GB"),
+  B("B");
+
+  private String value;
+
+  TestUnits(String value) {
+    this.value = value;
+  }
+
+  public String getValue() {
+    return value;
+  }
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestWindowBolt.java b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestWindowBolt.java
new file mode 100644
index 0000000..99facd1
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/TestWindowBolt.java
@@ -0,0 +1,46 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.examples.eco;
+
+import java.util.Map;
+
+import org.apache.storm.task.OutputCollector;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.topology.OutputFieldsDeclarer;
+import org.apache.storm.topology.base.BaseWindowedBolt;
+import org.apache.storm.tuple.Fields;
+import org.apache.storm.tuple.Values;
+import org.apache.storm.windowing.TupleWindow;
+
+@SuppressWarnings({"serial", "HiddenField"})
+public class TestWindowBolt extends BaseWindowedBolt {
+  private OutputCollector collector;
+
+
+  @Override
+  public void prepare(Map<String, Object> topoConf, TopologyContext context,
+                      OutputCollector collector) {
+    this.collector = collector;
+  }
+
+  @Override
+  public void execute(TupleWindow inputWindow) {
+    collector.emit(new Values(inputWindow.get().size()));
+  }
+
+  @Override
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+    declarer.declare(new Fields("count"));
+  }
+}
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/fibonacci.yaml b/eco-storm-examples/src/java/org/apache/heron/examples/eco/fibonacci.yaml
new file mode 100644
index 0000000..b1080ac
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/fibonacci.yaml
@@ -0,0 +1,74 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+---
+
+name: "fibonacci-topology"
+
+config:
+  topology.workers: 1
+
+components:
+  - id: "property-holder"
+    className: "org.apache.heron.examples.eco.TestPropertyHolder"
+    constructorArgs:
+      - "some argument"
+    properties:
+      - name: "numberProperty"
+        value: 11
+      - name: "publicProperty"
+        value: "This is public property"
+
+spouts:
+  - id: "spout-1"
+    className: "org.apache.heron.examples.eco.TestFibonacciSpout"
+    constructorArgs:
+      - ref: "property-holder"
+    parallelism: 1
+
+bolts:
+  - id: "even-and-odd-bolt"
+    className: "org.apache.heron.examples.eco.EvenAndOddBolt"
+    parallelism: 1
+
+  - id: "ibasic-print-bolt"
+    className: "org.apache.heron.examples.eco.TestIBasicPrintBolt"
+    parallelism: 1
+    configMethods:
+      - name: "sampleConfigurationMethod"
+        args:
+          - "${ecoPropertyOne}"
+          - MB
+
+  - id: "sys-out-bolt"
+    className: "org.apache.heron.examples.eco.TestPrintBolt"
+    parallelism: 1
+
+streams:
+  - from: "spout-1"
+    to: "even-and-odd-bolt"
+    grouping:
+      type: SHUFFLE
+
+  - from: "even-and-odd-bolt"
+    to: "ibasic-print-bolt"
+    grouping:
+      type: SHUFFLE
+      streamId: "odds"
+
+  - from: "even-and-odd-bolt"
+    to: "sys-out-bolt"
+    grouping:
+      type: SHUFFLE
+      streamId: "evens"
\ No newline at end of file
diff --git a/eco-heron-examples/src/java/com/twitter/heron/examples/eco/sample.properties b/eco-storm-examples/src/java/org/apache/heron/examples/eco/sample.properties
similarity index 100%
rename from eco-heron-examples/src/java/com/twitter/heron/examples/eco/sample.properties
rename to eco-storm-examples/src/java/org/apache/heron/examples/eco/sample.properties
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/simple_windowing.yaml b/eco-storm-examples/src/java/org/apache/heron/examples/eco/simple_windowing.yaml
new file mode 100644
index 0000000..0493d0a
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/simple_windowing.yaml
@@ -0,0 +1,65 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+---
+
+name: "sliding-window-topology"
+
+components:
+  - id: "windowLength"
+    className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
+    constructorArgs:
+      - 5
+  - id: "slidingInterval"
+    className: "org.apache.storm.topology.base.BaseWindowedBolt$Count"
+    constructorArgs:
+      - 3
+
+config:
+  topology.workers: 1
+
+# spout definitions
+spouts:
+  - id: "spout-1"
+    className: "org.apache.heron.examples.eco.TestNameSpout"
+    parallelism: 1
+
+# bolt definitions
+bolts:
+  - id: "bolt-1"
+    className: "org.apache.heron.examples.eco.TestWindowBolt"
+    configMethods:
+      - name: "withWindow"
+        args: [ref: "windowLength", ref: "slidingInterval"]
+    parallelism: 1
+  - id: "bolt-2"
+    className: "org.apache.heron.examples.eco.TestPrintBolt"
+    parallelism: 1
+
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+streams:
+
+  - from: "spout-1"
+    to: "bolt-1"
+    grouping:
+      type: FIELDS
+      args: ["word"]
+
+  - from: "bolt-1"
+    to: "bolt-2"
+    grouping:
+      type: SHUFFLE
\ No newline at end of file
diff --git a/eco-storm-examples/src/java/org/apache/heron/examples/eco/simple_wordcount.yaml b/eco-storm-examples/src/java/org/apache/heron/examples/eco/simple_wordcount.yaml
new file mode 100644
index 0000000..ec0ec72
--- /dev/null
+++ b/eco-storm-examples/src/java/org/apache/heron/examples/eco/simple_wordcount.yaml
@@ -0,0 +1,72 @@
+#  Copyright 2017 Twitter. All rights reserved.
+#
+#  Licensed 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.
+
+---
+
+# topology definition
+# name to be used when submitting
+name: "simple-wordcount-topology"
+
+# topology configuration
+# this will be passed to the submitter as a map of config options
+#
+config:
+  topology.workers: 2
+  topology.component.resourcemap:
+
+    - id: "spout-1"
+      ram: 256MB # The minimum value for a component's specified ram is 256MB
+      cpu: 0.5
+      disk: 4GB
+
+    - id: "bolt-1"
+      ram: 256MB # The minimum value for a component's specified ram is 256MB
+      cpu: 0.5
+      disk: 2GB
+
+  topology.component.jvmoptions:
+
+   - id: "spout-1"
+     options: ["-XX:NewSize=300m", "-Xms2g"]
+
+# spout definitions
+spouts:
+  - id: "spout-1"
+    className: "org.apache.heron.examples.eco.TestNameSpout"
+    parallelism: 1
+
+# bolt definitions
+bolts:
+  - id: "bolt-1"
+    className: "org.apache.heron.examples.eco.TestNameCounter"
+    parallelism: 1
+
+  - id: "bolt-2"
+    className: "org.apache.heron.examples.eco.LogInfoBolt"
+    parallelism: 1
+
+#stream definitions
+# stream definitions define connections between spouts and bolts.
+# note that such connections can be cyclical
+streams:
+  - from: "spout-1"
+    to: "bolt-1"
+    grouping:
+      type: FIELDS
+      args: ["word"]
+
+  - from: "bolt-1"
+    to: "bolt-2"
+    grouping:
+      type: SHUFFLE
\ No newline at end of file
diff --git a/eco/src/java/BUILD b/eco/src/java/BUILD
index 158fe1a..71d70bf 100644
--- a/eco/src/java/BUILD
+++ b/eco/src/java/BUILD
@@ -13,25 +13,25 @@ eco_deps = [
 
 java_library(
     name = "eco-defs-java",
-    srcs = glob(["com/twitter/heron/eco/definition/*.java"]),
+    srcs = glob(["org/apache/heron/eco/definition/*.java"]),
     deps = eco_deps,
 )
 
 java_library(
     name = "eco-parser-java",
-    srcs = glob(["com/twitter/heron/eco/parser/*.java"]),
+    srcs = glob(["org/apache/heron/eco/parser/*.java"]),
     deps = eco_deps + [":eco-defs-java"],
 )
 
 java_library(
     name = "eco-builder-java",
-    srcs = glob(["com/twitter/heron/eco/builder/*.java"]),
+    srcs = glob(["org/apache/heron/eco/builder/*.java"]),
     deps = eco_deps + [":eco-defs-java"],
 )
 
 java_library(
     name = "eco-storm-builder-java",
-    srcs = glob(["com/twitter/heron/eco/builder/storm/*.java"]),
+    srcs = glob(["org/apache/heron/eco/builder/storm/*.java"]),
     deps = eco_deps + [
         ":eco-builder-java",
         ":eco-defs-java",
@@ -40,7 +40,7 @@ java_library(
 
 java_library(
     name = "eco-heron-builder-java",
-    srcs = glob(["com/twitter/heron/eco/builder/heron/*.java"]),
+    srcs = glob(["org/apache/heron/eco/builder/heron/*.java"]),
     deps = eco_deps + [
         ":eco-builder-java",
         ":eco-defs-java",
@@ -49,13 +49,13 @@ java_library(
 
 java_library(
     name = "eco-submit-java",
-    srcs = glob(["com/twitter/heron/eco/submit/*.java"]),
+    srcs = glob(["org/apache/heron/eco/submit/*.java"]),
     deps = eco_deps, 
 )
 
 java_library(
     name = "eco-java",
-    srcs = glob(["com/twitter/heron/eco/*.java"]),
+    srcs = glob(["org/apache/heron/eco/*.java"]),
     deps = eco_deps + [
         ":eco-defs-java",
         ":eco-parser-java",
diff --git a/eco/src/java/com/twitter/heron/eco/Eco.java b/eco/src/java/com/twitter/heron/eco/Eco.java
deleted file mode 100644
index 77b4dd8..0000000
--- a/eco/src/java/com/twitter/heron/eco/Eco.java
+++ /dev/null
@@ -1,230 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.DefaultParser;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-
-import com.twitter.heron.api.Config;
-import com.twitter.heron.eco.builder.BoltBuilder;
-import com.twitter.heron.eco.builder.BuilderUtility;
-import com.twitter.heron.eco.builder.ComponentBuilder;
-import com.twitter.heron.eco.builder.ConfigBuilder;
-import com.twitter.heron.eco.builder.ObjectBuilder;
-import com.twitter.heron.eco.definition.BoltDefinition;
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-import com.twitter.heron.eco.definition.SpoutDefinition;
-import com.twitter.heron.eco.definition.StreamDefinition;
-import com.twitter.heron.eco.parser.EcoParser;
-import com.twitter.heron.eco.submit.EcoSubmitter;
-
-
-public class Eco {
-
-  private static final Logger LOG = Logger.getLogger(Eco.class.getName());
-  private static final String PROPS = "props";
-  private static final String ENV_PROPS = "env-props";
-  private static final String ECO_CONFIG_FILE = "eco-config-file";
-
-  private EcoParser ecoParser;
-  private EcoSubmitter ecoSubmitter;
-
-  public Eco(EcoParser ecoParser, EcoSubmitter ecoSubmitter) {
-    this.ecoParser = ecoParser;
-    this.ecoSubmitter = ecoSubmitter;
-  }
-
-  /**
-   * Submit an ECO topology
-   *
-   * @param fileInputStream  The input stream associated with ECO topology definition file
-   * @param propertiesFile  The optional key-value property file for optional property substitution.
-   * @param envFilter The optional flag to tell ECO to perform environment variable substitution
-   * @throws Exception
-   */
-  public void submit(FileInputStream fileInputStream,
-                     FileInputStream propertiesFile, boolean envFilter)
-      throws Exception {
-    EcoTopologyDefinition topologyDefinition = ecoParser
-        .parseFromInputStream(fileInputStream, propertiesFile, envFilter);
-
-    String topologyName = topologyDefinition.getName();
-    String topologyType = topologyDefinition.getType();
-
-    if ("storm".equals(topologyType)) {
-      System.out.println("topology type is Storm");
-      com.twitter.heron.eco.builder.storm.EcoBuilder ecoBuilder =
-          new com.twitter.heron.eco.builder.storm.EcoBuilder(
-            new com.twitter.heron.eco.builder.storm.SpoutBuilder(),
-            new BoltBuilder(),
-            new com.twitter.heron.eco.builder.storm.StreamBuilder(),
-            new ComponentBuilder(),
-            new ConfigBuilder());
-
-      Config topologyConfig = ecoBuilder
-          .buildConfig(topologyDefinition);
-
-      EcoExecutionContext executionContext
-          = new EcoExecutionContext(topologyDefinition, topologyConfig);
-
-      printTopologyInfo(executionContext);
-
-      ObjectBuilder objectBuilder = new ObjectBuilder();
-      objectBuilder.setBuilderUtility(new BuilderUtility());
-
-      org.apache.storm.topology.TopologyBuilder builder = ecoBuilder
-          .buildTopologyBuilder(executionContext, objectBuilder);
-      ecoSubmitter.submitStormTopology(topologyName, topologyConfig, builder.createTopology());
-    } else if ("heron".equals(topologyType)) {
-      System.out.println("topology type is Heron");
-      com.twitter.heron.eco.builder.heron.EcoBuilder ecoBuilder =
-          new com.twitter.heron.eco.builder.heron.EcoBuilder(
-            new com.twitter.heron.eco.builder.heron.SpoutBuilder(),
-            new BoltBuilder(),
-            new com.twitter.heron.eco.builder.heron.StreamBuilder(),
-            new ComponentBuilder(),
-            new ConfigBuilder());
-
-      Config topologyConfig = ecoBuilder
-          .buildConfig(topologyDefinition);
-
-      EcoExecutionContext executionContext
-          = new EcoExecutionContext(topologyDefinition, topologyConfig);
-
-      printTopologyInfo(executionContext);
-
-      ObjectBuilder objectBuilder = new ObjectBuilder();
-      objectBuilder.setBuilderUtility(new BuilderUtility());
-
-      com.twitter.heron.api.topology.TopologyBuilder builder = ecoBuilder
-          .buildTopologyBuilder(executionContext, objectBuilder);
-      ecoSubmitter.submitHeronTopology(topologyName, topologyConfig, builder.createTopology());
-    } else {
-      LOG.log(Level.SEVERE,
-          String.format("Unknown topology type \'%s\' for topology %s, not submitted",
-              topologyType, topologyName));
-    }
-  }
-
-  public static void main(String[] args) throws Exception {
-    Options options = constructOptions();
-
-    CommandLineParser parser = new DefaultParser();
-
-    CommandLine cmd;
-    try {
-      cmd = parser.parse(options, args);
-    } catch (ParseException e) {
-      throw new RuntimeException("Error parsing command line options: ", e);
-    }
-
-
-    FileInputStream fin = new FileInputStream(new File(cmd.getOptionValue(ECO_CONFIG_FILE)));
-
-    String propsFile = cmd.getOptionValue(PROPS);
-    FileInputStream propsInputStream = null;
-
-    if (propsFile != null) {
-      propsInputStream = new FileInputStream(new File(propsFile));
-    }
-
-
-    Boolean filterFromEnv = cmd.hasOption(ENV_PROPS);
-
-    Eco eco = new Eco(new EcoParser(), new EcoSubmitter());
-
-    eco.submit(fin, propsInputStream, filterFromEnv);
-  }
-
-  private static Options constructOptions() {
-    Options options = new Options();
-    Option ecoConfig = Option.builder("eco")
-        .desc("Yaml config file for specifying topology definitions")
-        .longOpt(ECO_CONFIG_FILE)
-        .hasArgs()
-        .argName(ECO_CONFIG_FILE)
-        .required()
-        .build();
-
-
-    Option filterOption = Option.builder(PROPS)
-        .desc("properties file for property substitution")
-        .longOpt(PROPS)
-        .hasArgs()
-        .required(false)
-        .argName(PROPS)
-        .build();
-
-    Option envSubOption = Option.builder("envFilter")
-        .desc("Perform environment variable substitution.")
-        .longOpt(ENV_PROPS)
-        .numberOfArgs(0)
-        .required(false)
-        .build();
-
-    options.addOption(filterOption);
-    options.addOption(ecoConfig);
-    options.addOption(envSubOption);
-
-    return options;
-  }
-
-  // construct command line help options
-  //TODO: (joshfischer) integrate with existing system somehow
-  private static Options constructHelpOptions() {
-    Options options = new Options();
-    Option help = Option.builder("h")
-        .desc("List all options and their description")
-        .longOpt("help")
-        .build();
-
-    options.addOption(help);
-    return options;
-  }
-
-  static void printTopologyInfo(EcoExecutionContext ctx) {
-    EcoTopologyDefinition t = ctx.getTopologyDefinition();
-
-    LOG.info("---------- TOPOLOGY DETAILS ----------");
-
-    LOG.info(String.format("Topology Name: %s", t.getName()));
-    LOG.info("--------------- SPOUTS ---------------");
-    for (SpoutDefinition s : t.getSpouts()) {
-      LOG.info(String.format("%s [%d] (%s)", s.getId(), s.getParallelism(), s.getClassName()));
-    }
-    LOG.info("---------------- BOLTS ---------------");
-    for (BoltDefinition b : t.getBolts()) {
-      LOG.info(String.format("%s [%d] (%s)", b.getId(), b.getParallelism(), b.getClassName()));
-    }
-
-    LOG.info("--------------- STREAMS ---------------");
-    for (StreamDefinition sd : t.getStreams()) {
-      LOG.info(String.format("%s --%s--> %s",
-          sd.getFrom(),
-          sd.getGrouping().getType(),
-          sd.getTo()));
-    }
-    LOG.info("--------------------------------------");
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/BoltBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/BoltBuilder.java
deleted file mode 100644
index 5259db5..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/BoltBuilder.java
+++ /dev/null
@@ -1,35 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder;
-
-import java.lang.reflect.InvocationTargetException;
-
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-import com.twitter.heron.eco.definition.ObjectDefinition;
-
-public class BoltBuilder {
-
-  public void buildBolts(EcoExecutionContext executionContext,
-                            ObjectBuilder objectBuilder)
-      throws IllegalAccessException, InstantiationException, ClassNotFoundException,
-      NoSuchFieldException, InvocationTargetException {
-    EcoTopologyDefinition topologyDefinition = executionContext.getTopologyDefinition();
-
-    for (ObjectDefinition def: topologyDefinition.getBolts()) {
-      Object obj = objectBuilder.buildObject(def, executionContext);
-      executionContext.addBolt(def.getId(), obj);
-    }
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/BuilderUtility.java b/eco/src/java/com/twitter/heron/eco/builder/BuilderUtility.java
deleted file mode 100644
index 3366cb5..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/BuilderUtility.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.twitter.heron.eco.definition.BeanListReference;
-import com.twitter.heron.eco.definition.BeanReference;
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.ObjectDefinition;
-import com.twitter.heron.eco.definition.PropertyDefinition;
-
-public class BuilderUtility {
-
-  private static final Logger LOG = LoggerFactory.getLogger(BuilderUtility.class);
-
-  @SuppressWarnings("rawtypes")
-  protected List<Object> resolveReferences(List<Object> args, EcoExecutionContext context) {
-    LOG.debug("Checking arguments for references.");
-    List<Object> cArgs = new ArrayList<>();
-
-    // resolve references
-    for (Object arg : args) {
-      if (arg instanceof BeanReference) {
-        LOG.debug("BeanReference: " + ((BeanReference) arg).getId());
-        cArgs.add(context.getComponent(((BeanReference) arg).getId()));
-      } else if (arg instanceof BeanListReference) {
-        List<Object> components = new ArrayList<>();
-        BeanListReference ref = (BeanListReference) arg;
-        for (String id : ref.getIds()) {
-          components.add(context.getComponent(id));
-        }
-
-        LOG.debug("BeanListReference resolved as {}" + components);
-        cArgs.add(components);
-      } else {
-        LOG.debug("Unknown:" + arg.toString());
-        cArgs.add(arg);
-      }
-    }
-    return cArgs;
-  }
-
-  @SuppressWarnings("rawtypes")
-  protected void applyProperties(ObjectDefinition bean, Object instance,
-                                      EcoExecutionContext context) throws
-      IllegalAccessException, InvocationTargetException, NoSuchFieldException {
-    List<PropertyDefinition> props = bean.getProperties();
-    Class clazz = instance.getClass();
-    if (props != null) {
-      for (PropertyDefinition prop : props) {
-        Object value = prop.isReference() ? context.getComponent(prop.getRef()) : prop.getValue();
-        Method setter = findSetter(clazz, prop.getName());
-        if (setter != null) {
-          LOG.debug("found setter, attempting with: " + instance.getClass() + "  " + value);
-          // invoke setter
-          setter.invoke(instance, new Object[]{value});
-        } else {
-          // look for a public instance variable
-          LOG.debug("no setter found. Looking for a public instance variable...");
-          Field field = findPublicField(clazz, prop.getName());
-          if (field != null) {
-            field.set(instance, value);
-          }
-        }
-      }
-    }
-  }
-
-  @SuppressWarnings("rawtypes")
-  protected Field findPublicField(Class clazz, String property)
-      throws NoSuchFieldException {
-    Field field = clazz.getField(property);
-    return field;
-  }
-
-  @SuppressWarnings("rawtypes")
-  private Method findSetter(Class clazz, String property) {
-    String setterName = toSetterName(property);
-    Method retval = null;
-    Method[] methods = clazz.getMethods();
-    for (Method method : methods) {
-      if (setterName.equals(method.getName())) {
-        LOG.debug("Found setter method: " + method.getName());
-        retval = method;
-      }
-    }
-    return retval;
-  }
-
-  protected String toSetterName(String name) {
-    return "set" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
-  }
-
-  protected Class<?> classForName(String className) throws ClassNotFoundException {
-    return Class.forName(className);
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/ComponentBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/ComponentBuilder.java
deleted file mode 100644
index 3e7be34..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/ComponentBuilder.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import com.twitter.heron.eco.definition.BeanDefinition;
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-
-public class ComponentBuilder {
-  public void buildComponents(EcoExecutionContext context, ObjectBuilder objectBuilder)
-      throws ClassNotFoundException,
-      IllegalAccessException, InstantiationException,
-      NoSuchFieldException, InvocationTargetException {
-    List<BeanDefinition> componentDefinitions = context.getTopologyDefinition().getComponents();
-
-    if (componentDefinitions != null) {
-      for (BeanDefinition bean : componentDefinitions) {
-        Object obj = objectBuilder.buildObject(bean, context);
-        context.addComponent(bean.getId(), obj);
-      }
-    }
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/ConfigBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/ConfigBuilder.java
deleted file mode 100644
index 787ecb0..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/ConfigBuilder.java
+++ /dev/null
@@ -1,202 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder;
-
-import java.util.List;
-import java.util.Map;
-
-
-import com.twitter.heron.api.Config;
-import com.twitter.heron.common.basics.ByteAmount;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-
-@SuppressWarnings("unchecked")
-public class ConfigBuilder {
-
-  public static final String COMPONENT_RESOURCE_MAP = "topology.component.resourcemap";
-  public static final String COMPONENT_JVM_OPTIONS = "topology.component.jvmoptions";
-  private static final String ID = "id";
-  private static final String RAM = "ram";
-  private static final String CPU = "cpu";
-  private static final String DISK = "disk";
-  private static final String OPTIONS = "options";
-  private static final String EQUALS = "=";
-  private static final String WHITESPACE = " ";
-  private static final String COMMA = ",";
-  private static final String LEFT_BRACE = "{";
-  private static final String RIGHT_BRACE = "}";
-  private static final String LEFT_BRACKET = "[";
-  private static final String RIGHT_BRACKET = "]";
-  private static final String MB = "MB";
-  private static final String GB = "GB";
-  private static final String B = "B";
-  private static final Integer MINIMUM_BYTES = 256000000;
-  private static final Integer MINIMUM_MB = 256;
-
-  /**
-   * Build the config for a ECO topology definition
-   *
-   * @param topologyDefinition - ECO topology definition
-   */
-  public Config buildConfig(EcoTopologyDefinition topologyDefinition)
-      throws IllegalArgumentException {
-
-    Map<String, Object> configMap = topologyDefinition.getConfig();
-    Config config = new Config();
-    for (Map.Entry<String, Object> entry: configMap.entrySet()) {
-
-      if (entry.getKey().equals(COMPONENT_RESOURCE_MAP)) {
-
-        setComponentLevelResource(config, entry);
-
-      } else if (entry.getKey().equals(COMPONENT_JVM_OPTIONS)) {
-
-        List<Object> objects = (List<Object>) entry.getValue();
-        for (Object obj : objects) {
-          String objString = obj.toString();
-          objString = objString.replace(LEFT_BRACE, WHITESPACE);
-          objString = objString.replace(RIGHT_BRACE, WHITESPACE);
-
-          int idIndex = objString.indexOf(ID);
-          int optionsIndex = objString.indexOf(OPTIONS);
-
-          String id = getIdValue(objString, idIndex);
-
-          String jvmOptions;
-          if (optionsIndex != -1) {
-
-            int equalsIndex = objString.indexOf(EQUALS, optionsIndex);
-            jvmOptions = objString.substring(equalsIndex + 1, objString.length());
-
-            jvmOptions = jvmOptions.replace(LEFT_BRACKET, "")
-                .replace(RIGHT_BRACKET, "");
-
-          } else {
-            throw new IllegalArgumentException(
-                "You must specify the JVM options for your component");
-          }
-
-          config.setComponentJvmOptions(id, jvmOptions);
-        }
-
-      } else {
-        config.put(entry.getKey(), entry.getValue());
-      }
-
-    }
-    return config;
-  }
-
-
-  private void setComponentLevelResource(Config config, Map.Entry<String, Object> entry) {
-    List<Object> objects = (List<Object>) entry.getValue();
-    for (Object obj: objects) {
-
-      String objString = obj.toString();
-
-      objString = objString.replace(COMMA, WHITESPACE);
-      objString = objString.replace(LEFT_BRACE, WHITESPACE);
-      objString = objString.replace(RIGHT_BRACE, WHITESPACE);
-
-      int idIndex = objString.indexOf(ID);
-      int ramIndex = objString.indexOf(RAM);
-      int cpuIndex = objString.indexOf(CPU);
-      int diskIndex = objString.indexOf(DISK);
-
-      String ramWithUom = "";
-      String id = getIdValue(objString, idIndex);
-      //todo (josh fischer) diskWithUom and cpu are still to be implemented for use with k8s
-      String diskWithUom = "";
-      String cpu = "";
-
-      if (ramIndex != -1) {
-        ramWithUom = assignValue(objString, ramIndex);
-      }
-
-      if (cpuIndex != -1) {
-        cpu = assignValue(objString, cpuIndex);
-      }
-
-      if (diskIndex != -1) {
-        diskWithUom = assignValue(objString, diskIndex);
-      }
-
-      ByteAmount byteAmount = null;
-
-      if (ramWithUom.contains(MB)) {
-        // its megaBytes
-        int mbIndex = verifyStartingIndexOfUom(ramWithUom, MB);
-        long megaBytes = extractRawValue(ramWithUom, mbIndex);
-        if (megaBytes < MINIMUM_MB) {
-          throw new IllegalArgumentException(
-              "The minimum Ram resource allocation for a component must be at least 256MB");
-        }
-        byteAmount = ByteAmount.fromMegabytes(megaBytes);
-
-      } else if (ramWithUom.contains(GB)) {
-        // its gigaBytes
-        // we don't validate here as NumberFormatException is thrown converting decimals to longs
-        int gbIndex = verifyStartingIndexOfUom(ramWithUom, GB);
-        byteAmount = ByteAmount.fromGigabytes(extractRawValue(ramWithUom, gbIndex));
-
-      } else if (ramWithUom.contains(B)) {
-        // its bytes
-        int bIndex = verifyStartingIndexOfUom(ramWithUom, B);
-        long bytes = extractRawValue(ramWithUom, bIndex);
-        if (bytes < MINIMUM_BYTES) {
-          throw new IllegalArgumentException(
-              "The minimum Ram resource allocation for a component must be at least 256000000B");
-        }
-        byteAmount = ByteAmount.fromBytes(bytes);
-
-      } else {
-        // There is no format throw an exception
-        throw new
-            IllegalArgumentException(
-            " Please specify 'B', 'MB', 'GB' when declaring Ram Resources");
-      }
-      config.setComponentRam(id, byteAmount);
-    }
-  }
-
-  private String getIdValue(String objString, int idIndex) {
-    String id = "";
-    if (idIndex != -1) {
-      id = assignValue(objString, idIndex);
-    } else {
-      throw new IllegalArgumentException("Must specify ID of component to allocate resources");
-    }
-    return id;
-  }
-
-  private int verifyStartingIndexOfUom(String ramWithUom, String uom) {
-    int bIndex = ramWithUom.indexOf(uom);
-    String ramUom = ramWithUom.substring(bIndex, ramWithUom.length());
-    if (!ramUom.equalsIgnoreCase(uom)) {
-      throw new IllegalArgumentException(
-          "Unit of Measure must be at the appended at the end of the value.");
-    }
-    return bIndex;
-  }
-
-  private long extractRawValue(String ramWithUom, int index) {
-    return Long.valueOf(ramWithUom.substring(0, index));
-  }
-
-  private String assignValue(String objString, int index) {
-    int equalsIndex = objString.indexOf(EQUALS, index);
-    int spaceIndex = objString.indexOf(" ", index);
-    return objString.substring(equalsIndex + 1, spaceIndex);
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/ObjectBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/ObjectBuilder.java
deleted file mode 100644
index 5f2f441..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/ObjectBuilder.java
+++ /dev/null
@@ -1,311 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.twitter.heron.eco.definition.ConfigurationMethodDefinition;
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.ObjectDefinition;
-
-public class ObjectBuilder {
-  private static final Logger LOG = LoggerFactory.getLogger(ObjectBuilder.class);
-
-  private BuilderUtility builderUtility;
-
-  public void setBuilderUtility(BuilderUtility builderUtility) {
-    this.builderUtility = builderUtility;
-  }
-
-  @SuppressWarnings("rawtypes")
-  public Object buildObject(ObjectDefinition def, EcoExecutionContext context)
-      throws ClassNotFoundException, IllegalAccessException, InstantiationException,
-      InvocationTargetException, NoSuchFieldException {
-    Class clazz = builderUtility.classForName(def.getClassName());
-
-    Object obj;
-    if (def.hasConstructorArgs()) {
-      LOG.debug("Found constructor arguments in definition ");
-      List<Object> cArgs = def.getConstructorArgs();
-
-      if (def.hasReferences()) {
-        LOG.debug("The definition has references");
-        cArgs = builderUtility.resolveReferences(cArgs, context);
-      } else {
-        LOG.debug("The definition does not have references");
-      }
-      LOG.debug("finding compatible constructor for : " + clazz.getName());
-      Constructor con = findCompatibleConstructor(cArgs, clazz);
-      if (con != null) {
-        LOG.debug("Found something seemingly compatible, attempting invocation...");
-        obj = con.newInstance(getArgsWithListCoercian(cArgs, con.getParameterTypes()));
-      } else {
-        String msg = String
-            .format("Couldn't find a suitable constructor for class '%s' with arguments '%s'.",
-            clazz.getName(),
-            cArgs);
-        throw new IllegalArgumentException(msg);
-      }
-    } else {
-      obj = clazz.newInstance();
-    }
-    builderUtility.applyProperties(def, obj, context);
-    invokeConfigMethods(def, obj, context);
-    return obj;
-  }
-
-  @SuppressWarnings("rawtypes")
-  protected Constructor findCompatibleConstructor(List<Object> args, Class target) {
-    Constructor retval = null;
-    int eligibleCount = 0;
-
-    LOG.debug("Target class: " + target.getName() + ", constructor args: " + args);
-    Constructor[] cons = target.getDeclaredConstructors();
-
-    for (Constructor con : cons) {
-      Class[] paramClasses = con.getParameterTypes();
-
-      if (paramClasses.length == args.size()) {
-        LOG.debug("found constructor with same number of args..");
-        boolean invokable = canInvokeWithArgs(args, con.getParameterTypes());
-        if (invokable) {
-          retval = con;
-          eligibleCount++;
-        }
-        LOG.debug("** invokable --> {}" + invokable);
-      } else {
-        LOG.debug("Skipping constructor with wrong number of arguments.");
-      }
-    }
-    if (eligibleCount > 1) {
-      LOG.error("Found multiple invokable constructors for class: "
-          + target + ", given arguments " + args + ". Using the last one found.");
-    }
-    return retval;
-  }
-
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  protected boolean canInvokeWithArgs(List<Object> args, Class[] parameterTypes) {
-    if (parameterTypes.length != args.size()) {
-      LOG.warn("parameter types were the wrong size");
-      return false;
-    }
-
-    for (int i = 0; i < args.size(); i++) {
-      Object obj = args.get(i);
-      if (obj == null) {
-        throw new IllegalArgumentException("argument shouldn't be null - index: " + i);
-      }
-      Class paramType = parameterTypes[i];
-      Class objectType = obj.getClass();
-      LOG.debug("Comparing parameter class " + paramType + " to object class "
-          + objectType + "to see if assignment is possible.");
-      if (paramType.equals(objectType)) {
-        LOG.debug("Yes, they are the same class.");
-      } else if (paramType.isAssignableFrom(objectType)) {
-        LOG.debug("Yes, assignment is possible.");
-      } else if (isPrimitiveBoolean(paramType) && Boolean.class.isAssignableFrom(objectType)) {
-        LOG.debug("Yes, assignment is possible.");
-      } else if (isPrimitiveNumber(paramType) && Number.class.isAssignableFrom(objectType)) {
-        LOG.debug("Yes, assignment is possible.");
-      } else if (paramType.isEnum() && objectType.equals(String.class)) {
-        LOG.debug("Yes, will convert a String to enum");
-      } else if (paramType.isArray() && List.class.isAssignableFrom(objectType)) {
-        LOG.debug("Assignment is possible if we convert a List to an array.");
-        LOG.debug("Array Type: " + paramType.getComponentType() + ", List type: "
-            + ((List) obj).get(0).getClass());
-      } else {
-        LOG.debug("returning false");
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @SuppressWarnings("rawtypes")
-  protected boolean isPrimitiveNumber(Class clazz) {
-    return clazz.isPrimitive() && !clazz.equals(boolean.class);
-  }
-
-  @SuppressWarnings("rawtypes")
-  protected boolean isPrimitiveBoolean(Class clazz) {
-    return clazz.isPrimitive() && clazz.equals(boolean.class);
-  }
-
-  @SuppressWarnings("rawtypes")
-  public void invokeConfigMethods(ObjectDefinition bean,
-                                         Object instance, EcoExecutionContext context)
-      throws InvocationTargetException, IllegalAccessException {
-
-    List<ConfigurationMethodDefinition> methodDefs = bean.getConfigMethods();
-    if (methodDefs == null || methodDefs.size() == 0) {
-      return;
-    }
-    Class clazz = instance.getClass();
-    for (ConfigurationMethodDefinition methodDef : methodDefs) {
-      List<Object> args = methodDef.getArgs();
-      if (args == null) {
-        args = new ArrayList<Object>();
-      }
-      if (methodDef.hasReferences()) {
-        args = builderUtility.resolveReferences(args, context);
-      }
-      String methodName = methodDef.getName();
-      LOG.debug("method name: " + methodName);
-      Method method = findCompatibleMethod(args, clazz, methodName);
-      if (method != null) {
-        Object[] methodArgs = getArgsWithListCoercian(args, method.getParameterTypes());
-        method.invoke(instance, methodArgs);
-      } else {
-        String msg = String
-            .format("Unable to find configuration method '%s' in class '%s' with arguments %s.",
-            new Object[]{methodName, clazz.getName(), args});
-        throw new IllegalArgumentException(msg);
-      }
-    }
-  }
-
-  @SuppressWarnings("rawtypes")
-  private Method findCompatibleMethod(List<Object> args, Class target, String methodName) {
-    Method retval = null;
-    int eligibleCount = 0;
-    LOG.debug("Target class: " + target.getName() + ",  methodName: "
-        + methodName + ", args: " + args);
-    Method[] methods = target.getMethods();
-    LOG.debug("methods count: " + methods.length);
-    for (Method method : methods) {
-      Class[] paramClasses = method.getParameterTypes();
-      if (paramClasses.length == args.size() && method.getName().equals(methodName)) {
-        LOG.debug("found constructor with same number of args..");
-        boolean invokable = false;
-        if (args.size() == 0) {
-          // it's a method with zero args
-          invokable = true;
-        } else {
-          invokable = canInvokeWithArgs(args, method.getParameterTypes());
-        }
-        if (invokable) {
-          retval = method;
-          eligibleCount++;
-        }
-        LOG.debug("** invokable --> " + invokable);
-      } else {
-        LOG.debug("Skipping method with wrong number of arguments.");
-      }
-    }
-    if (eligibleCount > 1) {
-      LOG.warn("Found multiple invokable methods for class, method, given arguments {} "
-          + new Object[]{target, methodName, args});
-    }
-    return retval;
-  }
-
-
-
-  /**
-   * Given a java.util.List of contructor/method arguments, and a list of parameter types,
-   * attempt to convert the
-   * list to an java.lang.Object array that can be used to invoke the constructor.
-   * If an argument needs
-   * to be coerced from a List to an Array, do so.
-   */
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  private Object[] getArgsWithListCoercian(List<Object> args, Class[] parameterTypes) {
-//        Class[] parameterTypes = constructor.getParameterTypes();
-    if (parameterTypes.length != args.size()) {
-      throw new IllegalArgumentException("Contructor parameter count does not "
-          + "egual argument size.");
-    }
-    Object[] constructorParams = new Object[args.size()];
-
-    // loop through the arguments, if we hit a list that has to be convered to an array,
-    // perform the conversion
-    for (int i = 0; i < args.size(); i++) {
-      Object obj = args.get(i);
-      Class paramType = parameterTypes[i];
-      Class objectType = obj.getClass();
-      LOG.debug("Comparing parameter class " + paramType.getName() + " to object class "
-          +  objectType.getName() + " to see if assignment is possible.");
-      if (paramType.equals(objectType)) {
-        LOG.debug("They are the same class.");
-        constructorParams[i] = args.get(i);
-        continue;
-      }
-      if (paramType.isAssignableFrom(objectType)) {
-        LOG.debug("Assignment is possible.");
-        constructorParams[i] = args.get(i);
-        continue;
-      }
-      if (isPrimitiveBoolean(paramType) && Boolean.class.isAssignableFrom(objectType)) {
-        LOG.debug("Its a primitive boolean.");
-        Boolean bool = (Boolean) args.get(i);
-        constructorParams[i] = bool.booleanValue();
-        continue;
-      }
-      if (isPrimitiveNumber(paramType) && Number.class.isAssignableFrom(objectType)) {
-        LOG.debug("Its a primitive number.");
-        Number num = (Number) args.get(i);
-        if (paramType == Float.TYPE) {
-          constructorParams[i] = num.floatValue();
-        } else if (paramType == Double.TYPE) {
-          constructorParams[i] = num.doubleValue();
-        } else if (paramType == Long.TYPE) {
-          constructorParams[i] = num.longValue();
-        } else if (paramType == Integer.TYPE) {
-          constructorParams[i] = num.intValue();
-        } else if (paramType == Short.TYPE) {
-          constructorParams[i] = num.shortValue();
-        } else if (paramType == Byte.TYPE) {
-          constructorParams[i] = num.byteValue();
-        } else {
-          constructorParams[i] = args.get(i);
-        }
-        continue;
-      }
-
-      // enum conversion
-      if (paramType.isEnum() && objectType.equals(String.class)) {
-        LOG.debug("Yes, will convert a String to enum");
-        constructorParams[i] = Enum.valueOf(paramType, (String) args.get(i));
-        continue;
-      }
-
-      // List to array conversion
-      if (paramType.isArray() && List.class.isAssignableFrom(objectType)) {
-        LOG.debug("Conversion appears possible...");
-        List list = (List) obj;
-        LOG.debug("Array Type: {}, List type: {}" + paramType.getComponentType()
-            + list.get(0).getClass());
-
-        // create an array of the right type
-        Object newArrayObj = Array.newInstance(paramType.getComponentType(), list.size());
-        for (int j = 0; j < list.size(); j++) {
-          Array.set(newArrayObj, j, list.get(j));
-
-        }
-        constructorParams[i] = newArrayObj;
-        LOG.debug("After conversion: {}" + constructorParams[i]);
-      }
-    }
-    return constructorParams;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/heron/EcoBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/heron/EcoBuilder.java
deleted file mode 100644
index e21cde9..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/heron/EcoBuilder.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder.heron;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Logger;
-
-import com.twitter.heron.api.Config;
-import com.twitter.heron.api.topology.TopologyBuilder;
-
-import com.twitter.heron.eco.builder.BoltBuilder;
-import com.twitter.heron.eco.builder.ComponentBuilder;
-import com.twitter.heron.eco.builder.ConfigBuilder;
-import com.twitter.heron.eco.builder.ObjectBuilder;
-
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-
-
-public class EcoBuilder {
-
-  private SpoutBuilder spoutBuilder;
-
-  private BoltBuilder boltBuilder;
-
-  private StreamBuilder streamBuilder;
-
-  private ComponentBuilder componentBuilder;
-
-  private ConfigBuilder configBuilder;
-
-  private static final Logger LOG = Logger.getLogger(EcoBuilder.class.getName());
-
-  public EcoBuilder(SpoutBuilder spoutBuilder, BoltBuilder boltBuilder,
-                    StreamBuilder streamBuilder, ComponentBuilder componentBuilder,
-                    ConfigBuilder configBuilder) {
-    this.spoutBuilder = spoutBuilder;
-    this.boltBuilder = boltBuilder;
-    this.streamBuilder = streamBuilder;
-    this.componentBuilder = componentBuilder;
-    this.configBuilder = configBuilder;
-  }
-
-  public TopologyBuilder buildTopologyBuilder(EcoExecutionContext executionContext,
-                                              ObjectBuilder objectBuilder)
-      throws InstantiationException, IllegalAccessException,
-      ClassNotFoundException,
-      NoSuchFieldException, InvocationTargetException {
-
-    TopologyBuilder builder = new TopologyBuilder();
-    LOG.info("Building components");
-    componentBuilder.buildComponents(executionContext, objectBuilder);
-    LOG.info("Building spouts");
-    spoutBuilder.buildSpouts(executionContext, builder, objectBuilder);
-    LOG.info("Building bolts");
-    boltBuilder.buildBolts(executionContext, objectBuilder);
-    LOG.info("Building streams");
-    streamBuilder.buildStreams(executionContext, builder, objectBuilder);
-
-    return builder;
-  }
-
-  public Config buildConfig(EcoTopologyDefinition topologyDefinition) throws Exception {
-    LOG.info("Building topology config");
-    return this.configBuilder.buildConfig(topologyDefinition);
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/heron/SpoutBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/heron/SpoutBuilder.java
deleted file mode 100644
index 2289a56..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/heron/SpoutBuilder.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder.heron;
-
-import java.lang.reflect.InvocationTargetException;
-
-import com.twitter.heron.api.spout.IRichSpout;
-import com.twitter.heron.api.topology.TopologyBuilder;
-
-import com.twitter.heron.eco.builder.ObjectBuilder;
-
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-import com.twitter.heron.eco.definition.ObjectDefinition;
-
-
-public class SpoutBuilder {
-
-  protected void buildSpouts(EcoExecutionContext executionContext,
-                             TopologyBuilder builder,
-                             ObjectBuilder objectBuilder)
-      throws ClassNotFoundException, InstantiationException, IllegalAccessException,
-      NoSuchFieldException, InvocationTargetException {
-    EcoTopologyDefinition topologyDefinition = executionContext.getTopologyDefinition();
-
-    for (ObjectDefinition def: topologyDefinition.getSpouts()) {
-      Object obj = objectBuilder.buildObject(def, executionContext);
-      builder.setSpout(def.getId(), (IRichSpout) obj, def.getParallelism());
-      executionContext.addSpout(def.getId(), obj);
-    }
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/heron/StreamBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/heron/StreamBuilder.java
deleted file mode 100644
index f488523..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/heron/StreamBuilder.java
+++ /dev/null
@@ -1,129 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder.heron;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.twitter.heron.api.bolt.IBasicBolt;
-import com.twitter.heron.api.bolt.IRichBolt;
-import com.twitter.heron.api.bolt.IWindowedBolt;
-import com.twitter.heron.api.grouping.CustomStreamGrouping;
-import com.twitter.heron.api.topology.BoltDeclarer;
-import com.twitter.heron.api.topology.TopologyBuilder;
-import com.twitter.heron.api.tuple.Fields;
-import com.twitter.heron.api.utils.Utils;
-
-import com.twitter.heron.eco.builder.ObjectBuilder;
-
-import com.twitter.heron.eco.definition.ComponentStream;
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-import com.twitter.heron.eco.definition.GroupingDefinition;
-import com.twitter.heron.eco.definition.ObjectDefinition;
-import com.twitter.heron.eco.definition.StreamDefinition;
-
-public class StreamBuilder {
-
-  protected void buildStreams(EcoExecutionContext executionContext, TopologyBuilder builder,
-                              ObjectBuilder objectBuilder)
-      throws IllegalAccessException, InstantiationException, ClassNotFoundException,
-      NoSuchFieldException, InvocationTargetException {
-    EcoTopologyDefinition topologyDefinition = executionContext.getTopologyDefinition();
-    Map<String, ComponentStream> componentStreams = new HashMap<>();
-
-    HashMap<String, BoltDeclarer> declarers = new HashMap<>();
-    for (StreamDefinition stream : topologyDefinition.getStreams()) {
-      Object boltObj = executionContext.getBolt(stream.getTo());
-      BoltDeclarer declarer = declarers.get(stream.getTo());
-      if (boltObj instanceof IRichBolt) {
-        if (declarer == null) {
-          declarer = builder.setBolt(stream.getTo(),
-              (IRichBolt) boltObj,
-              topologyDefinition.parallelismForBolt(stream.getTo()));
-          declarers.put(stream.getTo(), declarer);
-        }
-      } else if (boltObj instanceof IBasicBolt) {
-        if (declarer == null) {
-          declarer = builder.setBolt(
-              stream.getTo(),
-              (IBasicBolt) boltObj,
-              topologyDefinition.parallelismForBolt(stream.getTo()));
-          declarers.put(stream.getTo(), declarer);
-        }
-      } else if (boltObj instanceof IWindowedBolt) {
-        if (declarer == null) {
-          declarer = builder.setBolt(
-              stream.getTo(),
-              (IWindowedBolt) boltObj,
-              topologyDefinition.parallelismForBolt(stream.getTo()));
-          declarers.put(stream.getTo(), declarer);
-        }
-      }  else {
-        throw new IllegalArgumentException("Class does not appear to be a bolt: "
-            + boltObj.getClass().getName());
-      }
-
-      GroupingDefinition grouping = stream.getGrouping();
-      // if the streamId is defined, use it for the grouping,
-      // otherwise assume default stream
-      String streamId = grouping.getStreamId() == null
-          ? Utils.DEFAULT_STREAM_ID : grouping.getStreamId();
-
-
-      switch (grouping.getType()) {
-        case SHUFFLE:
-          declarer.shuffleGrouping(stream.getFrom(), streamId);
-          break;
-        case FIELDS:
-          List<String> groupingArgs = grouping.getArgs();
-          if (groupingArgs == null) {
-            throw new IllegalArgumentException("You must supply arguments for Fields grouping");
-          }
-          declarer.fieldsGrouping(stream.getFrom(), streamId, new Fields(groupingArgs));
-          break;
-        case ALL:
-          declarer.allGrouping(stream.getFrom(), streamId);
-          break;
-        case GLOBAL:
-          declarer.globalGrouping(stream.getFrom(), streamId);
-          break;
-        case NONE:
-          declarer.noneGrouping(stream.getFrom(), streamId);
-          break;
-        case CUSTOM:
-          declarer.customGrouping(stream.getFrom(), streamId,
-              buildCustomStreamGrouping(stream.getGrouping().getCustomClass(),
-                  executionContext,
-                  objectBuilder));
-          break;
-        default:
-          throw new UnsupportedOperationException("unsupported grouping type: " + grouping);
-      }
-    }
-    executionContext.setStreams(componentStreams);
-  }
-
-  private CustomStreamGrouping buildCustomStreamGrouping(ObjectDefinition objectDefinition,
-                                                         EcoExecutionContext executionContext,
-                                                         ObjectBuilder objectBuilder)
-      throws ClassNotFoundException,
-      IllegalAccessException, InstantiationException, NoSuchFieldException,
-      InvocationTargetException {
-    Object grouping = objectBuilder.buildObject(objectDefinition, executionContext);
-    return (CustomStreamGrouping) grouping;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/storm/EcoBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/storm/EcoBuilder.java
deleted file mode 100644
index 4900e73..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/storm/EcoBuilder.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder.storm;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Logger;
-
-import org.apache.storm.topology.TopologyBuilder;
-
-import com.twitter.heron.api.Config;
-import com.twitter.heron.eco.builder.BoltBuilder;
-import com.twitter.heron.eco.builder.ComponentBuilder;
-import com.twitter.heron.eco.builder.ConfigBuilder;
-import com.twitter.heron.eco.builder.ObjectBuilder;
-
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-
-
-public class EcoBuilder {
-
-  private SpoutBuilder spoutBuilder;
-
-  private BoltBuilder boltBuilder;
-
-  private StreamBuilder streamBuilder;
-
-  private ComponentBuilder componentBuilder;
-
-  private ConfigBuilder configBuilder;
-
-  private static final Logger LOG = Logger.getLogger(EcoBuilder.class.getName());
-
-  public EcoBuilder(SpoutBuilder spoutBuilder, BoltBuilder boltBuilder,
-                    StreamBuilder streamBuilder, ComponentBuilder componentBuilder,
-                    ConfigBuilder configBuilder) {
-    this.spoutBuilder = spoutBuilder;
-    this.boltBuilder = boltBuilder;
-    this.streamBuilder = streamBuilder;
-    this.componentBuilder = componentBuilder;
-    this.configBuilder = configBuilder;
-  }
-
-  public TopologyBuilder buildTopologyBuilder(EcoExecutionContext executionContext,
-                                              ObjectBuilder objectBuilder)
-      throws InstantiationException, IllegalAccessException,
-      ClassNotFoundException,
-      NoSuchFieldException, InvocationTargetException {
-
-    TopologyBuilder builder = new TopologyBuilder();
-    LOG.info("Building components");
-    componentBuilder.buildComponents(executionContext, objectBuilder);
-    LOG.info("Building spouts");
-    spoutBuilder.buildSpouts(executionContext, builder, objectBuilder);
-    LOG.info("Building bolts");
-    boltBuilder.buildBolts(executionContext, objectBuilder);
-    LOG.info("Building streams");
-    streamBuilder.buildStreams(executionContext, builder, objectBuilder);
-
-    return builder;
-  }
-
-  public Config buildConfig(EcoTopologyDefinition topologyDefinition) throws Exception {
-    LOG.info("Building topology config");
-    return this.configBuilder.buildConfig(topologyDefinition);
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/storm/SpoutBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/storm/SpoutBuilder.java
deleted file mode 100644
index 775d30d..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/storm/SpoutBuilder.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder.storm;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.storm.topology.IRichSpout;
-import org.apache.storm.topology.TopologyBuilder;
-
-import com.twitter.heron.eco.builder.ObjectBuilder;
-
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-import com.twitter.heron.eco.definition.ObjectDefinition;
-
-
-public class SpoutBuilder {
-
-  protected void buildSpouts(EcoExecutionContext executionContext,
-                             TopologyBuilder builder,
-                             ObjectBuilder objectBuilder)
-      throws ClassNotFoundException, InstantiationException, IllegalAccessException,
-      NoSuchFieldException, InvocationTargetException {
-    EcoTopologyDefinition topologyDefinition = executionContext.getTopologyDefinition();
-
-    for (ObjectDefinition def: topologyDefinition.getSpouts()) {
-      Object obj = objectBuilder.buildObject(def, executionContext);
-      builder.setSpout(def.getId(), (IRichSpout) obj, def.getParallelism());
-      executionContext.addSpout(def.getId(), obj);
-    }
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/builder/storm/StreamBuilder.java b/eco/src/java/com/twitter/heron/eco/builder/storm/StreamBuilder.java
deleted file mode 100644
index 6777890..0000000
--- a/eco/src/java/com/twitter/heron/eco/builder/storm/StreamBuilder.java
+++ /dev/null
@@ -1,129 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.builder.storm;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.storm.grouping.CustomStreamGrouping;
-import org.apache.storm.topology.BoltDeclarer;
-import org.apache.storm.topology.IBasicBolt;
-import org.apache.storm.topology.IRichBolt;
-import org.apache.storm.topology.IWindowedBolt;
-import org.apache.storm.topology.TopologyBuilder;
-import org.apache.storm.tuple.Fields;
-import org.apache.storm.utils.Utils;
-
-import com.twitter.heron.eco.builder.ObjectBuilder;
-
-import com.twitter.heron.eco.definition.ComponentStream;
-import com.twitter.heron.eco.definition.EcoExecutionContext;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-import com.twitter.heron.eco.definition.GroupingDefinition;
-import com.twitter.heron.eco.definition.ObjectDefinition;
-import com.twitter.heron.eco.definition.StreamDefinition;
-
-public class StreamBuilder {
-
-  protected void buildStreams(EcoExecutionContext executionContext, TopologyBuilder builder,
-                              ObjectBuilder objectBuilder)
-      throws IllegalAccessException, InstantiationException, ClassNotFoundException,
-      NoSuchFieldException, InvocationTargetException {
-    EcoTopologyDefinition topologyDefinition = executionContext.getTopologyDefinition();
-    Map<String, ComponentStream> componentStreams = new HashMap<>();
-
-    HashMap<String, BoltDeclarer> declarers = new HashMap<>();
-    for (StreamDefinition stream : topologyDefinition.getStreams()) {
-      Object boltObj = executionContext.getBolt(stream.getTo());
-      BoltDeclarer declarer = declarers.get(stream.getTo());
-      if (boltObj instanceof IRichBolt) {
-        if (declarer == null) {
-          declarer = builder.setBolt(stream.getTo(),
-              (IRichBolt) boltObj,
-              topologyDefinition.parallelismForBolt(stream.getTo()));
-          declarers.put(stream.getTo(), declarer);
-        }
-      } else if (boltObj instanceof IBasicBolt) {
-        if (declarer == null) {
-          declarer = builder.setBolt(
-              stream.getTo(),
-              (IBasicBolt) boltObj,
-              topologyDefinition.parallelismForBolt(stream.getTo()));
-          declarers.put(stream.getTo(), declarer);
-        }
-      } else if (boltObj instanceof IWindowedBolt) {
-        if (declarer == null) {
-          declarer = builder.setBolt(
-              stream.getTo(),
-              (IWindowedBolt) boltObj,
-              topologyDefinition.parallelismForBolt(stream.getTo()));
-          declarers.put(stream.getTo(), declarer);
-        }
-      }  else {
-        throw new IllegalArgumentException("Class does not appear to be a bolt: "
-            + boltObj.getClass().getName());
-      }
-
-      GroupingDefinition grouping = stream.getGrouping();
-      // if the streamId is defined, use it for the grouping,
-      // otherwise assume default stream
-      String streamId = grouping.getStreamId() == null
-          ? Utils.DEFAULT_STREAM_ID : grouping.getStreamId();
-
-
-      switch (grouping.getType()) {
-        case SHUFFLE:
-          declarer.shuffleGrouping(stream.getFrom(), streamId);
-          break;
-        case FIELDS:
-          List<String> groupingArgs = grouping.getArgs();
-          if (groupingArgs == null) {
-            throw new IllegalArgumentException("You must supply arguments for Fields grouping");
-          }
-          declarer.fieldsGrouping(stream.getFrom(), streamId, new Fields(groupingArgs));
-          break;
-        case ALL:
-          declarer.allGrouping(stream.getFrom(), streamId);
-          break;
-        case GLOBAL:
-          declarer.globalGrouping(stream.getFrom(), streamId);
-          break;
-        case NONE:
-          declarer.noneGrouping(stream.getFrom(), streamId);
-          break;
-        case CUSTOM:
-          declarer.customGrouping(stream.getFrom(), streamId,
-              buildCustomStreamGrouping(stream.getGrouping().getCustomClass(),
-                  executionContext,
-                  objectBuilder));
-          break;
-        default:
-          throw new UnsupportedOperationException("unsupported grouping type: " + grouping);
-      }
-    }
-    executionContext.setStreams(componentStreams);
-  }
-
-  private CustomStreamGrouping buildCustomStreamGrouping(ObjectDefinition objectDefinition,
-                                                         EcoExecutionContext executionContext,
-                                                         ObjectBuilder objectBuilder)
-      throws ClassNotFoundException,
-      IllegalAccessException, InstantiationException, NoSuchFieldException,
-      InvocationTargetException {
-    Object grouping = objectBuilder.buildObject(objectDefinition, executionContext);
-    return (CustomStreamGrouping) grouping;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/BeanDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/BeanDefinition.java
deleted file mode 100644
index 806ae14..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/BeanDefinition.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-public class BeanDefinition extends ObjectDefinition {
-
-  private String id;
-
-  public String getId() {
-    return id;
-  }
-
-  public void setId(String id) {
-    this.id = id;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/BeanListReference.java b/eco/src/java/com/twitter/heron/eco/definition/BeanListReference.java
deleted file mode 100644
index ff70fde..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/BeanListReference.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-import java.util.List;
-
-public class BeanListReference {
-  public List<String> ids;
-
-  public BeanListReference() { }
-
-  public BeanListReference(List<String> ids) {
-    this.ids = ids;
-  }
-
-  public List<String> getIds() {
-    return ids;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/BeanReference.java b/eco/src/java/com/twitter/heron/eco/definition/BeanReference.java
deleted file mode 100644
index 2314c82..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/BeanReference.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-public class BeanReference {
-  private String id;
-
-  public BeanReference(String id) {
-    this.id = id;
-  }
-
-  public String getId() {
-    return id;
-  }
-
-  public void setId(String id) {
-    this.id = id;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/BoltDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/BoltDefinition.java
deleted file mode 100644
index 203623d..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/BoltDefinition.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-public class BoltDefinition extends ObjectDefinition {
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/ComponentStream.java b/eco/src/java/com/twitter/heron/eco/definition/ComponentStream.java
deleted file mode 100644
index 5b747fd..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/ComponentStream.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-public class ComponentStream {
-
-  private String id;
-
-  private String toComponent;
-
-  private String fromComponent;
-
-  private String streamName;
-
-  public String getId() {
-    return id;
-  }
-
-  public void setId(String id) {
-    this.id = id;
-  }
-
-  public Object getToComponent() {
-    return toComponent;
-  }
-
-  public void setToComponent(String toComponent) {
-    this.toComponent = toComponent;
-  }
-
-  public String getFromComponent() {
-    return fromComponent;
-  }
-
-  public void setFromComponent(String fromComponent) {
-    this.fromComponent = fromComponent;
-  }
-
-  public String getStreamName() {
-    return streamName;
-  }
-
-  public void setStreamName(String streamName) {
-    this.streamName = streamName;
-  }
-
-  @Override
-  public String toString() {
-    return "ComponentStream{"
-        + "toComponent='" + toComponent + '\''
-        + ", fromComponent='" + fromComponent
-        + '\''
-        + ", streamName='" + streamName + '\''
-        + '}';
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/ConfigurationMethodDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/ConfigurationMethodDefinition.java
deleted file mode 100644
index d63918b..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/ConfigurationMethodDefinition.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ConfigurationMethodDefinition {
-  private String name;
-  private List<Object> args;
-  private boolean hasReferences = false;
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public List<Object> getArgs() {
-    return args;
-  }
-
-  @SuppressWarnings({"rawtypes", "unchecked"})
-  public void setArgs(List<Object> args) {
-
-    List<Object> newVal = new ArrayList<Object>();
-    for (Object obj : args) {
-      if (obj instanceof LinkedHashMap) {
-        Map map = (Map) obj;
-        if (map.containsKey("ref") && map.size() == 1) {
-          newVal.add(new BeanReference((String) map.get("ref")));
-          this.hasReferences = true;
-        } else if (map.containsKey("reflist") && map.size() == 1) {
-          newVal.add(new BeanListReference((List<String>) map.get("reflist")));
-          this.hasReferences = true;
-        } else {
-          newVal.add(obj);
-        }
-      } else {
-        newVal.add(obj);
-      }
-    }
-    this.args = newVal;
-  }
-
-  public boolean hasReferences() {
-    return this.hasReferences;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/EcoExecutionContext.java b/eco/src/java/com/twitter/heron/eco/definition/EcoExecutionContext.java
deleted file mode 100644
index 01d0dbb..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/EcoExecutionContext.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.twitter.heron.api.Config;
-
-
-public class EcoExecutionContext {
-
-  private EcoTopologyDefinition topologyDefinition;
-
-  private Config config;
-
-  private Map<String, Object> spouts = new HashMap<>();
-
-  private Map<String, Object> bolts = new HashMap<>();
-
-  private Map<String, ComponentStream> streams = new HashMap<>();
-
-  private Map<String, Object> components = new HashMap<>();
-
-  public EcoExecutionContext(EcoTopologyDefinition topologyDefinition, Config config) {
-    this.topologyDefinition = topologyDefinition;
-    this.config = config;
-  }
-
-  public EcoTopologyDefinition getTopologyDefinition() {
-    return topologyDefinition;
-  }
-
-  public void setTopologyDefinition(EcoTopologyDefinition topologyDefinition) {
-    this.topologyDefinition = topologyDefinition;
-  }
-
-  public Config getConfig() {
-    return config;
-  }
-
-  public void setConfig(Config config) {
-    this.config = config;
-  }
-
-  public Map<String, Object> getSpouts() {
-    return spouts;
-  }
-
-  public void setSpouts(Map<String, Object> spouts) {
-    this.spouts = spouts;
-  }
-
-  public Map<String, Object> getBolts() {
-    return bolts;
-  }
-
-  public Object getBolt(String id) {
-    return this.bolts.get(id);
-  }
-
-  public void setBolts(Map<String, Object> bolts) {
-    this.bolts = bolts;
-  }
-
-  public void addBolt(String key, Object value) {
-    this.bolts.put(key, value);
-  }
-
-  public Object getChild(String id) {
-    return this.bolts.get(id);
-  }
-
-  public Map<String, ComponentStream> getStreams() {
-    return streams;
-  }
-
-  public void setStreams(Map<String, ComponentStream> streams) {
-    this.streams = streams;
-  }
-
-  public Map<String, Object> getComponents() {
-    return components;
-  }
-
-  public void addComponent(String key, Object value) {
-    this.components.put(key, value);
-  }
-
-  public Object getComponent(String id) {
-    return this.components.get(id);
-  }
-
-  public void setComponents(Map<String, Object> components) {
-    this.components = components;
-  }
-
-  public void addSpout(String key, Object value) {
-    this.spouts.put(key, value);
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/EcoTopologyDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/EcoTopologyDefinition.java
deleted file mode 100644
index 132bb0d..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/EcoTopologyDefinition.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-public class EcoTopologyDefinition {
-
-  private String name;
-  private String type;
-  private Map<String, Object> config = new HashMap<>();
-  private Map<String, SpoutDefinition> spouts =  new LinkedHashMap<>();
-  private Map<String, BoltDefinition> bolts = new LinkedHashMap<>();
-  private List<StreamDefinition> streams = new ArrayList<>();
-  private Map<String, BeanDefinition> components = new LinkedHashMap<>();
-
-  public List<SpoutDefinition> getSpouts() {
-    return new ArrayList<>(this.spouts.values());
-  }
-
-  public SpoutDefinition getSpout(String id) {
-    return this.spouts.get(id);
-  }
-
-  public void setSpouts(List<SpoutDefinition> sources) {
-    this.spouts = new LinkedHashMap<>();
-    for (SpoutDefinition source: sources) {
-      this.spouts.put(source.getId(), source);
-    }
-  }
-
-  public List<BoltDefinition> getBolts() {
-    return new ArrayList<>(this.bolts.values());
-  }
-
-  public BoltDefinition getBolt(String id) {
-    return this.bolts.get(id);
-  }
-
-  public void setBolts(List<BoltDefinition> children) {
-    this.bolts = new LinkedHashMap<>();
-    for (BoltDefinition child: children) {
-      this.bolts.put(child.getId(), child);
-    }
-  }
-
-  public List<BeanDefinition> getComponents() {
-    return new ArrayList<>(this.components.values());
-  }
-
-  public Object getComponent(String id) {
-    return this.components.get(id);
-  }
-
-  public void setComponents(List<BeanDefinition> components) {
-    for (BeanDefinition bean: components) {
-      this.components.put(bean.getId(), bean);
-    }
-  }
-
-  public void addComponent(String key, BeanDefinition value) {
-    this.components.put(key, value);
-  }
-
-  public List<StreamDefinition> getStreams() {
-    return streams;
-  }
-
-  public void setStreams(List<StreamDefinition> streams) {
-    this.streams = streams;
-  }
-
-
-  public Map<String, Object> getConfig() {
-    return config;
-  }
-
-  public void setConfig(Map<String, Object> config) {
-    this.config = config;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public String getType() {
-    if (type == null || "storm".equals(type)) {
-      return "storm";
-    }
-
-    if ("heron".equals(type)) {
-      return "heron";
-    }
-
-    return null;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public Number parallelismForBolt(String to) {
-    return this.bolts.get(to).getParallelism();
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/GroupingDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/GroupingDefinition.java
deleted file mode 100644
index 1eeb817..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/GroupingDefinition.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-import java.util.List;
-
-public class GroupingDefinition {
-
-  public enum Type {
-    ALL,
-    CUSTOM,
-    SHUFFLE,
-    FIELDS,
-    GLOBAL,
-    NONE
-  }
-
-  private Type type;
-  private String streamId;
-  private List<String> args;
-  private ObjectDefinition customClass;
-
-  public Type getType() {
-    return type;
-  }
-
-  public void setType(Type type) {
-    this.type = type;
-  }
-
-  public String getStreamId() {
-    return streamId;
-  }
-
-  public void setStreamId(String streamId) {
-    this.streamId = streamId;
-  }
-
-  public List<String> getArgs() {
-    return args;
-  }
-
-  public void setArgs(List<String> args) {
-    this.args = args;
-  }
-
-  public ObjectDefinition getCustomClass() {
-    return customClass;
-  }
-
-  public void setCustomClass(ObjectDefinition customClass) {
-    this.customClass = customClass;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/ObjectDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/ObjectDefinition.java
deleted file mode 100644
index dd4a8f1..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/ObjectDefinition.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ObjectDefinition {
-
-  private String id;
-  private String className;
-  private int parallelism = 1;
-  private List<Object> constructorArgs;
-  private List<PropertyDefinition> properties;
-  private List<ConfigurationMethodDefinition> configMethods;
-  private boolean hasReferences;
-
-  public List<PropertyDefinition> getProperties() {
-    return properties;
-  }
-
-  public boolean hasConstructorArgs() {
-    return this.constructorArgs != null && this.constructorArgs.size() > 0;
-  }
-
-  public void setProperties(List<PropertyDefinition> properties) {
-    this.properties = properties;
-  }
-
-  public boolean hasReferences() {
-    return this.hasReferences;
-  }
-
-  public String getId() {
-    return id;
-  }
-
-  public void setId(String id) {
-    this.id = id;
-  }
-
-  public String getClassName() {
-    return className;
-  }
-
-  public void setClassName(String className) {
-    this.className = className;
-  }
-
-  public int getParallelism() {
-    return parallelism;
-  }
-
-  public void setParallelism(int parallelism) {
-    this.parallelism = parallelism;
-  }
-
-  public List<Object> getConstructorArgs() {
-    return constructorArgs;
-  }
-
-  @SuppressWarnings({"rawtypes", "unchecked"})
-  public void setConstructorArgs(List<Object> constructorArgs) {
-
-    List<Object> newVal = new ArrayList<Object>();
-    for (Object obj : constructorArgs) {
-      if (obj instanceof LinkedHashMap) {
-        Map map = (Map) obj;
-        if (map.containsKey("ref") && map.size() == 1) {
-          newVal.add(new BeanReference((String) map.get("ref")));
-          this.hasReferences = true;
-        } else if (map.containsKey("reflist") && map.size() == 1) {
-          newVal.add(new BeanListReference((List<String>) map.get("reflist")));
-          this.hasReferences = true;
-        } else {
-          newVal.add(obj);
-        }
-      } else {
-        newVal.add(obj);
-      }
-    }
-    this.constructorArgs = newVal;
-  }
-
-  public List<ConfigurationMethodDefinition> getConfigMethods() {
-    return configMethods;
-  }
-
-  public void setConfigMethods(List<ConfigurationMethodDefinition> configMethods) {
-    this.configMethods = configMethods;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/PropertyDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/PropertyDefinition.java
deleted file mode 100644
index e1cc902..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/PropertyDefinition.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-public class PropertyDefinition {
-
-  private String name;
-  private Object value;
-  private String ref;
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public Object getValue() {
-    return value;
-  }
-
-  public void setValue(Object value) {
-    if (this.ref != null) {
-      throw new IllegalStateException("A property can only have a value OR a reference, not both.");
-    }
-    this.value = value;
-  }
-
-  public String getRef() {
-    return ref;
-  }
-
-  public void setRef(String ref) {
-    if (this.value != null) {
-      throw new IllegalStateException("A property can only have a value OR a reference, not both.");
-    }
-    this.ref = ref;
-  }
-
-  public boolean isReference() {
-    return this.ref != null;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/SpoutDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/SpoutDefinition.java
deleted file mode 100644
index cb4f0a1..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/SpoutDefinition.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-public class SpoutDefinition extends ObjectDefinition {
-}
diff --git a/eco/src/java/com/twitter/heron/eco/definition/StreamDefinition.java b/eco/src/java/com/twitter/heron/eco/definition/StreamDefinition.java
deleted file mode 100644
index 03081c3..0000000
--- a/eco/src/java/com/twitter/heron/eco/definition/StreamDefinition.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.definition;
-
-public class StreamDefinition {
-
-  private String id;
-  private String name;
-  private String to;
-  private String from;
-  private GroupingDefinition grouping;
-
-  public String getId() {
-    return id;
-  }
-
-  public void setId(String id) {
-    this.id = id;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getTo() {
-    return to;
-  }
-
-  public void setTo(String to) {
-    this.to = to;
-  }
-
-  public String getFrom() {
-    return from;
-  }
-
-  public void setFrom(String from) {
-    this.from = from;
-  }
-
-  public GroupingDefinition getGrouping() {
-    return grouping;
-  }
-
-  public void setGrouping(GroupingDefinition groupingDefinition) {
-    this.grouping = groupingDefinition;
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/parser/EcoParser.java b/eco/src/java/com/twitter/heron/eco/parser/EcoParser.java
deleted file mode 100644
index 94f1bc2..0000000
--- a/eco/src/java/com/twitter/heron/eco/parser/EcoParser.java
+++ /dev/null
@@ -1,94 +0,0 @@
-//  Copyright 2017 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.parser;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.yaml.snakeyaml.TypeDescription;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-
-import com.twitter.heron.eco.definition.BoltDefinition;
-import com.twitter.heron.eco.definition.EcoTopologyDefinition;
-import com.twitter.heron.eco.definition.SpoutDefinition;
-
-public class EcoParser {
-
-  private static final Logger LOG = Logger.getLogger(EcoParser.class.getName());
-
-  public EcoTopologyDefinition parseFromInputStream(InputStream inputStream,
-                                                    InputStream propsFile, boolean envFilter)
-      throws Exception {
-
-    Yaml yaml = topologyYaml();
-
-    if (inputStream == null) {
-      throw new Exception("Unable to load eco input stream");
-    }
-    return loadTopologyFromYaml(yaml, inputStream, propsFile, envFilter);
-  }
-
-  private EcoTopologyDefinition loadTopologyFromYaml(Yaml yaml, InputStream inputStream,
-                                                     InputStream propsIn,
-                                                     boolean envFilter) throws IOException {
-    LOG.info("Parsing eco config file");
-    ByteArrayOutputStream bos = new ByteArrayOutputStream();
-    int b;
-    while ((b = inputStream.read()) != -1) {
-      bos.write(b);
-    }
-
-    String yamlDefinitionStr = bos.toString();
-    // properties file substitution
-    if (propsIn != null) {
-      LOG.info("Performing property substitution.");
-      Properties props = new Properties();
-      props.load(propsIn);
-      for (Object key : props.keySet()) {
-        yamlDefinitionStr =
-            yamlDefinitionStr.replace("${" + key + "}", props.getProperty((String) key));
-      }
-    } else {
-      LOG.info("Not performing property substitution.");
-    }
-
-    // environment variable substitution
-    if (envFilter) {
-      LOG.info("Performing environment variable substitution.");
-      Map<String, String> envs = System.getenv();
-      for (String key : envs.keySet()) {
-        yamlDefinitionStr = yamlDefinitionStr.replace("${ENV-" + key + "}", envs.get(key));
-      }
-    } else {
-      LOG.info("Not performing environment variable substitution.");
-    }
-    return (EcoTopologyDefinition) yaml.load(yamlDefinitionStr);
-  }
-  private static Yaml topologyYaml() {
-    Constructor topologyConstructor = new Constructor(EcoTopologyDefinition.class);
-
-    TypeDescription topologyDescription = new TypeDescription(EcoTopologyDefinition.class);
-
-    topologyDescription.putListPropertyType("spouts", SpoutDefinition.class);
-    topologyDescription.putListPropertyType("bolts", BoltDefinition.class);
-    topologyConstructor.addTypeDescription(topologyDescription);
-
-    return new Yaml(topologyConstructor);
-  }
-}
diff --git a/eco/src/java/com/twitter/heron/eco/submit/EcoSubmitter.java b/eco/src/java/com/twitter/heron/eco/submit/EcoSubmitter.java
deleted file mode 100644
index 8383bc4..0000000
--- a/eco/src/java/com/twitter/heron/eco/submit/EcoSubmitter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//  Copyright 2018 Twitter. All rights reserved.
-//
-//  Licensed 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.
-package com.twitter.heron.eco.submit;
-
-
-import org.apache.storm.StormSubmitter;
-import org.apache.storm.generated.StormTopology;
-
-import com.twitter.heron.api.Config;
-import com.twitter.heron.api.HeronSubmitter;
-import com.twitter.heron.api.HeronTopology;
-
-public class EcoSubmitter {
-
-  public void submitStormTopology(String topologyName,
-                                  Config topologyConfig, StormTopology topology)
-      throws org.apache.storm.generated.AlreadyAliveException,
-      org.apache.storm.generated.InvalidTopologyException {
-    StormSubmitter.submitTopology(topologyName, topologyConfig, topology);
-  }
-
-  public void submitHeronTopology(String topologyName,
-                                  Config topologyConfig, HeronTopology topology)
-      throws com.twitter.heron.api.exception.AlreadyAliveException,
-      com.twitter.heron.api.exception.InvalidTopologyException {
-    HeronSubmitter.submitTopology(topologyName, topologyConfig, topology);
-  }
-}
diff --git a/eco/src/java/org/apache/heron/eco/Eco.java b/eco/src/java/org/apache/heron/eco/Eco.java
new file mode 100644
index 0000000..ca1ea14
--- /dev/null
+++ b/eco/src/java/org/apache/heron/eco/Eco.java
@@ -0,0 +1,228 @@
+//  Copyright 2017 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.eco;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.heron.api.Config;
+import org.apache.heron.eco.builder.BoltBuilder;
+import org.apache.heron.eco.builder.BuilderUtility;
+import org.apache.heron.eco.builder.ComponentBuilder;
+import org.apache.heron.eco.builder.ConfigBuilder;
+import org.apache.heron.eco.builder.ObjectBuilder;
+import org.apache.heron.eco.definition.BoltDefinition;
+import org.apache.heron.eco.definition.EcoExecutionContext;
+import org.apache.heron.eco.definition.EcoTopologyDefinition;
+import org.apache.heron.eco.definition.SpoutDefinition;
+import org.apache.heron.eco.definition.StreamDefinition;
+import org.apache.heron.eco.parser.EcoParser;
+import org.apache.heron.eco.submit.EcoSubmitter;
+
+public class Eco {
+
+  private static final Logger LOG = Logger.getLogger(Eco.class.getName());
+  private static final String PROPS = "props";
+  private static final String ENV_PROPS = "env-props";
+  private static final String ECO_CONFIG_FILE = "eco-config-file";
+
+  private EcoParser ecoParser;
+  private EcoSubmitter ecoSubmitter;
+
+  public Eco(EcoParser ecoParser, EcoSubmitter ecoSubmitter) {
+    this.ecoParser = ecoParser;
+    this.ecoSubmitter = ecoSubmitter;
+  }
+
+  /**
+   * Submit an ECO topology
+   *
+   * @param fileInputStream  The input stream associated with ECO topology definition file
+   * @param propertiesFile  The optional key-value property file for optional property substitution.
+   * @param envFilter The optional flag to tell ECO to perform environment variable substitution
+   * @throws Exception
+   */
+  public void submit(FileInputStream fileInputStream,
+                     FileInputStream propertiesFile, boolean envFilter)
+      throws Exception {
+    EcoTopologyDefinition topologyDefinition = ecoParser
+        .parseFromInputStream(fileInputStream, propertiesFile, envFilter);
+
+    String topologyName = topologyDefinition.getName();
+    String topologyType = topologyDefinition.getType();
+
+    if ("storm".equals(topologyType)) {
+      System.out.println("topology type is Storm");
+      org.apache.heron.eco.builder.storm.EcoBuilder ecoBuilder =
+          new org.apache.heron.eco.builder.storm.EcoBuilder(
+            new org.apache.heron.eco.builder.storm.SpoutBuilder(),
+            new BoltBuilder(),
+            new org.apache.heron.eco.builder.storm.StreamBuilder(),
+            new ComponentBuilder(),
+            new ConfigBuilder());
+
+      Config topologyConfig = ecoBuilder
+          .buildConfig(topologyDefinition);
+
+      EcoExecutionContext executionContext
+          = new EcoExecutionContext(topologyDefinition, topologyConfig);
+
+      printTopologyInfo(executionContext);
+
+      ObjectBuilder objectBuilder = new ObjectBuilder();
+      objectBuilder.setBuilderUtility(new BuilderUtility());
+
+      org.apache.storm.topology.TopologyBuilder builder = ecoBuilder
+          .buildTopologyBuilder(executionContext, objectBuilder);
+      ecoSubmitter.submitStormTopology(topologyName, topologyConfig, builder.createTopology());
+    } else if ("heron".equals(topologyType)) {
+      System.out.println("topology type is Heron");
+      org.apache.heron.eco.builder.heron.EcoBuilder ecoBuilder =
+          new org.apache.heron.eco.builder.heron.EcoBuilder(
+            new org.apache.heron.eco.builder.heron.SpoutBuilder(),
+            new BoltBuilder(),
+            new org.apache.heron.eco.builder.heron.StreamBuilder(),
+            new ComponentBuilder(),
+            new ConfigBuilder());
+
+      Config topologyConfig = ecoBuilder
+          .buildConfig(topologyDefinition);
+
+      EcoExecutionContext executionContext
+          = new EcoExecutionContext(topologyDefinition, topologyConfig);
+
+      printTopologyInfo(executionContext);
+
+      ObjectBuilder objectBuilder = new ObjectBuilder();
+      objectBuilder.setBuilderUtility(new BuilderUtility());
+
+      org.apache.heron.api.topology.TopologyBuilder builder = ecoBuilder
+          .buildTopologyBuilder(executionContext, objectBuilder);
+      ecoSubmitter.submitHeronTopology(topologyName, topologyConfig, builder.createTopology());
+    } else {
+      LOG.log(Level.SEVERE,
+          String.format("Unknown topology type \'%s\' for topology %s, not submitted",
+              topologyType, topologyName));
+    }
+  }
+
+  public static void main(String[] args) throws Exception {
+    Options options = constructOptions();
+
+    CommandLineParser parser = new DefaultParser();
+
+    CommandLine cmd;
+    try {
+      cmd = parser.parse(options, args);
+    } catch (ParseException e) {
+      throw new RuntimeException("Error parsing command line options: ", e);
+    }
+
+
+    FileInputStream fin = new FileInputStream(new File(cmd.getOptionValue(ECO_CONFIG_FILE)));
+
+    String propsFile = cmd.getOptionValue(PROPS);
+    FileInputStream propsInputStream = null;
+
+    if (propsFile != null) {
+      propsInputStream = new FileInputStream(new File(propsFile));
+    }
+
+
+    Boolean filterFromEnv = cmd.hasOption(ENV_PROPS);
+
+    Eco eco = new Eco(new EcoParser(), new EcoSubmitter());
+
+    eco.submit(fin, propsInputStream, filterFromEnv);
+  }
+
+  private static Options constructOptions() {
+    Options options = new Options();
+    Option ecoConfig = Option.builder("eco")
+        .desc("Yaml config file for specifying topology definitions")
+        .longOpt(ECO_CONFIG_FILE)
+        .hasArgs()
+        .argName(ECO_CONFIG_FILE)
+        .required()
+        .build();
+
+
+    Option filterOption = Option.builder(PROPS)
+        .desc("properties file for property substitution")
+        .longOpt(PROPS)
+        .hasArgs()
+        .required(false)
+        .argName(PROPS)
+        .build();
+
+    Option envSubOption = Option.builder("envFilter")
+        .desc("Perform environment variable substitution.")
+        .longOpt(ENV_PROPS)
+        .numberOfArgs(0)
+        .required(false)
+        .build();
+
+    options.addOption(filterOption);
+    options.addOption(ecoConfig);
+    options.addOption(envSubOption);
+
+    return options;
+  }
+
+  // construct command line help options
+  //TODO: (joshfischer) integrate with existing system somehow
+  private static Options constructHelpOptions() {
+    Options options = new Options();
+    Option help = Option.builder("h")
+        .desc("List all options and their description")
+        .longOpt("help")
+        .build();
+
+    options.addOption(help);
+    return options;
+  }
+
+  static void printTopologyInfo(EcoExecutionContext ctx) {
+    EcoTopologyDefinition t = ctx.getTopologyDefinition();
+
+    LOG.info("---------- TOPOLOGY DETAILS ----------");
+
+    LOG.info(String.format("Topology Name: %s", t.getName()));
+    LOG.info("--------------- SPOUTS ---------------");
+    for (SpoutDefinition s : t.getSpouts()) {
+      LOG.info(String.format("%s [%d] (%s)", s.getId(), s.getParallelism(), s.getClassName()));
+    }
+    LOG.info("---------------- BOLTS ---------------");
+    for (BoltDefinition b : t.getBolts()) {
+      LOG.info(String.format("%s [%d] (%s)", b.getId(), b.getParallelism(), b.getClassName()));
+    }
+
+    LOG.info("--------------- STREAMS ---------------");
+    for (StreamDefinition sd : t.getStreams()) {
+      LOG.info(String.format("%s --%s--> %s",
+          sd.getFrom(),
+          sd.getGrouping().getType(),
+          sd.getTo()));
+    }
+    LOG.info("--------------------------------------");
+  }
+}
diff --git a/eco/src/java/org/apache/heron/eco/builder/BoltBuilder.java b/eco/src/java/org/apache/heron/eco/builder/BoltBuilder.java
new file mode 100644
index 0000000..b5f1ffd
--- /dev/null
+++ b/eco/src/java/org/apache/heron/eco/builder/BoltBuilder.java
@@ -0,0 +1,35 @@
+//  Copyright 2017 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.eco.builder;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.heron.eco.definition.EcoExecutionContext;
+import org.apache.heron.eco.definition.EcoTopologyDefinition;
+import org.apache.heron.eco.definition.ObjectDefinition;
+
+public class BoltBuilder {
+
+  public void buildBolts(EcoExecutionContext executionContext,
+                            ObjectBuilder objectBuilder)
+      throws IllegalAccessException, InstantiationException, ClassNotFoundException,
+      NoSuchFieldException, InvocationTargetException {
+    EcoTopologyDefinition topologyDefinition = executionContext.getTopologyDefinition();
+
+    for (ObjectDefinition def: topologyDefinition.getBolts()) {
+      Object obj = objectBuilder.buildObject(def, executionContext);
+      executionContext.addBolt(def.getId(), obj);
+    }
+  }
+}
diff --git a/eco/src/java/org/apache/heron/eco/builder/BuilderUtility.java b/eco/src/java/org/apache/heron/eco/builder/BuilderUtility.java
new file mode 100644
index 0000000..7a217cf
--- /dev/null
+++ b/eco/src/java/org/apache/heron/eco/builder/BuilderUtility.java
@@ -0,0 +1,116 @@
+//  Copyright 2018 Twitter. All rights reserved.
+//
+//  Licensed 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.
+package org.apache.heron.eco.builder;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.heron.eco.definition.BeanListReference;
+import org.apache.heron.eco.definition.BeanReference;
+import org.apache.heron.eco.definition.EcoExecutionContext;
+import org.apache.heron.eco.definition.ObjectDefinition;
+import org.apache.heron.eco.definition.PropertyDefinition;
+
+public class BuilderUtility {
+
+  private static final Logger LOG = LoggerFactory.getLogger(BuilderUtility.class);
+
+  @SuppressWarnings("rawtypes")
+  protected List<Object> resolveReferences(List<Object> args, EcoExecutionContext context) {
+    LOG.debug("Checking arguments for references.");
+    List<Object> cArgs = new ArrayList<>();
+
+    // resolve references
+    for (Object arg : args) {
+      if (arg instanceof BeanReference) {
+        LOG.debug("BeanReference: " + ((BeanReference) arg).getId());
+        cArgs.add(context.getComponent(((BeanReference) arg).getId()));
+      } else if (arg instanceof BeanListReference) {
+        List<Object> components = new ArrayList<>();
+        BeanListReference ref = (BeanListReference) arg;
+        for (String id : ref.getIds()) {
+          components.add(context.getComponent(id));
+        }
+
+        LOG.debug("BeanListReference resolved as {}" + components);
+        cArgs.add(components);
+      } else {
+        LOG.debug("Unknown:" + arg.toString());
+        cArgs.add(arg);
+      }
+    }
+    return cArgs;
+  }
+
+  @SuppressWarnings("rawtypes")
+  protected void applyProperties(ObjectDefinition bean, Object instance,
+                                      EcoExecutionContext context) throws
+      IllegalAccessException, InvocationTargetException, NoSuchFieldException {
+    List<PropertyDefinition> props = bean.getProperties();
+    Class clazz = instance.getClass();
+    if (props != null) {
+      for (PropertyDefinition prop : props) {
+        Object value = prop.isReference() ? context.getComponent(prop.getRef()) : prop.getValue();
+        Method setter = findSetter(clazz, prop.getName());
+        if (setter != null) {
+          LOG.debug("found setter, attempting with: " + instance.getClass() + "  " + value);
+          // invoke setter
+          setter.invoke(instance, new Object[]{value});
+        } else {
+          // look for a public instance variable
+          LOG.debug("no setter found. Looking for a public instance variable...");
+          Field field = findPublicField(clazz, prop.getName());
+          if (field != null) {
+            field.set(instance, value);
+          }
+        }
+      }
+    }
+  }
+
+  @SuppressWarnings("rawtypes")
+  protected Field findPublicField(Class clazz, String property)
+      throws NoSuchFieldException {
+    Field field = clazz.getField(property);
+    return field;
+  }
+
+  @SuppressWarnings("rawtypes")
+  private Method findSetter(Class clazz, String property) {
+    String setterName = toSetterName(property);
+    Method retval = null;
+    Method[] methods = clazz.getMethods();
+    for (Method method : methods) {
+      if (setterName.equals(method.getName())) {
+        LOG.debug("Found setter method: " + method.getName());
+        retval = method;
+      }
+    }
+    return retval;
+  }
+
+  protected String toSetterName(String name) {
+    return "set" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
+  }
+
+  protected Class<?> classForName(String className) throws ClassNotFoundException {
+    return Class.forName(className);
+  }
+}
diff --git a/eco/src/java/org/apache/heron/eco/builder/ComponentBuilder.java b/eco/src/java/org/apache/heron/eco/builder/ComponentBuilder.java
new file mode 100644
index 0000000..46a05f7
--- /dev/null
+++ b/eco/src/java/org/apache/heron/eco/builder/ComponentBuilder.java
@@ -0,0 +1,36 @@
+//  Copyright 2017 Twitter. All rights reserved.
+//
+//  Licensed 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
... 244814 lines suppressed ...

-- 
To stop receiving notification emails like this one, please contact
nlu90@apache.org.