diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/NickListener.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/NickListener.java
new file mode 100644
index 0000000000..62db427fd3
--- /dev/null
+++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/NickListener.java
@@ -0,0 +1,29 @@
+/**
+ *
+ * Copyright 2018 Miguel Hincapie.
+ *
+ * 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.nick;
+
+import org.jivesoftware.smack.packet.Message;
+
+/**
+ * Used with NickManager.
+ *
+ * @author Miguel Hincapie 2018
+ * @see XEP-0172: User Nickname
+ */
+public interface NickListener {
+ void newNickMessage(Message message);
+}
diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/NickManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/NickManager.java
new file mode 100644
index 0000000000..e31dc546fc
--- /dev/null
+++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/NickManager.java
@@ -0,0 +1,133 @@
+/**
+ *
+ * Copyright 2018 Miguel Hincapie.
+ *
+ * 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.nick;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+import org.jivesoftware.smack.AsyncButOrdered;
+import org.jivesoftware.smack.Manager;
+import org.jivesoftware.smack.SmackException;
+import org.jivesoftware.smack.StanzaListener;
+import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.filter.StanzaFilter;
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.packet.Stanza;
+import org.jivesoftware.smackx.nick.filter.NickFilter;
+import org.jivesoftware.smackx.nick.packet.Nick;
+
+import org.jxmpp.jid.EntityBareJid;
+import org.jxmpp.jid.Jid;
+
+
+/**
+ * Implementation of XEP-0172.
+ *
+ * @author Miguel Hincapie
+ * @see XEP-0172: User Nickname
+ */
+public final class NickManager extends Manager {
+
+ private static final Map INSTANCES = new WeakHashMap<>();
+
+ private static final StanzaFilter INCOMING_MESSAGE_FILTER = NickFilter.INSTANCE;
+
+ private final Set nickListeners = new HashSet<>();
+
+ private final AsyncButOrdered asyncButOrdered = new AsyncButOrdered<>();
+
+ private NickManager(XMPPConnection connection) {
+ super(connection);
+
+ connection.addSyncStanzaListener(new StanzaListener() {
+ @Override
+ public void processStanza(Stanza packet)
+ throws
+ SmackException.NotConnectedException,
+ InterruptedException,
+ SmackException.NotLoggedInException {
+ final Message message = (Message) packet;
+
+ Jid from = message.getFrom();
+ if (from != null) {
+ asyncButOrdered.performAsyncButOrdered(from, new Runnable() {
+ @Override
+ public void run() {
+ synchronized (nickListeners) {
+ for (NickListener listener : nickListeners) {
+ listener.newNickMessage(message);
+ }
+ }
+ }
+ });
+ }
+
+ }
+ }, INCOMING_MESSAGE_FILTER);
+ }
+
+ public static synchronized NickManager getInstanceFor(XMPPConnection connection) {
+ NickManager nickManager = INSTANCES.get(connection);
+ if (nickManager == null) {
+ nickManager = new NickManager(connection);
+ INSTANCES.put(connection, nickManager);
+ }
+ return nickManager;
+ }
+
+ public synchronized boolean addNickMessageListener(NickListener listener) {
+ return nickListeners.add(listener);
+ }
+
+ public synchronized boolean removeNickMessageListener(NickListener listener) {
+ return nickListeners.remove(listener);
+ }
+
+ public void sendNickMessage(EntityBareJid to, String nickname) throws
+ SmackException.NotLoggedInException,
+ InterruptedException,
+ SmackException.NotConnectedException {
+ sendStanza(createNickMessage(to, nickname));
+ }
+
+ /**
+ * Create a Smack's message stanza to update the user's nickName.
+ *
+ * @param to the receiver.
+ * @param nickName the new nickName.
+ * @return instance of Message stanza.
+ */
+ private static Message createNickMessage(EntityBareJid to, String nickName) {
+ Message message = new Message();
+ message.setTo(to);
+ message.setType(Message.Type.chat);
+ message.setStanzaId();
+ message.addExtension(new Nick(nickName));
+ return message;
+ }
+
+ private void sendStanza(Message message)
+ throws
+ SmackException.NotLoggedInException,
+ SmackException.NotConnectedException,
+ InterruptedException {
+ XMPPConnection connection = getAuthenticatedConnectionOrThrow();
+ connection.sendStanza(message);
+ }
+}
diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/filter/NickFilter.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/filter/NickFilter.java
new file mode 100644
index 0000000000..e7ac96587b
--- /dev/null
+++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/filter/NickFilter.java
@@ -0,0 +1,36 @@
+/**
+ *
+ * Copyright 2018 Miguel Hincapie.
+ *
+ * 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.nick.filter;
+
+import org.jivesoftware.smack.filter.StanzaExtensionFilter;
+import org.jivesoftware.smack.filter.StanzaFilter;
+import org.jivesoftware.smackx.nick.packet.Nick;
+
+/**
+ * Used with NickManager.
+ *
+ * @author Miguel Hincapie 2018
+ * @see XEP-0172: User Nickname
+ */
+public final class NickFilter extends StanzaExtensionFilter {
+
+ public static final StanzaFilter INSTANCE = new NickFilter(Nick.ELEMENT_NAME, Nick.NAMESPACE);
+
+ private NickFilter(String elementName, String namespace) {
+ super(elementName, namespace);
+ }
+}
diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/filter/package-info.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/filter/package-info.java
new file mode 100644
index 0000000000..3b49f182bb
--- /dev/null
+++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/nick/filter/package-info.java
@@ -0,0 +1,21 @@
+/**
+ *
+ * Copyright 2018 Miguel Hincapie
+ *
+ * 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.
+ */
+
+/**
+ * Smacks implementation of XEP-0172: User Nickname.
+ */
+package org.jivesoftware.smackx.nick.filter;
diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/nick/NickManagerTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/nick/NickManagerTest.java
new file mode 100644
index 0000000000..755aed75cf
--- /dev/null
+++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/nick/NickManagerTest.java
@@ -0,0 +1,59 @@
+/**
+ *
+ * Copyright Miguel Hincapie
+ *
+ * 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.nick;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.jivesoftware.smack.DummyConnection;
+import org.jivesoftware.smackx.InitExtensions;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class NickManagerTest extends InitExtensions {
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void getInstanceFor() throws Exception {
+ DummyConnection dummyConnection = new DummyConnection();
+ dummyConnection.connect();
+ NickManager nickManager = NickManager.getInstanceFor(dummyConnection);
+ assertNotNull(nickManager);
+ }
+
+ @Test
+ public void addNickMessageListener() {
+ }
+
+ @Test
+ public void removeNickMessageListener() {
+ }
+
+ @Test
+ public void sendNickMessage() {
+ }
+}