Index: src-qt4/warden-gui/dialogEditIP.cpp
===================================================================
--- src-qt4/warden-gui/dialogEditIP.cpp	(revision 0cfe72fdb39d3716f8451ab51997c60f28609424)
+++ src-qt4/warden-gui/dialogEditIP.cpp	(revision 8901c471a3edc5def8f045e3450b592605a7bc8d)
@@ -14,4 +14,5 @@
 #include <QProcess>
 #include <QString>
+#include <QFile>
 #include <QFileDialog>
 #include <QMessageBox>
@@ -22,17 +23,90 @@
 #include "dialogEditIP.h"
 
-void dialogEditIP::programInit(QString jIP, QStringList IPs)
-{
-  wardenIP = jIP;
-  listIP->clear();
-  for ( int i=0; i<IPs.count() ; i++)
-     if ( ! IPs.at(i).isEmpty() )
-	listIP->addItem(IPs.at(i));
+void dialogEditIP::programInit(QString name)
+{
+  JailDir = pcbsd::Utils::getValFromPCConf("/usr/local/etc/warden.conf", "JDIR");
+  jailName = name;
+  QString tmp;
+
+  // Lets start loading IP addresses
+  QFile file( JailDir + "/." + jailName + ".meta/ipv4" );
+  if ( file.exists() && file.open( QIODevice::ReadOnly ) ) {
+     QTextStream stream( &file ); tmp=""; tmp = stream.readLine();
+     lineIP->setText(tmp);
+     if ( ! tmp.isEmpty() )
+        checkIPv4->setChecked(true);
+     file.close();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/bridge-ipv4" );
+  if ( file.exists() && file.open( QIODevice::ReadOnly ) ) {
+     QTextStream stream( &file ); tmp=""; tmp = stream.readLine();
+     lineIPBridge->setText(tmp);
+     if ( ! tmp.isEmpty() )
+        checkIPv4Bridge->setChecked(true);
+     file.close();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/defaultrouter-ipv4" );
+  if ( file.exists() && file.open( QIODevice::ReadOnly ) ) {
+     QTextStream stream( &file ); tmp=""; tmp = stream.readLine();
+     lineIPRouter->setText(tmp);
+     if ( ! tmp.isEmpty() )
+        checkIPv4Router->setChecked(true);
+     file.close();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/ipv6" );
+  if ( file.exists() && file.open( QIODevice::ReadOnly ) ) {
+     QTextStream stream( &file ); tmp=""; tmp = stream.readLine();
+     lineIP6->setText(tmp);
+     if ( ! tmp.isEmpty() )
+        checkIPv6->setChecked(true);
+     file.close();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/bridge-ipv6" );
+  if ( file.exists() && file.open( QIODevice::ReadOnly ) ) {
+     QTextStream stream( &file ); tmp=""; tmp = stream.readLine();
+     lineIP6Bridge->setText(tmp);
+     if ( ! tmp.isEmpty() )
+        checkIPv6Bridge->setChecked(true);
+     file.close();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/defaultrouter-ipv6" );
+  if ( file.exists() && file.open( QIODevice::ReadOnly ) ) {
+     QTextStream stream( &file ); tmp=""; tmp = stream.readLine();
+     lineIP6Router->setText(tmp);
+     if ( ! tmp.isEmpty() )
+        checkIPv6Router->setChecked(true);
+     file.close();
+  }
 
   // Our buttons / slots
+  connect( checkIPv4, SIGNAL( clicked() ), this, SLOT( slotCheckChecks() ) );
+  connect( checkIPv4Bridge, SIGNAL( clicked() ), this, SLOT( slotCheckChecks() ) );
+  connect( checkIPv4Router, SIGNAL( clicked() ), this, SLOT( slotCheckChecks() ) );
+  connect( checkIPv6, SIGNAL( clicked() ), this, SLOT( slotCheckChecks() ) );
+  connect( checkIPv6Bridge, SIGNAL( clicked() ), this, SLOT( slotCheckChecks() ) );
+  connect( checkIPv6Router, SIGNAL( clicked() ), this, SLOT( slotCheckChecks() ) );
+
   connect( pushSave, SIGNAL( clicked() ), this, SLOT( slotSaveClicked() ) );
   connect( pushCancel, SIGNAL( clicked() ), this, SLOT( slotCancelClicked() ) );
   connect( pushAdd, SIGNAL( clicked() ), this, SLOT( slotAddClicked() ) );
   connect( pushRemove, SIGNAL( clicked() ), this, SLOT( slotRemClicked() ) );
+
+  slotCheckChecks();
+}
+
+void dialogEditIP::slotCheckChecks()
+{
+  lineIP->setEnabled(checkIPv4->isChecked());
+  lineIPBridge->setEnabled(checkIPv4Bridge->isChecked());
+  lineIPRouter->setEnabled(checkIPv4Router->isChecked());
+  lineIP6->setEnabled(checkIPv6->isChecked());
+  lineIP6Bridge->setEnabled(checkIPv6Bridge->isChecked());
+  lineIP6Router->setEnabled(checkIPv6Router->isChecked());
+
 }
 
@@ -44,4 +118,29 @@
 bool dialogEditIP::sanityCheckSettings()
 {
+  if ( checkIPv4->isChecked() && ! checkValidBlock(lineIP->text(), QString("IPv4")) ) {
+        QMessageBox::critical(this, tr("Warden"), tr("Invalid IPv4 address!"), QMessageBox::Ok, QMessageBox::Ok);
+        return false;
+  }
+  if ( checkIPv4Bridge->isChecked() && ! checkValidBlock(lineIPBridge->text(), QString("IPv4")) ) {
+        QMessageBox::critical(this, tr("Warden"), tr("Invalid IPv4 bridge address!"), QMessageBox::Ok, QMessageBox::Ok);
+        return false;
+  }
+  if ( checkIPv4Router->isChecked() && ! checkValidBlock(lineIPRouter->text(), QString("IPv4")) ) {
+        QMessageBox::critical(this, tr("Warden"), tr("Invalid IPv4 router address!"), QMessageBox::Ok, QMessageBox::Ok);
+        return false;
+  }
+  if ( checkIPv6->isChecked() && ! checkValidBlock(lineIP6->text(), QString("IPv6")) ) {
+        QMessageBox::critical(this, tr("Warden"), tr("Invalid IPv6 address!"), QMessageBox::Ok, QMessageBox::Ok);
+        return false;
+  }
+  if ( checkIPv6Bridge->isChecked() && ! checkValidBlock(lineIP6Bridge->text(), QString("IPv6")) ) {
+        QMessageBox::critical(this, tr("Warden"), tr("Invalid IPv6 bridge address!"), QMessageBox::Ok, QMessageBox::Ok);
+        return false;
+  }
+  if ( checkIPv6Router->isChecked() && ! checkValidBlock(lineIP6Router->text(), QString("IPv6")) ) {
+        QMessageBox::critical(this, tr("Warden"), tr("Invalid IPv6 router address!"), QMessageBox::Ok, QMessageBox::Ok);
+        return false;
+  }
+
   return true;
 }
@@ -59,4 +158,87 @@
 void dialogEditIP::saveSettings()
 {
+  QString tmp;
+  QFile file;
+
+  // Start saving settings
+  file.setFileName( JailDir + "/." + jailName + ".meta/ipv4" );
+  if ( checkIPv4->isChecked() ) {
+    if ( file.open( QIODevice::WriteOnly ) ) {
+       QTextStream stream( &file ); tmp = lineIP->text();
+       if (tmp.indexOf("/") == -1)
+         tmp = tmp + "/24"; 
+       stream << tmp;
+       file.close();
+    }
+  } else {
+    file.remove();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/bridge-ipv4" );
+  if ( checkIPv4Bridge->isChecked() ) {
+    if ( file.open( QIODevice::WriteOnly ) ) {
+       QTextStream stream( &file ); tmp = lineIPBridge->text();
+       if (tmp.indexOf("/") == -1)
+         tmp = tmp + "/24"; 
+       stream << tmp;
+       file.close();
+    }
+  } else {
+    file.remove();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/defaultrouter-ipv4" );
+  if ( checkIPv4Router->isChecked() ) {
+    if ( file.open( QIODevice::WriteOnly ) ) {
+       QTextStream stream( &file ); tmp = lineIPRouter->text();
+       if (tmp.indexOf("/") == -1)
+         tmp = tmp + "/24"; 
+       stream << tmp;
+       file.close();
+    }
+  } else {
+    file.remove();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/ipv6" );
+  if ( checkIPv6->isChecked() ) {
+    if ( file.open( QIODevice::WriteOnly ) ) {
+       QTextStream stream( &file ); tmp = lineIP6->text();
+       if (tmp.indexOf("/") == -1)
+         tmp = tmp + "/64"; 
+       stream << tmp;
+       file.close();
+    }
+  } else {
+    file.remove();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/bridge-ipv6" );
+  if ( checkIPv6Bridge->isChecked() ) {
+    if ( file.open( QIODevice::WriteOnly ) ) {
+       QTextStream stream( &file ); tmp = lineIP6Bridge->text();
+       if (tmp.indexOf("/") == -1)
+         tmp = tmp + "/64"; 
+       stream << tmp;
+       file.close();
+    }
+  } else {
+    file.remove();
+  }
+
+  file.setFileName( JailDir + "/." + jailName + ".meta/defaultrouter-ipv6" );
+  if ( checkIPv6Router->isChecked() ) {
+    if ( file.open( QIODevice::WriteOnly ) ) {
+       QTextStream stream( &file ); tmp = lineIP6Router->text();
+       if (tmp.indexOf("/") == -1)
+         tmp = tmp + "/64"; 
+       stream << tmp;
+       file.close();
+    }
+  } else {
+    file.remove();
+  }
+
+        /*
 	QStringList IPs;
 	for ( int i=0; i<listIP->count() ; i++)
@@ -76,4 +258,5 @@
                 QCoreApplication::processEvents();
         }
+        */
 	
 }
@@ -96,4 +279,25 @@
 }
 
+bool dialogEditIP::checkValidBlock(QString block, QString type)
+{
+   QString url = block;
+
+   // Strip off the /24 part
+   if ( url.indexOf("/") != -1 )
+      url.truncate(url.indexOf("/"));
+
+   if ( type == "IPv4" ) {
+      if ( ! pcbsd::Utils::validateIPV4(url) )
+	return false;
+
+   } else {
+      if ( ! pcbsd::Utils::validateIPV6(url) )
+	return false;
+
+   }
+
+   return true;
+}
+
 void dialogEditIP::slotRemClicked()
 {
Index: src-qt4/warden-gui/dialogEditIP.h
===================================================================
--- src-qt4/warden-gui/dialogEditIP.h	(revision 1f0939ebe9ce9c9bc02fc15c501ad42e6629659a)
+++ src-qt4/warden-gui/dialogEditIP.h	(revision 8901c471a3edc5def8f045e3450b592605a7bc8d)
@@ -15,5 +15,5 @@
         }
 
-	void programInit(QString, QStringList);
+	void programInit(QString);
 
 public slots:
@@ -27,9 +27,12 @@
         void slotCancelClicked();
         void slotSaveClicked();
+        void slotCheckChecks();
 
 private:
 	void displayRepos();
         void saveSettings();
-        QString wardenIP;
+        bool checkValidBlock(QString block, QString type);
+        QString jailName;
+        QString JailDir;
 
 signals:
Index: src-qt4/warden-gui/dialogEditIP.ui
===================================================================
--- src-qt4/warden-gui/dialogEditIP.ui	(revision 1f0939ebe9ce9c9bc02fc15c501ad42e6629659a)
+++ src-qt4/warden-gui/dialogEditIP.ui	(revision 8901c471a3edc5def8f045e3450b592605a7bc8d)
@@ -7,10 +7,10 @@
     <x>0</x>
     <y>0</y>
-    <width>413</width>
-    <height>327</height>
+    <width>502</width>
+    <height>413</height>
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Repository Configuration</string>
+   <string>IP Configuration</string>
   </property>
   <property name="windowIcon">
@@ -26,44 +26,215 @@
      <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
-       <widget class="QListWidget" name="listIP"/>
-      </item>
-      <item row="1" column="0" colspan="2">
-       <layout class="QHBoxLayout" name="horizontalLayout_2">
-        <item>
-         <spacer name="horizontalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QPushButton" name="pushAdd">
-          <property name="text">
-           <string>&amp;Add</string>
-          </property>
-          <property name="icon">
-           <iconset>
-            <normaloff>:/add.png</normaloff>:/add.png</iconset>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QPushButton" name="pushRemove">
-          <property name="text">
-           <string>&amp;Remove</string>
-          </property>
-          <property name="icon">
-           <iconset>
-            <normaloff>:/remove.png</normaloff>:/remove.png</iconset>
-          </property>
-         </widget>
-        </item>
-       </layout>
+       <widget class="QTabWidget" name="tabWidget">
+        <property name="currentIndex">
+         <number>0</number>
+        </property>
+        <widget class="QWidget" name="tab">
+         <attribute name="title">
+          <string>IPv4</string>
+         </attribute>
+         <layout class="QGridLayout" name="gridLayout_4">
+          <item row="0" column="0">
+           <widget class="QCheckBox" name="checkIPv4">
+            <property name="text">
+             <string>IPv4 Address</string>
+            </property>
+            <property name="checked">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLineEdit" name="lineIP">
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+            <property name="inputMask">
+             <string notr="true"/>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignHCenter</set>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0">
+           <widget class="QCheckBox" name="checkIPv4Bridge">
+            <property name="text">
+             <string>IPv4 Bridge Address</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0">
+           <widget class="QLineEdit" name="lineIPBridge">
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="4" column="0">
+           <widget class="QCheckBox" name="checkIPv4Router">
+            <property name="text">
+             <string>IPv4 Default Router</string>
+            </property>
+           </widget>
+          </item>
+          <item row="5" column="0">
+           <widget class="QLineEdit" name="lineIPRouter">
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="6" column="0">
+           <spacer name="verticalSpacer_2">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>140</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="tab_3">
+         <attribute name="title">
+          <string>IPv6</string>
+         </attribute>
+         <layout class="QGridLayout" name="gridLayout_5">
+          <item row="0" column="0">
+           <widget class="QCheckBox" name="checkIPv6">
+            <property name="text">
+             <string>IPv6 Address</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLineEdit" name="lineIP6">
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0">
+           <widget class="QCheckBox" name="checkIPv6Bridge">
+            <property name="text">
+             <string>IPv6 Bridge Address</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0">
+           <widget class="QLineEdit" name="lineIP6Bridge">
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="4" column="0">
+           <widget class="QCheckBox" name="checkIPv6Router">
+            <property name="text">
+             <string>IPv6 Default Router</string>
+            </property>
+           </widget>
+          </item>
+          <item row="5" column="0">
+           <widget class="QLineEdit" name="lineIP6Router">
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="6" column="0">
+           <spacer name="verticalSpacer">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>140</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="tab_2">
+         <attribute name="title">
+          <string>Advanced</string>
+         </attribute>
+         <layout class="QGridLayout" name="gridLayout_3">
+          <item row="0" column="0">
+           <widget class="QComboBox" name="comboBox">
+            <item>
+             <property name="text">
+              <string>IPv4 Aliases</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>IPv4 Bridge Aliases</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>IPv6 Aliases</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>IPv6 Bridge Aliases</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QListWidget" name="listIP"/>
+          </item>
+          <item row="2" column="0">
+           <layout class="QHBoxLayout" name="horizontalLayout_2">
+            <item>
+             <spacer name="horizontalSpacer_2">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QPushButton" name="pushAdd">
+              <property name="text">
+               <string>&amp;Add</string>
+              </property>
+              <property name="icon">
+               <iconset>
+                <normaloff>:/add.png</normaloff>:/add.png</iconset>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="pushRemove">
+              <property name="text">
+               <string>&amp;Remove</string>
+              </property>
+              <property name="icon">
+               <iconset>
+                <normaloff>:/remove.png</normaloff>:/remove.png</iconset>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </widget>
       </item>
      </layout>
Index: src-qt4/warden-gui/dialogwarden.cpp
===================================================================
--- src-qt4/warden-gui/dialogwarden.cpp	(revision f66423f1b8f78efb268d0d110d5fbfdfa7d81938)
+++ src-qt4/warden-gui/dialogwarden.cpp	(revision 8901c471a3edc5def8f045e3450b592605a7bc8d)
@@ -1455,22 +1455,7 @@
      return;
 
-   QString IPs;
-
-   for (int i=0; i < jailDetails.count(); ++i) {
-     if ( jailDetails.at(i).at(0) != listJails->currentItem()->text(0) )
-        continue;
-     IPs = jailDetails.at(i).at(3);
-     if ( jailDetails.at(i).at(1) == "Pending" )
-	return;
-     break;
-   }
-  
-
    dIP = new dialogEditIP();
    connect(dIP, SIGNAL(saved()),this, SLOT(slotMonitorJailDetails()) );
-   if ( IPs.isEmpty() )
-      dIP->programInit(listJails->currentItem()->text(0), QStringList() );
-   else
-      dIP->programInit(listJails->currentItem()->text(0), IPs.split(" ") );
+   dIP->programInit(listJails->currentItem()->text(0));
    dIP->exec();
 
