diff --git a/common/rfb/CSecurityVeNCrypt.cxx b/common/rfb/CSecurityVeNCrypt.cxx
index 94af48d..39a95f4 100644
--- a/common/rfb/CSecurityVeNCrypt.cxx
+++ b/common/rfb/CSecurityVeNCrypt.cxx
@@ -30,7 +30,6 @@
 #include <rfb/CSecurityVeNCrypt.h>
 #include <rfb/CSecurityVncAuth.h>
 #include <rfb/LogWriter.h>
-#include <rfb/SSecurityVeNCrypt.h>
 #include <list>
 
 using namespace rfb;
@@ -147,14 +146,14 @@
 
     /* make a choice and send it to the server, meanwhile set up the stack */
     if (!haveChosenType) {
-      chosenType = 0;
+      chosenType = secTypeInvalid;
       U8 i;
       list<U32>::iterator j;
       list<U32> preferredList;
 
       /* Try preferred choice */
-      SSecurityVeNCrypt::getSecTypes(&preferredList);
-	  
+      preferredList = security->GetEnabledExtSecTypes();
+
       for (j = preferredList.begin(); j != preferredList.end(); j++) {
 	for (i = 0; i < nAvailableTypes; i++) {
 	  if (*j == availableTypes[i]) {
@@ -163,29 +162,19 @@
 	  }
 	}
 
-	if (chosenType)
+	if (chosenType != secTypeInvalid)
 	  break;
       }
 
       vlog.debug("Choosing security type %s (%d)", secTypeName(chosenType),
 		 chosenType);
-      /* Set up the stack according to the chosen type: */
-      switch (chosenType) {
-	case secTypeTLSNone:
-	case secTypeTLSVnc:
-	case secTypeTLSPlain:
-	case secTypeX509None:
-	case secTypeX509Vnc:
-	case secTypeX509Plain:
-	  csecurity = CSecurityVeNCrypt::getCSecurityStack(chosenType);
-	  break;
 
-	case secTypeInvalid:
-	case secTypeVeNCrypt: /* would cause looping */
-	default:
-	  throw AuthFailureException("No valid VeNCrypt sub-type");
-      }
-      
+      /* Set up the stack according to the chosen type: */
+      if (chosenType == secTypeInvalid || chosenType == secTypeVeNCrypt)
+	throw AuthFailureException("No valid VeNCrypt sub-type");
+
+      csecurity = CSecurityVeNCrypt::getCSecurityStack(chosenType);
+
       /* send chosen type to server */
       os->writeU32(chosenType);
       os->flush();
diff --git a/common/rfb/SSecurityVeNCrypt.cxx b/common/rfb/SSecurityVeNCrypt.cxx
index 894118d..2dd331e 100644
--- a/common/rfb/SSecurityVeNCrypt.cxx
+++ b/common/rfb/SSecurityVeNCrypt.cxx
@@ -54,12 +54,6 @@
  "specifies path to the key of the x509 certificate in PEM format",
  "", ConfServer);
 
-StringParameter SSecurityVeNCrypt::secTypesStr
-("VeNCryptTypes",
- "Specify which security scheme to use for VeNCrypt connections (TLSNone, "
- "TLSVnc, TLSPlain, X509None, X509Vnc, X509Plain)",
- "TLSVnc,TLSPlain,X509Vnc,X509Plain");
-
 SSecurityVeNCrypt::SSecurityVeNCrypt(Security *sec) : security(sec)
 {
   ssecurity = NULL;
@@ -141,7 +135,8 @@
    */
   if (!haveSentTypes) {
     list<U32> listSubTypes;
-    SSecurityVeNCrypt::getSecTypes(&listSubTypes);
+
+    listSubTypes = security->GetEnabledExtSecTypes();
 
     numTypes = listSubTypes.size();
     subTypes = new U32[numTypes];
@@ -180,22 +175,12 @@
 
     vlog.debug("Choosing security type %s (%d)", secTypeName(chosenType),
 	       chosenType);
-    /* Set up the stack according to the chosen type */
-    switch(chosenType) {
-    case secTypeTLSNone:
-    case secTypeTLSVnc:
-    case secTypeTLSPlain:
-    case secTypeX509None:
-    case secTypeX509Vnc:
-    case secTypeX509Plain:
-      ssecurity = SSecurityVeNCrypt::getSSecurityStack(chosenType);
-	break;  
-    case secTypeInvalid:
-    case secTypeVeNCrypt: /* This would cause looping */
-    default:
-      throw AuthFailureException("No valid VeNCrypt sub-type");
-    }
 
+    /* Set up the stack according to the chosen type */
+    if (chosenType == secTypeInvalid || chosenType == secTypeVeNCrypt)
+      throw AuthFailureException("No valid VeNCrypt sub-type");
+
+    ssecurity = SSecurityVeNCrypt::getSSecurityStack(chosenType);
   }
 
   /* continue processing the messages */
@@ -221,68 +206,3 @@
   }
 }
 
