diff --git a/lib/native/mac/libjnmaccoreaudio.jnilib b/lib/native/mac/libjnmaccoreaudio.jnilib
index 320601a6d1e7e5fe3897e225ef5efb88cf19341b..36b14be8817c9e4c79dcf50bdc6e2017a6509850 100755
Binary files a/lib/native/mac/libjnmaccoreaudio.jnilib and b/lib/native/mac/libjnmaccoreaudio.jnilib differ
diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.c b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
similarity index 69%
rename from src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.c
rename to src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
index 460bb397c4ed664d18f06d0c48a76d4fffa2a474..7ad57402963b4483622548bf350f73a17ff950d2 100644
--- a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.c
+++ b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
@@ -5,7 +5,7 @@
  * See terms of license at gnu.org.
  */
 
-#include "org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h"
+#include "org_jitsi_impl_neomedia_CoreAudioDevice.h"
 
 #include "../lib/device.h"
 
@@ -21,8 +21,22 @@ static jbyteArray getStrBytes(JNIEnv *env, const char *str);
 
 // Implementation
 
+JNIEXPORT jint JNICALL
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
+  (JNIEnv *env, jclass clazz)
+{
+    return initDevices();
+}
+
+JNIEXPORT void JNICALL
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
+  (JNIEnv *env, jclass clazz)
+{
+    freeDevices();
+}
+
 JNIEXPORT jbyteArray JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getDeviceNameBytes
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -35,8 +49,23 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getDeviceNameBytes
     return deviceNameBytes;
 }
 
+JNIEXPORT jbyteArray JNICALL
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceModelIdentifierBytes
+  (JNIEnv *env, jclass clazz, jstring deviceUID)
+{
+    const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
+    char * deviceModelIdentifier = getDeviceModelIdentifier(deviceUIDPtr);
+    jbyteArray deviceModelIdentifierBytes
+        = getStrBytes(env, deviceModelIdentifier);
+    // Free
+    free(deviceModelIdentifier);
+    (*env)->ReleaseStringUTFChars(env, deviceUID, deviceUIDPtr);
+
+    return deviceModelIdentifierBytes;
+}
+
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -48,7 +77,7 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setInputDeviceVolume
 }
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -60,7 +89,7 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setOutputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -72,7 +101,7 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getInputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
new file mode 100644
index 0000000000000000000000000000000000000000..c02caef497f49e3594a415c5df6a0ce6922936de
--- /dev/null
+++ b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
@@ -0,0 +1,77 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_jitsi_impl_neomedia_CoreAudioDevice */
+
+#ifndef _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#define _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    initDevices
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    freeDevices
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceNameBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceModelIdentifierBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceModelIdentifierBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setInputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setOutputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getInputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getOutputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h
deleted file mode 100644
index 06ff03ca89db95c7b81dc2ea5a1dcf75a9ec07be..0000000000000000000000000000000000000000
--- a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice */
-
-#ifndef _Included_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
-#define _Included_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    getDeviceNameBytes
- * Signature: (Ljava/lang/String;)[B
- */
-JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getDeviceNameBytes
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    setInputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setInputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    setOutputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setOutputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    getInputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getInputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    getOutputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getOutputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/src/native/macosx/coreaudio/lib/device.c b/src/native/macosx/coreaudio/lib/device.c
index a7e1df9f4b117db2a9d1bcc2ee5ef3baea9112a8..0894ae2aaacb64cab59e97c4c26721a6413a4fc3 100644
--- a/src/native/macosx/coreaudio/lib/device.c
+++ b/src/native/macosx/coreaudio/lib/device.c
@@ -18,6 +18,10 @@
 /**
  * Private definition of functions,
  */
+char* getDeviceProperty(
+        const char * deviceUID,
+        AudioObjectPropertySelector propertySelector);
+
 OSStatus setDeviceVolume(
         const char * deviceUID,
         Float32 volume,
@@ -31,6 +35,26 @@ OSStatus getChannelsForStereo(
         const char * deviceUID,
         UInt32 * channels);
 
+/**
+ * Do nothing: there is no need to initializes anything to get device
+ * information on MacOsX.
+ *
+ * @return Always returns 0 (always works).
+ */
+int initDevices(void)
+{
+    return 0;
+}
+
+/**
+ * Do nothing: there is no need to frees anything once getting device
+ * information is finished on MacOsX.
+ */
+void freeDevices(void)
+{
+    // Nothing to do.
+}
+
 /**
  * Returns the audio device corresponding to the UID given in parameter. Or
  * kAudioObjectUnknown if the device is nonexistant or if anything as failed.
@@ -104,6 +128,38 @@ AudioDeviceID getDevice(
  */
 char* getDeviceName(
         const char * deviceUID)
+{
+    return getDeviceProperty(deviceUID, kAudioObjectPropertyName);
+}
+
+/**
+ * Returns the device model identifier for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ *
+ * @param device The device to get the name from.
+ *
+ * @return The device model identifier for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ */
+char* getDeviceModelIdentifier(
+        const char * deviceUID)
+{
+    return getDeviceProperty(deviceUID, kAudioDevicePropertyModelUID);
+}
+
+/**
+ * Returns the requested device property for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ *
+ * @param device The device to get the name from.
+ * @param propertySelector The property we want to retrieve.
+ *
+ * @return The requested device property for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ */
+char* getDeviceProperty(
+        const char * deviceUID,
+        AudioObjectPropertySelector propertySelector)
 {
     AudioDeviceID device;
     OSStatus err = noErr;
@@ -114,15 +170,15 @@ char* getDeviceName(
     if((device = getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tgetDevice\n");
         return NULL;
     }
 
-    // Gets the device name
-    CFStringRef deviceName;
-    size = sizeof(deviceName);
-    address.mSelector = kAudioObjectPropertyName;
+    // Gets the device property
+    CFStringRef deviceProperty;
+    size = sizeof(deviceProperty);
+    address.mSelector = propertySelector;
     address.mScope = kAudioObjectPropertyScopeGlobal;
     address.mElement = kAudioObjectPropertyElementMaster;
 
@@ -132,33 +188,34 @@ char* getDeviceName(
             0,
             NULL,
             &size,
-            &deviceName)) != noErr)
+            &deviceProperty)) != noErr)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tAudioObjectGetPropertyData, err: %d\n",
                 ((int) err));
         return NULL;
     }
 
