Add @since tags and update change log for release 3.6.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 447a70a..f9f5354 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,90 @@
 Apex Malhar Changelog
 ========================================================================================================================
 
+Version 3.6.0 - 2016-11-30
+------------------------------------------------------------------------------------------------------------------------
+
+### Sub-task
+* [APEXMALHAR-2244] - Optimize WindowedStorage and Spillable data structures for time series
+* [APEXMALHAR-2248] - Create SpillableSet and SpillableSetMultimap interfaces and implementation
+
+### Bug
+* [APEXMALHAR-1852] - File Splitter Test Failing
+* [APEXMALHAR-2176] - expressionFunctions for FilterOperator throws IndexOutOfBounds
+* [APEXMALHAR-2207] - JsonFormatterTest application test should check for presence of expected results
+* [APEXMALHAR-2217] - Remove some redundant code in WindowedStorage and WindowedKeyedStorage
+* [APEXMALHAR-2224] - GenericFileOutputOperator rotateCall fails if no data is written to the file
+* [APEXMALHAR-2226] - Not suppported Exception in AbstractFileOutput Operator.
+* [APEXMALHAR-2227] - Error while connecting with Kafka using Apache Apex
+* [APEXMALHAR-2236] - Potential NullPointerException in JdbcStore
+* [APEXMALHAR-2245] - WindowBoundedMapCache.remove not working when key not in cache
+* [APEXMALHAR-2246] - Key of SpillableByteArrayListMultimapImpl not comparable
+* [APEXMALHAR-2256] - POJOInnerJoinOperator should use getDeclaredField of java reflection
+* [APEXMALHAR-2258] - JavaExpressionParser does not cast type correctly when expression is binary
+* [APEXMALHAR-2263] - Offsets in AbstractFileInputOperator should be long rather than int
+* [APEXMALHAR-2265] - Add entries to mkdocs.yml for recently added operator docs
+* [APEXMALHAR-2272] - sequentialFileRead property on FSInputModule not functioning as expected
+* [APEXMALHAR-2273] - Retraction trigger is fired incorrectly when fireOnlyUpdatedPanes is true
+* [APEXMALHAR-2276] - ManagedState: value of a key does not get over-written in the same time bucket
+* [APEXMALHAR-2281] - ManagedState: race condition with put & asyncGet
+* [APEXMALHAR-2290] - JDBCPOJOInsertOutput Operator - Optimization to populate metadata from database
+* [APEXMALHAR-2291] - Exactly-once processing not working correctly for JdbcPOJOInsertOutputOperator
+* [APEXMALHAR-2299] - TimeBasedDedupOperator throws exception during time bucket assignment in certain edge cases
+* [APEXMALHAR-2305] - Change implementation of session window to reflect what is described in streaming 102 blog
+* [APEXMALHAR-2307] - Session windows are not deleted properly after merge or extend
+* [APEXMALHAR-2309] - TimeBasedDedupOperator marks new tuples as duplicates if expired tuples exist
+* [APEXMALHAR-2312] - NullPointerException in FileSplitterInput when file path is specified
+* [APEXMALHAR-2314] - Improper functioning in partitioning of sequentialFileRead property of FSRecordReader 
+* [APEXMALHAR-2315] - Ignore Join Test for because of issues in POJOInnerJoinOperator
+* [APEXMALHAR-2317] - Change SpillableBenchmarkApp to adapt the change on Spillable Data Structure
+* [APEXMALHAR-2325] - Same block id is emitting from FSInputModule
+* [APEXMALHAR-2329] - ManagedState benchmark should not use constant bucket
+* [APEXMALHAR-2333] - StateTracker#run throws NoSuchElementException
+* [APEXMALHAR-2334] - Managed State benchmark: blocked committed window 
+* [APEXMALHAR-2342] - Fix null pointer exception in AbstractFileOutputOperator setup
+* [APEXMALHAR-2351] - Exception while fetching properties for Operators using JdbcStore 
+* [APEXMALHAR-2353] - timeExpression should not be null for time based Dedup
+
+### Documentation
+* [APEXMALHAR-2166] - Add user documentation for Json Parser
+* [APEXMALHAR-2167] - Add user documentation for Json Formatter
+* [APEXMALHAR-2179] - Add documentation for JDBCPollInputOperator
+* [APEXMALHAR-2184] - Add documentation for FileSystem Input Operator
+* [APEXMALHAR-2219] - Add documentation for Deduper
+* [APEXMALHAR-2232] - Add documentation for csv parser
+* [APEXMALHAR-2242] - Add documentation for 0.9 version of Kafka Input Operator.
+* [APEXMALHAR-2257] - Add documentation for Transform operator
+* [APEXMALHAR-2264] - Add documentation for jmsInputOperator
+* [APEXMALHAR-2282] - Document Windowed Operator and Accumulation
+
+### Improvement
+* [APEXMALHAR-2017] - Use pre checkpoint notification to optimize operator IO
+* [APEXMALHAR-2139] - UniqueCounter changes
+* [APEXMALHAR-2237] - Dynamic partitioning support for FSInputModule
+* [APEXMALHAR-2267] - Remove the word "Byte" in the spillable data structures because it's implied
+* [APEXMALHAR-2280] - Add InterfaceStability annotations to all windowed operator related packages
+* [APEXMALHAR-2302] - Exposing more properties of FSSplitter and BlockReader operators to FSRecordReaderModule
+* [APEXMALHAR-2320] - FSWindowDataManager.toSlice() can cause lots of garbage collection
+* [APEXMALHAR-2327] - BucketsFileSystem.writeBucketData() call Slice.toByteArray() cause allocate unnecessary memory
+* [APEXMALHAR-2340] - Initialize the list of JdbcFieldInfo in JdbcPOJOInsertOutput from properties.xml
+
+### New Feature
+* [APEXMALHAR-1818] - Integrate Calcite to support SQL
+* [APEXMALHAR-2152] - Enricher - Add fixed length file format support to FSLoader
+* [APEXMALHAR-2181] - Non-Transactional Prepared Statement Based Cassandra Upsert (Update + Insert ) output Operator
+* [APEXMALHAR-2209] - Add inner join example application to examples repository
+* [APEXMALHAR-2229] - Add support for peek on com.datatorrent.lib.fileaccess.FileAccess.FileReader
+* [APEXMALHAR-2247] - Add iteration feature in SpillableArrayListImpl and generalize SerdeListSlice to SerdeCollectionSlice
+* [APEXMALHAR-2304] - Apex SQL: Add examples for SQL in Apex in demos folder
+
+### Task
+* [APEXMALHAR-2143] - Evaluate and retire lib/math, lib/algo, and lib/streamquery operators
+* [APEXMALHAR-2190] - Use reusable buffer to serial spillable data structure
+* [APEXMALHAR-2201] - Suppress console output in Stream API tests
+* [APEXMALHAR-2225] - Upgrade checkstyle rules to 1.1.0 and fix trailing whitespace
+* [APEXMALHAR-2240] - Implement Windowed Join Operator
+* [APEXMALHAR-2338] - Couple of links in fsInputOperator.md have a stray # which prevents proper display
+
 Version 3.5.0 - 2016-08-31
 ------------------------------------------------------------------------------------------------------------------------
 