-void SSecurityVeNCrypt::getSecTypes(list<U32>* secTypes)
-{
-  CharArray types;
-
-  types.buf = SSecurityVeNCrypt::secTypesStr.getData();
-  list<U32> configured = SSecurityVeNCrypt::parseSecTypes(types.buf);
-  list<U32>::iterator i;
-  for (i = configured.begin(); i != configured.end(); i++)
-    secTypes->push_back(*i);
-}
-
-U32 SSecurityVeNCrypt::secTypeNum(const char *name)
-{
-  if (strcasecmp(name, "TLSNone") == 0)
-    return secTypeTLSNone;
-  if (strcasecmp(name, "TLSVnc") == 0)
-    return secTypeTLSVnc;
-  if (strcasecmp(name, "TLSPlain") == 0)
-    return secTypeTLSPlain;
-  if (strcasecmp(name, "X509None") == 0)
-    return secTypeX509None;
-  if (strcasecmp(name, "X509Vnc") == 0)
-    return secTypeX509Vnc;
-  if (strcasecmp(name, "X509Plain") == 0)
-    return secTypeX509Plain;
-
-  return secTypeInvalid;
-}
-
-char* SSecurityVeNCrypt::secTypeName(U32 num)
-{
-  switch (num) {
-  case secTypePlain:
-    return "Plain";
-  case secTypeTLSNone:
-    return "TLSNone";
-  case secTypeTLSVnc:
-    return "TLSVnc";
-  case secTypeTLSPlain:
-    return "TLSPlain";
-  case secTypeX509None:
-    return "X509None";
-  case secTypeX509Vnc:
-    return "X509Vnc";
-  case secTypeX509Plain:
-    return "X509Plain";
-  default:
-    return "[unknown secType]";
-  }
-}
-
-list<U32> SSecurityVeNCrypt::parseSecTypes(const char *secTypes)
-{
-  list<U32> result;
-  CharArray types(strDup(secTypes)), type;
-  while (types.buf) {
-    strSplit(types.buf, ',', &type.buf, &types.buf);
-    int typeNum = SSecurityVeNCrypt::secTypeNum(type.buf);
-    if (typeNum != secTypeInvalid)
-      result.push_back(typeNum);
-  }
-  return result;
-}
-
-
diff --git a/common/rfb/SSecurityVeNCrypt.h b/common/rfb/SSecurityVeNCrypt.h
index 1fd6b4a..3d5949e 100644
--- a/common/rfb/SSecurityVeNCrypt.h
+++ b/common/rfb/SSecurityVeNCrypt.h
@@ -46,13 +46,8 @@
     virtual int getType() const { return secTypeVeNCrypt; }
     virtual const char* getUserName() const { return NULL; }
 
-    static StringParameter X509_CertFile, X509_KeyFile, secTypesStr;
+    static StringParameter X509_CertFile, X509_KeyFile;
 
-    /* XXX Derive Security class and merge those functions appropriately ? */
-    static void getSecTypes(std::list<rdr::U32>* secTypes);
-    static rdr::U32 secTypeNum(const char *name);
-    static char* secTypeName(rdr::U32 num);
-    static std::list<rdr::U32> parseSecTypes(const char *types);
   protected:
     static SSecurityStack* getSSecurityStack(int secType);
 
