diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py
index f83fc062..a522f822 100644
--- a/sleekxmpp/basexmpp.py
+++ b/sleekxmpp/basexmpp.py
@@ -114,20 +114,12 @@ class basexmpp(object):
 		for plugin in self.plugin:
 			self.plugin[plugin].post_init()
 
-	def getNewId(self):
-		with self.id_lock:
-			self.id += 1
-			return self.getId()
-
 	def add_handler(self, mask, pointer, name=None, disposable=False, threaded=False, filter=False, instream=False):
                 # threaded is no longer needed, but leaving it for backwards compatibility for now
 		if name is None:
 			name = 'add_handler_%s' % self.getNewId()
 		self.registerHandler(XMLCallback(name, MatchXMLMask(mask), pointer, once=disposable, instream=instream))
 
-	def getId(self):
-		return "%x".upper() % self.id
-
 	def sendXML(self, data, mask=None, timeout=10):
 		return self.send(tostring(data), mask, timeout)
 
diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py
index d37d2920..5531b1d2 100644
--- a/sleekxmpp/xmlstream/xmlstream.py
+++ b/sleekxmpp/xmlstream/xmlstream.py
@@ -101,7 +101,9 @@ class XMLStream(object):
         disconnect           -- Disconnect from the server and terminate
                                 processing.
         event                -- Trigger a custom event.
+        get_id               -- Return the current stream ID.
         incoming_filter      -- Optionally filter stanzas before processing.
+        new_id               -- Generate a new, unique ID value.
         process              -- Read XML stanzas from the stream and apply
                                 matching stream handlers.
         reconnect            -- Reestablish a connection to the server.
@@ -144,6 +146,8 @@ class XMLStream(object):
         self.removeHandler = self.remove_handler
         self.setSocket = self.set_socket
         self.sendRaw = self.send_raw
+        self.getId = self.get_id
+        self.getNewId = self.new_id
 
         self.ssl_support = SSL_SUPPORT
 
@@ -178,8 +182,29 @@ class XMLStream(object):
         self.__root_stanza = []
         self.__handlers = []
 
+        self._id = 0
+        self._id_lock = threading.Lock()
+
         self.run = True
 
+    def new_id(self):
+        """
+        Generate and return a new stream ID in hexadecimal form.
+
+        Many stanzas, handlers, or matchers may require unique 
+        ID values. Using this method ensures that all new ID values 
+        are unique in this stream.
+        """
+        with self._id_lock:
+            self._id += 1
+            return self.get_id()
+
+    def get_id(self):
+        """
+        Return the current unique stream ID in hexadecimal form.
+        """
+        return "%X" % self._id
+
     def connect(self, host='', port=0, use_ssl=False,
                 use_tls=True, reattempt=True):
         """