diff --git a/modules/zeromq-ext/README.txt b/modules/zeromq-ext/README.txt
new file mode 100644
index 0000000..c7c0d2f
--- /dev/null
+++ b/modules/zeromq-ext/README.txt
@@ -0,0 +1,37 @@
+Apache Ignite ZeroMQ Streamer Module
+------------------------
+
+Apache Ignite ZeroMQ Streamer module provides streaming from ZeroMQ to Ignite cache.
+
+Starting data transfer to Ignite cache can be done with the following steps.
+
+1. Import Ignite ZeroMQ Streamer Module In Maven Project
+
+If you are using Maven to manage dependencies of your project, you can add ZeroMQ module
+dependency like this (replace '${ignite-zeromq-ext.version}' with actual Ignite version you are
+interested in):
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    ...
+    <dependencies>
+        ...
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-zeromq-ext</artifactId>
+            <version>${ignite-zeromq-ext.version}</version>
+        </dependency>
+        ...
+    </dependencies>
+    ...
+</project>
+
+2. Create an Ignite configuration file (see example-ignite.xml) and make sure it is accessible from the streamer.
+
+3. Create your StreamSingleTupleExtractor or StreamMultipleTupleExtractor, an example can be found in the tests folder
+ZeroMqStringSingleTupleExtractor.java. Now it is necessary to add in a streamer
+IgniteZeroMqStreamer.setSingleTupleExtractor(...).
+
+4. Create a topology with the streamer and start.
diff --git a/modules/zeromq-ext/licenses/apache-2.0.txt b/modules/zeromq-ext/licenses/apache-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/modules/zeromq-ext/licenses/apache-2.0.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/modules/zeromq-ext/modules/core/src/test/config/log4j-test.xml b/modules/zeromq-ext/modules/core/src/test/config/log4j-test.xml
new file mode 100755
index 0000000..370a50a
--- /dev/null
+++ b/modules/zeromq-ext/modules/core/src/test/config/log4j-test.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN"
+    "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
+<!--
+    Log4j configuration.
+-->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+    <!--
+        Logs System.out messages to console.
+    -->
+    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+        <!-- Log to STDOUT. -->
+        <param name="Target" value="System.out"/>
+
+        <!-- Log from DEBUG and higher. -->
+        <param name="Threshold" value="DEBUG"/>
+
+        <!-- The default pattern: Date Priority [Category] Message\n -->
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+        </layout>
+
+        <!-- Do not log beyond INFO level. -->
+        <filter class="org.apache.log4j.varia.LevelRangeFilter">
+            <param name="levelMin" value="DEBUG"/>
+            <param name="levelMax" value="INFO"/>
+        </filter>
+    </appender>
+
+    <!--
+        Logs all System.err messages to console.
+    -->
+    <appender name="CONSOLE_ERR" class="org.apache.log4j.ConsoleAppender">
+        <!-- Log to STDERR. -->
+        <param name="Target" value="System.err"/>
+
+        <!-- Log from WARN and higher. -->
+        <param name="Threshold" value="WARN"/>
+
+        <!-- The default pattern: Date Priority [Category] Message\n -->
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+        </layout>
+    </appender>
+
+    <!--
+        Logs all output to specified file.
+    -->
+    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
+        <param name="Threshold" value="DEBUG"/>
+        <param name="File" value="${IGNITE_HOME}/work/log/ignite.log"/>
+        <param name="Append" value="true"/>
+        <param name="MaxFileSize" value="10MB"/>
+        <param name="MaxBackupIndex" value="10"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="[%d{ISO8601}][%-5p][%t][%c{1}] %m%n"/>
+        </layout>
+    </appender>
+
+    <!--
+        Uncomment to enable Ignite query execution debugging.
+    -->
+    <!--
+    <category name="org.apache.ignite.internal.processors.query">
+        <level value="DEBUG"/>
+    </category>
+    -->
+
+    <!--
+        Uncomment to enable Exchange, Rebalance and Partitions workflow debugging.
+    -->
+    <!--
+         <category name="org.apache.ignite.internal.processors.cache.distributed.dht.preloader">
+             <level value="DEBUG"/>
+         </category>
+
+        <category name="org.apache.ignite.internal.processors.cache.distributed.dht.topology">
+            <level value="DEBUG"/>
+        </category>
+    -->
+
+    <!--
+        Uncomment to enable debugging of partition counters.
+    -->
+    <!--
+        <category name="org.apache.ignite.internal.processors.cache.PartitionTxUpdateCounterDebugWrapper">
+            <level value="DEBUG"/>
+        </category>
+    -->
+
+    <!--
+        Uncomment to enable transactions debugging.
+    -->
+    <!--
+         <category name="org.apache.ignite.cache.msg.tx.prepare">
+             <level value="DEBUG"/>
+         </category>
+
+         <category name="org.apache.ignite.cache.msg.tx.finish">
+             <level value="DEBUG"/>
+         </category>
+
+         <category name="org.apache.ignite.cache.msg.tx.recovery">
+             <level value="DEBUG"/>
+         </category>
+    -->
+
+    <!-- Disable all open source debugging. -->
+    <category name="org">
+        <level value="INFO"/>
+    </category>
+
+    <category name="org.eclipse.jetty">
+        <level value="INFO"/>
+    </category>
+
+    <!-- Default settings. -->
+    <root>
+        <!-- Print at info by default. -->
+        <level value="INFO"/>
+
+        <!-- Append to file and console. -->
+        <appender-ref ref="FILE"/>
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="CONSOLE_ERR"/>
+    </root>
+</log4j:configuration>
diff --git a/modules/zeromq-ext/modules/core/src/test/config/tests.properties b/modules/zeromq-ext/modules/core/src/test/config/tests.properties
new file mode 100644
index 0000000..18b3606
--- /dev/null
+++ b/modules/zeromq-ext/modules/core/src/test/config/tests.properties
@@ -0,0 +1,153 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Local address to bind to.
+local.ip=127.0.0.1
+
+# TCP communication port
+comm.tcp.port=30010
+
+# JBoss JNDI
+# JBoss context factory for JNDI connection establishing.
+jboss.jndi.context.factory=org.jnp.interfaces.NamingContextFactory
+# JBoss specific parameter for JNDI connection establishing.
+jboss.jndi.pkg.prefixes=org.jboss.naming:org.jnp.interfaces
+# URL of JBoss server for the 1st node.
+jboss.jndi.node1.provider.url=jnp://localhost:1199
+# URL of JBoss server for the 2nd node.
+jboss.jndi.node2.provider.url=jnp://localhost:1299
+# JBoss Discovery test max wait time.
+jboss.disco.test.wait=180000
+
+# Deployment configuration paths.
+# You will either need to override deploy.uri.dir or supply CLASSES_URI as system property.
+#
+# Path to keystore with private and public keys.
+deploy.uri.secure.keystore=@{IGNITE_HOME}/modules/tests/config/securedeploy/keystore
+# Temporary dir where deployment unit stored before deploy.
+deploy.uri.tmpdir=${java.io.tmpdir}/gg
+# Deployment dir for file scanner test with different types of GAR's.
+deploy.uri.file2.path=${java.io.tmpdir}/gg/verification/
+# URI string.
+deploy.uri.file2=file://freq=200@localhost/${java.io.tmpdir}/gg/verification/
+# File scanner URI for local file deployment.
+deploy.uri.file=file://localhost/@{IGNITE_HOME}/modules/extdata/uri/target/file/
+# FTP scanner URI for FTP deployment.
+deploy.uri.ftp=ftp://ftptest:iddqd@94.72.60.102:21/test/deployment
+# Classes scanner URI for classes deployment. Must be overridden for every user.
+deploy.uri.cls=${CLASSES_URI}
+# Http scanner URI for HTTP deployment.
+deploy.uri.http=http://fake.uri
+# Http scanner URI for secure SSL HTTPs deployment.
+deploy.uri.https=https://fake.uri
+# Directory with descriptors to construct GAR files.
+deploy.gar.descriptor.dir=modules/urideploy/src/test/java/org/apache/ignite/spi/deployment/uri/META-INF
+
+# Directory with a number of descriptors for the Ant gar task.
+ant.gar.descriptor.dir=modules/extdata/p2p/META-INF
+# Temporary directory for the Ant task resulting GAR file.
+ant.gar.tmpdir=${java.io.tmpdir}/gg
+# The same as p2p.uri.cls but without protocol
+ant.gar.srcdir=@{IGNITE_HOME}/modules/extdata/uri/target/classes/
+
+# Paths to use in URI deployment SPI tests
+urideployment.jar.uri=modules/extdata/uri/target/deploy/uri.jar
+urideployment.path.tmp=modules/extdata/uri/target/deploy_tmp/
+
+# GAR paths to use in URI deployment SPI tests
+ant.urideployment.gar.uri=file://freq=5000@localhost/EXTDATA/uri/target/deploy
+ant.urideployment.gar.file=modules/extdata/uri/target/deploy/uri.gar
+ant.urideployment.gar.libs-file=modules/extdata/uri/target/deploy2/uri-libs.gar
+ant.urideployment.gar.classes-file=modules/extdata/uri/target/deploy2/uri-classes.gar
+ant.urideployment.gar.path=modules/extdata/uri/target/deploy/
+
+# Classpath directory for GridP2PUserVersionChangeSelfTest
+ant.userversion.class.dir=@{IGNITE_HOME}/modules/tests/java/
+
+# Multicast discovery self test.
+discovery.mbeanserver.selftest.baseport=50000
+
+# TCP communication self test.
+comm.mbeanserver.selftest.baseport=50100
+
+# Kernel tests.
+grid.comm.selftest.sender.timeout=1000
+grid.comm.selftest.timeout=10000
+
+#P2P tests
+#Overwrite this property. It should point to P2P module compilation directory.
+p2p.uri.cls=file://localhost/@{IGNITE_HOME}/modules/extdata/p2p/target/classes/
+p2p.uri.cls.second=file://localhost/@{IGNITE_HOME}/modules/extdata/uri/target/classes/
+
+# AOP tests.
+# Connector port for RMI.
+connector.rmi.port=7657
+# Connector port for XFire Web Service.
+connector.ws.port=9090
+
+# Load test duration in minutes.
+load.test.duration=500
+load.test.threadnum=50
+load.test.nodenum=5
+
+# Loaders tests
+loader.self.test.config=modules/core/src/test/config/loaders/grid-cfg.xml
+loader.self.multipletest.config=modules/core/src/test/config/loaders/grid-cfg-2-grids.xml
+loader.self.test.jboss.config=modules/core/src/test/config/loaders/grid-cfg.xml
+
+# WebSphere jmx properties
+websphere.jmx.connector.host=localhost
+websphere.jmx.connector.port=8880
+websphere.jmx.connector.security=false
+websphere.jmx.username=
+websphere.jmx.pwd=
+
+# GlassFish jmx properties for GlassFish Loader
+glassfish.jmx.rmi.connector.port=8686
+glassfish.jmx.username=admin
+glassfish.jmx.password=adminadmin
+
+# Tomcat jmx properties for Servlet Loader
+tomcat.jmx.rmi.connector.port=1097
+
+# Marshaller for tests
+#marshaller.class=org.apache.ignite.marshaller.jdk.GridJdkMarshaller
+
+# EC2 configuration for tests
+#amazon.access.key=
+#amazon.secret.key=
+
+# SSH config.
+ssh.username=uname
+ssh.password=passwd
+
+# SSL tests keystore.
+ssl.keystore.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/server.jks
+ssl.keystore.password=123456
+
+# node01 signed with trust-one, node02 and node03 by trust-two, node02old is expired
+# trust-both contains both CAs
+ssl.keystore.node01.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/ca/node01.jks
+ssl.keystore.node02.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/ca/node02.jks
+ssl.keystore.node03.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/ca/node03.jks
+ssl.keystore.trustone.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/ca/trust-one.jks
+ssl.keystore.trusttwo.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/ca/trust-two.jks
+ssl.keystore.trustboth.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/ca/trust-both.jks
+ssl.keystore.node02old.path=@{IGNITE_HOME}/modules/clients/src/test/keystore/ca/node02old.jks
+
+# Hadoop home directory.
+hadoop.home=@{HADOOP_HOME}
diff --git a/modules/zeromq-ext/pom.xml b/modules/zeromq-ext/pom.xml
new file mode 100644
index 0000000..9ba89cd
--- /dev/null
+++ b/modules/zeromq-ext/pom.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!--
+    POM file.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.ignite</groupId>
+        <artifactId>ignite-parent</artifactId>
+        <version>1</version>
+        <relativePath>../../parent</relativePath>
+    </parent>
+
+    <artifactId>ignite-zeromq-ext</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <url>http://ignite.apache.org</url>
+
+    <properties>
+        <jeromq.version>0.3.6</jeromq.version>
+        <ignite.version>2.9.0-SNAPSHOT</ignite.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${ignite.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-log4j</artifactId>
+            <version>${ignite.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-spring</artifactId>
+            <version>${ignite.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${ignite.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.zeromq</groupId>
+            <artifactId>jeromq</artifactId>
+            <version>${jeromq.version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamer.java b/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamer.java
new file mode 100644
index 0000000..1a8e15b
--- /dev/null
+++ b/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamer.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.stream.zeromq;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.stream.StreamAdapter;
+import org.jetbrains.annotations.NotNull;
+import org.zeromq.ZMQ;
+import org.zeromq.ZMQException;
+
+/**
+ * This streamer uses https://github.com/zeromq/jeromq/.
+ * Implements socket types listed {@link ZeroMqTypeSocket}.
+ */
+public class IgniteZeroMqStreamer<K, V> extends StreamAdapter<byte[], K, V> implements AutoCloseable {
+    /** Logger. */
+    protected IgniteLogger log;
+
+    /** Parameter {@code True} if streamer started. */
+    private volatile boolean isStarted = false;
+
+    /** Process stream asynchronously */
+    private ExecutorService zeroMqExSrv;
+
+    /** ZeroMQ context. */
+    private ZMQ.Context ctx;
+
+    /** ZeroMQ context threads. */
+    private int ioThreads;
+
+    /** ZeroMQ socket type. */
+    private int socketType;
+
+    /** ZeroMQ socket address. */
+    private String addr;
+
+    /** ZeroMQ topic name. */
+    private byte[] topic;
+
+    /** Maximum time to wait. */
+    private long timeout = 5_000;
+
+    /**
+     * @param ioThreads Threads on context.
+     * @param socketType Socket type.
+     * @param addr Address to connect zmq.
+     * @param topic Topic name for PUB-SUB socket type, otherwise null.
+     */
+    public IgniteZeroMqStreamer(int ioThreads, ZeroMqTypeSocket socketType, @NotNull String addr, byte[] topic) {
+        A.ensure(ioThreads > 0, "ioThreads has to larger than 0.");
+        A.ensure(!"".equals(addr), "addr cannot be empty.");
+        A.ensure(socketType != null, "socketType has to be specified.");
+
+        this.ioThreads = ioThreads;
+        this.addr = addr;
+        this.topic = topic;
+        this.socketType = socketType.getType();
+    }
+
+    /**
+     * Starts ZeroMQ streamer.
+     */
+    public void start() {
+        A.ensure(getSingleTupleExtractor() != null || getMultipleTupleExtractor() != null, "ZeroMq extractor.");
+
+        log = getIgnite().log();
+
+        if (isStarted) {
+            log.warning("Attempted to start an already started ZeroMQ streamer");
+            return;
+        }
+
+        isStarted = true;
+
+        zeroMqExSrv = Executors.newSingleThreadExecutor();
+
+        ctx = ZMQ.context(ioThreads);
+
+        zeroMqExSrv.execute(() -> {
+            ZMQ.Socket socket = ctx.socket(socketType);
+            socket.connect(addr);
+
+            if (ZeroMqTypeSocket.SUB.getType() == socketType)
+                socket.subscribe(topic);
+
+            while (isStarted) {
+                try {
+                    byte[] msg = socket.recv(0);
+
+                    if (ZeroMqTypeSocket.SUB.getType() == socketType) {
+                        if (socket.hasReceiveMore()) {
+                            addMessage(socket.recv(0));
+                            continue;
+                        }
+                    }
+
+                    addMessage(msg);
+                }
+                catch (ZMQException e) {
+                    if (e.getErrorCode() == ZMQ.Error.ETERM.getCode()) {
+                        break;
+                    }
+                }
+            }
+
+            socket.close();
+        });
+    }
+
+    /**
+     * Stops ZeroMQ streamer.
+     */
+    @Override public void close() throws Exception {
+        isStarted = false;
+
+        if (ctx != null)
+            ctx.close();
+
+        if (zeroMqExSrv != null) {
+            zeroMqExSrv.shutdown();
+
+            try {
+                if (!zeroMqExSrv.awaitTermination(timeout, TimeUnit.MILLISECONDS))
+                    log.warning("Timed out waiting for consumer threads to shut down, exiting uncleanly.");
+            }
+            catch (InterruptedException ignored) {
+                zeroMqExSrv.shutdownNow();
+                log.error("Interrupted during shutdown, exiting uncleanly.");
+            }
+        }
+    }
+}
diff --git a/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/ZeroMqTypeSocket.java b/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/ZeroMqTypeSocket.java
new file mode 100644
index 0000000..58eecaa
--- /dev/null
+++ b/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/ZeroMqTypeSocket.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.stream.zeromq;
+
+import org.zeromq.ZMQ;
+
+/**
+ * Enumeration of all supported IgniteZeroMqStreamer socket types.
+ * <p>
+ * The following types are supported:
+ * <ul>
+ * <li>{@link #PAIR}</li>
+ * <li>{@link #SUB}</li>
+ * <li>{@link #PULL}</li>
+ * </ul>
+ */
+public enum ZeroMqTypeSocket {
+    /** For PAIR-PAIR pattern. */
+    PAIR(ZMQ.PAIR),
+
+    /** For PUB-SUB pattern. */
+    SUB(ZMQ.SUB),
+
+    /** For PUSH-PULL pattern */
+    PULL(ZMQ.PULL);
+
+    /** Socket type. */
+    private int type;
+
+    /**
+     * @param type Socket type.
+     */
+    ZeroMqTypeSocket(int type) {
+        this.type = type;
+    }
+
+    /** @return ZeroMQ original type. */
+    public int getType() {
+        return type;
+    }
+}
diff --git a/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/package-info.java b/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/package-info.java
new file mode 100644
index 0000000..5e4cfc2
--- /dev/null
+++ b/modules/zeromq-ext/src/main/java/org/apache/ignite/stream/zeromq/package-info.java
@@ -0,0 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * Contains implementation of ZeroMQ Streamer.
+ */
+package org.apache.ignite.stream.zeromq;
diff --git a/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamerTest.java b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamerTest.java
new file mode 100644
index 0000000..f297695
--- /dev/null
+++ b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamerTest.java
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.stream.zeromq;
+
+import java.io.UnsupportedEncodingException;
+import java.util.concurrent.CountDownLatch;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteDataStreamer;
+import org.apache.ignite.cache.CachePeekMode;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.CacheEvent;
+import org.apache.ignite.events.EventType;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.zeromq.ZMQ;
+
+import static org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT;
+
+/**
+ * Tests {@link IgniteZeroMqStreamer}.
+ */
+public class IgniteZeroMqStreamerTest extends GridCommonAbstractTest {
+    /** Cache entries count. */
+    private static final int CACHE_ENTRY_COUNT = 1000;
+
+    /** Local address for 0mq. */
+    private final String ADDR = "tcp://localhost:5671";
+
+    /** Topic name for PUB-SUB. */
+    private final byte[] TOPIC = "0mq".getBytes();
+
+    /** If pub-sub envelopes are used. */
+    private static boolean multipart_pubsub;
+
+    /** Constructor. */
+    public IgniteZeroMqStreamerTest() {
+        super(true);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        return super.getConfiguration(igniteInstanceName).setIncludeEventTypes(EventType.EVTS_ALL);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return 10_000;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void beforeTestsStarted() throws Exception {
+        grid().getOrCreateCache(defaultCacheConfiguration());
+    }
+
+    /**
+     * @throws Exception Test exception.
+     */
+    @Test
+    public void testZeroMqPairSocket() throws Exception {
+        try (IgniteDataStreamer<Integer, String> dataStreamer = grid().dataStreamer(DEFAULT_CACHE_NAME)) {
+            try (IgniteZeroMqStreamer streamer = newStreamerInstance(
+                dataStreamer, 1, ZeroMqTypeSocket.PAIR, ADDR, null);) {
+                executeStreamer(streamer, ZMQ.PAIR, null);
+            }
+        }
+    }
+
+    /**
+     * @throws Exception Test exception.
+     */
+    @Test
+    public void testZeroMqSubSocketMultipart() throws Exception {
+        try (IgniteDataStreamer<Integer, String> dataStreamer = grid().dataStreamer(DEFAULT_CACHE_NAME)) {
+            try (IgniteZeroMqStreamer streamer = newStreamerInstance(
+                dataStreamer, 3, ZeroMqTypeSocket.SUB, ADDR, TOPIC);) {
+                multipart_pubsub = true;
+                executeStreamer(streamer, ZMQ.PUB, TOPIC);
+            }
+        }
+    }
+
+    /**
+     * @throws Exception Test exception.
+     */
+    @Test
+    public void testZeroMqSubSocket() throws Exception {
+        try (IgniteDataStreamer<Integer, String> dataStreamer = grid().dataStreamer(DEFAULT_CACHE_NAME)) {
+            try (IgniteZeroMqStreamer streamer = newStreamerInstance(
+                dataStreamer, 3, ZeroMqTypeSocket.SUB, ADDR, TOPIC);) {
+                executeStreamer(streamer, ZMQ.PUB, TOPIC);
+            }
+        }
+    }
+
+    /**
+     * @throws Exception Test exception.
+     */
+    @Test
+    public void testZeroMqPullSocket() throws Exception {
+        try (IgniteDataStreamer<Integer, String> dataStreamer = grid().dataStreamer(DEFAULT_CACHE_NAME)) {
+            try (IgniteZeroMqStreamer streamer = newStreamerInstance(
+                dataStreamer, 4, ZeroMqTypeSocket.PULL, ADDR, null);) {
+                executeStreamer(streamer, ZMQ.PUSH, null);
+            }
+        }
+    }
+
+    /**
+     * Execute ZeroMQ streamer and checking cache content after streaming finished.
+     * Set singleTupleExtractor via {@link ZeroMqStringSingleTupleExtractor} in streamer.
+     *
+     * @param streamer ZeroMQ streamer.
+     * @param clientSocket ZeroMQ socket type.
+     * @param topic Topic name for PUB-SUB.
+     * @throws Exception Test exception.
+     */
+    private void executeStreamer(IgniteZeroMqStreamer streamer, int clientSocket,
+        byte[] topic) throws Exception {
+        streamer.setSingleTupleExtractor(new ZeroMqStringSingleTupleExtractor());
+
+        IgniteCache<Integer, String> cache = grid().cache(DEFAULT_CACHE_NAME);
+
+        CacheListener listener = subscribeToPutEvents();
+
+        streamer.start();
+
+        assertEquals(0, cache.size(CachePeekMode.PRIMARY));
+
+        startZeroMqClient(clientSocket, topic);
+
+        CountDownLatch latch = listener.getLatch();
+
+        latch.await();
+
+        unsubscribeToPutEvents(listener);
+
+        // Last element.
+        int testId = CACHE_ENTRY_COUNT - 1;
+
+        String cachedValue = cache.get(testId);
+
+        // ZeroMQ message successfully put to cache.
+        assertTrue(cachedValue != null && cachedValue.endsWith(String.valueOf(testId)));
+
+        assertTrue(cache.size() == CACHE_ENTRY_COUNT);
+
+        cache.clear();
+    }
+
+    /**
+     * @param dataStreamer Ignite Data Streamer.
+     * @return ZeroMQ Streamer.
+     */
+    private IgniteZeroMqStreamer newStreamerInstance(IgniteDataStreamer<Integer, String> dataStreamer,
+        int ioThreads, ZeroMqTypeSocket socketType, @NotNull String addr, byte[] topic) {
+        IgniteZeroMqStreamer streamer = new IgniteZeroMqStreamer(ioThreads, socketType, addr, topic);
+
+        streamer.setIgnite(grid());
+        streamer.setStreamer(dataStreamer);
+
+        dataStreamer.allowOverwrite(true);
+        dataStreamer.autoFlushFrequency(1);
+
+        return streamer;
+    }
+
+    /**
+     * Starts ZeroMQ client for testing.
+     *
+     * @param clientSocket ZeroMQ socket type.
+     * @param topic Topic name for PUB-SUB.
+     */
+    private void startZeroMqClient(int clientSocket,
+        byte[] topic) throws InterruptedException, UnsupportedEncodingException {
+        try (ZMQ.Context context = ZMQ.context(1);
+             ZMQ.Socket socket = context.socket(clientSocket)) {
+
+            socket.bind(ADDR);
+
+            if (ZMQ.PUB == clientSocket)
+                Thread.sleep(500);
+
+            for (int i = 0; i < CACHE_ENTRY_COUNT; i++) {
+                if (ZMQ.PUB == clientSocket)
+                    socket.sendMore(topic);
+
+                if (ZMQ.PUB == clientSocket && multipart_pubsub)
+                    socket.send((topic + " " + String.valueOf(i)).getBytes("UTF-8"));
+                else
+                    socket.send(String.valueOf(i).getBytes("UTF-8"));
+            }
+        }
+    }
+
+    /**
+     * @return Cache listener.
+     */
+    private CacheListener subscribeToPutEvents() {
+        Ignite ignite = grid();
+
+        // Listen to cache PUT events and expect as many as messages as test data items.
+        CacheListener listener = new CacheListener();
+
+        ignite.events(ignite.cluster().forCacheNodes(DEFAULT_CACHE_NAME)).localListen(listener, EVT_CACHE_OBJECT_PUT);
+
+        return listener;
+    }
+
+    /**
+     * @param listener Cache listener.
+     */
+    private void unsubscribeToPutEvents(CacheListener listener) {
+        Ignite ignite = grid();
+
+        ignite.events(ignite.cluster().forCacheNodes(DEFAULT_CACHE_NAME)).stopLocalListen(listener, EVT_CACHE_OBJECT_PUT);
+    }
+
+    /**
+     * Listener.
+     */
+    private class CacheListener implements IgnitePredicate<CacheEvent> {
+
+        /** */
+        private final CountDownLatch latch = new CountDownLatch(CACHE_ENTRY_COUNT);
+
+        /**
+         * @return Latch.
+         */
+        public CountDownLatch getLatch() {
+            return latch;
+        }
+
+        /**
+         * @param evt Cache Event.
+         * @return {@code true}.
+         */
+        @Override
+        public boolean apply(CacheEvent evt) {
+            latch.countDown();
+
+            return true;
+        }
+    }
+}
diff --git a/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamerTestSuite.java b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamerTestSuite.java
new file mode 100644
index 0000000..93f4f47
--- /dev/null
+++ b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/IgniteZeroMqStreamerTestSuite.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.stream.zeromq;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * ZeroMQ streamer tests.
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+    IgniteZeroMqStreamerTest.class
+})
+public class IgniteZeroMqStreamerTestSuite {
+}
diff --git a/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/ZeroMqStringSingleTupleExtractor.java b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/ZeroMqStringSingleTupleExtractor.java
new file mode 100644
index 0000000..cf1e7f2
--- /dev/null
+++ b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/ZeroMqStringSingleTupleExtractor.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.stream.zeromq;
+
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.stream.StreamSingleTupleExtractor;
+
+/**
+ * Default implementation single tuple extractor for ZeroMQ streamer.
+ */
+public class ZeroMqStringSingleTupleExtractor implements StreamSingleTupleExtractor<byte[], Integer, String> {
+    /** Counter. */
+    private AtomicInteger count = new AtomicInteger();
+
+    public ZeroMqStringSingleTupleExtractor() {
+        count.set(0);
+    }
+
+    @Override public Map.Entry<Integer, String> extract(byte[] msg) {
+        try {
+            return new IgniteBiTuple<>(count.getAndIncrement(), new String(msg, Charset.forName("UTF-8")));
+        }
+        catch (IgniteException e) {
+            return null;
+        }
+    }
+}
diff --git a/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/package-info.java b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/package-info.java
new file mode 100644
index 0000000..5e4cfc2
--- /dev/null
+++ b/modules/zeromq-ext/src/test/java/org/apache/ignite/stream/zeromq/package-info.java
@@ -0,0 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * Contains implementation of ZeroMQ Streamer.
+ */
+package org.apache.ignite.stream.zeromq;
diff --git a/pom.xml b/pom.xml
index f9b081c..c0a40cb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,7 @@
         <module>modules/pub-sub</module>
         <module>modules/spring-boot-autoconfigure</module>
         <module>modules/spring-boot-client-autoconfigure</module>
+        <module>modules/zeromq-ext</module>
     </modules>
 
     <profiles>
