diff --git a/documentation/extensions/index.md b/documentation/extensions/index.md
index 33c0a7eb5..50af12a65 100644
--- a/documentation/extensions/index.md
+++ b/documentation/extensions/index.md
@@ -83,6 +83,7 @@ Experimental Smack Extensions and currently supported XEPs of smack-experimental
| [Internet of Things - Provisioning](iot.md) | [XEP-0324](http://xmpp.org/extensions/xep-0324.html) | Provisioning, access rights and user priviliges for the Internet of Things. |
| [Internet of Things - Control](iot.md) | [XEP-0325](http://xmpp.org/extensions/xep-0325.html) | Describes how to control devices or actuators in an XMPP-based sensor netowrk. |
| [HTTP over XMPP transport](hoxt.md) | [XEP-0332](http://xmpp.org/extensions/xep-0332.html) | Allows to transport HTTP communication over XMPP peer-to-peer networks. |
+| Chat Markers | [XEP-0333](http://xmpp.org/extensions/xep-0333.html) | A solution of marking the last received, displayed and acknowledged message in a chat. |
| JSON Containers | [XEP-0335](http://xmpp.org/extensions/xep-0335.html) | Encapsulation of JSON data within XMPP Stanzas. |
| [Internet of Things - Discovery](iot.md) | [XEP-0347](http://xmpp.org/extensions/xep-0347.html) | Describes how Things can be installed and discovered by their owners. |
| Client State Indication | [XEP-0352](http://xmpp.org/extensions/xep-0352.html) | A way for the client to indicate its active/inactive state. |
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/ChatMarkersManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/ChatMarkersManager.java
new file mode 100644
index 000000000..1727f83a3
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/ChatMarkersManager.java
@@ -0,0 +1,89 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers;
+
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.jivesoftware.smack.ConnectionCreationListener;
+import org.jivesoftware.smack.Manager;
+import org.jivesoftware.smack.SmackException.NoResponseException;
+import org.jivesoftware.smack.SmackException.NotConnectedException;
+import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.XMPPConnectionRegistry;
+import org.jivesoftware.smack.XMPPException.XMPPErrorException;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements;
+import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
+
+/**
+ * Chat Markers Manager class (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+public final class ChatMarkersManager extends Manager {
+
+ static {
+ XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() {
+ @Override
+ public void connectionCreated(XMPPConnection connection) {
+ getInstanceFor(connection);
+ }
+ });
+ }
+
+ private static final Map INSTANCES = new WeakHashMap<>();
+
+ /**
+ * Get the singleton instance of ChatMarkersManager.
+ *
+ * @param connection
+ * @return the instance of ChatMarkersManager
+ */
+ public static synchronized ChatMarkersManager getInstanceFor(XMPPConnection connection) {
+ ChatMarkersManager chatMarkersManager = INSTANCES.get(connection);
+
+ if (chatMarkersManager == null) {
+ chatMarkersManager = new ChatMarkersManager(connection);
+ INSTANCES.put(connection, chatMarkersManager);
+ }
+
+ return chatMarkersManager;
+ }
+
+ private ChatMarkersManager(XMPPConnection connection) {
+ super(connection);
+ }
+
+ /**
+ * Returns true if Chat Markers is supported by the server.
+ *
+ * @return true if Chat Markers is supported by the server.
+ * @throws NotConnectedException
+ * @throws XMPPErrorException
+ * @throws NoResponseException
+ * @throws InterruptedException
+ */
+ public boolean isSupportedByServer()
+ throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
+ return ServiceDiscoveryManager.getInstanceFor(connection())
+ .serverSupportsFeature(ChatMarkersElements.NAMESPACE);
+ }
+
+}
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/element/ChatMarkersElements.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/element/ChatMarkersElements.java
new file mode 100644
index 000000000..c3f29ae6c
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/element/ChatMarkersElements.java
@@ -0,0 +1,234 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers.element;
+
+import org.jivesoftware.smack.packet.ExtensionElement;
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.util.XmlStringBuilder;
+
+/**
+ * Chat Markers elements (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+public class ChatMarkersElements {
+
+ public static final String NAMESPACE = "urn:xmpp:chat-markers:0";
+
+ /**
+ * Markable extension class.
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+ public static class MarkableExtension implements ExtensionElement {
+
+ /**
+ * markable element.
+ */
+ public static final String ELEMENT = "markable";
+
+ public MarkableExtension() {
+ }
+
+ @Override
+ public String getElementName() {
+ return ELEMENT;
+ }
+
+ @Override
+ public String getNamespace() {
+ return NAMESPACE;
+ }
+
+ @Override
+ public CharSequence toXML() {
+ XmlStringBuilder xml = new XmlStringBuilder(this);
+ xml.closeEmptyElement();
+ return xml;
+ }
+
+ public static MarkableExtension from(Message message) {
+ return (MarkableExtension) message.getExtension(ELEMENT, NAMESPACE);
+ }
+ }
+
+ /**
+ * Received extension class.
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+ public static class ReceivedExtension implements ExtensionElement {
+
+ /**
+ * received element.
+ */
+ public static final String ELEMENT = "received";
+
+ private final String id;
+
+ public ReceivedExtension(String id) {
+ this.id = id;
+ }
+
+ /**
+ * Get the id.
+ *
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String getElementName() {
+ return ELEMENT;
+ }
+
+ @Override
+ public String getNamespace() {
+ return NAMESPACE;
+ }
+
+ @Override
+ public CharSequence toXML() {
+ XmlStringBuilder xml = new XmlStringBuilder(this);
+ xml.attribute("id", id);
+ xml.closeEmptyElement();
+ return xml;
+ }
+
+ public static ReceivedExtension from(Message message) {
+ return (ReceivedExtension) message.getExtension(ELEMENT, NAMESPACE);
+ }
+ }
+
+ /**
+ * Displayed extension class.
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+ public static class DisplayedExtension implements ExtensionElement {
+
+ /**
+ * displayed element.
+ */
+ public static final String ELEMENT = "displayed";
+
+ private final String id;
+
+ public DisplayedExtension(String id) {
+ this.id = id;
+ }
+
+ /**
+ * Get the id.
+ *
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String getElementName() {
+ return ELEMENT;
+ }
+
+ @Override
+ public String getNamespace() {
+ return NAMESPACE;
+ }
+
+ @Override
+ public CharSequence toXML() {
+ XmlStringBuilder xml = new XmlStringBuilder(this);
+ xml.attribute("id", id);
+ xml.closeEmptyElement();
+ return xml;
+ }
+
+ public static DisplayedExtension from(Message message) {
+ return (DisplayedExtension) message.getExtension(ELEMENT, NAMESPACE);
+ }
+ }
+
+ /**
+ * Acknowledged extension class.
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+ public static class AcknowledgedExtension implements ExtensionElement {
+
+ /**
+ * acknowledged element.
+ */
+ public static final String ELEMENT = "acknowledged";
+
+ private final String id;
+
+ public AcknowledgedExtension(String id) {
+ this.id = id;
+ }
+
+ /**
+ * Get the id.
+ *
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String getElementName() {
+ return ELEMENT;
+ }
+
+ @Override
+ public String getNamespace() {
+ return NAMESPACE;
+ }
+
+ @Override
+ public CharSequence toXML() {
+ XmlStringBuilder xml = new XmlStringBuilder(this);
+ xml.attribute("id", id);
+ xml.closeEmptyElement();
+ return xml;
+ }
+
+ public static AcknowledgedExtension from(Message message) {
+ return (AcknowledgedExtension) message.getExtension(ELEMENT, NAMESPACE);
+ }
+ }
+
+}
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/element/package-info.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/element/package-info.java
new file mode 100644
index 000000000..6a919f016
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/element/package-info.java
@@ -0,0 +1,24 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * 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.
+ */
+/**
+ * Chat Markers elements (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ *
+ */
+package org.jivesoftware.smackx.chat_markers.element;
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/package-info.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/package-info.java
new file mode 100644
index 000000000..72fb0c8e5
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/package-info.java
@@ -0,0 +1,24 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * 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.
+ */
+/**
+ * XEP-0333: Chat Markers.
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ *
+ */
+package org.jivesoftware.smackx.chat_markers;
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/AcknowledgedProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/AcknowledgedProvider.java
new file mode 100644
index 000000000..b4ca97d5d
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/AcknowledgedProvider.java
@@ -0,0 +1,39 @@
+/**
+ *
+ * Copyright 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers.provider;
+
+import org.jivesoftware.smack.provider.ExtensionElementProvider;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.AcknowledgedExtension;
+import org.xmlpull.v1.XmlPullParser;
+
+/**
+ * Acknowledged extension provider class (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+public class AcknowledgedProvider extends ExtensionElementProvider {
+
+ @Override
+ public AcknowledgedExtension parse(XmlPullParser parser, int initialDepth) throws Exception {
+ String id = parser.getAttributeValue("", "id");
+ return new AcknowledgedExtension(id);
+ }
+
+}
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/DisplayedProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/DisplayedProvider.java
new file mode 100644
index 000000000..340bd3e82
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/DisplayedProvider.java
@@ -0,0 +1,39 @@
+/**
+ *
+ * Copyright 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers.provider;
+
+import org.jivesoftware.smack.provider.ExtensionElementProvider;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.DisplayedExtension;
+import org.xmlpull.v1.XmlPullParser;
+
+/**
+ * Displayed extension provider class (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+public class DisplayedProvider extends ExtensionElementProvider {
+
+ @Override
+ public DisplayedExtension parse(XmlPullParser parser, int initialDepth) throws Exception {
+ String id = parser.getAttributeValue("", "id");
+ return new DisplayedExtension(id);
+ }
+
+}
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/MarkableProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/MarkableProvider.java
new file mode 100644
index 000000000..452d54d38
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/MarkableProvider.java
@@ -0,0 +1,38 @@
+/**
+ *
+ * Copyright 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers.provider;
+
+import org.jivesoftware.smack.provider.ExtensionElementProvider;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.MarkableExtension;
+import org.xmlpull.v1.XmlPullParser;
+
+/**
+ * Markable extension provider class (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+public class MarkableProvider extends ExtensionElementProvider {
+
+ @Override
+ public MarkableExtension parse(XmlPullParser parser, int initialDepth) throws Exception {
+ return new MarkableExtension();
+ }
+
+}
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/ReceivedProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/ReceivedProvider.java
new file mode 100644
index 000000000..4e0676606
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/ReceivedProvider.java
@@ -0,0 +1,39 @@
+/**
+ *
+ * Copyright 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers.provider;
+
+import org.jivesoftware.smack.provider.ExtensionElementProvider;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.ReceivedExtension;
+import org.xmlpull.v1.XmlPullParser;
+
+/**
+ * Received extension provider class (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ * @author Fernando Ramirez
+ *
+ */
+public class ReceivedProvider extends ExtensionElementProvider {
+
+ @Override
+ public ReceivedExtension parse(XmlPullParser parser, int initialDepth) throws Exception {
+ String id = parser.getAttributeValue("", "id");
+ return new ReceivedExtension(id);
+ }
+
+}
diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/package-info.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/package-info.java
new file mode 100644
index 000000000..10ecdf320
--- /dev/null
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/provider/package-info.java
@@ -0,0 +1,24 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * 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.
+ */
+/**
+ * Chat Markers providers (XEP-0333).
+ *
+ * @see XEP-0333: Chat
+ * Markers
+ *
+ */
+package org.jivesoftware.smackx.chat_markers.provider;
diff --git a/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers b/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers
index 21a546154..a50ca9559 100644
--- a/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers
+++ b/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers
@@ -211,4 +211,26 @@
org.jivesoftware.smackx.push_notifications.provider.RemoteDisablingProvider
+
+
+ markable
+ urn:xmpp:chat-markers:0
+ org.jivesoftware.smackx.chat_markers.provider.MarkableProvider
+
+
+ received
+ urn:xmpp:chat-markers:0
+ org.jivesoftware.smackx.chat_markers.provider.ReceivedProvider
+
+
+ displayed
+ urn:xmpp:chat-markers:0
+ org.jivesoftware.smackx.chat_markers.provider.DisplayedProvider
+
+
+ acknowledged
+ urn:xmpp:chat-markers:0
+ org.jivesoftware.smackx.chat_markers.provider.AcknowledgedProvider
+
+
diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/AcknowledgedExtensionTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/AcknowledgedExtensionTest.java
new file mode 100644
index 000000000..20546ca02
--- /dev/null
+++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/AcknowledgedExtensionTest.java
@@ -0,0 +1,55 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers;
+
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.AcknowledgedExtension;
+import org.jivesoftware.smackx.chat_markers.provider.AcknowledgedProvider;
+import org.junit.Assert;
+import org.junit.Test;
+import org.jxmpp.jid.impl.JidCreate;
+import org.xmlpull.v1.XmlPullParser;
+
+public class AcknowledgedExtensionTest {
+
+ String acknowledgedMessageStanza = ""
+ + "" + "";
+
+ String acknowledgedExtension = "";
+
+ @Test
+ public void checkDisplayedExtension() throws Exception {
+ Message message = new Message(JidCreate.from("northumberland@shakespeare.lit/westminster"));
+ message.setStanzaId("message-2");
+ message.addExtension(new ChatMarkersElements.AcknowledgedExtension("message-1"));
+ Assert.assertEquals(acknowledgedMessageStanza, message.toXML().toString());
+ }
+
+ @Test
+ public void checkDisplayedProvider() throws Exception {
+ XmlPullParser parser = PacketParserUtils.getParserFor(acknowledgedExtension);
+ AcknowledgedExtension acknowledgedExtension1 = new AcknowledgedProvider().parse(parser);
+ Assert.assertEquals("message-1", acknowledgedExtension1.getId());
+
+ Message message = (Message) PacketParserUtils.parseStanza(acknowledgedMessageStanza);
+ AcknowledgedExtension acknowledgedExtension2 = AcknowledgedExtension.from(message);
+ Assert.assertEquals("message-1", acknowledgedExtension2.getId());
+ }
+
+}
diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/DisplayedExtensionTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/DisplayedExtensionTest.java
new file mode 100644
index 000000000..7bd146400
--- /dev/null
+++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/DisplayedExtensionTest.java
@@ -0,0 +1,55 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers;
+
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.DisplayedExtension;
+import org.jivesoftware.smackx.chat_markers.provider.DisplayedProvider;
+import org.junit.Assert;
+import org.junit.Test;
+import org.jxmpp.jid.impl.JidCreate;
+import org.xmlpull.v1.XmlPullParser;
+
+public class DisplayedExtensionTest {
+
+ String displayedMessageStanza = ""
+ + "" + "";
+
+ String displayedExtension = "";
+
+ @Test
+ public void checkDisplayedExtension() throws Exception {
+ Message message = new Message(JidCreate.from("northumberland@shakespeare.lit/westminster"));
+ message.setStanzaId("message-2");
+ message.addExtension(new ChatMarkersElements.DisplayedExtension("message-1"));
+ Assert.assertEquals(displayedMessageStanza, message.toXML().toString());
+ }
+
+ @Test
+ public void checkDisplayedProvider() throws Exception {
+ XmlPullParser parser = PacketParserUtils.getParserFor(displayedExtension);
+ DisplayedExtension displayedExtension1 = new DisplayedProvider().parse(parser);
+ Assert.assertEquals("message-1", displayedExtension1.getId());
+
+ Message message = (Message) PacketParserUtils.parseStanza(displayedMessageStanza);
+ DisplayedExtension displayedExtension2 = DisplayedExtension.from(message);
+ Assert.assertEquals("message-1", displayedExtension2.getId());
+ }
+
+}
diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/MarkableExtensionTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/MarkableExtensionTest.java
new file mode 100644
index 000000000..a595a21f5
--- /dev/null
+++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/MarkableExtensionTest.java
@@ -0,0 +1,57 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers;
+
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.MarkableExtension;
+import org.jivesoftware.smackx.chat_markers.provider.MarkableProvider;
+import org.junit.Assert;
+import org.junit.Test;
+import org.jxmpp.jid.impl.JidCreate;
+import org.xmlpull.v1.XmlPullParser;
+
+public class MarkableExtensionTest {
+
+ String markableMessageStanza = ""
+ + "My lord, dispatch; read o'er these articles."
+ + "" + "";
+
+ String markableExtension = "";
+
+ @Test
+ public void checkMarkableExtension() throws Exception {
+ Message message = new Message(JidCreate.from("ingrichard@royalty.england.lit/throne"));
+ message.setStanzaId("message-1");
+ message.setBody("My lord, dispatch; read o'er these articles.");
+ message.addExtension(new ChatMarkersElements.MarkableExtension());
+ Assert.assertEquals(markableMessageStanza, message.toXML().toString());
+ }
+
+ @Test
+ public void checkMarkableProvider() throws Exception {
+ XmlPullParser parser = PacketParserUtils.getParserFor(markableExtension);
+ MarkableExtension markableExtension1 = new MarkableProvider().parse(parser);
+ Assert.assertEquals(markableExtension, markableExtension1.toXML().toString());
+
+ Message message = (Message) PacketParserUtils.parseStanza(markableMessageStanza);
+ MarkableExtension markableExtension2 = MarkableExtension.from(message);
+ Assert.assertEquals(markableExtension, markableExtension2.toXML().toString());
+ }
+
+}
diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/ReceivedExtensionTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/ReceivedExtensionTest.java
new file mode 100644
index 000000000..ffdadec3d
--- /dev/null
+++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/chat_markers/ReceivedExtensionTest.java
@@ -0,0 +1,55 @@
+/**
+ *
+ * Copyright © 2016 Fernando Ramirez
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smackx.chat_markers;
+
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements;
+import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements.ReceivedExtension;
+import org.jivesoftware.smackx.chat_markers.provider.ReceivedProvider;
+import org.junit.Assert;
+import org.junit.Test;
+import org.jxmpp.jid.impl.JidCreate;
+import org.xmlpull.v1.XmlPullParser;
+
+public class ReceivedExtensionTest {
+
+ String receivedMessageStanza = ""
+ + "" + "";
+
+ String receivedExtension = "";
+
+ @Test
+ public void checkReceivedExtension() throws Exception {
+ Message message = new Message(JidCreate.from("northumberland@shakespeare.lit/westminster"));
+ message.setStanzaId("message-2");
+ message.addExtension(new ChatMarkersElements.ReceivedExtension("message-1"));
+ Assert.assertEquals(receivedMessageStanza, message.toXML().toString());
+ }
+
+ @Test
+ public void checkReceivedProvider() throws Exception {
+ XmlPullParser parser = PacketParserUtils.getParserFor(receivedExtension);
+ ReceivedExtension receivedExtension1 = new ReceivedProvider().parse(parser);
+ Assert.assertEquals("message-1", receivedExtension1.getId());
+
+ Message message = (Message) PacketParserUtils.parseStanza(receivedMessageStanza);
+ ReceivedExtension receivedExtension2 = ReceivedExtension.from(message);
+ Assert.assertEquals("message-1", receivedExtension2.getId());
+ }
+
+}