Upgrade to smack 4
diff --git a/examples/pubsub-client/pom.xml b/examples/pubsub-client/pom.xml
index 1803ff7..bb52efc 100644
--- a/examples/pubsub-client/pom.xml
+++ b/examples/pubsub-client/pom.xml
@@ -32,12 +32,27 @@
   <dependencies>
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smack</artifactId>
+      <artifactId>smack-tcp</artifactId>
     </dependency>
 
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smackx</artifactId>
+      <artifactId>smack-resolver-javax</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-sasl-javax</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-java7</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-extensions</artifactId>
     </dependency>
   </dependencies>
 
diff --git a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientGUI.java b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientGUI.java
index 9613859..ef986b3 100644
--- a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientGUI.java
+++ b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientGUI.java
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.demo.pubsub.client;
 
+import org.jxmpp.stringprep.XmppStringprepException;
+
 import java.awt.BorderLayout;
 import java.awt.GridLayout;
 
@@ -122,11 +124,16 @@
         createAndShowGUI();
         registerShutDownHook();
 
-        login();
+        try {
+            login();
+        } catch (XmppStringprepException e) {
+            e.printStackTrace();
+            return;
+        }
         pcm.refresh();
     }
 
-    public void login() {
+    public void login() throws XmppStringprepException {
         do {
             askForCredentials();
         } while (pcm.login() == false);
diff --git a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientModel.java b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientModel.java
index 440a995..b72351f 100644
--- a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientModel.java
+++ b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubClientModel.java
@@ -19,22 +19,28 @@
  */
 package org.apache.vysper.demo.pubsub.client;
 
+import java.io.IOException;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
 import javax.swing.DefaultListModel;
 
+import org.jivesoftware.smack.AbstractXMPPConnection;
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.XMPPException;
-import org.jivesoftware.smackx.packet.DiscoverItems;
-import org.jivesoftware.smackx.packet.DiscoverItems.Item;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smackx.disco.packet.DiscoverItems;
+import org.jivesoftware.smackx.disco.packet.DiscoverItems.Item;
 import org.jivesoftware.smackx.pubsub.Affiliation;
 import org.jivesoftware.smackx.pubsub.Node;
+import org.jivesoftware.smackx.pubsub.PubSubException;
 import org.jivesoftware.smackx.pubsub.PubSubManager;
 import org.jivesoftware.smackx.pubsub.Subscription;
+import org.jxmpp.jid.impl.JidCreate;
+import org.jxmpp.stringprep.XmppStringprepException;
 
 public class PubsubClientModel {
     private Map<String, DefaultListModel> nodeMessages = new TreeMap<String, DefaultListModel>();
@@ -43,7 +49,7 @@
 
     private PubsubEventListener pel = new PubsubEventListener(this);
 
-    private XMPPConnection connection;
+    private AbstractXMPPConnection connection;
 
     private PubSubManager pubsubMgr;
 
@@ -69,7 +75,8 @@
         return jid;
     }
 
-    private void discoverAffiliations(Map<String, PubsubNode> lookup) throws XMPPException {
+    private void discoverAffiliations(Map<String, PubsubNode> lookup) throws XMPPException,
+            SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException {
         List<Affiliation> lAffiliations = pubsubMgr.getAffiliations();
         for (Affiliation affiliation : lAffiliations) {
             System.out.print(affiliation.getType());
@@ -81,7 +88,8 @@
         }
     }
 
-    private void discoverSubscriptions(Map<String, PubsubNode> lookup) throws XMPPException {
+    private void discoverSubscriptions(Map<String, PubsubNode> lookup) throws XMPPException,
+            SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException {
         List<Subscription> lSubscriptions = pubsubMgr.getSubscriptions();
         for (Subscription subscription : lSubscriptions) {
             System.out.print(subscription.getState());
@@ -95,11 +103,11 @@
         }
     }
 
-    private void discoverNodes(Map<String, PubsubNode> lookup) throws XMPPException {
+    private void discoverNodes(Map<String, PubsubNode> lookup) throws XMPPException,
+            SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException {
         DiscoverItems di = pubsubMgr.discoverNodes(null);
-        Iterator<Item> iIt = di.getItems();
-        while (iIt.hasNext()) {
-            Item i = iIt.next();
+        List<Item> iIt = di.getItems();
+        for (Item i : iIt) {
             System.out.println("Adding " + i.getNode());
 
             PubsubNode n = new PubsubNode(i.getNode());
@@ -109,45 +117,48 @@
         }
     }
 
-    public boolean login() {
-        XMPPConnection.DEBUG_ENABLED = false;
+    public boolean login() throws XmppStringprepException {
         try {
             connection = connect(username, password, hostname);
-        } catch (XMPPException e) {
+        } catch (XMPPException | IOException | InterruptedException | SmackException e) {
             System.err.println("Login failed for user " + username);
             e.printStackTrace();
             return false;
         }
 
-        pubsubMgr = new PubSubManager(connection, "pubsub.vysper.org");
+        pubsubMgr = PubSubManager.getInstance(connection, JidCreate.bareFrom("pubsub.vysper.org"));
         return true;
     }
 
-    private XMPPConnection connect(String username, String password, String host) throws XMPPException {
-        XMPPConnection connection = new XMPPConnection(host);
+    private AbstractXMPPConnection connect(String username, String password, String host)
+            throws XMPPException, IOException, InterruptedException, SmackException {
+        AbstractXMPPConnection connection = new XMPPTCPConnection(username, password, host);
         connection.connect();
-        connection.login(username, password);
+        connection.login();
         return connection;
     }
 
     public void refresh() {
-        Map<String, PubsubNode> lookup = new HashMap<String, PubsubNode>();
+        Map<String, PubsubNode> lookup = new HashMap<>();
 
         try {
             discoverNodes(lookup);
-        } catch (XMPPException e) {
+        } catch (XMPPException | SmackException.NotConnectedException | InterruptedException
+                | SmackException.NoResponseException e) {
             e.printStackTrace();
         }
 
         try {
             discoverSubscriptions(lookup);
-        } catch (XMPPException e) {
+        } catch (XMPPException | SmackException.NotConnectedException | InterruptedException
+                | SmackException.NoResponseException e) {
             e.printStackTrace();
         }
 
         try {
             discoverAffiliations(lookup);
-        } catch (XMPPException e) {
+        } catch (XMPPException | SmackException.NotConnectedException | InterruptedException
+                | SmackException.NoResponseException e) {
             e.printStackTrace();
         }
 
@@ -160,7 +171,7 @@
                 Node node = pubsubMgr.getNode(n.getNode());
                 node.removeItemEventListener(pel); // remove the listener in cases we already know the node
                 node.addItemEventListener(pel); // add the listener for events
-            } catch (XMPPException e) {
+            } catch (XMPPException | SmackException.NoResponseException | SmackException.NotConnectedException | InterruptedException | PubSubException.NotAPubSubNodeException e) {
                 e.printStackTrace();
             }
         }
diff --git a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubCreateButtonListener.java b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubCreateButtonListener.java
index f3bb9da..bd6324c 100644
--- a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubCreateButtonListener.java
+++ b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubCreateButtonListener.java
@@ -29,6 +29,7 @@
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPException;
 
 public class PubsubCreateButtonListener implements ActionListener {
@@ -50,7 +51,7 @@
                 parent.getPubsubMgr().createNode(nodeID);
                 System.out.println("Node created " + nodeID);
                 parent.refresh();
-            } catch (XMPPException e1) {
+            } catch (XMPPException | SmackException.NoResponseException | SmackException.NotConnectedException | InterruptedException e1) {
                 System.err.println("Couldn't create node " + nodeID);
                 e1.printStackTrace();
             }
diff --git a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubDeleteButtonListener.java b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubDeleteButtonListener.java
index 84764ce..1ea9adf 100644
--- a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubDeleteButtonListener.java
+++ b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubDeleteButtonListener.java
@@ -27,6 +27,7 @@
 import javax.swing.JOptionPane;
 import javax.swing.JTextField;
 
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPException;
 
 public class PubsubDeleteButtonListener implements ActionListener {
@@ -47,7 +48,7 @@
                 parent.getPubsubMgr().deleteNode(nodeID);
                 System.out.println("Node deleted: " + nodeID);
                 parent.refresh();
-            } catch (XMPPException e1) {
+            } catch (XMPPException | SmackException.NoResponseException | SmackException.NotConnectedException | InterruptedException e1) {
                 System.err.println("Couldn't delete node " + nodeID);
                 e1.printStackTrace();
             }
diff --git a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubEventListener.java b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubEventListener.java
index ccf355c..24cb8cd 100644
--- a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubEventListener.java
+++ b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubEventListener.java
@@ -38,7 +38,7 @@
         System.out.println("Got something from " + e.getNodeId());
         
         for (PayloadItem<SimplePayload> i : e.getItems()) {
-            lm.add(0, i.getPayload().toXML()); //alwasy add to the top
+            lm.add(0, i.getPayload().toXML(null)); //alwasy add to the top
         }
     }
 }
diff --git a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubPublishButtonListener.java b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubPublishButtonListener.java
index 66e901b..8ab004c 100644
--- a/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubPublishButtonListener.java
+++ b/examples/pubsub-client/src/main/java/org/apache/vysper/demo/pubsub/client/PubsubPublishButtonListener.java
@@ -24,10 +24,12 @@
 
 import javax.swing.JTextField;
 
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPException;
 import org.jivesoftware.smackx.pubsub.LeafNode;
 import org.jivesoftware.smackx.pubsub.Node;
 import org.jivesoftware.smackx.pubsub.PayloadItem;
+import org.jivesoftware.smackx.pubsub.PubSubException;
 import org.jivesoftware.smackx.pubsub.PubSubManager;
 import org.jivesoftware.smackx.pubsub.SimplePayload;
 
@@ -76,7 +78,7 @@
             } else {
                 throw new IllegalArgumentException("Can only send to leaf nodes");
             }
-        } catch (XMPPException e1) {
+        } catch (XMPPException | SmackException.NotConnectedException | InterruptedException | SmackException.NoResponseException e1) {
             System.err.println("Couldn't send an item to " + nodeID);
             e1.printStackTrace();
         }
@@ -92,7 +94,7 @@
         Node node = null;
         try {
             node = pubsubMgr.getNode(nodeID);
-        } catch (XMPPException e1) {
+        } catch (XMPPException | SmackException.NoResponseException | SmackException.NotConnectedException | InterruptedException | PubSubException.NotAPubSubNodeException e1) {
             System.err.println("Couldn't get the node object for " + nodeID);
             e1.printStackTrace();
         }
diff --git a/pom.xml b/pom.xml
index e1ca8a0..b3470ee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -262,14 +262,32 @@
 
       <dependency>
         <groupId>org.igniterealtime.smack</groupId>
-        <artifactId>smack</artifactId>
-        <version>3.2.1</version>
+        <artifactId>smack-tcp</artifactId>
+        <version>4.3.4</version>
       </dependency>
 
       <dependency>
         <groupId>org.igniterealtime.smack</groupId>
-        <artifactId>smackx</artifactId>
-        <version>3.2.1</version>
+        <artifactId>smack-resolver-javax</artifactId>
+        <version>4.3.4</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.igniterealtime.smack</groupId>
+        <artifactId>smack-sasl-javax</artifactId>
+        <version>4.3.4</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.igniterealtime.smack</groupId>
+        <artifactId>smack-java7</artifactId>
+        <version>4.3.4</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.igniterealtime.smack</groupId>
+        <artifactId>smack-extensions</artifactId>
+        <version>4.3.4</version>
       </dependency>
 
       <dependency>
diff --git a/server/admin-console/pom.xml b/server/admin-console/pom.xml
index 335fc00..dfdc7bc 100644
--- a/server/admin-console/pom.xml
+++ b/server/admin-console/pom.xml
@@ -31,11 +31,23 @@
 
 		<dependency>
 			<groupId>org.igniterealtime.smack</groupId>
-			<artifactId>smack</artifactId>
+			<artifactId>smack-tcp</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.igniterealtime.smack</groupId>
-			<artifactId>smackx</artifactId>
+			<artifactId>smack-resolver-javax</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.igniterealtime.smack</groupId>
+			<artifactId>smack-sasl-javax</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.igniterealtime.smack</groupId>
+			<artifactId>smack-java7</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.igniterealtime.smack</groupId>
+			<artifactId>smack-extensions</artifactId>
 		</dependency>
 
 		<dependency>
diff --git a/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java b/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java
index 01eb269..1caf79b 100644
--- a/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java
+++ b/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java
@@ -22,9 +22,10 @@
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.jivesoftware.smackx.FormField;
-import org.jivesoftware.smackx.packet.AdHocCommandData;
-import org.jivesoftware.smackx.packet.DataForm;
+import org.jivesoftware.smackx.commands.packet.AdHocCommandData;
+import org.jivesoftware.smackx.xdata.packet.DataForm;
+import org.apache.vysper.xmpp.stanza.dataforms.Field;
+import org.jivesoftware.smackx.xdata.FormField;
 
 /**
  * Builds {@link AdHocCommandData} from posted data
@@ -42,7 +43,7 @@
         AdHocCommandData commandData = new AdHocCommandData();
         commandData.setSessionID(getSingleValue(parameters, AdminConsoleController.SESSION_FIELD));
         
-        DataForm form = new DataForm("submit");
+        DataForm form = new DataForm(DataForm.Type.submit);
         
         for(Entry<String, String[]> entry : parameters.entrySet()) {
             if(!AdminConsoleController.SESSION_FIELD.equals(entry.getKey())) {
diff --git a/server/admin-console/src/main/java/org/apache/vysper/console/AdminConsoleController.java b/server/admin-console/src/main/java/org/apache/vysper/console/AdminConsoleController.java
index d3dbcf6..106d98b 100644
--- a/server/admin-console/src/main/java/org/apache/vysper/console/AdminConsoleController.java
+++ b/server/admin-console/src/main/java/org/apache/vysper/console/AdminConsoleController.java
@@ -19,6 +19,7 @@
  */
 package org.apache.vysper.console;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -27,16 +28,17 @@
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
-import org.jivesoftware.smack.ConnectionConfiguration;
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.XMPPException;
 import org.jivesoftware.smack.packet.IQ.Type;
-import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.Stanza;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
 import org.jivesoftware.smackx.commands.AdHocCommand.Action;
 import org.jivesoftware.smackx.commands.AdHocCommand.Status;
 import org.jivesoftware.smackx.commands.AdHocCommandNote;
-import org.jivesoftware.smackx.packet.AdHocCommandData;
-import org.jivesoftware.smackx.packet.DataForm;
+import org.jivesoftware.smackx.commands.packet.AdHocCommandData;
+import org.jivesoftware.smackx.xdata.packet.DataForm;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -46,33 +48,34 @@
 import org.springframework.web.servlet.ModelAndView;
 
 /**
- * MVC controller 
+ * MVC controller
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
 @Controller
 public class AdminConsoleController {
-    
+
     private static final String MODEL_AUTHENTICATED = "authenticated";
 
     public static final String SESSION_ATTRIBUTE = "smack.client";
 
     public static final String SESSION_FIELD = "vysper-admingui-sessionid";
-    
+
     public static final Map<String, String> COMMANDS = new HashMap<String, String>();
     static {
         COMMANDS.put("get-online-users-num", "Get online users");
         COMMANDS.put("add-user", "Add user");
         COMMANDS.put("change-user-password", "Change user password");
     }
-    
-    private ConnectionConfiguration connectionConfiguration;
-    
+
+    private XMPPTCPConnectionConfiguration connectionConfiguration;
+
     private AdHocCommandDataBuilder adHocCommandDataBuilder = new AdHocCommandDataBuilder();
+
     private HtmlFormBuilder htmlFormBuilder = new HtmlFormBuilder();
-    
+
     @Autowired
-    public AdminConsoleController(ConnectionConfiguration connectionConfiguration) {
+    public AdminConsoleController(XMPPTCPConnectionConfiguration connectionConfiguration) {
         this.connectionConfiguration = connectionConfiguration;
     }
 
@@ -82,10 +85,10 @@
     @RequestMapping("/")
     public ModelAndView index(HttpSession session) throws XMPPException {
         ExtendedXMPPConnection client = (ExtendedXMPPConnection) session.getAttribute(SESSION_ATTRIBUTE);
-        if(client == null) {
+        if (client == null) {
             // login
             return login();
-        } else if(!client.isConnected()) {
+        } else if (!client.isConnected()) {
             return login("Disconnected from XMPP server, please log in again");
         } else {
             ModelAndView mav = new ModelAndView("index");
@@ -93,58 +96,59 @@
             return mav;
         }
     }
-    
+
     private String getUserName(XMPPConnection client) {
-        Entity entity = EntityImpl.parseUnchecked(client.getUser());
+        Entity entity = EntityImpl.parseUnchecked(client.getUser().toString());
         return entity.getBareJID().getFullQualifiedName();
     }
-    
+
     /**
      * Show the initial command form
-     */    
-    @RequestMapping(value="/{command}", method=RequestMethod.GET)
+     */
+    @RequestMapping(value = "/{command}", method = RequestMethod.GET)
     public ModelAndView command(@PathVariable("command") String command, HttpSession session) throws XMPPException {
         ExtendedXMPPConnection client = (ExtendedXMPPConnection) session.getAttribute(SESSION_ATTRIBUTE);
-        if(client == null) {
+        if (client == null) {
             // login
             return login();
-        } else if(!client.isConnected()) {
+        } else if (!client.isConnected()) {
             return login("Disconnected from XMPP server, please log in again");
         } else {
-            if(!COMMANDS.keySet().contains(command)) {
+            if (!COMMANDS.keySet().contains(command)) {
                 throw new ResourceNotFoundException();
             }
-            
+
             AdHocCommandData requestCommand = new AdHocCommandData();
-            requestCommand.setType(Type.SET);
+            requestCommand.setType(Type.set);
             requestCommand.setFrom(client.getUser());
-            requestCommand.setTo(client.getServiceName());
+            requestCommand.setTo(client.getXMPPServiceDomain());
             requestCommand.setAction(Action.execute);
             requestCommand.setNode("http://jabber.org/protocol/admin#" + command);
-            
+
             return sendRequestAndGenerateForm(command, client, requestCommand);
         }
     }
 
     /**
      * Handle a submitted form and show the result or additional form
-     */    
-    @RequestMapping(value="/{command}", method=RequestMethod.POST)
-    public ModelAndView submitCommand(@PathVariable("command") String command, HttpServletRequest request, HttpSession session) throws XMPPException {
+     */
+    @RequestMapping(value = "/{command}", method = RequestMethod.POST)
+    public ModelAndView submitCommand(@PathVariable("command") String command, HttpServletRequest request,
+            HttpSession session) throws XMPPException {
         ExtendedXMPPConnection client = (ExtendedXMPPConnection) session.getAttribute(SESSION_ATTRIBUTE);
-        if(client == null) {
+        if (client == null) {
             // login
             return login();
-        } else if(!client.isConnected()) {
+        } else if (!client.isConnected()) {
             return login("Disconnected from XMPP server, please log in again");
         } else {
             @SuppressWarnings("unchecked")
             AdHocCommandData requestCommand = adHocCommandDataBuilder.build(request.getParameterMap());
-            requestCommand.setType(Type.SET);
+            requestCommand.setType(Type.set);
             requestCommand.setFrom(client.getUser());
-            requestCommand.setTo(client.getServiceName());
+            requestCommand.setTo(client.getXMPPServiceDomain());
             requestCommand.setNode("http://jabber.org/protocol/admin#" + command);
-            
+
             return sendRequestAndGenerateForm(command, client, requestCommand);
         }
     }
@@ -152,25 +156,26 @@
     private ModelAndView sendRequestAndGenerateForm(String command, ExtendedXMPPConnection client,
             AdHocCommandData requestCommand) {
         try {
-            Packet response = client.sendSync(requestCommand);
-            
+            Stanza response = client.sendSync(requestCommand);
+
             StringBuffer htmlForm = new StringBuffer();
-            if(response != null) {
+            if (response != null) {
                 AdHocCommandData responseData = (AdHocCommandData) response;
                 DataForm form = responseData.getForm();
-                
-                for(AdHocCommandNote note : responseData.getNotes()) {
+
+                for (AdHocCommandNote note : responseData.getNotes()) {
                     htmlForm.append("<p class='note " + note.getType() + "'>" + note.getValue() + "</p>");
                 }
-                
+
                 htmlForm.append("<form action='' method='post'>");
-                htmlForm.append("<input type='hidden' name='" + SESSION_FIELD + "' value='" + responseData.getSessionID() + "' />");
-    
+                htmlForm.append("<input type='hidden' name='" + SESSION_FIELD + "' value='"
+                        + responseData.getSessionID() + "' />");
+
                 htmlForm.append(htmlFormBuilder.build(form));
-                if(Status.executing.equals(responseData.getStatus())) {
+                if (Status.executing.equals(responseData.getStatus())) {
                     htmlForm.append("<input type='submit' value='" + COMMANDS.get(command) + "' />");
-                } else if(Status.completed.equals(responseData.getStatus())) {
-                    if(form == null || form.getFields() == null || !form.getFields().hasNext()) {
+                } else if (Status.completed.equals(responseData.getStatus())) {
+                    if (form == null || form.getFields() == null || form.getFields().isEmpty()) {
                         // no field, print success
                         htmlForm.append("<p>Command successful</p>");
                     }
@@ -178,14 +183,14 @@
                 htmlForm.append("</form>");
             } else {
                 htmlForm.append("<p class='note error'>Timeout waiting for response from XMPP server</p>");
-                
+
             }
-                
+
             ModelAndView mav = new ModelAndView("command");
             mav.addObject(MODEL_AUTHENTICATED, getUserName(client));
             mav.addObject("form", htmlForm.toString());
             return mav;
-        } catch (InterruptedException e) {
+        } catch (InterruptedException | SmackException.NotConnectedException e) {
             throw new RuntimeException(e);
         }
     }
@@ -203,19 +208,20 @@
     protected ExtendedXMPPConnection createXMPPConnection() {
         return new ExtendedXMPPConnection(connectionConfiguration);
     }
-    
+
     /**
-     * Connect and authenticate the user 
+     * Connect and authenticate the user
      */
-    @RequestMapping(value="/login", method=RequestMethod.POST)
-    public ModelAndView login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) {
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    public ModelAndView login(@RequestParam("username") String username, @RequestParam("password") String password,
+            HttpSession session) {
         ExtendedXMPPConnection client = createXMPPConnection();
         try {
             client.connect();
             client.login(username, password);
             session.setAttribute(SESSION_ATTRIBUTE, client);
             return new ModelAndView("redirect:");
-        } catch (XMPPException e) {
+        } catch (XMPPException | SmackException | IOException | InterruptedException e) {
             ModelAndView mav = new ModelAndView("index");
             mav.addObject("error", "Failed to login to server: " + e.getMessage());
             return mav;
@@ -225,10 +231,10 @@
     /**
      * Log out and disconnect the user
      */
-    @RequestMapping(value="/logout")
+    @RequestMapping(value = "/logout")
     public ModelAndView logout(HttpSession session) {
         ExtendedXMPPConnection client = (ExtendedXMPPConnection) session.getAttribute(SESSION_ATTRIBUTE);
-        if(client != null) {
+        if (client != null) {
             client.disconnect();
             session.removeAttribute(SESSION_ATTRIBUTE);
         }
diff --git a/server/admin-console/src/main/java/org/apache/vysper/console/ExtendedXMPPConnection.java b/server/admin-console/src/main/java/org/apache/vysper/console/ExtendedXMPPConnection.java
index caa8790..4ecf501 100644
--- a/server/admin-console/src/main/java/org/apache/vysper/console/ExtendedXMPPConnection.java
+++ b/server/admin-console/src/main/java/org/apache/vysper/console/ExtendedXMPPConnection.java
@@ -24,76 +24,74 @@
 
 import javax.security.auth.callback.CallbackHandler;
 
-import org.jivesoftware.smack.ConnectionConfiguration;
-import org.jivesoftware.smack.PacketListener;
+import org.jivesoftware.smack.SmackException;
+import org.jivesoftware.smack.StanzaListener;
 import org.jivesoftware.smack.XMPPConnection;
-import org.jivesoftware.smack.filter.PacketFilter;
-import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.filter.StanzaFilter;
+import org.jivesoftware.smack.packet.Stanza;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
 
 /**
- * Extends {@link XMPPConnection} to add support for synchronous request-response
+ * Extends {@link XMPPConnection} to add support for synchronous
+ * request-response
  * 
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
-public class ExtendedXMPPConnection extends XMPPConnection {
-    
-    public ExtendedXMPPConnection(ConnectionConfiguration config, CallbackHandler callbackHandler) {
-        super(config, callbackHandler);
-    }
+public class ExtendedXMPPConnection extends XMPPTCPConnection {
 
-    public ExtendedXMPPConnection(ConnectionConfiguration config) {
+    public ExtendedXMPPConnection(XMPPTCPConnectionConfiguration config) {
         super(config);
     }
 
-    public ExtendedXMPPConnection(String serviceName, CallbackHandler callbackHandler) {
-        super(serviceName, callbackHandler);
-    }
+//    public ExtendedXMPPConnection(String serviceName) {
+//        super(serviceName);
+//    }
 
-    public ExtendedXMPPConnection(String serviceName) {
-        super(serviceName);
-    }
-
-    public static class IdPacketFilter implements PacketFilter {
+    public static class IdPacketFilter implements StanzaFilter {
         private String id;
 
         public IdPacketFilter(String id) {
             this.id = id;
         }
 
-        public boolean accept(Packet packet) {
-            return id.equals(packet.getPacketID());
+        @Override
+        public boolean accept(Stanza stanza) {
+            return id.equals(stanza.getStanzaId());
         }
     }
-    
-    public static class SyncPacketListener implements PacketListener {
-        private LinkedBlockingQueue<Packet> queue;
 
-        public SyncPacketListener(LinkedBlockingQueue<Packet> queue) {
+    public static class SyncPacketListener implements StanzaListener {
+        private LinkedBlockingQueue<Stanza> queue;
+
+        public SyncPacketListener(LinkedBlockingQueue<Stanza> queue) {
             this.queue = queue;
         }
 
-        public void processPacket(Packet packet) {
+        @Override
+        public void processStanza(Stanza packet) {
             queue.offer(packet);
         }
     }
-    
+
     /**
      * Send a request and wait for the response.
+     * 
      * @param request
      * @return
      * @throws InterruptedException
      */
-    public Packet sendSync(Packet request) throws InterruptedException {
-        LinkedBlockingQueue<Packet> queue = new LinkedBlockingQueue<Packet>();
-        PacketListener listener = new SyncPacketListener(queue);
-        PacketFilter filter = new IdPacketFilter(request.getPacketID());
-        
-        addPacketListener(listener, filter);
-        sendPacket(request);
-        
-        Packet response = queue.poll(10000, TimeUnit.MILLISECONDS);
-        removePacketListener(listener);
-        
+    public Stanza sendSync(Stanza request) throws InterruptedException, SmackException.NotConnectedException {
+        LinkedBlockingQueue<Stanza> queue = new LinkedBlockingQueue<>();
+        StanzaListener listener = new SyncPacketListener(queue);
+        StanzaFilter filter = new IdPacketFilter(request.getPacketID());
+
+        addSyncStanzaListener(listener, filter);
+        sendStanza(request);
+
+        Stanza response = queue.poll(10000, TimeUnit.MILLISECONDS);
+        removeSyncStanzaListener(listener);
+
         return response;
     }
 }
diff --git a/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java b/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java
index 27acfdf..00002fd 100644
--- a/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java
+++ b/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java
@@ -23,9 +23,8 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.jivesoftware.smackx.FormField;
-import org.jivesoftware.smackx.FormField.Option;
-import org.jivesoftware.smackx.packet.DataForm;
+import org.jivesoftware.smackx.xdata.FormField;
+import org.jivesoftware.smackx.xdata.packet.DataForm;
 
 /**
  * Builds an HTML form from a {@link DataForm}
@@ -44,36 +43,36 @@
             return "";
 
         StringBuilder sb = new StringBuilder();
-        Iterator<String> instructions = form.getInstructions();
-        while (instructions.hasNext()) {
-            sb.append("<p class='instruction'>" + instructions.next() + "</p>");
+        List<String> instructions = form.getInstructions();
+        for (String instruction: instructions) {
+            sb.append("<p class='instruction'>" + instruction + "</p>");
         }
 
-        Iterator<FormField> fields = form.getFields();
+        Iterator<FormField> fields = form.getFields().iterator();
         while (fields.hasNext()) {
             FormField field = fields.next();
-            String type = field.getType();
+            FormField.Type type = field.getType();
             sb.append("<p>");
-            if ("hidden".equals(type)) {
+            if (type == FormField.Type.hidden) {
                 sb.append(hiddenFieldToHtml(field));
-            } else if ("fixed".equals(type)) {
+            } else if (type == FormField.Type.fixed) {
                 sb.append(fixedFieldToHtml(field));
-            } else if ("jid-single".equals(type)) {
+            } else if (type == FormField.Type.jid_single) {
                 sb.append(jidSingleFieldToHtml(field));
-            } else if ("text-single".equals(type) || type == null) {
+            } else if (type == FormField.Type.text_single || type == null) {
                 sb.append(textSingleFieldToHtml(field));
-            } else if ("text-private".equals(type)) {
+            } else if (type == FormField.Type.text_private) {
                 sb.append(textPrivateFieldToHtml(field));
-            } else if ("text-multi".equals(type)) {
+            } else if (type == FormField.Type.text_multi) {
                 sb.append(textMultiFieldToHtml(field));
-            } else if ("list-single".equals(type)) {
+            } else if (type == FormField.Type.list_single) {
                 sb.append(listSingleFieldToHtml(field));
-            } else if ("list-multi".equals(type)) {
+            } else if (type == FormField.Type.list_multi) {
                 sb.append(listMultiFieldToHtml(field));
-            } else if ("jid-multi".equals(type)) {
+            } else if (type == FormField.Type.jid_multi) {
                 // for now, do jid-multi as a textarea
                 sb.append(textMultiFieldToHtml(field));
-            } else if ("boolean".equals(type)) {
+            } else if (type == FormField.Type.bool) {
                 sb.append(booleanFieldToHtml(field));
             } else {
                 throw new RuntimeException("Unknown field type: " + type);
@@ -111,7 +110,7 @@
         StringBuilder sb = new StringBuilder();
         if (field.getLabel() != null)
             sb.append(field.getLabel());
-        sb.append(" <span>" + field.getValues().next() + "</span>");
+        sb.append(" <span>" + field.getValues().get(0) + "</span>");
         return sb.toString();
     }
 
@@ -141,7 +140,7 @@
         sb.append("'>");
         
         boolean first = true;
-        Iterator<String> values = field.getValues();
+        Iterator<CharSequence> values = field.getValues().iterator();
         while(values.hasNext()) {
             if(!first) sb.append("\r\n");
             sb.append(values.next());
@@ -153,16 +152,16 @@
     }
     
     private String listSingleFieldToHtml(FormField field) {
-        Iterator<String> fieldValues = field.getValues();
-        List<String> values = new ArrayList<String>();
+        Iterator<CharSequence> fieldValues = field.getValues().iterator();
+        List<CharSequence> values = new ArrayList<>();
         if(fieldValues.hasNext()) values.add(fieldValues.next());
         
         return listFieldToHtml(field, values, false);
     }
 
     private String listMultiFieldToHtml(FormField field) {
-        Iterator<String> fieldValues = field.getValues();
-        List<String> values = new ArrayList<String>();
+        Iterator<CharSequence> fieldValues = field.getValues().iterator();
+        List<CharSequence> values = new ArrayList<>();
         while(fieldValues.hasNext()) {
             values.add(fieldValues.next());
         }
@@ -170,7 +169,7 @@
         return listFieldToHtml(field, values, true);
     }
 
-    private String listFieldToHtml(FormField field, List<String> values, boolean multiple) {
+    private String listFieldToHtml(FormField field, List<CharSequence> values, boolean multiple) {
         StringBuilder sb = new StringBuilder();
         sb.append(labelToHtml(field));
         sb.append("<select id='");
@@ -183,10 +182,10 @@
         }
         sb.append(">");
         
-        Iterator<Option> options = field.getOptions();
+        Iterator<FormField.Option> options = field.getOptions().iterator();
         
         while(options.hasNext()) {
-            Option option = options.next();
+            FormField.Option option = options.next();
             sb.append("<option value='");
             sb.append(option.getValue());
             sb.append("'");
@@ -214,7 +213,7 @@
     
     private String booleanFieldToHtml(FormField field) {
         StringBuilder sb = new StringBuilder();
-        boolean value = (field.getValues().hasNext() && "true".equals(field.getValues().next()));
+        boolean value = (!field.getValues().isEmpty() && "true".equals(field.getValues().get(0).toString()));
         
         sb.append(labelToHtml(field));
         sb.append("<input name='");
@@ -257,9 +256,9 @@
         return field.isRequired() ? "required" : "";
     }
 
-    private String getSingleValue(FormField field) {
-        if (field.getValues().hasNext()) {
-            return field.getValues().next();
+    private CharSequence getSingleValue(FormField field) {
+        if (!field.getValues().isEmpty()) {
+            return field.getValues().get(0);
         } else {
             return "";
         }
diff --git a/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java b/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java
index 2112c1f..5bd8e1c 100644
--- a/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java
+++ b/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java
@@ -23,9 +23,9 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import org.jivesoftware.smackx.FormField;
-import org.jivesoftware.smackx.packet.AdHocCommandData;
-import org.jivesoftware.smackx.packet.DataForm;
+import org.jivesoftware.smackx.commands.packet.AdHocCommandData;
+import org.jivesoftware.smackx.xdata.FormField;
+import org.jivesoftware.smackx.xdata.packet.DataForm;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -57,10 +57,10 @@
         AdHocCommandData commandData = builder.build(parameters);
         
         DataForm form = commandData.getForm();
-        Assert.assertTrue(form.getFields().hasNext());
-        FormField field = form.getFields().next();
+        Assert.assertFalse(form.getFields().isEmpty());
+        FormField field = form.getFields().get(0);
         
-        Iterator<String> values = field.getValues();
+        Iterator<CharSequence> values = field.getValues().iterator();
         Assert.assertEquals("value 1", values.next());
         Assert.assertEquals("value 2", values.next());
         Assert.assertFalse(values.hasNext());
diff --git a/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java b/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java
index dae3522..4611cd8 100644
--- a/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java
+++ b/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java
@@ -21,19 +21,24 @@
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPException;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.springframework.web.servlet.ModelAndView;
 
+import java.io.IOException;
+
+import static org.mockito.Mockito.mock;
+
 
 public class AdminConsoleControllerTest {
     
     private static final String ENTITY = "test@vysper.org";
     private static final String PASSWORD = "password";
 
-    private ExtendedXMPPConnection connection = Mockito.mock(ExtendedXMPPConnection.class);
+    private ExtendedXMPPConnection connection = mock(ExtendedXMPPConnection.class);
     
     private AdminConsoleController controller = new AdminConsoleController(null) {
         @Override
@@ -42,11 +47,11 @@
         }
     };
     
-    private HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+    private HttpServletRequest request = mock(HttpServletRequest.class);
     private MockHttpSession session = new MockHttpSession();
     
     @Test
-    public void login() throws XMPPException {
+    public void login() throws XMPPException, InterruptedException, IOException, SmackException {
         ModelAndView mav = controller.login(ENTITY, PASSWORD, session);
         
         Mockito.verify(connection).connect();
@@ -57,8 +62,9 @@
     }
 
     @Test
-    public void failedLogin() throws XMPPException {
-        Mockito.doThrow(new XMPPException()).when(connection).login(ENTITY, PASSWORD);
+    public void failedLogin() throws XMPPException, InterruptedException, IOException, SmackException {
+        XMPPException xmppException = mock(XMPPException.class);
+        Mockito.doThrow(xmppException).when(connection).login(ENTITY, PASSWORD);
         
         ModelAndView mav = controller.login(ENTITY, PASSWORD, session);
         
@@ -72,8 +78,9 @@
     }
 
     @Test
-    public void failedConnect() throws XMPPException {
-        Mockito.doThrow(new XMPPException()).when(connection).connect();
+    public void failedConnect() throws XMPPException, InterruptedException, IOException, SmackException {
+        XMPPException xmppException = mock(XMPPException.class);
+        Mockito.doThrow(xmppException).when(connection).connect();
         
         ModelAndView mav = controller.login(ENTITY, PASSWORD, session);
         
diff --git a/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java b/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java
index 54ad4b5..cd6250b 100644
--- a/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java
+++ b/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java
@@ -19,9 +19,8 @@
  */
 package org.apache.vysper.console;
 
-import org.jivesoftware.smackx.FormField;
-import org.jivesoftware.smackx.FormField.Option;
-import org.jivesoftware.smackx.packet.DataForm;
+import org.jivesoftware.smackx.xdata.FormField;
+import org.jivesoftware.smackx.xdata.packet.DataForm;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -33,13 +32,13 @@
     private static final String VALUE2 = "Value 2";
     private static final String VALUE3 = "Value 3";
 
-    private DataForm form = new DataForm("form");
+    private DataForm form = new DataForm(DataForm.Type.form);
     private HtmlFormBuilder builder = new HtmlFormBuilder();
 
     @Test
     public void testHiddenField() {
         FormField field = new FormField("abc def");
-        field.setType("hidden");
+        field.setType(FormField.Type.hidden);
         field.addValue(VALUE1);
         form.addField(field);
         
@@ -52,7 +51,7 @@
     @Test
     public void testTextPrivateField() {
         FormField field = new FormField("abc def");
-        field.setType("text-private");
+        field.setType(FormField.Type.text_private);
         field.addValue(VALUE1);
         form.addField(field);
         
@@ -65,7 +64,7 @@
     @Test
     public void testTextSingleField() {
         FormField field = new FormField("abc def");
-        field.setType("text-single");
+        field.setType(FormField.Type.text_single);
         field.addValue(VALUE1);
         form.addField(field);
         
@@ -77,8 +76,7 @@
 
     @Test
     public void testFixedField() {
-        FormField field = new FormField("abc def");
-        field.setType("fixed");
+        FormField field = new FormField();
         field.addValue(VALUE1);
         field.setLabel(LABEL);
         form.addField(field);
@@ -92,7 +90,7 @@
     @Test
     public void testJidSingleField() {
         FormField field = new FormField("abc def");
-        field.setType("jid-single");
+        field.setType(FormField.Type.jid_single);
         field.addValue(VALUE1);
         form.addField(field);
         
@@ -105,7 +103,7 @@
     @Test
     public void testTextMultiField() {
         FormField field = new FormField("abc def");
-        field.setType("text-multi");
+        field.setType(FormField.Type.text_multi);
         field.addValue(VALUE1);
         field.addValue(VALUE2);
         field.addValue(VALUE3);
@@ -120,7 +118,7 @@
     @Test
     public void testJidMultiField() {
         FormField field = new FormField("abc def");
-        field.setType("jid-multi");
+        field.setType(FormField.Type.jid_multi);
         field.addValue(VALUE1);
         field.addValue(VALUE2);
         field.addValue(VALUE3);
@@ -135,9 +133,9 @@
     @Test
     public void listSingleFieldNoValue() {
         FormField field = new FormField("abc def");
-        field.setType("list-single");
-        field.addOption(new Option("Label 1", VALUE1));
-        field.addOption(new Option(VALUE2));
+        field.setType(FormField.Type.list_single);
+        field.addOption(new FormField.Option("Label 1", VALUE1));
+        field.addOption(new FormField.Option(VALUE2));
         form.addField(field);
         
         String actual = builder.build(form);
@@ -149,9 +147,9 @@
     @Test
     public void listSingleFieldWithValue() {
         FormField field = new FormField("abc def");
-        field.setType("list-single");
-        field.addOption(new Option("Label 1", VALUE1));
-        field.addOption(new Option(VALUE2));
+        field.setType(FormField.Type.list_single);
+        field.addOption(new FormField.Option("Label 1", VALUE1));
+        field.addOption(new FormField.Option(VALUE2));
         field.addValue(VALUE1);
         form.addField(field);
         
@@ -164,9 +162,9 @@
     @Test
     public void listMultiFieldNoValue() {
         FormField field = new FormField("abc def");
-        field.setType("list-multi");
-        field.addOption(new Option("Label 1", VALUE1));
-        field.addOption(new Option(VALUE2));
+        field.setType(FormField.Type.list_multi);
+        field.addOption(new FormField.Option("Label 1", VALUE1));
+        field.addOption(new FormField.Option(VALUE2));
         form.addField(field);
         
         String actual = builder.build(form);
@@ -178,10 +176,10 @@
     @Test
     public void listMultiFieldWithValue() {
         FormField field = new FormField("abc def");
-        field.setType("list-multi");
-        field.addOption(new Option("Label 1", VALUE1));
-        field.addOption(new Option(VALUE2));
-        field.addOption(new Option(VALUE3));
+        field.setType(FormField.Type.list_multi);
+        field.addOption(new FormField.Option("Label 1", VALUE1));
+        field.addOption(new FormField.Option(VALUE2));
+        field.addOption(new FormField.Option(VALUE3));
         field.addValue(VALUE1);
         field.addValue(VALUE3);
         form.addField(field);
@@ -200,7 +198,7 @@
     @Test
     public void testBooleanFieldDefault() {
         FormField field = new FormField("abc def");
-        field.setType("boolean");
+        field.setType(FormField.Type.bool);
         form.addField(field);
         
         String actual = builder.build(form);
@@ -212,7 +210,7 @@
     @Test
     public void testBooleanFieldWithValue() {
         FormField field = new FormField("abc def");
-        field.setType("boolean");
+        field.setType(FormField.Type.bool);
         field.addValue("true");
         form.addField(field);
         
diff --git a/server/core-inttest/pom.xml b/server/core-inttest/pom.xml
index 6ce5ad4..2516969 100644
--- a/server/core-inttest/pom.xml
+++ b/server/core-inttest/pom.xml
@@ -55,13 +55,31 @@
 
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smack</artifactId>
+      <artifactId>smack-tcp</artifactId>
       <scope>test</scope>
     </dependency>
 
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smackx</artifactId>
+      <artifactId>smack-resolver-javax</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-sasl-javax</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-java7</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-extensions</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/server/core-inttest/src/test/java/org/apache/vysper/smack/BasicClient.java b/server/core-inttest/src/test/java/org/apache/vysper/smack/BasicClient.java
index c58c18c..80f177e 100644
--- a/server/core-inttest/src/test/java/org/apache/vysper/smack/BasicClient.java
+++ b/server/core-inttest/src/test/java/org/apache/vysper/smack/BasicClient.java
@@ -21,44 +21,52 @@
 
 import java.util.Random;
 
-import org.jivesoftware.smack.Chat;
+import org.apache.vysper.xmpp.authentication.Plain;
+import org.apache.vysper.xmpp.cryptography.NonCheckingX509TrustManagerFactory;
 import org.jivesoftware.smack.ConnectionConfiguration;
-import org.jivesoftware.smack.MessageListener;
-import org.jivesoftware.smack.PacketListener;
-import org.jivesoftware.smack.Roster;
 import org.jivesoftware.smack.SASLAuthentication;
+import org.jivesoftware.smack.SmackException;
+import org.jivesoftware.smack.StanzaListener;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.XMPPException;
-import org.jivesoftware.smack.filter.PacketFilter;
+import org.jivesoftware.smack.chat2.Chat;
+import org.jivesoftware.smack.chat2.ChatManager;
+import org.jivesoftware.smack.debugger.ConsoleDebugger;
+import org.jivesoftware.smack.packet.ExtensionElement;
 import org.jivesoftware.smack.packet.IQ;
-import org.jivesoftware.smack.packet.Message;
-import org.jivesoftware.smack.packet.Packet;
-import org.jivesoftware.smack.packet.PacketExtension;
 import org.jivesoftware.smack.packet.Presence;
-import org.jivesoftware.smackx.packet.Time;
-import org.jivesoftware.smackx.packet.Version;
+import org.jivesoftware.smack.packet.Stanza;
+import org.jivesoftware.smack.roster.Roster;
+import org.jivesoftware.smack.sasl.SASLMechanism;
+import org.jivesoftware.smack.sasl.core.SCRAMSHA1Mechanism;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
+import org.jivesoftware.smackx.iqversion.packet.Version;
+import org.jivesoftware.smackx.time.packet.Time;
+import org.jxmpp.jid.impl.JidCreate;
 
 /**
  */
 public class BasicClient {
 
-    static class IQListener implements PacketListener {
+    static class IQListener implements StanzaListener {
 
-        public void processPacket(Packet packet) {
+        public void processStanza(Stanza packet) {
             IQ iq = (IQ) packet;
             String iqString = iq.toString();
-            System.out.println("T" + System.currentTimeMillis() + " IQ: " + iqString + ": " + iq.toXML());
+            System.out.println("T" + System.currentTimeMillis() + " IQ: " + iqString + ": " + iq.toXML(null));
         }
     }
 
-    static class PresenceListener implements PacketListener {
+    static class PresenceListener implements StanzaListener {
 
-        public void processPacket(Packet packet) {
+        public void processStanza(Stanza packet) {
             Presence presence = (Presence) packet;
             String iqString = presence.toString();
-            final PacketExtension extension = presence.getExtension("http://jabber.org/protocol/caps");
+            final ExtensionElement extension = presence.getExtension("http://jabber.org/protocol/caps");
             if (extension != null)
-                System.out.println("T" + System.currentTimeMillis() + " Pres: " + iqString + ": " + presence.toXML());
+                System.out
+                        .println("T" + System.currentTimeMillis() + " Pres: " + iqString + ": " + presence.toXML(null));
         }
     }
 
@@ -68,39 +76,23 @@
         String to = args.length < 2 ? null : args[1];
 
         try {
-            ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("localhost");
-            //            ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("xmpp.eu");
-            connectionConfiguration.setCompressionEnabled(false);
-            connectionConfiguration.setSelfSignedCertificateEnabled(true);
-            connectionConfiguration.setExpiredCertificatesCheckEnabled(false);
-            connectionConfiguration.setDebuggerEnabled(true);
-            connectionConfiguration.setSASLAuthenticationEnabled(true);
-            connectionConfiguration.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
-            XMPPConnection.DEBUG_ENABLED = true;
-            XMPPConnection connection = new XMPPConnection(connectionConfiguration);
+            XMPPTCPConnectionConfiguration connectionConfiguration = XMPPTCPConnectionConfiguration.builder()
+                    .setHost("localhost").setCompressionEnabled(false)
+                    .setCustomX509TrustManager(NonCheckingX509TrustManagerFactory.X509)
+                    .setDebuggerFactory(ConsoleDebugger.Factory.INSTANCE)
+                    .addEnabledSaslMechanism(SASLMechanism.PLAIN)
+                    .setSecurityMode(ConnectionConfiguration.SecurityMode.required).build();
+
+            XMPPTCPConnection connection = new XMPPTCPConnection(connectionConfiguration);
             connection.connect();
 
-            SASLAuthentication saslAuthentication = connection.getSASLAuthentication();
-            //            saslAuthentication.authenticateAnonymously();
-            //            saslAuthentication.authenticate("user1@vysper.org", "password1", "test");
-
-            //            if (!saslAuthentication.isAuthenticated()) return;
-
             connection.login(me + "@vysper.org", "password1");
 
-            connection.getRoster().setSubscriptionMode(Roster.SubscriptionMode.accept_all);
+            Roster.getInstanceFor(connection).setSubscriptionMode(Roster.SubscriptionMode.accept_all);
 
-            connection.addPacketListener(new IQListener(), new PacketFilter() {
-                public boolean accept(Packet packet) {
-                    return packet instanceof IQ;
-                }
-            });
+            connection.addSyncStanzaListener(new IQListener(), packet -> packet instanceof IQ);
 
-            connection.addPacketListener(new PresenceListener(), new PacketFilter() {
-                public boolean accept(Packet packet) {
-                    return packet instanceof Presence;
-                }
-            });
+            connection.addSyncStanzaListener(new PresenceListener(), packet -> packet instanceof Presence);
 
             Chat chat = null;
             if (to != null) {
@@ -108,16 +100,16 @@
                 presence.setFrom(connection.getUser());
                 String toEntity = to + "@vysper.org";
                 presence.setTo(toEntity);
-                connection.sendPacket(presence);
+                connection.sendStanza(presence);
 
-                chat = connection.getChatManager().createChat(toEntity, new MessageListener() {
-                    public void processMessage(Chat inchat, Message message) {
-                        System.out.println("log received message: " + message.getBody());
-                    }
+                ChatManager chatManager = ChatManager.getInstanceFor(connection);
+                chat = chatManager.chatWith(JidCreate.entityBareFrom(toEntity));
+                chatManager.addIncomingListener((from, message, chat1) -> {
+                    System.out.println("log received message: " + message.getBody());
                 });
             }
 
-            connection.sendPacket(new Presence(Presence.Type.available, "pommes", 1, Presence.Mode.available));
+            connection.sendStanza(new Presence(Presence.Type.available, "pommes", 1, Presence.Mode.available));
 
             Thread.sleep(1000);
 
@@ -127,19 +119,20 @@
             // query server time
             sendIQGetWithTimestamp(connection, new Time());
 
-            /*            while (to != null) {
-            //                chat.sendMessage("Hello " + to + " at " + new Date());
-                            try { Thread.sleep((new Random().nextInt(15)+1)*1000 ); } catch (InterruptedException e) { ; }
-                        }*/
+            /*
+             * while (to != null) { // chat.sendMessage("Hello " + to + " at " + new
+             * Date()); try { Thread.sleep((new Random().nextInt(15)+1)*1000 ); } catch
+             * (InterruptedException e) { ; } }
+             */
 
             for (int i = 0; i < 10; i++) {
-                connection.sendPacket(new Presence(Presence.Type.available, "pommes", 1, Presence.Mode.available));
+                connection.sendStanza(new Presence(Presence.Type.available, "pommes", 1, Presence.Mode.available));
                 try {
                     Thread.sleep((new Random().nextInt(15) + 10) * 1000);
                 } catch (InterruptedException e) {
                     ;
                 }
-                connection.sendPacket(new Presence(Presence.Type.available, "nickes", 1, Presence.Mode.away));
+                connection.sendStanza(new Presence(Presence.Type.available, "nickes", 1, Presence.Mode.away));
                 try {
                     Thread.sleep((new Random().nextInt(15) + 10) * 1000);
                 } catch (InterruptedException e) {
@@ -162,14 +155,15 @@
             } catch (InterruptedException ie) {
                 ;
             }
-            e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+            e.printStackTrace(); // To change body of catch statement use File | Settings | File Templates.
         }
         System.exit(0);
     }
 
-    private static void sendIQGetWithTimestamp(XMPPConnection connection, IQ iq) {
-        iq.setType(IQ.Type.GET);
-        connection.sendPacket(iq);
+    private static void sendIQGetWithTimestamp(XMPPConnection connection, IQ iq)
+            throws SmackException.NotConnectedException, InterruptedException {
+        iq.setType(IQ.Type.get);
+        connection.sendStanza(iq);
         System.out.println("T" + System.currentTimeMillis() + " IQ request sent");
     }
 }
diff --git a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/AbstractIntegrationTestCase.java b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/AbstractIntegrationTestCase.java
index bde7baf..34d3058 100644
--- a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/AbstractIntegrationTestCase.java
+++ b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/AbstractIntegrationTestCase.java
@@ -31,16 +31,27 @@
 import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.authentication.AccountManagement;
+import org.apache.vysper.xmpp.cryptography.NonCheckingX509TrustManagerFactory;
 import org.apache.vysper.xmpp.server.XMPPServer;
 import org.jivesoftware.smack.ConnectionConfiguration;
-import org.jivesoftware.smack.PacketCollector;
 import org.jivesoftware.smack.SmackConfiguration;
+import org.jivesoftware.smack.SmackException;
+import org.jivesoftware.smack.StanzaCollector;
 import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.debugger.ConsoleDebugger;
 import org.jivesoftware.smack.filter.PacketIDFilter;
+import org.jivesoftware.smack.filter.StanzaIdFilter;
 import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.Stanza;
+import org.jivesoftware.smack.sasl.SASLMechanism;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSession;
+
 /**
  */
 public abstract class AbstractIntegrationTestCase extends TestCase {
@@ -59,7 +70,7 @@
 
     private static final int DEFAULT_SERVER_PORT = 25222;
 
-    protected XMPPConnection client;
+    protected XMPPTCPConnection client;
 
     private XMPPServer server;
 
@@ -72,7 +83,7 @@
     @Override
     protected void setUp() throws Exception {
         // make sure Smack times out after 5 seconds
-        SmackConfiguration.setPacketReplyTimeout(5000);
+        SmackConfiguration.setDefaultReplyTimeout(5000);
 
         port = findFreePort();
 
@@ -105,30 +116,34 @@
         Thread.sleep(200);
     }
 
-    protected XMPPConnection connectClient(int port, String username, String password) throws Exception {
-        ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("localhost", port);
-        connectionConfiguration.setCompressionEnabled(false);
-        connectionConfiguration.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
-        connectionConfiguration.setSASLAuthenticationEnabled(true);
-        connectionConfiguration.setDebuggerEnabled(false);
-        connectionConfiguration.setKeystorePath("src/main/config/bogus_mina_tls.cert");
-        connectionConfiguration.setTruststorePath("src/main/config/bogus_mina_tls.cert");
-        connectionConfiguration.setTruststorePassword("boguspw");
+    protected XMPPTCPConnection connectClient(int port, String username, String password) throws Exception {
+        XMPPTCPConnectionConfiguration connectionConfiguration = XMPPTCPConnectionConfiguration
+                .builder()
+                .setHost("localhost")
+                .setXmppDomain(SERVER_DOMAIN)
+                .setPort(port)
+                .setCompressionEnabled(false)
+                .setSecurityMode(ConnectionConfiguration.SecurityMode.required)
+                .addEnabledSaslMechanism(SASLMechanism.PLAIN)
+                .setHostnameVerifier((hostname, session) -> true)
+                .setDebuggerFactory(ConsoleDebugger.Factory.INSTANCE)
+                .setKeystorePath("src/main/config/bogus_mina_tls.cert")
+                .setCustomX509TrustManager(NonCheckingX509TrustManagerFactory.X509)
+                .build();
 
-        XMPPConnection.DEBUG_ENABLED = true;
-        XMPPConnection client = new XMPPConnection(connectionConfiguration);
+        XMPPTCPConnection client = new XMPPTCPConnection(connectionConfiguration);
 
         client.connect();
-
         client.login(username, password);
+
         return client;
     }
 
-    protected Packet sendSync(XMPPConnection client, Packet request) {
+    protected Stanza sendSync(XMPPConnection client, Stanza request) throws SmackException.NotConnectedException, InterruptedException {
         // Create a packet collector to listen for a response.
-        PacketCollector collector = client.createPacketCollector(new PacketIDFilter(request.getPacketID()));
+        StanzaCollector collector = client.createStanzaCollector(new StanzaIdFilter(request.getStanzaId()));
 
-        client.sendPacket(request);
+        client.sendStanza(request);
 
         // Wait up to 5 seconds for a result.
         return collector.nextResult(5000);
diff --git a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/PingPacket.java b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/PingPacket.java
index 8599872..7683c20 100644
--- a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/PingPacket.java
+++ b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/PingPacket.java
@@ -22,9 +22,15 @@
 import org.jivesoftware.smack.packet.IQ;
 
 public class PingPacket extends IQ {
+
+    public PingPacket() {
+        super("ping", "urn:xmpp:ping");
+    }
+
     @Override
-    public String getChildElementXML() {
-        return "<ping xmlns='urn:xmpp:ping'/>";
+    protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
+        xml.setEmptyElement();
+        return xml;
     }
 
 }
\ No newline at end of file
diff --git a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIntegrationTestCase.java b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIntegrationTestCase.java
index ccb5289..44a1773 100644
--- a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIntegrationTestCase.java
+++ b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIntegrationTestCase.java
@@ -33,15 +33,14 @@
 
     public void testClientServerPing() throws Exception {
         PingPacket pingRequest = new PingPacket();
-        pingRequest.setType(IQ.Type.GET);
+        pingRequest.setType(IQ.Type.get);
         pingRequest.setTo(SERVER_DOMAIN);
         pingRequest.setFrom(TEST_USERNAME1);
 
         IQ result = (IQ) sendSync(client, pingRequest);
 
         assertNotNull(result);
-        assertEquals(IQ.Type.RESULT, result.getType());
-        assertEquals(SERVER_DOMAIN, result.getFrom());
-        assertEquals(TEST_USERNAME1, result.getTo());
+        assertEquals(IQ.Type.result, result.getType());
+        assertEquals(SERVER_DOMAIN, result.getFrom().toString());
     }
 }
diff --git a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingNoSupportIntegrationTestCase.java b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingNoSupportIntegrationTestCase.java
index 038981e..68bc169 100644
--- a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingNoSupportIntegrationTestCase.java
+++ b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingNoSupportIntegrationTestCase.java
@@ -33,16 +33,15 @@
 
     public void testClientServerPing() throws Exception {
         PingPacket pingRequest = new PingPacket();
-        pingRequest.setType(IQ.Type.GET);
+        pingRequest.setType(IQ.Type.get);
         pingRequest.setTo(SERVER_DOMAIN);
         pingRequest.setFrom(TEST_USERNAME1);
 
         IQ result = (IQ) sendSync(client, pingRequest);
 
         assertNotNull(result);
-        assertEquals(IQ.Type.ERROR, result.getType());
-        assertEquals(SERVER_DOMAIN, result.getFrom());
-        assertEquals(TEST_USERNAME1, result.getTo());
-        assertEquals("service-unavailable", result.getError().getCondition());
+        assertEquals(IQ.Type.error, result.getType());
+        assertEquals(SERVER_DOMAIN, result.getFrom().toString());
+        assertEquals("service-unavailable", result.getError().getCondition().toString());
     }
 }
diff --git a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/RunS2SServers.java b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/RunS2SServers.java
index 83d40a5..89d88f4 100644
--- a/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/RunS2SServers.java
+++ b/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/RunS2SServers.java
@@ -27,10 +27,6 @@
 import java.util.Properties;
 import java.util.concurrent.LinkedBlockingQueue;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
 import org.apache.vysper.mina.C2SEndpoint;
 import org.apache.vysper.mina.S2SEndpoint;
 import org.apache.vysper.storage.StorageProviderRegistry;
@@ -39,19 +35,26 @@
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.authentication.AccountCreationException;
 import org.apache.vysper.xmpp.authentication.AccountManagement;
+import org.apache.vysper.xmpp.cryptography.NonCheckingX509TrustManagerFactory;
 import org.apache.vysper.xmpp.server.XMPPServer;
-import org.jivesoftware.smack.ConnectionConfiguration;
-import org.jivesoftware.smack.PacketListener;
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.XMPPException;
-import org.jivesoftware.smack.filter.PacketFilter;
 import org.jivesoftware.smack.packet.Message;
 import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.Stanza;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
+import org.jxmpp.jid.impl.JidCreate;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
 
 public class RunS2SServers extends TestCase {
 
     private static final String FILE_FILTER = "s2s-p";
-    
+
     public static Test suite() {
         File testsDir = new File(".");
         File[] testFiles = testsDir.listFiles(new FilenameFilter() {
@@ -59,9 +62,9 @@
                 return name.startsWith(FILE_FILTER);
             }
         });
-        
+
         TestSuite suite = new TestSuite("S2S integration tests");
-        for(File testFile : testFiles) {
+        for (File testFile : testFiles) {
             try {
                 suite.addTest(new RunS2SServers(testFile));
             } catch (IOException e) {
@@ -70,10 +73,11 @@
         }
         return suite;
     }
-    
+
     private File testFile;
+
     private Properties config = new Properties();
-    
+
     public RunS2SServers(File testFile) throws IOException {
         this.testFile = testFile;
         config.load(new FileInputStream(testFile));
@@ -95,9 +99,9 @@
 
         String keystorePath = config.getProperty("keystore.path");
         String keystorePassword = config.getProperty("keystore.password");
-        
+
         XMPPServer server = createLocalServer(localServer, localUser, localPassword, keystorePath, keystorePassword);
-        
+
         Thread.sleep(2000);
 
         System.out.println();
@@ -105,12 +109,13 @@
         System.out.println("Connecting local client");
         System.out.println();
         System.out.println();
-        
-        LinkedBlockingQueue<Packet> localClientPackages = new LinkedBlockingQueue<Packet>();
-        LinkedBlockingQueue<Packet> remoteClientPackages = new LinkedBlockingQueue<Packet>();
-        
-        XMPPConnection localClient = connectClient(localConnect, localUser.getFullQualifiedName(), localPassword, keystorePath, keystorePassword, localClientPackages);
-//        XMPPConnection localClient = null;
+
+        LinkedBlockingQueue<Stanza> localClientPackages = new LinkedBlockingQueue<>();
+        LinkedBlockingQueue<Stanza> remoteClientPackages = new LinkedBlockingQueue<>();
+
+        XMPPTCPConnection localClient = connectClient(localConnect, localUser.getFullQualifiedName(), localPassword,
+                keystorePath, keystorePassword, localClientPackages);
+        // XMPPConnection localClient = null;
 
         System.out.println();
         System.out.println();
@@ -118,8 +123,9 @@
         System.out.println();
         System.out.println();
 
-//        XMPPConnection remoteClient = connectClient(remoteServer, remoteUser, remotePassword, keystorePath, keystorePassword, remoteClientPackages);
-        XMPPConnection remoteClient = null;
+        // XMPPConnection remoteClient = connectClient(remoteServer, remoteUser,
+        // remotePassword, keystorePath, keystorePassword, remoteClientPackages);
+        XMPPTCPConnection remoteClient = null;
 
         Thread.sleep(3000);
 
@@ -130,39 +136,39 @@
         System.out.println();
 
         remoteClientPackages.clear();
-        Message msg = new Message(remoteUser);
+        Message msg = new Message(JidCreate.from(remoteUser));
         msg.setBody("Hello world");
-        
-        localClient.sendPacket(msg);
-        
-//        Packet packet = remoteClientPackages.poll(15000, TimeUnit.MILLISECONDS);
-//        if(packet != null && packet instanceof Message) {
-//            System.out.println("!!!!!!" + ((Message)packet).getBody());
-//        } else {
-//            fail("Message not received by remote client");
-//        }
-//
-//        Thread.sleep(3000);
-//
-//        System.out.println();
-//        System.out.println();
-//        System.out.println("Sending message from remote to local");
-//        System.out.println();
-//        System.out.println();
-//
-//        localClientPackages.clear();
-//        msg = new Message(localUser.getFullQualifiedName());
-//        msg.setBody("Hello world");
-//        
-//        remoteClient.sendPacket(msg);
-//        
-//        packet = localClientPackages.poll(15000, TimeUnit.MILLISECONDS);
-//        if(packet != null && packet instanceof Message) {
-//            System.out.println("!!!!!!" + ((Message)packet).getBody());
-//        } else {
-//            fail("Message not received by local client");
-//        }
-        
+
+        localClient.sendStanza(msg);
+
+        // Packet packet = remoteClientPackages.poll(15000, TimeUnit.MILLISECONDS);
+        // if(packet != null && packet instanceof Message) {
+        // System.out.println("!!!!!!" + ((Message)packet).getBody());
+        // } else {
+        // fail("Message not received by remote client");
+        // }
+        //
+        // Thread.sleep(3000);
+        //
+        // System.out.println();
+        // System.out.println();
+        // System.out.println("Sending message from remote to local");
+        // System.out.println();
+        // System.out.println();
+        //
+        // localClientPackages.clear();
+        // msg = new Message(localUser.getFullQualifiedName());
+        // msg.setBody("Hello world");
+        //
+        // remoteClient.sendPacket(msg);
+        //
+        // packet = localClientPackages.poll(15000, TimeUnit.MILLISECONDS);
+        // if(packet != null && packet instanceof Message) {
+        // System.out.println("!!!!!!" + ((Message)packet).getBody());
+        // } else {
+        // fail("Message not received by local client");
+        // }
+
         Thread.sleep(15000);
         System.out.println();
         System.out.println();
@@ -172,35 +178,28 @@
 
         remoteClient.disconnect();
         localClient.disconnect();
-        
+
         Thread.sleep(5000);
-        
+
         server.stop();
     }
 
-    private XMPPConnection connectClient(String host, String user, String password, String keystorePath, String keystorePassword, final LinkedBlockingQueue<Packet> packageQueue)
-            throws XMPPException {
-//        ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration(host, 5222);
-        ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration(host, 5222, "protocol7.com");
-        connectionConfiguration.setKeystorePath(keystorePath);
-        connectionConfiguration.setTruststorePath(keystorePath);
-        connectionConfiguration.setTruststorePassword(keystorePassword);
-        XMPPConnection client = new XMPPConnection(connectionConfiguration);
-        
+    private XMPPTCPConnection connectClient(String host, String user, String password, String keystorePath,
+            String keystorePassword, final LinkedBlockingQueue<Stanza> packageQueue)
+            throws XMPPException, IOException, InterruptedException, SmackException {
+        XMPPTCPConnectionConfiguration connectionConfiguration = XMPPTCPConnectionConfiguration.builder().setHost(host)
+                .setPort(5222).setXmppDomain("protocol7.com").setKeystorePath(keystorePath)
+                .setCustomX509TrustManager(NonCheckingX509TrustManagerFactory.X509).build();
+
+        XMPPTCPConnection client = new XMPPTCPConnection(connectionConfiguration);
+
         client.connect();
         client.login(user, password);
-        client.addPacketListener(new PacketListener() {
-            public void processPacket(Packet packet) {
-                System.out.println("# " + packet);
-                packageQueue.add(packet);
-            }
-        }, new PacketFilter() {
-            public boolean accept(Packet arg0) {
-                return true;
-            }
-        });
+        client.addSyncStanzaListener(packet -> {
+            System.out.println("# " + packet);
+            packageQueue.add(packet);
+        }, arg0 -> true);
 
-        
         return client;
     }
 
@@ -210,7 +209,7 @@
 
         StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
         final AccountManagement accountManagement = (AccountManagement) providerRegistry
-        .retrieve(AccountManagement.class);
+                .retrieve(AccountManagement.class);
 
         if (!accountManagement.verifyAccountExists(localUser)) {
             accountManagement.addUser(localUser, password);
@@ -218,13 +217,13 @@
 
         // S2S endpoint
         server.addEndpoint(new S2SEndpoint());
-        
+
         // C2S endpoint
         server.addEndpoint(new C2SEndpoint());
-        
+
         server.setStorageProviderRegistry(providerRegistry);
         server.setTLSCertificateInfo(new File(keystorePath), keystorePassword);
-        
+
         server.start();
         return server;
     }
diff --git a/server/core/pom.xml b/server/core/pom.xml
index 38d5901..1f388d6 100644
--- a/server/core/pom.xml
+++ b/server/core/pom.xml
@@ -136,13 +136,31 @@
     
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smack</artifactId>
+      <artifactId>smack-tcp</artifactId>
       <scope>test</scope>
     </dependency>
 
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smackx</artifactId>
+      <artifactId>smack-resolver-javax</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-sasl-javax</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-java7</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-extensions</artifactId>
       <scope>test</scope>
     </dependency>
     
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/cryptography/NonCheckingX509TrustManagerFactory.java b/server/core/src/main/java/org/apache/vysper/xmpp/cryptography/NonCheckingX509TrustManagerFactory.java
index 4c3ff4e..c50c9b5 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/cryptography/NonCheckingX509TrustManagerFactory.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/cryptography/NonCheckingX509TrustManagerFactory.java
@@ -46,7 +46,7 @@
 
     static final Logger logger = LoggerFactory.getLogger(NonCheckingX509TrustManagerFactory.class);
     
-    static final X509TrustManager X509 = new X509TrustManager() {
+    public static final X509TrustManager X509 = new X509TrustManager() {
         public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
             logger.error("this XMPP Vysper instance uses NonCheckingTrustManagerFactory, clients certificates are not checked");
         }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
index 20046f8..6287769 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
@@ -138,7 +138,7 @@
                             LOG.warn("XMPP handshake with {} at {} timed out", remoteServer, ipAddress);
                         }
                     } catch (InterruptedException e) {
-                        throw new RemoteServerTimeoutException("Connection to " + remoteServer + " was interrupted", e);
+                        throw new RemoteServerTimeoutException("XMPPConnection to " + remoteServer + " was interrupted", e);
                     }
                 } 
 
diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java
index 29d5cc9..87e997d 100644
--- a/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java
+++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java
@@ -19,7 +19,11 @@
  */
 package org.apache.vysper.xmpp.server.s2s;
 import java.io.File;
+import java.io.IOException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
 
+import org.apache.mina.filter.ssl.BogusTrustManagerFactory;
 import org.apache.vysper.mina.C2SEndpoint;
 import org.apache.vysper.mina.S2SEndpoint;
 import org.apache.vysper.storage.StorageProviderRegistry;
@@ -27,6 +31,7 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.authentication.AccountManagement;
+import org.apache.vysper.xmpp.cryptography.NonCheckingX509TrustManagerFactory;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.XMPPServer;
@@ -34,14 +39,27 @@
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.jivesoftware.smack.ConnectionConfiguration;
 import org.jivesoftware.smack.PacketListener;
+import org.jivesoftware.smack.SmackException;
+import org.jivesoftware.smack.StanzaListener;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.XMPPException;
 import org.jivesoftware.smack.filter.PacketFilter;
+import org.jivesoftware.smack.filter.StanzaFilter;
 import org.jivesoftware.smack.packet.Message;
 import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
+import org.jxmpp.jid.impl.JidCreate;
+import org.jxmpp.stringprep.XmppStringprepException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.X509TrustManager;
 
 
 public class Server2Server {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(Server2Server.class);
 
     public static void main(String[] args) throws Exception {
         Entity localServer = EntityImpl.parseUnchecked(args[0]);
@@ -111,42 +129,41 @@
 
     private static void sendMessagesUsingClients(Entity localUser, Entity remoteServer, Entity remoteUser,
             String remotePassword, String keystorePath, String keystorePassword) throws XMPPException,
-            InterruptedException {
-        ConnectionConfiguration localConnectionConfiguration = new ConnectionConfiguration("localhost", 5222);
-        localConnectionConfiguration.setKeystorePath(keystorePath);
-        localConnectionConfiguration.setTruststorePath(keystorePath);
-        localConnectionConfiguration.setTruststorePassword(keystorePassword);
-        XMPPConnection localClient = new XMPPConnection(localConnectionConfiguration);
+            InterruptedException, IOException, SmackException {
+        XMPPTCPConnectionConfiguration localConnectionConfiguration = XMPPTCPConnectionConfiguration
+                .builder()
+                .setHost("localhost")
+                .setPort(5222)
+                .setKeystorePath(keystorePath)
+                .setCustomX509TrustManager(NonCheckingX509TrustManagerFactory.X509)
+                .build();
+
+        XMPPTCPConnection localClient = new XMPPTCPConnection(localConnectionConfiguration);
 
         localClient.connect();
         localClient.login(localUser.getNode(), "password1");
-        localClient.addPacketListener(new PacketListener() {
-            public void processPacket(Packet packet) {
-                System.out.println("# " + packet);
-            }
-        }, new PacketFilter() {
-            public boolean accept(Packet arg0) {
-                return true;
-            }
-        });
-        
-        
-        ConnectionConfiguration remoteConnectionConfiguration = new ConnectionConfiguration(remoteServer.getFullQualifiedName(), 5222);
-        remoteConnectionConfiguration.setKeystorePath(keystorePath);
-        remoteConnectionConfiguration.setTruststorePath(keystorePath);
-        remoteConnectionConfiguration.setTruststorePassword(keystorePassword);
-        XMPPConnection remoteClient = new XMPPConnection(remoteConnectionConfiguration);
+        localClient.addSyncStanzaListener(packet -> System.out.println("# " + packet), stanza -> false);
+
+        XMPPTCPConnectionConfiguration remoteConnectionConfiguration = XMPPTCPConnectionConfiguration
+                .builder()
+                .setHost(remoteServer.getFullQualifiedName())
+                .setPort(5222)
+                .setKeystorePath(keystorePath)
+                .setCustomX509TrustManager(NonCheckingX509TrustManagerFactory.X509)
+                .build();
+
+        XMPPTCPConnection remoteClient = new XMPPTCPConnection(remoteConnectionConfiguration);
 
         remoteClient.connect();
         remoteClient.login(remoteUser.getNode(), remotePassword);
         
         Thread.sleep(3000);
         
-        Message msg = new Message(remoteUser.getFullQualifiedName());
+        Message msg = new Message(JidCreate.entityFrom(remoteUser.getFullQualifiedName()));
 //        Message msg = new Message(localUser.getFullQualifiedName());
         msg.setBody("Hello world");
         
-        localClient.sendPacket(msg);
+        localClient.sendStanza(msg);
 //        remoteClient.sendPacket(msg);
         
         
diff --git a/server/extensions/xep0045-muc-inttest/pom.xml b/server/extensions/xep0045-muc-inttest/pom.xml
index 0c26fc0..de7c748 100644
--- a/server/extensions/xep0045-muc-inttest/pom.xml
+++ b/server/extensions/xep0045-muc-inttest/pom.xml
@@ -55,13 +55,31 @@
 
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smack</artifactId>
+      <artifactId>smack-tcp</artifactId>
       <scope>test</scope>
     </dependency>
 
     <dependency>
       <groupId>org.igniterealtime.smack</groupId>
-      <artifactId>smackx</artifactId>
+      <artifactId>smack-resolver-javax</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-sasl-javax</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-java7</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.igniterealtime.smack</groupId>
+      <artifactId>smack-extensions</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractIntegrationTestCase.java b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractIntegrationTestCase.java
index 3d42e16..0bd17d3 100644
--- a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractIntegrationTestCase.java
+++ b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractIntegrationTestCase.java
@@ -23,24 +23,30 @@
 import java.io.IOException;
 import java.net.ServerSocket;
 
-import junit.framework.TestCase;
-
 import org.apache.vysper.mina.C2SEndpoint;
 import org.apache.vysper.mina.TCPEndpoint;
 import org.apache.vysper.storage.StorageProviderRegistry;
 import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.authentication.AccountManagement;
+import org.apache.vysper.xmpp.cryptography.NonCheckingX509TrustManagerFactory;
 import org.apache.vysper.xmpp.server.XMPPServer;
 import org.jivesoftware.smack.ConnectionConfiguration;
-import org.jivesoftware.smack.PacketCollector;
 import org.jivesoftware.smack.SmackConfiguration;
+import org.jivesoftware.smack.SmackException;
+import org.jivesoftware.smack.StanzaCollector;
 import org.jivesoftware.smack.XMPPConnection;
-import org.jivesoftware.smack.filter.PacketIDFilter;
-import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.debugger.ConsoleDebugger;
+import org.jivesoftware.smack.filter.StanzaIdFilter;
+import org.jivesoftware.smack.packet.Stanza;
+import org.jivesoftware.smack.sasl.SASLMechanism;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import junit.framework.TestCase;
+
 /**
  */
 public abstract class AbstractIntegrationTestCase extends TestCase {
@@ -50,7 +56,7 @@
     protected static final String TLS_CERTIFICATE_PATH = "src/main/config/bogus_mina_tls.cert";
 
     protected static final String TLS_CERTIFICATE_PASSWORD = "boguspw";
-    
+
     protected static final String SERVER_DOMAIN = "vysper.org";
 
     protected static final String TEST_USERNAME1 = "test1@vysper.org";
@@ -63,7 +69,7 @@
 
     private static final int DEFAULT_SERVER_PORT = 25222;
 
-    protected XMPPConnection client;
+    protected XMPPTCPConnection client;
 
     private XMPPServer server;
 
@@ -76,7 +82,7 @@
     @Override
     protected void setUp() throws Exception {
         // make sure Smack times out after 5 seconds
-        SmackConfiguration.setPacketReplyTimeout(5000);
+        SmackConfiguration.setDefaultReplyTimeout(5000);
 
         port = findFreePort();
 
@@ -109,18 +115,16 @@
         Thread.sleep(200);
     }
 
-    protected XMPPConnection connectClient(int port, String username, String password) throws Exception {
-        ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("localhost", port);
-        connectionConfiguration.setCompressionEnabled(false);
-        connectionConfiguration.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
-        connectionConfiguration.setSASLAuthenticationEnabled(true);
-        connectionConfiguration.setDebuggerEnabled(false);
-        connectionConfiguration.setKeystorePath(TLS_CERTIFICATE_PATH);
-        connectionConfiguration.setTruststorePath(TLS_CERTIFICATE_PATH);
-        connectionConfiguration.setTruststorePassword(TLS_CERTIFICATE_PASSWORD);
+    protected XMPPTCPConnection connectClient(int port, String username, String password) throws Exception {
+        XMPPTCPConnectionConfiguration connectionConfiguration = XMPPTCPConnectionConfiguration.builder()
+                .setHost("localhost").setPort(port).setXmppDomain(SERVER_DOMAIN)
+                .setHostnameVerifier((hostname, session) -> true).setCompressionEnabled(false)
+                .setSecurityMode(ConnectionConfiguration.SecurityMode.required)
+                .addEnabledSaslMechanism(SASLMechanism.PLAIN).setDebuggerFactory(ConsoleDebugger.Factory.INSTANCE)
+                .setKeystorePath(TLS_CERTIFICATE_PATH)
+                .setCustomX509TrustManager(NonCheckingX509TrustManagerFactory.X509).build();
 
-        XMPPConnection.DEBUG_ENABLED = true;
-        XMPPConnection client = new XMPPConnection(connectionConfiguration);
+        XMPPTCPConnection client = new XMPPTCPConnection(connectionConfiguration);
 
         client.connect();
 
@@ -128,11 +132,12 @@
         return client;
     }
 
-    protected Packet sendSync(XMPPConnection client, Packet request) {
+    protected Stanza sendSync(XMPPConnection client, Stanza request)
+            throws SmackException.NotConnectedException, InterruptedException {
         // Create a packet collector to listen for a response.
-        PacketCollector collector = client.createPacketCollector(new PacketIDFilter(request.getPacketID()));
+        StanzaCollector collector = client.createStanzaCollector(new StanzaIdFilter(request.getStanzaId()));
 
-        client.sendPacket(request);
+        client.sendStanza(request);
 
         // Wait up to 5 seconds for a result.
         return collector.nextResult(5000);
diff --git a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractMUCIntegrationTestCase.java b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractMUCIntegrationTestCase.java
index 60ecc52..bf2f953 100644
--- a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractMUCIntegrationTestCase.java
+++ b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/AbstractMUCIntegrationTestCase.java
@@ -24,23 +24,28 @@
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
 import org.apache.vysper.xmpp.server.XMPPServer;
 import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
 import org.jivesoftware.smackx.muc.MultiUserChat;
+import org.jivesoftware.smackx.muc.MultiUserChatManager;
+import org.jxmpp.jid.EntityBareJid;
+import org.jxmpp.jid.impl.JidCreate;
+import org.jxmpp.jid.parts.Resourcepart;
 
 /**
  */
 public abstract class AbstractMUCIntegrationTestCase extends AbstractIntegrationTestCase {
 
-    protected static final String NICK1 = "Nick";
+    protected static final Resourcepart NICK1 = Resourcepart.fromOrThrowUnchecked("Nick");
 
-    protected static final String NICK2 = "Nick2";
+    protected static final Resourcepart NICK2 = Resourcepart.fromOrThrowUnchecked("Nick2");
 
     protected static final String MUC_SUBDOMAIN = "chat";
 
-    protected static final String ROOM_JID = "room@chat.vysper.org";
+    protected static final EntityBareJid ROOM_JID = JidCreate.entityBareFromOrThrowUnchecked("room@chat.vysper.org");
 
     protected Conference conference = new Conference("test conference", new MUCFeatures());
 
-    protected XMPPConnection client2;
+    protected XMPPTCPConnection client2;
 
     protected MultiUserChat chat;
 
@@ -57,8 +62,8 @@
 
         client2 = connectClient(port, TEST_USERNAME2, TEST_PASSWORD2);
 
-        chat = new MultiUserChat(client, ROOM_JID);
-        chat2 = new MultiUserChat(client2, ROOM_JID);
+        chat = MultiUserChatManager.getInstanceFor(client).getMultiUserChat(ROOM_JID);
+        chat2 = MultiUserChatManager.getInstanceFor(client2).getMultiUserChat(ROOM_JID);
     }
 
     @Override
diff --git a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/EnterExitRoomIntegrationTestCase.java b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/EnterExitRoomIntegrationTestCase.java
index 33c1ecc..2013b3b 100644
--- a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/EnterExitRoomIntegrationTestCase.java
+++ b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/EnterExitRoomIntegrationTestCase.java
@@ -27,46 +27,48 @@
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
 import org.jivesoftware.smack.packet.Message;
+import org.jxmpp.jid.EntityFullJid;
+import org.jxmpp.jid.parts.Resourcepart;
 
 /**
  */
 public class EnterExitRoomIntegrationTestCase extends AbstractMUCIntegrationTestCase {
 
     public void testEnterRoom() throws Exception {
-        chat.join("Nick");
+        chat.join(Resourcepart.from("Nick"));
 
-        Room room = conference.findRoom(EntityImpl.parseUnchecked(ROOM_JID));
+        Room room = conference.findRoom(EntityImpl.parseUnchecked(ROOM_JID.toString()));
         assertEquals(1, room.getOccupantCount());
         Occupant occupant = room.getOccupants().iterator().next();
         assertEquals(TEST_USERNAME1, occupant.getJid().getBareJID().getFullQualifiedName());
         assertEquals("Nick", occupant.getNick());
 
-        final BlockingQueue<String> joinedQueue = new LinkedBlockingQueue<String>();
+        final BlockingQueue<EntityFullJid> joinedQueue = new LinkedBlockingQueue<>();
         chat.addParticipantStatusListener(new ParticipantStatusListenerAdapter() {
 
             @Override
-            public void joined(String participant) {
+            public void joined(EntityFullJid participant) {
                 joinedQueue.add(participant);
             }
         });
-        chat2.join("Nick2");
+        chat2.join(Resourcepart.from("Nick2"));
         assertEquals(2, room.getOccupantCount());
 
         // chat should be notified
-        assertEquals(ROOM_JID + "/Nick2", joinedQueue.poll(5000, TimeUnit.MILLISECONDS));
+        assertEquals(ROOM_JID + "/Nick2", joinedQueue.poll(5000, TimeUnit.MILLISECONDS).toString());
     }
 
     public void testExitRoom() throws Exception {
-        chat.join("Nick");
-        chat2.join("Nick2");
+        chat.join(Resourcepart.from("Nick"));
+        chat2.join(Resourcepart.from("Nick2"));
 
-        Room room = conference.findRoom(EntityImpl.parseUnchecked(ROOM_JID));
+        Room room = conference.findRoom(EntityImpl.parseUnchecked(ROOM_JID.toString()));
         assertEquals(2, room.getOccupantCount());
 
-        final BlockingQueue<String> leftQueue = new LinkedBlockingQueue<String>();
+        final BlockingQueue<EntityFullJid> leftQueue = new LinkedBlockingQueue<>();
         chat.addParticipantStatusListener(new ParticipantStatusListenerAdapter() {
             @Override
-            public void left(String participant) {
+            public void left(EntityFullJid participant) {
                 leftQueue.add(participant);
             }
         });
@@ -74,27 +76,27 @@
         chat2.leave();
 
         // wait for status update
-        assertEquals(ROOM_JID + "/Nick2", leftQueue.poll(5000, TimeUnit.MILLISECONDS));
+        assertEquals(ROOM_JID + "/Nick2", leftQueue.poll(5000, TimeUnit.MILLISECONDS).toString());
         assertEquals(1, room.getOccupantCount());
 
     }
 
     public void testSendMessageToRoom() throws Exception {
-        chat.join("Nick");
-        chat2.join("Nick2");
+        chat.join(Resourcepart.from("Nick"));
+        chat2.join(Resourcepart.from("Nick2"));
 
         chat.sendMessage("Fooo");
         Message message = chat.nextMessage(5000);
 
         assertNotNull(message);
         assertEquals("Fooo", message.getBody());
-        assertEquals(ROOM_JID + "/Nick", message.getFrom());
-        assertEquals(TEST_USERNAME1, EntityImpl.parse(message.getTo()).getBareJID().getFullQualifiedName());
+        assertEquals(ROOM_JID + "/Nick", message.getFrom().toString());
+        assertEquals(TEST_USERNAME1, EntityImpl.parse(message.getTo().toString()).getBareJID().getFullQualifiedName());
 
         message = chat2.nextMessage(5000);
         assertNotNull(message);
         assertEquals("Fooo", message.getBody());
-        assertEquals(ROOM_JID + "/Nick", message.getFrom());
-        assertEquals(TEST_USERNAME2, EntityImpl.parse(message.getTo()).getBareJID().getFullQualifiedName());
+        assertEquals(ROOM_JID + "/Nick", message.getFrom().toString());
+        assertEquals(TEST_USERNAME2, EntityImpl.parse(message.getTo().toString()).getBareJID().getFullQualifiedName());
     }
 }
diff --git a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ModerationIntegrationTestCase.java b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ModerationIntegrationTestCase.java
index ef34c5b..355e6c3 100644
--- a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ModerationIntegrationTestCase.java
+++ b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ModerationIntegrationTestCase.java
@@ -30,12 +30,12 @@
     public void testGrantModeration() throws Exception {
         chat.join(NICK1);
         
-        Room room = conference.findRoom(EntityImpl.parseUnchecked(ROOM_JID));
-        assertEquals(Role.Moderator, room.findOccupantByNick(NICK1).getRole());
+        Room room = conference.findRoom(EntityImpl.parseUnchecked(ROOM_JID.toString()));
+        assertEquals(Role.Moderator, room.findOccupantByNick(NICK1.toString()).getRole());
         
         chat2.join(NICK2);
         
         chat.grantModerator(NICK2);
-        assertEquals(Role.Moderator, room.findOccupantByNick(NICK2).getRole());
+        assertEquals(Role.Moderator, room.findOccupantByNick(NICK2.toString()).getRole());
     }
 }
diff --git a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ParticipantStatusListenerAdapter.java b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ParticipantStatusListenerAdapter.java
index e4fd754..eaed5d9 100644
--- a/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ParticipantStatusListenerAdapter.java
+++ b/server/extensions/xep0045-muc-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/ParticipantStatusListenerAdapter.java
@@ -20,53 +20,86 @@
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.inttest;
 
 import org.jivesoftware.smackx.muc.ParticipantStatusListener;
+import org.jxmpp.jid.EntityFullJid;
+import org.jxmpp.jid.Jid;
+import org.jxmpp.jid.parts.Resourcepart;
 
 /**
  */
 public class ParticipantStatusListenerAdapter implements ParticipantStatusListener {
 
-    public void adminGranted(String participant) {
+    @Override
+    public void joined(EntityFullJid participant) {
+        
     }
 
-    public void adminRevoked(String participant) {
+    @Override
+    public void left(EntityFullJid participant) {
+
     }
 
-    public void banned(String participant, String actor, String reason) {
+    @Override
+    public void kicked(EntityFullJid participant, Jid actor, String reason) {
+
     }
 
-    public void joined(String participant) {
+    @Override
+    public void voiceGranted(EntityFullJid participant) {
+
     }
 
-    public void kicked(String participant, String actor, String reason) {
+    @Override
+    public void voiceRevoked(EntityFullJid participant) {
+
     }
 
-    public void left(String participant) {
+    @Override
+    public void banned(EntityFullJid participant, Jid actor, String reason) {
+
     }
 
-    public void membershipGranted(String participant) {
+    @Override
+    public void membershipGranted(EntityFullJid participant) {
+
     }
 
-    public void membershipRevoked(String participant) {
+    @Override
+    public void membershipRevoked(EntityFullJid participant) {
+
     }
 
-    public void moderatorGranted(String participant) {
+    @Override
+    public void moderatorGranted(EntityFullJid participant) {
+
     }
 
-    public void moderatorRevoked(String participant) {
+    @Override
+    public void moderatorRevoked(EntityFullJid participant) {
+
     }
 
-    public void nicknameChanged(String participant, String newNickname) {
+    @Override
+    public void ownershipGranted(EntityFullJid participant) {
+
     }
 
-    public void ownershipGranted(String participant) {
+    @Override
+    public void ownershipRevoked(EntityFullJid participant) {
+
     }
 
-    public void ownershipRevoked(String participant) {
+    @Override
+    public void adminGranted(EntityFullJid participant) {
+
     }
 
-    public void voiceGranted(String participant) {
+    @Override
+    public void adminRevoked(EntityFullJid participant) {
+
     }
 
-    public void voiceRevoked(String participant) {
+    @Override
+    public void nicknameChanged(EntityFullJid participant, Resourcepart newNickname) {
+
     }
 }
diff --git a/server/extensions/xep0065-socks/pom.xml b/server/extensions/xep0065-socks/pom.xml
index e845658..1e9dc7a 100644
--- a/server/extensions/xep0065-socks/pom.xml
+++ b/server/extensions/xep0065-socks/pom.xml
@@ -61,12 +61,27 @@
 		</dependency>
 	    <dependency>
 	      <groupId>org.igniterealtime.smack</groupId>
-	      <artifactId>smack</artifactId>
+	      <artifactId>smack-tcp</artifactId>
 	      <scope>test</scope>
 	    </dependency>
+		<dependency>
+			<groupId>org.igniterealtime.smack</groupId>
+			<artifactId>smack-resolver-javax</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.igniterealtime.smack</groupId>
+			<artifactId>smack-sasl-javax</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.igniterealtime.smack</groupId>
+			<artifactId>smack-java7</artifactId>
+			<scope>test</scope>
+		</dependency>
 	    <dependency>
 	      <groupId>org.igniterealtime.smack</groupId>
-	      <artifactId>smackx</artifactId>
+	      <artifactId>smack-extensions</artifactId>
 	      <scope>test</scope>
 	    </dependency>
 
diff --git a/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java b/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java
index 2c44f95..4d63419 100644
--- a/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java
+++ b/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java
@@ -37,30 +37,33 @@
 import org.apache.vysper.xmpp.modules.roster.SubscriptionType;
 import org.apache.vysper.xmpp.modules.roster.persistence.RosterManager;
 import org.apache.vysper.xmpp.server.XMPPServer;
-import org.jivesoftware.smack.ConnectionConfiguration;
-import org.jivesoftware.smack.SmackConfiguration;
-import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.SmackException;
 import org.jivesoftware.smack.XMPPException;
+import org.jivesoftware.smack.roster.Roster;
+import org.jivesoftware.smack.tcp.XMPPTCPConnection;
+import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
 import org.jivesoftware.smackx.bytestreams.BytestreamListener;
 import org.jivesoftware.smackx.bytestreams.BytestreamRequest;
 import org.jivesoftware.smackx.bytestreams.BytestreamSession;
 import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager;
 import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamSession;
+import org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.jxmpp.jid.Jid;
+import org.jxmpp.jid.impl.JidCreate;
 
 /**
  * Integration test for SOCKS5 mediated connections
  *
- * This test requires that "vysper.org" and "socks.vysper.org" resolves to 127.0.0.1
- * and is therefore disabled by default.
- *  
- * On Linux/OS X, add the following to /etc/hosts:
- * 127.0.0.1   vysper.org
- * 127.0.0.1   socks.vysper.org
+ * This test requires that "vysper.org" and "socks.vysper.org" resolves to
+ * 127.0.0.1 and is therefore disabled by default.
+ * 
+ * On Linux/OS X, add the following to /etc/hosts: 127.0.0.1 vysper.org
+ * 127.0.0.1 socks.vysper.org
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
@@ -68,18 +71,24 @@
 public class Socks5IntegrationTest {
 
     private static final String SUBDOMAIN = "socks";
+
     private static final String SERVER = "vysper.org";
+
     private static final Entity USER1 = EntityImpl.parseUnchecked("user1@vysper.org");
+
     private static final Entity USER2 = EntityImpl.parseUnchecked("user2@vysper.org");
+
     private static final String PASSWORD = "password";
 
-    
     private static final String CHARSET = "ASCII";
+
     private static final String TEST_DATA = "hello world";
 
     private XMPPServer server;
-    private XMPPConnection requestor;
-    private XMPPConnection target;
+
+    private XMPPTCPConnection requestor;
+
+    private XMPPTCPConnection target;
 
     @Before
     public void before() throws Exception {
@@ -95,7 +104,7 @@
         server.addModule(new Socks5Module(SUBDOMAIN));
 
         // disable direct connections
-        SmackConfiguration.setLocalSocks5ProxyEnabled(false);
+        Socks5Proxy.setLocalSocks5ProxyEnabled(false);
 
         assertTransfer();
     }
@@ -103,12 +112,13 @@
     @Test
     public void directConnectionTransfer() throws Exception {
         // enable direct connections
-        SmackConfiguration.setLocalSocks5ProxyEnabled(true);
+        Socks5Proxy.setLocalSocks5ProxyEnabled(true);
 
         assertTransfer();
     }
 
-    private void assertTransfer() throws InterruptedException, XMPPException, IOException, UnsupportedEncodingException {
+    private void assertTransfer()
+            throws InterruptedException, XMPPException, IOException, UnsupportedEncodingException, SmackException {
         LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
 
         Socks5BytestreamManager mng2 = Socks5BytestreamManager.getBytestreamManager(target);
@@ -120,7 +130,8 @@
         System.out.println("Starting SOCKS5 transfer");
         System.out.println("##################");
 
-        String targetJid = requestor.getRoster().getPresence(USER2.getFullQualifiedName()).getFrom();
+        Jid targetJid = Roster.getInstanceFor(requestor).getPresence(JidCreate.bareFrom(USER2.getFullQualifiedName()))
+                .getFrom();
 
         Socks5BytestreamManager mng1 = Socks5BytestreamManager.getBytestreamManager(requestor);
         Socks5BytestreamSession session = mng1.establishSession(targetJid);
@@ -134,21 +145,21 @@
 
     private final class TestByteStreamListener implements BytestreamListener {
         private final LinkedBlockingQueue<String> queue;
-    
+
         private TestByteStreamListener(LinkedBlockingQueue<String> queue) {
             this.queue = queue;
         }
-    
+
         public void incomingBytestreamRequest(BytestreamRequest request) {
             BytestreamSession session;
             try {
                 session = request.accept();
-    
+
                 byte[] b = new byte[TEST_DATA.getBytes(CHARSET).length];
                 InputStream in = session.getInputStream();
                 in.read(b);
                 in.close();
-    
+
                 queue.put(new String(b));
             } catch (Exception e) {
                 Assert.fail(e.getMessage());
@@ -164,9 +175,11 @@
         server.stop();
     }
 
-    private XMPPConnection connectClient(Entity username) throws XMPPException {
-        ConnectionConfiguration config = new ConnectionConfiguration(SERVER, 5222);
-        XMPPConnection conn = new XMPPConnection(config);
+    private XMPPTCPConnection connectClient(Entity username)
+            throws XMPPException, InterruptedException, IOException, SmackException {
+        XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder().setXmppDomain(SERVER)
+                .setPort(5222).build();
+        XMPPTCPConnection conn = new XMPPTCPConnection(config);
         conn.connect();
         conn.login(username.getFullQualifiedName(), PASSWORD);
         return conn;
@@ -189,8 +202,8 @@
         server.start();
         System.out.println("vysper server is running...");
 
-        RosterManager rosterManager = (RosterManager) server.getServerRuntimeContext().getStorageProvider(
-                RosterManager.class);
+        RosterManager rosterManager = (RosterManager) server.getServerRuntimeContext()
+                .getStorageProvider(RosterManager.class);
         rosterManager.addContact(USER1, new RosterItem(USER2, SubscriptionType.BOTH));
         rosterManager.addContact(USER2, new RosterItem(USER1, SubscriptionType.BOTH));