diff --git a/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableBenchmarkApp.java b/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableBenchmarkApp.java
index e2fe8bb..300ea64 100644
--- a/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableBenchmarkApp.java
+++ b/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableBenchmarkApp.java
@@ -29,6 +29,9 @@
 import com.datatorrent.lib.fileaccess.TFileImpl;
 
 @ApplicationAnnotation(name = "SpillableBenchmarkApp")
+/**
+ * @since 3.6.0
+ */
 public class SpillableBenchmarkApp implements StreamingApplication
 {
   protected final String PROP_STORE_PATH = "dt.application.SpillableBenchmarkApp.storeBasePath";
diff --git a/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestInputOperator.java b/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestInputOperator.java
index c3eafb0..9bee9a6 100644
--- a/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestInputOperator.java
+++ b/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestInputOperator.java
@@ -22,6 +22,9 @@
 import com.datatorrent.api.InputOperator;
 import com.datatorrent.common.util.BaseOperator;
 
+/**
+ * @since 3.6.0
+ */
 public class SpillableTestInputOperator extends BaseOperator implements InputOperator
 {
   public final transient DefaultOutputPort<String> output = new DefaultOutputPort<String>();
diff --git a/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestOperator.java b/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestOperator.java
index 7c87b93..07ab02e 100644
--- a/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestOperator.java
+++ b/benchmark/src/main/java/com/datatorrent/benchmark/spillable/SpillableTestOperator.java
@@ -35,6 +35,9 @@
 import com.datatorrent.api.Operator.ShutdownException;
 import com.datatorrent.common.util.BaseOperator;
 
+/**
+ * @since 3.6.0
+ */
 public class SpillableTestOperator extends BaseOperator implements Operator.CheckpointNotificationListener
 {
   private static final Logger logger = LoggerFactory.getLogger(SpillableTestOperator.class);
diff --git a/benchmark/src/main/java/com/datatorrent/benchmark/state/ManagedStateBenchmarkApp.java b/benchmark/src/main/java/com/datatorrent/benchmark/state/ManagedStateBenchmarkApp.java
index be615d0..ae5ba40 100644
--- a/benchmark/src/main/java/com/datatorrent/benchmark/state/ManagedStateBenchmarkApp.java
+++ b/benchmark/src/main/java/com/datatorrent/benchmark/state/ManagedStateBenchmarkApp.java
@@ -47,6 +47,9 @@
 import com.datatorrent.lib.util.KeyValPair;
 
 @ApplicationAnnotation(name = "ManagedStateBenchmark")
+/**
+ * @since 3.6.0
+ */
 public class ManagedStateBenchmarkApp implements StreamingApplication
 {
   protected static final String PROP_STORE_PATH = "dt.application.ManagedStateBenchmark.storeBasePath";
diff --git a/benchmark/src/main/java/com/datatorrent/benchmark/state/StoreOperator.java b/benchmark/src/main/java/com/datatorrent/benchmark/state/StoreOperator.java
index f960d15..74ba658 100644
--- a/benchmark/src/main/java/com/datatorrent/benchmark/state/StoreOperator.java
+++ b/benchmark/src/main/java/com/datatorrent/benchmark/state/StoreOperator.java
@@ -38,6 +38,9 @@
 import com.datatorrent.lib.util.KeyValPair;
 import com.datatorrent.netlet.util.Slice;
 
+/**
+ * @since 3.6.0
+ */
 public class StoreOperator extends BaseOperator implements Operator.CheckpointNotificationListener
 {
   private static final Logger logger = LoggerFactory.getLogger(StoreOperator.class);
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperator.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperator.java
index 95f98fe..b790492 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperator.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperator.java
@@ -124,6 +124,8 @@
  * 13. Support for handling Nulls i.e. whether null values in the POJO are to be persisted as is or to be ignored so
  *     that the application need not perform a read to populate a POJO field if it is not available in the context
  * 14. A few autometrics are provided for monitoring the latency aspects of the cassandra cluster
+ *
+ * @since 3.6.0
  */
 
 @InterfaceStability.Evolving
@@ -922,7 +924,7 @@
     this.windowDataManager = windowDataManager;
   }
 
-  /***
+  /**
    * Implementing concrete Operator instances define the Connection Builder properties by implementing this method
    * Please refer to {@link com.datatorrent.contrib.cassandra.ConnectionStateManager.ConnectionBuilder} for
    * an example implementation of the ConnectionStateManager instantiation.
@@ -993,8 +995,7 @@
    * @param windowId
    * @return Whether the current POJO that is being passed in should be allowed to write into the cassandra row just for
    * the reconciling window phase
-    ***/
-
+   */
   abstract boolean reconcileRecord(Object T, long windowId);
 
   enum OperationContext
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPojoUtils.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPojoUtils.java
index b1f5f4a..8b435c9 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPojoUtils.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPojoUtils.java
@@ -31,12 +31,14 @@
 import com.datastax.driver.core.TypeCodec;
 import com.datatorrent.lib.util.PojoUtils;
 
-/***
+/**
  * Used to manage simple data type based getters for given cassandra columns
+ *
+ * @since 3.6.0
  */
 public class CassandraPojoUtils
 {
-  /***
+  /**
    * Resolves a getter that can be associated with the given field name in the Pojo matching to the given
    * data type of cassandra
    * @param tuplePayloadClass The tuple class that is used to build the getter from
@@ -99,7 +101,7 @@
     return getter;
   }
 
-  /***
+  /**
    * Populates a given bound statement column with a value give a POJO and the map representing the getters
    * @param boundStatement The statement that needs to be populated with the value
    * @param getters A map mapping the applicable getter for a given column name as key
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPreparedStatementGenerator.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPreparedStatementGenerator.java
index 355fccf..713179c 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPreparedStatementGenerator.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/CassandraPreparedStatementGenerator.java
@@ -32,8 +32,10 @@
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
 
-/***
+/**
  * Used to generate CQL strings that can be used to generate prepared statements.
+ *
+ * @since 3.6.0
  */
 public class CassandraPreparedStatementGenerator
 {
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/ConnectionStateManager.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/ConnectionStateManager.java
index cfc2b46..b4fd21f 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/ConnectionStateManager.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/ConnectionStateManager.java
@@ -74,6 +74,8 @@
  * }
  * Please refer {@link ConnectionBuilder} for details about parameters that can be used to define the connection
  * and its default behaviour
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class ConnectionStateManager implements AutoCloseable, Serializable
diff --git a/contrib/src/main/java/com/datatorrent/contrib/cassandra/UpsertExecutionContext.java b/contrib/src/main/java/com/datatorrent/contrib/cassandra/UpsertExecutionContext.java
index 66d0b6c..65e4af2 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/cassandra/UpsertExecutionContext.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/cassandra/UpsertExecutionContext.java
@@ -34,6 +34,8 @@
  *  See {@link ConnectionStateManager.ConnectionBuilder} to set the default TTL for all payload executions
  *  6. Override the default Consistency level to be used for the current mutation
  *  See {@link ConnectionStateManager.ConnectionBuilder} for setting default consistency.
+ *
+ * @since 3.6.0
  */
 public class UpsertExecutionContext<T>
 {
diff --git a/contrib/src/main/java/com/datatorrent/contrib/enrich/FixedWidthFSLoader.java b/contrib/src/main/java/com/datatorrent/contrib/enrich/FixedWidthFSLoader.java
index d37ce3e..2f54f66 100644
--- a/contrib/src/main/java/com/datatorrent/contrib/enrich/FixedWidthFSLoader.java
+++ b/contrib/src/main/java/com/datatorrent/contrib/enrich/FixedWidthFSLoader.java
@@ -46,6 +46,8 @@
  * This implementation of {@link FSLoader} is used to load data from fixed width
  * file.User needs to set {@link FixedWidthFSLoader#fieldDescription} to specify
  * field information.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class FixedWidthFSLoader extends FSLoader
diff --git a/contrib/src/main/java/org/apache/apex/malhar/contrib/misc/streamquery/GroupByHavingOperator.java b/contrib/src/main/java/org/apache/apex/malhar/contrib/misc/streamquery/GroupByHavingOperator.java
index 9999429..9b2eeda 100644
--- a/contrib/src/main/java/org/apache/apex/malhar/contrib/misc/streamquery/GroupByHavingOperator.java
+++ b/contrib/src/main/java/org/apache/apex/malhar/contrib/misc/streamquery/GroupByHavingOperator.java
@@ -33,6 +33,9 @@
 import com.datatorrent.lib.streamquery.index.ColumnIndex;
 import com.datatorrent.lib.streamquery.condition.Condition;
 @Deprecated
+/**
+ * @since 3.6.0
+ */
 public class GroupByHavingOperator extends BaseOperator
 {
 
diff --git a/contrib/src/test/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperatorCodecsTest.java b/contrib/src/test/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperatorCodecsTest.java
index 87c783f..faf32a4 100644
--- a/contrib/src/test/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperatorCodecsTest.java
+++ b/contrib/src/test/java/com/datatorrent/contrib/cassandra/AbstractUpsertOutputOperatorCodecsTest.java
@@ -42,7 +42,7 @@
 public class AbstractUpsertOutputOperatorCodecsTest
 {
 
-  /***
+  /**
    * The schema that is used
    *
    *
diff --git a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/FusionStyleSQLApplication.java b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/FusionStyleSQLApplication.java
index 94b02db..80b997d 100644
--- a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/FusionStyleSQLApplication.java
+++ b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/FusionStyleSQLApplication.java
@@ -40,6 +40,9 @@
 
 
 @ApplicationAnnotation(name = "FusionStyleSQLApplication")
+/**
+ * @since 3.6.0
+ */
 public class FusionStyleSQLApplication implements StreamingApplication
 {
   @Override
diff --git a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/PureStyleSQLApplication.java b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/PureStyleSQLApplication.java
index 9a727a3..79295f9 100644
--- a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/PureStyleSQLApplication.java
+++ b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/PureStyleSQLApplication.java
@@ -29,6 +29,9 @@
 import com.datatorrent.api.annotation.ApplicationAnnotation;
 
 @ApplicationAnnotation(name = "PureStyleSQLApplication")
+/**
+ * @since 3.6.0
+ */
 public class PureStyleSQLApplication implements StreamingApplication
 {
   @Override
diff --git a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithAPI.java b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithAPI.java
index 604332b..da4f563 100644
--- a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithAPI.java
+++ b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithAPI.java
@@ -28,6 +28,9 @@
 import com.datatorrent.api.annotation.ApplicationAnnotation;
 
 @ApplicationAnnotation(name = "SQLApplicationWithAPI")
+/**
+ * @since 3.6.0
+ */
 public class SQLApplicationWithAPI implements StreamingApplication
 {
   @Override
diff --git a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithModelFile.java b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithModelFile.java
index 2d22b18..4c90a82 100644
--- a/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithModelFile.java
+++ b/demos/sql/src/main/java/org/apache/apex/malhar/sql/sample/SQLApplicationWithModelFile.java
@@ -30,6 +30,9 @@
 import com.datatorrent.api.annotation.ApplicationAnnotation;
 
 @ApplicationAnnotation(name = "SQLApplicationWithModelFile")
+/**
+ * @since 3.6.0
+ */
 public class SQLApplicationWithModelFile implements StreamingApplication
 {
   @Override
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/state/managed/BucketProvider.java b/library/src/main/java/org/apache/apex/malhar/lib/state/managed/BucketProvider.java
index bbd18ac..fc836e5 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/state/managed/BucketProvider.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/state/managed/BucketProvider.java
@@ -21,6 +21,8 @@
 /**
  * This interface declares methods to get bucket by bucket id
  *
+ *
+ * @since 3.6.0
  */
 public interface BucketProvider
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/state/managed/TimeExtractor.java b/library/src/main/java/org/apache/apex/malhar/lib/state/managed/TimeExtractor.java
index e70e80f..5d706db 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/state/managed/TimeExtractor.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/state/managed/TimeExtractor.java
@@ -20,6 +20,8 @@
 
 /**
  * A way to extract time from data
+ *
+ * @since 3.6.0
  */
 public interface TimeExtractor<T>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/state/spillable/managed/ManagedTimeUnifiedStateSpillableStateStore.java b/library/src/main/java/org/apache/apex/malhar/lib/state/spillable/managed/ManagedTimeUnifiedStateSpillableStateStore.java
index 207cb31..9eef72f 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/state/spillable/managed/ManagedTimeUnifiedStateSpillableStateStore.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/state/spillable/managed/ManagedTimeUnifiedStateSpillableStateStore.java
@@ -23,6 +23,8 @@
 
 /**
  *
+ *
+ * @since 3.6.0
  */
 public class ManagedTimeUnifiedStateSpillableStateStore extends ManagedTimeUnifiedStateImpl implements SpillableStateStore
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/ClassLoaderUtils.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/ClassLoaderUtils.java
index 855c21f..928ca09 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/ClassLoaderUtils.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/ClassLoaderUtils.java
@@ -25,6 +25,9 @@
 import org.apache.hadoop.fs.FSDataInputStream;
 
 @InterfaceStability.Evolving
+/**
+ * @since 3.6.0
+ */
 public class ClassLoaderUtils
 {
   /**
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixKeyValueSerdeManager.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixKeyValueSerdeManager.java
index 57638d8..fc6b875 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixKeyValueSerdeManager.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixKeyValueSerdeManager.java
@@ -30,6 +30,8 @@
  *
  * @param <K>
  * @param <V>
+ *
+ * @since 3.6.0
  */
 public class AffixKeyValueSerdeManager<K, V> extends KeyValueSerdeManager<K, V>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixSerde.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixSerde.java
index 7504633..28f07ec 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixSerde.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/AffixSerde.java
@@ -25,6 +25,8 @@
  * AffixSerde provides serde for adding prefix or suffix
  *
  * @param <T>
+ *
+ * @since 3.6.0
  */
 public class AffixSerde<T> implements Serde<T>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/ArraySerde.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/ArraySerde.java
index 4b2a45b..4ace95c 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/ArraySerde.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/ArraySerde.java
@@ -24,6 +24,9 @@
 import com.esotericsoftware.kryo.io.Output;
 import com.google.common.base.Preconditions;
 
+/**
+ * @since 3.6.0
+ */
 public class ArraySerde<T> implements Serde<T[]>
 {
   private Serde<T> itemSerde;
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/Block.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/Block.java
index c140962..4b621d1 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/Block.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/Block.java
@@ -27,6 +27,8 @@
  *
  * keep the information of one block
  *
+ *
+ * @since 3.6.0
  */
 public class Block
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockReleaseStrategy.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockReleaseStrategy.java
index f8a097e..53e592b 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockReleaseStrategy.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockReleaseStrategy.java
@@ -23,6 +23,8 @@
  * - Stream keep on reporting how many free blocks it has in certain frequent. usually at the end of each window
  * - Stream check how many block should release. Stream usually release the blocks but Stream can make its own decision
  * - Stream report how many blocks actually released
+ *
+ * @since 3.6.0
  */
 public interface BlockReleaseStrategy
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockStream.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockStream.java
index ee50f7d..6dc8a7d 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockStream.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BlockStream.java
@@ -32,6 +32,8 @@
  * A stream is a collection of blocks
  * BlockStream avoids copying the data that are already exposed to the caller
  *
+ *
+ * @since 3.6.0
  */
 public class BlockStream extends OutputStream
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BufferSlice.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BufferSlice.java
index 5d830fe..237115a 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BufferSlice.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/BufferSlice.java
@@ -28,6 +28,8 @@
  * com.datatorrent.netlet.util.Slice has problem with the hashCode(), so
  * override here
  *
+ *
+ * @since 3.6.0
  */
 public class BufferSlice extends Slice
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/DefaultBlockReleaseStrategy.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/DefaultBlockReleaseStrategy.java
index 365cbc3..29177cb 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/DefaultBlockReleaseStrategy.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/DefaultBlockReleaseStrategy.java
@@ -24,6 +24,8 @@
 /**
  * This implementation get the minimum number of free blocks in the period to release.
  *
+ *
+ * @since 3.6.0
  */
 public class DefaultBlockReleaseStrategy implements BlockReleaseStrategy
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/GenericSerde.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/GenericSerde.java
index 0fbb2ab..8501614 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/GenericSerde.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/GenericSerde.java
@@ -30,6 +30,8 @@
  * incompatible changes to the class being serialized.
  *
  * @param <T> The type being serialized
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class GenericSerde<T> implements Serde<T>
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueByteStreamProvider.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueByteStreamProvider.java
index a7dfa7f..13b5046 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueByteStreamProvider.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueByteStreamProvider.java
@@ -22,6 +22,8 @@
  * This interface provides methods for stream for key/value.
  * The implementation can separate the stream for key and value or share the same one.
  *
+ *
+ * @since 3.6.0
  */
 public interface KeyValueByteStreamProvider
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueSerdeManager.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueSerdeManager.java
index 6fbe9fe..e74c7a3 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueSerdeManager.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/KeyValueSerdeManager.java
@@ -23,6 +23,9 @@
 
 import com.datatorrent.netlet.util.Slice;
 
+/**
+ * @since 3.6.0
+ */
 public class KeyValueSerdeManager<K, V>
 {
   protected Serde<K> keySerde;
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/PairSerde.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/PairSerde.java
index 3190880..534bdf3 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/PairSerde.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/PairSerde.java
@@ -30,6 +30,8 @@
 
 /**
  * This is an implementation of {@link Serde} which serializes and deserializes pairs.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class PairSerde<T1, T2> implements Serde<Pair<T1, T2>>
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/SerializationBuffer.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/SerializationBuffer.java
index f33f1e0..2d7c204 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/SerializationBuffer.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/SerializationBuffer.java
@@ -24,6 +24,9 @@
 
 import com.datatorrent.netlet.util.Slice;
 
+/**
+ * @since 3.6.0
+ */
 public class SerializationBuffer extends Output implements WindowCompleteListener, WindowListener
 {
   /*
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowCompleteListener.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowCompleteListener.java
index d2d38a7..9abb056 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowCompleteListener.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowCompleteListener.java
@@ -18,6 +18,9 @@
  */
 package org.apache.apex.malhar.lib.utils.serde;
 
+/**
+ * @since 3.6.0
+ */
 public interface WindowCompleteListener
 {
   /**
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowedBlockStream.java b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowedBlockStream.java
index 53710f8..4b9ced8 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowedBlockStream.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/utils/serde/WindowedBlockStream.java
@@ -35,6 +35,8 @@
 /**
  * This is a stream which manages blocks and supports window related operations.
  *
+ *
+ * @since 3.6.0
  */
 public class WindowedBlockStream extends BlockStream implements WindowListener, WindowCompleteListener
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/WindowedMergeOperator.java b/library/src/main/java/org/apache/apex/malhar/lib/window/WindowedMergeOperator.java
index 4706302..4928bca 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/WindowedMergeOperator.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/WindowedMergeOperator.java
@@ -20,6 +20,8 @@
 
 /**
  * Interface for Merge Windowed Operator.
+ *
+ * @since 3.6.0
  */
 public interface WindowedMergeOperator<InputT1, InputT2>
     extends WindowedOperator<InputT1>
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/CoGroup.java b/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/CoGroup.java
index e22d582..2363a8b 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/CoGroup.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/CoGroup.java
@@ -24,6 +24,8 @@
 
 /**
  * CoGroup Join Accumulation.
+ *
+ * @since 3.6.0
  */
 public class CoGroup<T> extends InnerJoin<T>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/InnerJoin.java b/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/InnerJoin.java
index fd250a2..7f0dade 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/InnerJoin.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/InnerJoin.java
@@ -27,6 +27,8 @@
 
 /**
  * Combine Join Accumulation, inner-joins tuples with same type from different streams.
+ *
+ * @since 3.6.0
  */
 public class InnerJoin<T> implements MergeAccumulation<T, T, List<Set<T>>, List<List<T>>>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/PojoInnerJoin.java b/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/PojoInnerJoin.java
index 4b3bc69..f9cf91e 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/PojoInnerJoin.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/accumulation/PojoInnerJoin.java
@@ -32,6 +32,8 @@
 
 /**
  * Inner join Accumulation for Pojo Streams.
+ *
+ * @since 3.6.0
  */
 public class PojoInnerJoin<InputT1, InputT2>
     implements MergeAccumulation<InputT1, InputT2, List<List<Map<String, Object>>>, List<Map<String, Object>>>
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/KeyedWindowedMergeOperatorImpl.java b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/KeyedWindowedMergeOperatorImpl.java
index eeb4777..9accf25 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/KeyedWindowedMergeOperatorImpl.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/KeyedWindowedMergeOperatorImpl.java
@@ -38,6 +38,8 @@
  * @param <InputT2> The type of the value of the keyed input tuple from second stream.
  * @param <AccumT> The type of the accumulated value in the operator state per key per window.
  * @param <OutputT> The type of the value of the keyed output tuple.
+ *
+ * @since 3.6.0
  */
 public class KeyedWindowedMergeOperatorImpl<KeyT, InputT1, InputT2, AccumT, OutputT>
     extends KeyedWindowedOperatorImpl<KeyT, InputT1, AccumT, OutputT>
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableSessionWindowedStorage.java b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableSessionWindowedStorage.java
index b88501e..ef06eea 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableSessionWindowedStorage.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableSessionWindowedStorage.java
@@ -37,6 +37,8 @@
 
 /**
  * Spillable session windowed storage.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class SpillableSessionWindowedStorage<K, V> extends SpillableWindowedKeyedStorage<K, V> implements SessionWindowedStorage<K, V>
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedKeyedStorage.java b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedKeyedStorage.java
index d41c494..bf0c804 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedKeyedStorage.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedKeyedStorage.java
@@ -41,6 +41,8 @@
  *
  * @param <K> The key type
  * @param <V> The value type
+ *
+ * @since 3.6.0
  */
 public class SpillableWindowedKeyedStorage<K, V> implements WindowedStorage.WindowedKeyedStorage<K, V>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedPlainStorage.java b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedPlainStorage.java
index f9bbc17..f70771c 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedPlainStorage.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/SpillableWindowedPlainStorage.java
@@ -35,6 +35,8 @@
  * This is an implementation of WindowedPlainStorage that makes use of {@link Spillable} data structures
  *
  * @param <T> Type of the value per window
+ *
+ * @since 3.6.0
  */
 public class SpillableWindowedPlainStorage<T> implements WindowedStorage.WindowedPlainStorage<T>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowKeyPairTimeExtractor.java b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowKeyPairTimeExtractor.java
index ecf63a5..3242f7a 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowKeyPairTimeExtractor.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowKeyPairTimeExtractor.java
@@ -25,6 +25,8 @@
 /**
  * A {@link TimeExtractor} to extract time from Pair of {@link Window} and key
  * The type of key doesn't matter in this case, so it assumes object as the key type
+ *
+ * @since 3.6.0
  */
 public class WindowKeyPairTimeExtractor<K> implements TimeExtractor<Pair<Window, K>>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowTimeExtractor.java b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowTimeExtractor.java
index aee389a..603c90c 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowTimeExtractor.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowTimeExtractor.java
@@ -23,6 +23,8 @@
 
 /**
  * A {@link TimeExtractor} to extract time from {@link Window}
+ *
+ * @since 3.6.0
  */
 public class WindowTimeExtractor implements TimeExtractor<Window>
 {
diff --git a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowedMergeOperatorImpl.java b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowedMergeOperatorImpl.java
index 79475e3..d2594c1 100644
--- a/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowedMergeOperatorImpl.java
+++ b/library/src/main/java/org/apache/apex/malhar/lib/window/impl/WindowedMergeOperatorImpl.java
@@ -36,6 +36,8 @@
  * @param <InputT2> The type of input tuple from first stream.
  * @param <AccumT> The type of the accumulated value in the operator state per key per window.
  * @param <OutputT> The type of output tuple.
+ *
+ * @since 3.6.0
  */
 public class WindowedMergeOperatorImpl<InputT1, InputT2, AccumT, OutputT>
     extends WindowedOperatorImpl<InputT1, AccumT, OutputT> implements WindowedMergeOperator<InputT1, InputT2>
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/SQLExecEnvironment.java b/sql/src/main/java/org/apache/apex/malhar/sql/SQLExecEnvironment.java
index de146f6..8ce524b 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/SQLExecEnvironment.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/SQLExecEnvironment.java
@@ -75,6 +75,8 @@
  * </pre>
  *
  * Above code will evaluate SQL statement and convert the resultant Relational Algebra to a sub-DAG.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class SQLExecEnvironment
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/codegen/BeanClassGenerator.java b/sql/src/main/java/org/apache/apex/malhar/sql/codegen/BeanClassGenerator.java
index 3e384a2..5365e20 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/codegen/BeanClassGenerator.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/codegen/BeanClassGenerator.java
@@ -47,6 +47,8 @@
 
 /**
  * Creates a bean class on fly.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class BeanClassGenerator
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/codegen/ExpressionCompiler.java b/sql/src/main/java/org/apache/apex/malhar/sql/codegen/ExpressionCompiler.java
index e12ff53..542d27f 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/codegen/ExpressionCompiler.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/codegen/ExpressionCompiler.java
@@ -47,6 +47,8 @@
 /**
  * Converts calcite expression of type {@link RexNode} to quasi-Java expression which can be used
  * with {@link com.datatorrent.lib.util.PojoUtils}
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class ExpressionCompiler
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/operators/FilterTransformOperator.java b/sql/src/main/java/org/apache/apex/malhar/sql/operators/FilterTransformOperator.java
index 192c58b..586a3fc 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/operators/FilterTransformOperator.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/operators/FilterTransformOperator.java
@@ -27,6 +27,8 @@
 
 /**
  * This is an extension of {@link TransformOperator} which also takes care of filtering tuples.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class FilterTransformOperator extends TransformOperator
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/operators/InnerJoinOperator.java b/sql/src/main/java/org/apache/apex/malhar/sql/operators/InnerJoinOperator.java
index 0b21898..a1950cd 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/operators/InnerJoinOperator.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/operators/InnerJoinOperator.java
@@ -26,6 +26,8 @@
 /**
  * This is an extension of {@link POJOInnerJoinOperator} operator which works over a global scope and
  * does not have time bound expiry of join tuples.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class InnerJoinOperator extends POJOInnerJoinOperator
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/operators/LineReader.java b/sql/src/main/java/org/apache/apex/malhar/sql/operators/LineReader.java
index b0225f0..6c0cbfd 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/operators/LineReader.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/operators/LineReader.java
@@ -31,6 +31,8 @@
 
 /**
  * This operator reads data from given file/folder in line by line fashion.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class LineReader extends AbstractFileInputOperator<byte[]>
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/operators/OperatorUtils.java b/sql/src/main/java/org/apache/apex/malhar/sql/operators/OperatorUtils.java
index e5a1928..c67e8f3 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/operators/OperatorUtils.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/operators/OperatorUtils.java
@@ -23,6 +23,9 @@
 import org.apache.hadoop.classification.InterfaceStability;
 
 @InterfaceStability.Evolving
+/**
+ * @since 3.6.0
+ */
 public class OperatorUtils
 {
   private static int opCount = 1;
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/planner/ApexRelNode.java b/sql/src/main/java/org/apache/apex/malhar/sql/planner/ApexRelNode.java
index 7a0d339..9d92f98 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/planner/ApexRelNode.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/planner/ApexRelNode.java
@@ -64,6 +64,8 @@
 
 /**
  * This class defines how to populate DAG of Apex for the relational nodes of SQL Calcite
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public abstract class ApexRelNode
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelInfo.java b/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelInfo.java
index 29948ec..7455d49 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelInfo.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelInfo.java
@@ -27,6 +27,8 @@
 
 /**
  * This object communicates stream and connection data between various stages of relational algebra.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class RelInfo
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelNodeVisitor.java b/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelNodeVisitor.java
index 68343ce..5a2c1c1 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelNodeVisitor.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/planner/RelNodeVisitor.java
@@ -35,6 +35,8 @@
 
 /**
  * This class is the main class that converts relational algebra to a sub-DAG.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class RelNodeVisitor
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTable.java b/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTable.java
index 6d16f63..68a9745 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTable.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTable.java
@@ -42,6 +42,8 @@
  * This is representation of Apex source/destination to Calcite's {@link StreamableTable} table.
  * Any table that gets registered with {@link org.apache.apex.malhar.sql.SQLExecEnvironment}
  * gets registered as {@link ApexSQLTable}.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class ApexSQLTable implements ScannableTable, StreamableTable
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTableFactory.java b/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTableFactory.java
index c18f854..75f60df 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTableFactory.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/schema/ApexSQLTableFactory.java
@@ -32,6 +32,9 @@
 import org.apache.hadoop.classification.InterfaceStability;
 
 @InterfaceStability.Evolving
+/**
+ * @since 3.6.0
+ */
 public class ApexSQLTableFactory implements TableFactory<Table>
 {
   @SuppressWarnings("unchecked")
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/schema/TupleSchemaRegistry.java b/sql/src/main/java/org/apache/apex/malhar/sql/schema/TupleSchemaRegistry.java
index 7924298..460fafb 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/schema/TupleSchemaRegistry.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/schema/TupleSchemaRegistry.java
@@ -45,6 +45,9 @@
 import org.apache.hadoop.fs.Path;
 
 @InterfaceStability.Evolving
+/**
+ * @since 3.6.0
+ */
 public class TupleSchemaRegistry
 {
   public static final String FQCN_PACKAGE = "org.apache.apex.generated.schema.";
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/table/CSVMessageFormat.java b/sql/src/main/java/org/apache/apex/malhar/sql/table/CSVMessageFormat.java
index a96df65..533e55d 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/table/CSVMessageFormat.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/table/CSVMessageFormat.java
@@ -38,6 +38,9 @@
 import com.datatorrent.contrib.parser.DelimitedSchema;
 
 @InterfaceStability.Evolving
+/**
+ * @since 3.6.0
+ */
 public class CSVMessageFormat implements MessageFormat
 {
   public static final String CSV_SCHEMA = "schema";
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/table/Endpoint.java b/sql/src/main/java/org/apache/apex/malhar/sql/table/Endpoint.java
index 41a26de..c38d2aa 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/table/Endpoint.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/table/Endpoint.java
@@ -32,6 +32,8 @@
  * This interface defines abstract table and how it should be operated with.
  * Endpoint interface can be implemented for any type of data source eg. Kafka, File, JDBC etc.
  * Implementation of Endpoint interface should define how the table should represented for both input OR output side.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public interface Endpoint
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/table/FileEndpoint.java b/sql/src/main/java/org/apache/apex/malhar/sql/table/FileEndpoint.java
index cac32a4..5ded696 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/table/FileEndpoint.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/table/FileEndpoint.java
@@ -37,6 +37,8 @@
 
 /**
  * This is an implementation of {@link Endpoint} which defined how data should be read/written to file system.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class FileEndpoint implements Endpoint
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/table/KafkaEndpoint.java b/sql/src/main/java/org/apache/apex/malhar/sql/table/KafkaEndpoint.java
index 56419c3..57308a1 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/table/KafkaEndpoint.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/table/KafkaEndpoint.java
@@ -40,6 +40,8 @@
 
 /**
  * This is an implementation of {@link Endpoint} which defined how data should be read/written from kafka messaging system
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class KafkaEndpoint implements Endpoint
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/table/MessageFormat.java b/sql/src/main/java/org/apache/apex/malhar/sql/table/MessageFormat.java
index 80fef93..efae1ff 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/table/MessageFormat.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/table/MessageFormat.java
@@ -31,6 +31,8 @@
 /**
  * This interface defines how message should be parsed from input or formatted for output.
  * The implementation of this interface should define both parsing and formatting representation for data.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public interface MessageFormat
diff --git a/sql/src/main/java/org/apache/apex/malhar/sql/table/StreamEndpoint.java b/sql/src/main/java/org/apache/apex/malhar/sql/table/StreamEndpoint.java
index 5462e42..e666a3f 100644
--- a/sql/src/main/java/org/apache/apex/malhar/sql/table/StreamEndpoint.java
+++ b/sql/src/main/java/org/apache/apex/malhar/sql/table/StreamEndpoint.java
@@ -37,6 +37,8 @@
 
 /**
  * This is an implementation of {@link Endpoint} which defined how data should be read/written to a Apex streaming port.
+ *
+ * @since 3.6.0
  */
 @InterfaceStability.Evolving
 public class StreamEndpoint implements Endpoint