-    // Converts the device name to ASCII.
-    CFIndex deviceNameLength = CFStringGetLength(deviceName) + 1;
-    char * deviceASCIIName;
+    // Converts the device property to ASCII.
+    CFIndex devicePropertyLength = CFStringGetLength(deviceProperty) + 1;
+    char * deviceASCIIProperty;
     // The caller of this function must free the string.
-    if((deviceASCIIName = (char *) malloc(deviceNameLength * sizeof(char)))
+    if((deviceASCIIProperty
+                = (char *) malloc(devicePropertyLength * sizeof(char)))
             == NULL)
     {
-        perror("getDeviceName (coreaudio/device.c): \
+        perror("getDeviceProperty (coreaudio/device.c): \
                     \n\tmalloc\n");
         return NULL;
     }
     if(CFStringGetCString(
-                deviceName,
-                deviceASCIIName,
-                deviceNameLength,
+                deviceProperty,
+                deviceASCIIProperty,
+                devicePropertyLength,
                 kCFStringEncodingASCII))
     {
-        return deviceASCIIName;
+        return deviceASCIIProperty;
     }
     return NULL;
 }
diff --git a/src/native/macosx/coreaudio/lib/device.h b/src/native/macosx/coreaudio/lib/device.h
index ed5b12cb85c5caad2c6ad0f3128f2a6c47a40510..3a78e8441442973c21c6da3a28c79dd4b98b55ae 100644
--- a/src/native/macosx/coreaudio/lib/device.h
+++ b/src/native/macosx/coreaudio/lib/device.h
@@ -17,12 +17,19 @@
  *
  * @author Vincent Lucas
  */
+int initDevices(void);
+
+void freeDevices(void);
+
 AudioDeviceID getDevice(
         const char * deviceUID);
 
 char* getDeviceName(
         const char * deviceUID);
 
+char* getDeviceModelIdentifier(
+        const char * deviceUID);
+
 OSStatus setInputDeviceVolume(
         const char * deviceUID,
         Float32 volume);
diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.c b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
similarity index 82%
rename from src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.c
rename to src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
index a0824d3e64dd8da7dce0e2f242edf39f5601594b..2afc9305c4cd1c46752ca1afcb5edf5cba0f052d 100644
--- a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.c
+++ b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
@@ -5,7 +5,7 @@
  * See terms of license at gnu.org.
  */
 
-#include "org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h"
+#include "org_jitsi_impl_neomedia_CoreAudioDevice.h"
 
 #include "../lib/device.h"
 
@@ -22,21 +22,21 @@ static jbyteArray getStrBytes(JNIEnv *env, const char *str);
 // Implementation
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_initDevices
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
   (JNIEnv *env, jclass clazz)
 {
     return initDevices();
 }
 
 JNIEXPORT void JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_freeDevices
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
   (JNIEnv *env, jclass clazz)
 {
     freeDevices();
 }
 
 JNIEXPORT jbyteArray JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getDeviceNameBytes
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -50,7 +50,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getDeviceNameBytes
 }
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -62,7 +62,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setInputDeviceVolume
 }
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -74,7 +74,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setOutputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -86,7 +86,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getInputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
new file mode 100644
index 0000000000000000000000000000000000000000..c02caef497f49e3594a415c5df6a0ce6922936de
--- /dev/null
+++ b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
@@ -0,0 +1,77 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_jitsi_impl_neomedia_CoreAudioDevice */
+
+#ifndef _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#define _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    initDevices
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    freeDevices
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceNameBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceModelIdentifierBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceModelIdentifierBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setInputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setOutputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getInputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getOutputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h
deleted file mode 100644
index fafe376c04a4059f4e6528c7a637d7327101dd43..0000000000000000000000000000000000000000
--- a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice */
-
-#ifndef _Included_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
-#define _Included_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    initDevices
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_initDevices
-  (JNIEnv *, jclass);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    freeDevices
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_freeDevices
-  (JNIEnv *, jclass);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    getDeviceNameBytes
- * Signature: (Ljava/lang/String;)[B
- */
-JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getDeviceNameBytes
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    setInputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setInputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    setOutputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setOutputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    getInputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getInputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    getOutputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getOutputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/src/org/jitsi/impl/neomedia/wincoreaudio/CoreAudioDevice.java b/src/org/jitsi/impl/neomedia/CoreAudioDevice.java
similarity index 57%
rename from src/org/jitsi/impl/neomedia/wincoreaudio/CoreAudioDevice.java
rename to src/org/jitsi/impl/neomedia/CoreAudioDevice.java
index 3477f5ec93b453f1438be7d5cac50b6de5451b2e..4c1529275a66c2f5bf5f962116eada8342c76ad5 100644
--- a/src/org/jitsi/impl/neomedia/wincoreaudio/CoreAudioDevice.java
+++ b/src/org/jitsi/impl/neomedia/CoreAudioDevice.java
@@ -4,12 +4,12 @@
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
-package org.jitsi.impl.neomedia.wincoreaudio;
+package org.jitsi.impl.neomedia;
 
 import org.jitsi.util.*;
 
 /**
- * JNI link to the Windows CoreAudio library.
+ * JNI link to the MacOsX / Windows CoreAudio library.
  *
  * @author Vincent Lucqs
  */
@@ -17,11 +17,21 @@ public class CoreAudioDevice
 {
     static
     {
-        System.loadLibrary("jnwincoreaudio");
+        if(OSUtils.IS_MAC)
+        {
+            System.loadLibrary("jnmaccoreaudio");
+        }
+        else if(OSUtils.IS_WINDOWS_VISTA
+                || OSUtils.IS_WINDOWS_7
+                || OSUtils.IS_WINDOWS_8)
+        {
+            System.loadLibrary("jnwincoreaudio");
+        }
     }
 
-//    public static native AudioDeviceID getDevice(
-//            String deviceUID);
+    public static native int initDevices();
+
+    public static native void freeDevices();
 
     public static String getDeviceName(
             String deviceUID)
@@ -32,11 +42,21 @@ public static String getDeviceName(
         return deviceName;
     }
 
-    public static native int initDevices();
+    public static native byte[] getDeviceNameBytes(
+            String deviceUID);
 
-    public static native void freeDevices();
+    public static String getDeviceModelIdentifier(
+            String deviceUID)
+    {
+        byte[] deviceModelIdentifierBytes
+            = getDeviceModelIdentifierBytes(deviceUID);
+        String deviceModelIdentifier
+            = StringUtils.newString(deviceModelIdentifierBytes);
 
-    public static native byte[] getDeviceNameBytes(
+        return deviceModelIdentifier;
+    }
+
+    public static native byte[] getDeviceModelIdentifierBytes(
             String deviceUID);
 
     public static native int setInputDeviceVolume(
diff --git a/src/org/jitsi/impl/neomedia/device/Devices.java b/src/org/jitsi/impl/neomedia/device/Devices.java
index a8f32f8351857b12fa9c78f831ba9abef78ef2da..5bad919ced9c63afbc39ac9fbec6714e83c79556 100644
--- a/src/org/jitsi/impl/neomedia/device/Devices.java
+++ b/src/org/jitsi/impl/neomedia/device/Devices.java
@@ -72,7 +72,8 @@ public ExtendedCaptureDeviceInfo getDevice(
             {
                 ExtendedCaptureDeviceInfo activeDevice = activeDevices.get(i);
 
-                if(!devicePreferences.contains(activeDevice.getIdentifier()))
+                if(!devicePreferences.contains(
+                            activeDevice.getModelIdentifier()))
                 {
                     // Adds the device in the preference list (to the end of the
                     // list, but the save device will push it to the top of
@@ -97,7 +98,7 @@ public ExtendedCaptureDeviceInfo getDevice(
                         // If we have found the "preferred" device among active
                         // device.
                         if(devicePreference.equals(
-                                activeDevice.getIdentifier()))
+                                activeDevice.getModelIdentifier()))
                         {
                             return activeDevice;
                         }
@@ -209,7 +210,7 @@ private void saveDevice(
         String selectedDeviceIdentifier
             = (device == null)
                 ? NoneAudioSystem.LOCATOR_PROTOCOL
-                : device.getIdentifier();
+                : device.getModelIdentifier();
 
         // Sorts the user preferences to put the selected device on top.
         addToDevicePreferences(
@@ -305,7 +306,7 @@ private void addToDevicePreferences(
                     for(ExtendedCaptureDeviceInfo activeDevice : activeDevices)
                     {
                         if(devicePreference.equals(
-                                    activeDevice.getIdentifier())
+                                    activeDevice.getModelIdentifier())
                                 || devicePreference.equals(
                                         NoneAudioSystem.LOCATOR_PROTOCOL))
                         {
@@ -336,12 +337,12 @@ private void renameOldFashionedIdentifier(
         for(ExtendedCaptureDeviceInfo activeDevice : activeDevices)
         {
             String name = activeDevice.getName();
-            String id = activeDevice.getIdentifier();
+            String id = activeDevice.getModelIdentifier();
 
             // We can only switch to the new fashioned notation, only if the OS
             // API gives us a unique identifier (different from the device
             // name).
-            if(!name.equals(id))
+            if(id != null)
             {
                 synchronized(devicePreferences)
                 {
diff --git a/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java b/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java
index 7a3f611045ae7d88f8d4aa8ae920cd057df2f0c7..f166a83d1181ed48b5d580107ca8f47df9cb0f21 100644
--- a/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java
+++ b/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java
@@ -27,6 +27,11 @@ public class ExtendedCaptureDeviceInfo
      */
     private final String uid;
 
+    /**
+     * The persistent identifier for the model of this device.
+     */
+    private final String modelIdentifier;
+
     /**
      * Constructs a CaptureDeviceInfo object with the specified name, media
      * locator, and array of Format objects.
@@ -34,18 +39,22 @@ public class ExtendedCaptureDeviceInfo
      * @param captureDeiceInfo the device info.
      * @param uid The device UID (unique identifier).
      * @param transportType The device transport type.
+     * @param modelIdentifier The persistent identifier for the model of this
+     * device.
      */
     public ExtendedCaptureDeviceInfo(
             CaptureDeviceInfo captureDeviceInfo,
             String uid,
-            String transportType)
+            String transportType,
+            String modelIdentifier)
     {
         this(
                 captureDeviceInfo.getName(),
                 captureDeviceInfo.getLocator(),
                 captureDeviceInfo.getFormats(),
                 uid,
-                transportType);
+                transportType,
+                modelIdentifier);
     }
 
     /**
@@ -57,15 +66,22 @@ public ExtendedCaptureDeviceInfo(
      * @param formats An array of the output formats supported by the device.
      * @param uid The device UID (unique identifier).
      * @param transportType The device transport type.
+     * @param modelIdentifier The persistent identifier for the model of this
+     * device.
      */
     public ExtendedCaptureDeviceInfo(
-            String name, MediaLocator locator, Format[] formats,
-            String uid, String transportType)
+            String name,
+            MediaLocator locator,
+            Format[] formats,
+            String uid,
+            String transportType,
+            String modelIdentifier)
     {
         super(name, locator, formats);
 
         this.uid = uid;
         this.transportType = transportType;
+        this.modelIdentifier = modelIdentifier;
     }
 
     /**
@@ -119,6 +135,16 @@ public String getUID()
         return uid;
     }
 
+    /**
+     * Returns the model identifier of this instance.
+     *
+     * @return the model identifier of this instance
+     */
+    public String getModelIdentifier()
+    {
+        return modelIdentifier;
+    }
+
     /**
      * Returns a hash code value for this object for the benefit of hashtables.
      *
diff --git a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
index c46f6164fcf58661f4852d69bb4966e65f2b3d4d..43bb6a921d1c971735744b4a8f91ca0570bf8fc7 100644
--- a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
+++ b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
@@ -280,6 +280,8 @@ protected void doInitialize()
                 = Pa.DeviceInfo_getTransportType(deviceInfo);
             String deviceUID
                 = Pa.DeviceInfo_getDeviceUID(deviceInfo);
+            String modelIdentifier
+                = CoreAudioDevice.getDeviceModelIdentifier(deviceUID);
 
             /*
              * TODO The intention of reinitialize() was to perform the
@@ -336,7 +338,8 @@ protected void doInitialize()
                                         Format.byteArray)
                             },
                             deviceUID,
-                            transportType);
+                            transportType,
+                            modelIdentifier);
             }
 
             /*
diff --git a/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java b/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java
index c91ba16c5831fd1282350a7e3ef4d02acaa4f77e..d7c8cda77796a0bbb8d57190b624a6d3576f169b 100644
--- a/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java
+++ b/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java
@@ -370,6 +370,7 @@ public void callback(long c, long i, int eol)
                             captureDeviceFormats.toArray(
                                     new Format[captureDeviceFormats.size()]),
                             null,
+                            null,
                             null));
         }
         if (!playbackDevices.isEmpty())
@@ -381,6 +382,7 @@ public void callback(long c, long i, int eol)
                             new MediaLocator(LOCATOR_PROTOCOL + ":"),
                             null,
                             null,
+                            null,
                             null));
         }
 
@@ -473,6 +475,7 @@ private void sinkInfoListCallback(
                                     + name),
                         null,
                         null,
+                        null,
                         null));
     }
 
@@ -539,6 +542,7 @@ private void sourceInfoListCallback(
                             sourceInfoFormatList.toArray(
                                     new Format[sourceInfoFormatList.size()]),
                             null,
+                            null,
                             null));
         }
     }
diff --git a/src/org/jitsi/impl/neomedia/maccoreaudio/CoreAudioDevice.java b/src/org/jitsi/impl/neomedia/maccoreaudio/CoreAudioDevice.java
deleted file mode 100644
index 21d7481a8a3e0794e95318d2657ac81dd68d4252..0000000000000000000000000000000000000000
--- a/src/org/jitsi/impl/neomedia/maccoreaudio/CoreAudioDevice.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jitsi.impl.neomedia.maccoreaudio;
-
-import org.jitsi.util.*;
-
-/**
- * JNI link to the MacOSX CoreAudio library.
- *
- * @author Vincent Lucqs
- */
-public class CoreAudioDevice
-{
-    static
-    {
-        System.loadLibrary("jnmaccoreaudio");
-    }
-
-//    public static native AudioDeviceID getDevice(
-//            String deviceUID);
-
-    public static String getDeviceName(
-            String deviceUID)
-    {
-        byte[] deviceNameBytes = getDeviceNameBytes(deviceUID);
-        String deviceName = StringUtils.newString(deviceNameBytes);
-
-        return deviceName;
-    }
-
-    public static native byte[] getDeviceNameBytes(
-            String deviceUID);
-
-    public static native int setInputDeviceVolume(
-            String deviceUID,
-            float volume);
-
-    public static native int setOutputDeviceVolume(
-            String deviceUID,
-            float volume);
-
-    public static native float getInputDeviceVolume(
-            String deviceUID);
-
-    public static native float getOutputDeviceVolume(
-            String deviceUID);
-}