diff --git a/kadmin/init.c b/kadmin/init.c
index 1f4165200..01e9aa47f 100644
--- a/kadmin/init.c
+++ b/kadmin/init.c
@@ -36,129 +36,95 @@
  * SUCH DAMAGE. 
  */
 
-#include "admin_locl.h"
+#include "kadmin_locl.h"
+#include <kadm5/private.h>
 
 RCSID("$Id$");
 
+static kadm5_ret_t
+create_random_entry(krb5_principal princ, time_t max_life, time_t max_rlife,
+		    u_int32_t attributes)
+{
+    kadm5_principal_ent_rec ent;
+    kadm5_ret_t ret;
+    int mask = 0;
+    krb5_keyblock *keys;
+    int n_keys, i;
+
+    memset(&ent, 0, sizeof(ent));
+    ent.principal = princ;
+    mask |= KADM5_PRINCIPAL;
+    ent.max_life = max_life;
+    mask |= KADM5_MAX_LIFE;
+    ent.max_renewable_life = max_rlife;
+    mask |= KADM5_MAX_RLIFE;
+    ent.attributes |= attributes | KRB5_KDB_DISALLOW_ALL_TIX;
+    mask |= KADM5_ATTRIBUTES;
+
+    ret = kadm5_create_principal(kadm_handle, &ent, mask, "hemlig");
+    if(ret)
+	return ret;
+    ret = kadm5_randkey_principal(kadm_handle, princ, &keys, &n_keys);
+    if(ret)
+	return ret;
+    for(i = 0; i < n_keys; i++)
+	krb5_free_keyblock_contents(context, &keys[i]);
+    free(keys);
+    ret = kadm5_get_principal(kadm_handle, princ, &ent, 
+			      KADM5_PRINCIPAL | KADM5_ATTRIBUTES);
+    if(ret)
+	return ret;
+    ent.attributes &= (~KRB5_KDB_DISALLOW_ALL_TIX);
+    ent.kvno = 1;
+    ret = kadm5_modify_principal(kadm_handle, &ent, 
+				 KADM5_ATTRIBUTES|KADM5_KVNO);
+    if(ret)
+	return ret;
+    return 0;
+}
+
 int
 init(int argc, char **argv)
 {
-    krb5_error_code ret;
+    kadm5_ret_t ret;
     int i;
 
-    int default_life = 86400;
-    int default_renew = 5 * 86400;
-    int max_life = 0;
-    int max_renew = 0;
-    
-    hdb_entry ent;
+    HDB *db = _kadm5_s_get_db(kadm_handle);
 
     ret = db->open(context, db, O_RDWR | O_CREAT, 0600);
     if(ret){
 	krb5_warn(context, ret, "hdb_open");
 	return 0;
     }
-    memset(&ent, 0, sizeof(ent));
-    for(i = 1; i < argc; i++){
-	krb5_build_principal(context, &ent.principal, 
-			     strlen(argv[i]), argv[i], 
-			     "krbtgt",
-			     argv[i],
-			     NULL);
-	ret = db->fetch(context, db, &ent);
-	switch(ret){
-	case 0:
-	    krb5_warnx(context, "Entry already exists");
-	    krb5_free_principal(context, ent.principal);
-	    continue;
-	case HDB_ERR_NOENTRY:
-	    break;
-	default:
-	    krb5_warn(context, ret, "hdb_fetch");
-	    db->close(context, db);
-	    return 0;
-	}
-	
-	max_life = getlife("Realm max ticket life", "infinite");
-	max_renew = getlife("Realm max renewable ticket life", "infinite");
-	default_life = getlife("Default ticket life", "1 day");
-	default_renew = getlife("Default renewable ticket life", "7 days");
-	
-	/* Create `krbtgt/REALM' */
-	init_des_key(&ent);
-	ent.kvno = 1;
-	if(max_life){
-	    ent.max_life = malloc(sizeof(*ent.max_life));
-	    *ent.max_life = max_life;
-	}
-	if(max_renew){
-	    ent.max_renew = malloc(sizeof(*ent.max_renew));
-	    *ent.max_renew = max_renew;
-	}
-	ent.created_by.time = time(NULL);
-	krb5_build_principal(context, &ent.created_by.principal,
-			     strlen(argv[i]), argv[i],
-			     "kadmin",
-			     NULL);
-	ent.flags.forwardable = 1;
-	ent.flags.proxiable = 1;
-	ent.flags.renewable = 1;
-	ent.flags.postdate = 1;
-	ent.flags.server = 1;
-	db->store(context, db, 1, &ent);
-	hdb_free_entry(context, &ent);
-
-	/* Create `default' */
-	memset(&ent, 0, sizeof(ent));
-	krb5_build_principal(context, &ent.principal,
-			     strlen(argv[i]), argv[i],
-			     "default",
-			     NULL);
-	if(default_life){
-	    ent.max_life = malloc(sizeof(*ent.max_life));
-	    *ent.max_life = default_life;
-	}
-	if(default_renew){
-	    ent.max_renew = malloc(sizeof(*ent.max_renew));
-	    *ent.max_renew = default_renew;
-	}
-	ent.created_by.time = time(NULL);
-	krb5_build_principal(context, &ent.created_by.principal, 
-			     strlen(argv[i]), argv[i],
-			     "kadmin",
-			     NULL);
-	ent.flags.invalid = 1;
-	db->store(context, db, 1, &ent);
-	hdb_free_entry(context, &ent);
-
-	/* Create `kadmin/changepw' */
-	memset(&ent, 0, sizeof(ent));
-	init_des_key(&ent);
-	ent.kvno = 1;
-	krb5_build_principal(context, &ent.principal,
-			     strlen(argv[i]), argv[i],
-			     "kadmin",
-			     "changepw",
-			     NULL);
-	if(default_life){
-	    ent.max_life = malloc(sizeof(*ent.max_life));
-	    *ent.max_life = default_life;
-	}
-	if(default_renew){
-	    ent.max_renew = malloc(sizeof(*ent.max_renew));
-	    *ent.max_renew = default_renew;
-	}
-	ent.created_by.time = time(NULL);
-	krb5_build_principal(context, &ent.created_by.principal, 
-			     strlen(argv[i]), argv[i],
-			     "kadmin",
-			     NULL);
-	ent.flags.initial   = 1;
-	ent.flags.server    = 1;
-	ent.flags.change_pw = 1;
-	db->store(context, db, 1, &ent);
-	hdb_free_entry(context, &ent);
-    }
     db->close(context, db);
+    for(i = 1; i < argc; i++){
+	krb5_principal princ;
+	time_t max_life, max_rlife;
+	/* Create `krbtgt/REALM' */
+	krb5_make_principal(context, &princ, argv[i], "krbtgt", argv[i], NULL);
+	max_life = get_deltat("Realm max ticket life", 
+				  "unlimited");
+	max_rlife = get_deltat("Realm max renewable ticket life", 
+					    "unlimited");
+	create_random_entry(princ, max_life, max_rlife, 0);
+	krb5_free_principal(context, princ);
+	/* Create `kadmin/changepw' */
+	krb5_make_principal(context, &princ, argv[i], 
+			    "kadmin", "changepw", NULL);
+	create_random_entry(princ, 5*60, 5*60, 
+			    KRB5_KDB_DISALLOW_TGT_BASED|
+			    KRB5_KDB_PWCHANGE_SERVICE|
+			    KRB5_KDB_DISALLOW_POSTDATED|
+			    KRB5_KDB_DISALLOW_FORWARDABLE|
+			    KRB5_KDB_DISALLOW_RENEWABLE|
+			    KRB5_KDB_DISALLOW_PROXIABLE|
+			    KRB5_KDB_REQUIRES_PRE_AUTH);
+	krb5_free_principal(context, princ);
+	/* Create `kadmin/admin' */
+	krb5_make_principal(context, &princ, argv[i], 
+			    "kadmin", "admin", NULL);
+	create_random_entry(princ, 60*60, 60*60, KRB5_KDB_REQUIRES_PRE_AUTH);
+	krb5_free_principal(context, princ);
+    }
     return 0;
 }