diff --git a/xCAT-server/lib/xcat/plugins/kvm.pm b/xCAT-server/lib/xcat/plugins/kvm.pm
index 8cba6d642..5848de6f3 100644
--- a/xCAT-server/lib/xcat/plugins/kvm.pm
+++ b/xCAT-server/lib/xcat/plugins/kvm.pm
@@ -64,6 +64,7 @@ sub handled_commands {
   return {
     rpower => 'nodehm:power,mgt',
     mkvm => 'nodehm:power,mgt',
+    chvm => 'nodehm:power,mgt',
     rmigrate => 'nodehm:mgt',
     getcons => 'nodehm:mgt',
     #rvitals => 'nodehm:mgt',
@@ -89,34 +90,23 @@ my $vmtab;
 
 sub build_pool_xml {
     my $url = shift;
-    my $currpools = shift;
-    my %usedindexes; #sadly, because we can't create new mountpoints via libvirt, we'll just use a simple number
-                    #and images will precreate maybe 1024 mountpoints
-    my $mntpoint;
     my $pool;
-    foreach (@$currpools) {
-        $pool = XMLin($_->get_xml_description());
-        $mntpoint = $pool->{target}->{path};
-        $mntpoint =~ s/.*\///;
-        $usedindexes{$mntpoint}=1;
-    }
-    my $index=0;
-    while ($usedindexes{$index}) {
-        $index++;
-    }
     my $host = $url;
     $host =~ s/.*:\/\///;
     $host =~ s/(\/.*)//;
     my $srcpath = $1;
     my $uuid = xCAT::Utils::genUUID(url=>$url);
     my $pooldesc = '<pool type="netfs">';
-    $pooldesc .= '<name>'.$url.'</name>';
+    $pooldesc .= '<name>'.$url.'</name>'; #Hey, at least libvirt doesn't have stupid name restrictions...
     $pooldesc .= '<uuid>'.$uuid.'</uuid>>';
     $pooldesc .= '<source>';
     $pooldesc .= '<host name="'.$host.'"/>';
     $pooldesc .= '<dir path="'.$srcpath.'"/>';
     $pooldesc .= '</source>';
-    $pooldesc .= '<target><path>/var/lib/xcat/pools/'.$index.'</path></target></pool>';
+    $pooldesc .= '<target><path>/var/lib/xcat/pools/'.$uuid.'</path></target></pool>';
+    system("ssh $hyp mkdir -p /var/lib/xcat/pools/$uuid"); #ok, so not *technically* just building XML, but here is the cheapest
+                                                            #place to know uuid...  And yes, we must be allowed to ssh in
+                                                            #libvirt just isn't capable enough for this sort of usage
     return $pooldesc;
 }
 
@@ -136,7 +126,6 @@ sub get_storage_pool_by_url {
         $pool = undef;
     }
     if ($pool) { return $poolobj; }
-    print build_pool_xml($url,\@currpools);
     $poolobj = $hypconn->create_storage_pool(build_pool_xml($url,\@currpools));
     return $poolobj;
 }
@@ -320,7 +309,7 @@ sub build_diskstruct {
                 }
                 next; #nfs:// skips the other stuff
                 #$diskhash->{source}->{file} = get_filepath_by_url(url=>$disk_parts[0],dev=>$diskhash->{target}->{dev}); #"/var/lib/xcat/vmnt/nfs_".$1."/$node/".$diskhash->{target}->{dev};
-            } else {
+            } else { #currently, this would be a bare file to slap in as a disk
                 $diskhash->{source}->{file} = $disk_parts[0];
             }
 
@@ -835,7 +824,7 @@ sub chvm {
     my $memory;
     @ARGV=@_;
     require Getopt::Long;
-    Getoptions(
+    GetOptions(
         "a=s"=>\@addsizes,
         "d=s"=>\@derefdisks,
         "mem=s"=>\$memory,
@@ -892,9 +881,22 @@ sub chvm {
         my $dom = $hypconn->get_domain_by_name($node);
         my $currstate=getpowstate($dom);
         if ($currstate eq 'on') { #attempt live attach
-
+            foreach (@diskstoadd) {
+                my $suffix =$_;
+                my $bus;
+                $suffix =~ s/.*\.//;
+                if ($suffix =~ /^sd/) {
+                    $bus='scsi';
+                } elsif ($suffix =~ /^hd/) {
+                    sendmsg("Reboot required to add IDE drives",$node);
+                    next;
+                } elsif ($suffix =~ /vd/) {
+                    $bus='virtio';
+                }
+                my $xml = "<disk type='file' device='disk'><source file='$_'/><target dev='$suffix' bus='$bus'/></disk>";
+                $dom->attach_device($xml);
+            }
         }
-
     }
 }
 
@@ -1002,6 +1004,8 @@ sub guestcmd {
     return power(@args);
   } elsif ($command eq "mkvm") {
       return mkvm($node,@args);
+  } elsif ($command eq "chvm") {
+      return chvm($node,@args);
   } elsif ($command eq "rmigrate") {
       return migrate($node,@args);
   } elsif ($command eq "getrvidparms") {