diff --git a/nameko-func.py b/nameko-func.py
index fecfe17..ae216b2 100644
--- a/nameko-func.py
+++ b/nameko-func.py
@@ -56,6 +56,18 @@ def user_or_customer(uid):
     conn.unbind()
     return False
 
+# Get the objectclasses
+def objclasses(rdn, uid, connection):
+    # search for objectClasses
+    connection.search(rdn, '(%s)' % uid, attributes=['objectClass'])
+    objclass = []
+    # get the relevant data
+    tmp = conn.entries[0]['objectClass']
+    # This one sets up the array
+    for y in tmp:
+        objclass.append(y)
+    # return the array containing the objectClasses, like ['inetOrgPerson', 'posixAccount', 'ldapPublicKey']
+    return objclass
 
 # checks if a user already exists in the LDAP
 class UserLookUp(object):
@@ -100,11 +112,12 @@ class CreateUser(object):
         if not conn.bind():
             self.dispatch('ldap', '%s [Error CreateUser] Could not connect to LDAPserver\n' % datetime.now() )
             return "Could not connect to LDAP Server."
+        
         # set objectClasses for the new user
-        obj_new_user = ObjectDef(['inetOrgPerson', 'posixAccount', 'shadowAccount'], conn)
+        obj_new_user = ObjectDef(['inetOrgPerson', 'posixAccount', 'ldapPublicKey'], conn)
         w = Writer(conn, obj_new_user)
         # newly created users get put into ou=customers
-        dn = 'uid=%s,ou=customers,dc=ungleich,dc=ch' % user
+        dn = 'uid=%s,ou=users,dc=ungleich,dc=ch' % user
         w.new(dn)
         # Filling in some of the data
         # required attributes are sn, cn, homeDirectory, uid (already handled by dn), uidNumber, gidNumber
@@ -160,7 +173,9 @@ class GetUserData(object):
             conn.unbind()
             self.dispatch('ldap', '%s [Info GetUserData] Could not find user %s\n' % (datetime.now(), LDAP_UID) )
             return ("error", "Could not find the user.", "", "")
-        obj = ObjectDef(['inetOrgPerson', 'posixAccount', 'shadowAccount'], conn)
+        # Workaround because not all users have the same objectClasses
+        objclass = objclasses(rdn, LDAP_UID, conn)
+        obj = ObjectDef(objclass, conn)
         # The Reader gets the data for the user
         r = Reader(conn, obj, rdn)
         r.search()
@@ -205,8 +220,10 @@ class ChangeUserData(object):
             conn.unbind()
             self.dispatch('ldap', '%s [Info ChangeUserData] User with %s not found.\n' % (datetime.now(), LDAP_UID) )
             return "Could not find user."
+        # Fix because not every user has the same objectClasses
+        objclass = objclasses(rdn, LDAP_UID, conn)
         # Set up a reader for the user
-        obj = ObjectDef(['inetOrgPerson', 'posixAccount', 'shadowAccount'], conn)
+        obj = ObjectDef(objclass, conn)
         r = Reader(conn, obj, rdn)
         r.search()
         # Again, user_or_customer() should prevent it from throwing an exception because it's a confirmed user
@@ -253,8 +270,10 @@ class ChangePassword(object):
             conn.unbind()
             self.dispatch('ldap', '%s [Error ChangePassword] Could not find user %s\n' % (datetime.now(), LDAP_UID) )
             return "Could not find the user."
+        # Plus not everyone has the same objectClasses, so workaround
+        objclass = objclasses(rdn, LDAP_UID, conn)
+        obj = ObjectDef(objclass, conn)
         # Set up a Reader for the DN
-        obj = ObjectDef(['inetOrgPerson', 'posixAccount', 'shadowAccount'], conn)
         r = Reader(conn, obj, rdn)
         r.search()
         # Shouldn't throw an exception, since the user is confirmed to be there