diff --git a/src/main/java/net/floodlightcontroller/bgproute/BgpRoute.java b/src/main/java/net/floodlightcontroller/bgproute/BgpRoute.java
index 2819253..47f3d1a 100644
--- a/src/main/java/net/floodlightcontroller/bgproute/BgpRoute.java
+++ b/src/main/java/net/floodlightcontroller/bgproute/BgpRoute.java
@@ -1,5 +1,13 @@
 package net.floodlightcontroller.bgproute;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Collection;
 import java.util.Map;
 import java.util.ArrayList;
@@ -18,6 +26,9 @@
 import net.floodlightcontroller.restclient.RestClient;
 
 import net.floodlightcontroller.linkdiscovery.ILinkDiscovery;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,6 +41,10 @@
 	protected ITopologyService topology;
 	
 	protected static Ptree ptree;
+	protected static String BGPdRestIp;
+	protected static String RouterId;
+	
+	
 	
 	@Override
 	public Collection<Class<? extends IFloodlightService>> getModuleServices() {
@@ -41,7 +56,7 @@
 	@Override
 	public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
 		Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<Class<? extends IFloodlightService>, IFloodlightService>();
-		m.put(IBgpRouteService.class, this); 
+		m.put(IBgpRouteService.class, this);
 		return m;
 	}
 
@@ -69,11 +84,23 @@
 		
 		// Test.
 		//test();
+		  
 	}
 
 	public Ptree getPtree() {
 		return ptree;
 	}
+	public void  clearPtree() {
+		ptree = null;
+		ptree = new Ptree(32);
+		
+	}
+	public String getBGPdRestIp() {
+		return BGPdRestIp;
+	}
+	public String getRouterId() {
+		return RouterId;
+	}
 	
 	// Return nexthop address as byte array.
 	public Rib lookupRib(byte[] dest) {
@@ -154,8 +181,113 @@
 	
 	@Override
 	public void startUp(FloodlightModuleContext context) {
-		restApi.addRestletRoutable(new BgpRouteWebRoutable()); 
+		restApi.addRestletRoutable(new BgpRouteWebRoutable());
 		topology.addListener((ITopologyListener) this);
+		
+		 // get the BGPdRestIp and RouterId from transit-route-pusher.py
+  		File file = new File("/home/ubuntu/sdn/transit-route-pusher.py");  
+       
+        
+    try{  
+        BufferedReader input = new BufferedReader (new FileReader(file));  
+        String text; 
+        int is_BGPdRestIp=0;
+        int is_RouterId=0;
+        								                         
+        while((text = input.readLine()) != null && (is_BGPdRestIp == 0) || (is_RouterId == 0) ){  
+        					  
+        		if(is_BGPdRestIp == 1 && is_RouterId ==1)
+        		{break;}
+        		
+        				if(is_BGPdRestIp == 0 && text.contains("BGPdRestIp") ){
+		        				String[] temp =	text.split("\"");
+		        				BGPdRestIp = temp[1];
+		        				is_BGPdRestIp = 1;
+		        				
+        				
+            	}else if (is_RouterId == 0 && text.contains("RouterId") ){
+												
+		            	String[] temp =	text.split("\"");
+		    							RouterId = temp[1];
+		    							is_RouterId = 1;
+		    							
+    							
+									}
+        						
+        					}
+    
+                   
+    }  catch(Exception e){  
+       e.printStackTrace();
+           }  
+      
+		        
+			// automatically get the rib from bgpd at the ONOS initiation process.
+    String dest=RouterId;
+    String str="http://"+BGPdRestIp+"/wm/bgp/"+dest;
+	 		
+	          
+	try {
+	       	 
+				URL url = new URL(str);
+				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+				conn.setRequestMethod("GET");
+				conn.setRequestProperty("Accept", "application/json");
+		 
+				if (conn.getResponseCode() != 200) {
+					throw new RuntimeException("Failed : HTTP error code : "
+							+ conn.getResponseCode());
+				}
+	
+			 BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); 
+			 StringBuffer res = new StringBuffer();
+			 String line;
+			 while ((line = br.readLine()) != null) {
+				 	res.append(line);
+			 	}	   
+			 
+			 String res2=res.toString().replaceAll("\"", "'");
+			 JSONObject jsonObj = (JSONObject) JSONSerializer.toJSON(res2);  
+			 JSONArray rib_json_array = jsonObj.getJSONArray("rib");
+			 String router_id = jsonObj.getString("router-id");
+			       
+			 int size = rib_json_array.size();
+			 System.out.print("size:"+size+"\n");
+			 for (int j = 0; j < size; j++) {
+	        JSONObject second_json_object = rib_json_array.getJSONObject(j);
+	        String prefix = second_json_object.getString("prefix");
+	        String nexthop = second_json_object.getString("nexthop");
+	        
+	        //insert each rib entry into the local rib;
+	        String[] substring= prefix.split("/");
+	        String prefix1=substring[0];
+	        String mask1=substring[1];
+	        			
+						Prefix p = new Prefix(prefix1, Integer.valueOf(mask1));
+						PtreeNode node = ptree.acquire(p.getAddress(), p.masklen);
+						Rib rib = new Rib(router_id, nexthop, p.masklen);
+			
+						if (node.rib != null) {
+							node.rib = null;
+							ptree.delReference(node);
+						}
+						node.rib = rib;
+      
+			 }  
+			 br.close();
+			 conn.disconnect();
+
+			} catch (MalformedURLException e) {
+
+				e.printStackTrace();
+
+			} catch (IOException e) {
+
+				e.printStackTrace();
+
+			}
+	
+
 	}
 
 	@Override
diff --git a/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResource.java b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResource.java
index d5abb5a..28d9621 100644
--- a/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResource.java
+++ b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResource.java
@@ -7,6 +7,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import net.floodlightcontroller.restclient.RestClient;
+import java.io.UnsupportedEncodingException;  
+import java.nio.ByteBuffer;  
 
 public class BgpRouteResource extends ServerResource {
     
@@ -27,60 +29,85 @@
 	}
 	
 	@SuppressWarnings("unused")
-    @Get
-	public String get(String fmJson) {
-		String dest = (String) getRequestAttributes().get("dest");
-		String output = "";
-		IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
-                get(IBgpRouteService.class.getCanonicalName());
-		
-		if (dest != null) {
-			Prefix p = new Prefix(dest, 32);
-			if (p == null) {
-				return "[GET]: dest address format is wrong";
-			}
-			byte [] nexthop = bgpRoute.lookupRib(p.getAddress()).nextHop.getAddress();
-			if (nexthop != null) {
-				output += "{\"result\": \"" + addrToString(nexthop) + "\"}\n";
+	@Get
+		public String get(String fmJson) {		
+		String linpp=fmJson;
+			String dest = (String) getRequestAttributes().get("dest");
+			String output = "";
+			IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
+	                get(IBgpRouteService.class.getCanonicalName());
+			
+			if (dest != null) {
+				Prefix p = new Prefix(dest, 32);
+				if (p == null) {
+					return "[GET]: dest address format is wrong";
+				}
+							
+				// the dest here refers to router-id
+				//BGPdRestIp includes port number, such as 1.1.1.1:8080
+				String BGPdRestIp = bgpRoute.getBGPdRestIp();
+				String url="http://"+BGPdRestIp+"/wm/bgp/"+dest;
+				
+							
+				
+				RestClient.get(url);
+				output="Get rib from bgpd finished!\n";
+				return output;
+			
 			} else {
-				output += "{\"result\": \"Nexthop does not exist\"}\n";
-			}
-		} else {
-			Ptree ptree = bgpRoute.getPtree();
-			output += "{\n  \"rib\": [\n";
-			boolean printed = false;
-			for (PtreeNode node = ptree.begin(); node != null; node = ptree.next(node)) {
-				if (node.rib == null) {
-					continue;
+				Ptree ptree = bgpRoute.getPtree();
+				output += "{\n  \"rib\": [\n";
+				boolean printed = false;
+				for (PtreeNode node = ptree.begin(); node != null; node = ptree.next(node)) {
+					if (node.rib == null) {
+						continue;
+					}
+					if (printed == true) {
+						output += ",\n";
+					}
+					output += "    {\"prefix\": \"" + addrToString(node.key) + "/" + node.keyBits +"\", ";
+					output += "\"nexthop\": \"" + addrToString(node.rib.nextHop.getAddress()) +"\"}";
+					printed = true;
 				}
-				if (printed == true) {
-					output += ",\n";
-				}
-				output += "    {\"prefix\": \"" + addrToString(node.key) + "/" + node.keyBits +"\", ";
-				output += "\"nexthop\": \"" + addrToString(node.rib.nextHop.getAddress()) +"\"}";
-				printed = true;
+				//output += "{\"router_id\": \"" + addrToString(node.rib.routerId.getAddress()) +"\"}\n";
+				output += "\n  ]\n}\n";
+	   
 			}
-			//output += "{\"router_id\": \"" + addrToString(node.rib.routerId.getAddress()) +"\"}\n";
-			output += "\n  ]\n}\n";
+			return output;
 		}
-		
-		return output;
-	}
+
+	public static ByteBuffer toByteBuffer(String value) throws UnsupportedEncodingException
+	  {
+	  return ByteBuffer.wrap(value.getBytes("UTF-8"));
+	  }
+
+public static String toString(ByteBuffer buffer) throws UnsupportedEncodingException
+	 {
+	    byte[] bytes = new byte[buffer.remaining()];
+	    buffer.get(bytes);
+	    return new String(bytes, "UTF-8");
+	    
+	   }
+
+	
 	@Post
 	public String store(String fmJson) {
         IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
                 get(IBgpRouteService.class.getCanonicalName());
-
-	    Ptree ptree = bgpRoute.getPtree();
-
+ 	
+	  Ptree ptree = bgpRoute.getPtree();
+	
 		String router_id = (String) getRequestAttributes().get("routerid");
 		String prefix = (String) getRequestAttributes().get("prefix");
 		String mask = (String) getRequestAttributes().get("mask");
 		String nexthop = (String) getRequestAttributes().get("nexthop");
 		String capability = (String) getRequestAttributes().get("capability");
-		String reply = null;
+		
+	
+		String reply = "";
 		
 		if (capability == null) {
+		
 			// this is a prefix add
 			Prefix p = new Prefix(prefix, Integer.valueOf(mask));
 			PtreeNode node = ptree.acquire(p.getAddress(), p.masklen);
@@ -94,46 +121,73 @@
 			
 			reply = "[POST: " + prefix + "/" + mask + ":" + nexthop + "]";
 			log.info(reply);
+	
 			
-			RestClient.get("http://localhost:5000/bgp_update");
+		}else if(capability.equals("1")){
+			reply = "[POST-capability: " + capability + "]\n";
+			log.info(reply);
+			// to store the number in the top node of the Ptree	
+			
+		}else{			
+			reply = "[POST-capability: " + capability + "]\n";
+			log.info(reply);
+			// to store the number in the top node of the Ptree	
+	
 		}
 		
+		
 		return reply + "\n";
+		
+	
 	}
 	
 	@Delete
 	public String delete(String fmJson) {
-        IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
+		IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
                 get(IBgpRouteService.class.getCanonicalName());
 
-        Ptree ptree = bgpRoute.getPtree();
-		
+   Ptree ptree = bgpRoute.getPtree();
+      	
 		String routerId = (String) getRequestAttributes().get("routerid");
 		String prefix = (String) getRequestAttributes().get("prefix");
 		String mask = (String) getRequestAttributes().get("mask");
 		String nextHop = (String) getRequestAttributes().get("nexthop");
 		String capability = (String) getRequestAttributes().get("capability");
-		String reply = null;
+		
+		String reply = "";
 		
 		if (capability == null) {
-			// this is a prefix delete
-			Prefix p = new Prefix(prefix, Integer.valueOf(mask));
-			PtreeNode node = ptree.lookup(p.getAddress(), p.masklen);
-			Rib r = new Rib(routerId, nextHop, p.masklen);
-
-			if (node != null && node.rib != null) {
-				if (r.equals(node.rib)) {
-					node.rib = null;
-					ptree.delReference(node);
-				}
-			}
+					// this is a prefix delete
+					Prefix p = new Prefix(prefix, Integer.valueOf(mask));
+										
+					PtreeNode node = ptree.lookup(p.getAddress(), p.masklen);
+									
+					Rib r = new Rib(routerId, nextHop, p.masklen);
+					
+					if (node != null && node.rib != null) {
+						
+						if (r.equals(node.rib)) {
+							
+							node.rib = null;
+							ptree.delReference(node);					
+						}
+					}
+					
+							
+					reply =reply + "[DELE: " + prefix + "/" + mask + ":" + nextHop + "]";
+					
+		}else {
 			
-			reply = "[DELE: " + prefix + "/" + mask + ":" + nextHop + "]";
-			log.info(reply);
+			// clear the local rib: Ptree			
+			bgpRoute.clearPtree();
+			reply = "[DELE-capability: " + capability + "; The local Rib is cleared!]\n";
 			
-			RestClient.get("http://localhost:5000/bgp_update");
-		}
-
+			
+			// to store the number in the top node of the Ptree	
+				
+		}	
+		log.info(reply);
+	
 		return reply + "\n";
 	}
 }
diff --git a/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResourceSynch.java b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResourceSynch.java
new file mode 100644
index 0000000..d0c337a
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteResourceSynch.java
@@ -0,0 +1,72 @@
+package net.floodlightcontroller.bgproute;
+
+
+import org.restlet.resource.Post;
+import org.restlet.resource.Delete;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import net.floodlightcontroller.restclient.RestClient;
+
+
+public class BgpRouteResourceSynch extends ServerResource {
+    
+	protected static Logger log = LoggerFactory
+            .getLogger(BgpRouteResource.class);
+	
+	@Post
+	public String store(String fmJson) {
+		
+		IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
+                get(IBgpRouteService.class.getCanonicalName());
+	  
+		String router_id = (String) getRequestAttributes().get("routerid");
+		String prefix = (String) getRequestAttributes().get("prefix");
+		String mask = (String) getRequestAttributes().get("mask");
+		String nexthop = (String) getRequestAttributes().get("nexthop");
+				
+			try{		
+				
+			String BGPdRestIp = bgpRoute.getBGPdRestIp();	
+				
+			//BGPdRestIp includes port number, such as 1.1.1.1:8080
+			RestClient.post("http://"+BGPdRestIp+"/wm/bgp/"+router_id+"/"+prefix+"/"+mask+"/"+nexthop);
+			}catch(Exception e)
+			{e.printStackTrace();}
+			
+			String reply = "";
+			reply = "[POST: " + prefix + "/" + mask + ":" + nexthop + "/synch]";
+			log.info(reply);
+			
+    return reply + "\n";
+		
+	
+	}
+	
+	@Delete
+	public String delete(String fmJson) {
+		IBgpRouteService bgpRoute = (IBgpRouteService)getContext().getAttributes().
+                get(IBgpRouteService.class.getCanonicalName());
+        
+		String routerId = (String) getRequestAttributes().get("routerid");
+		String prefix = (String) getRequestAttributes().get("prefix");
+		String mask = (String) getRequestAttributes().get("mask");
+		String nextHop = (String) getRequestAttributes().get("nexthop");
+		
+		String reply = "";
+		try{
+					String BGPdRestIp = bgpRoute.getBGPdRestIp();	
+						
+					RestClient.delete("http://"+BGPdRestIp+"/wm/bgp/"+routerId+"/"+prefix+"/"+mask+"/"+nextHop);	
+														
+		}catch(Exception e)
+		{e.printStackTrace();}
+		
+		reply =reply + "[DELE: " + prefix + "/" + mask + ":" + nextHop + "/synch]";
+					
+		log.info(reply);		
+
+
+		return reply + "\n";
+	}
+}
diff --git a/src/main/java/net/floodlightcontroller/bgproute/BgpRouteWebRoutable.java b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteWebRoutable.java
index 37d5696..a18c550 100644
--- a/src/main/java/net/floodlightcontroller/bgproute/BgpRouteWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/bgproute/BgpRouteWebRoutable.java
@@ -12,7 +12,8 @@
 		Router router = new Router(context);
 		router.attach("/json", BgpRouteResource.class);
 		router.attach("/rib/{dest}", BgpRouteResource.class);
-		router.attach("/{routerid}/{prefix}/{mask}/{nexthop}", BgpRouteResource.class);
+		router.attach("/{routerid}/{prefix}/{mask}/{nexthop}", BgpRouteResource.class);		
+		router.attach("/{routerid}/{prefix}/{mask}/{nexthop}/synch", BgpRouteResourceSynch.class);
 		router.attach("/{routerid}/{capability}", BgpRouteResource.class);
 		return router;
 	}
diff --git a/src/main/java/net/floodlightcontroller/bgproute/IBgpRouteService.java b/src/main/java/net/floodlightcontroller/bgproute/IBgpRouteService.java
index 62bdf5e..a6025ef 100644
--- a/src/main/java/net/floodlightcontroller/bgproute/IBgpRouteService.java
+++ b/src/main/java/net/floodlightcontroller/bgproute/IBgpRouteService.java
@@ -8,4 +8,11 @@
     
     public Ptree getPtree();
     
+    public String getBGPdRestIp();
+    
+    public String getRouterId();
+    
+	  public void  clearPtree() ;
+       
+    
 }
diff --git a/src/main/java/net/floodlightcontroller/bgproute/Ptree.java b/src/main/java/net/floodlightcontroller/bgproute/Ptree.java
index d53789e..dcb6e83 100644
--- a/src/main/java/net/floodlightcontroller/bgproute/Ptree.java
+++ b/src/main/java/net/floodlightcontroller/bgproute/Ptree.java
@@ -13,7 +13,7 @@
 		maxKeyOctets = bit_to_octet(max_key_bits); 
 		refCount = 0;
 	}
-
+	
 	public PtreeNode acquire(byte [] key) {
 		return acquire(key, maxKeyBits);
 	}
@@ -278,6 +278,10 @@
 		
 		return add;
 	}
+	//add by linpp
+	private void clear() {
+	
+	}
 	
 	private void node_remove(PtreeNode node) {
 		PtreeNode child;
diff --git a/src/main/java/net/floodlightcontroller/bgproute/Rib.java b/src/main/java/net/floodlightcontroller/bgproute/Rib.java
index 71868ff..574e820 100644
--- a/src/main/java/net/floodlightcontroller/bgproute/Rib.java
+++ b/src/main/java/net/floodlightcontroller/bgproute/Rib.java
@@ -40,6 +40,7 @@
 	
 	public boolean equals(Rib r) {
 				
-		return this.routerId == r.routerId && this.nextHop == r.nextHop && this.masklen == r.masklen;
+		return this.routerId.equals(r.routerId) && this.nextHop.equals(r.nextHop)  && this.masklen == r.masklen;
+		
 	}
 }
diff --git a/src/main/java/net/floodlightcontroller/restclient/RestClient.java b/src/main/java/net/floodlightcontroller/restclient/RestClient.java
index 07eab45..541b42d 100644
--- a/src/main/java/net/floodlightcontroller/restclient/RestClient.java
+++ b/src/main/java/net/floodlightcontroller/restclient/RestClient.java
@@ -1,10 +1,17 @@
 package net.floodlightcontroller.restclient;
 
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
+
+
 public class RestClient {
 
 	public static void get (String str) {
@@ -16,7 +23,7 @@
 	 
 			URL url = new URL(str);
 			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-			conn.setRequestMethod("GET"); 
+			conn.setRequestMethod("GET");
 			conn.setRequestProperty("Accept", "application/json");
 	 
 			if (conn.getResponseCode() != 200) {
@@ -24,18 +31,68 @@
 						+ conn.getResponseCode());
 			}
 	 
-			/* Disable reading the output from the server for now
-			 * 
-			BufferedReader br = new BufferedReader(new InputStreamReader(
-					(conn.getInputStream())));
-	 
-			String output;
-			System.out.println("Output from Server .... \n");
-			while ((output = br.readLine()) != null) {
-				System.out.println(output);
-			}
-			 */
+			if (conn.getContentType().equals("application/json")) 
+			{	}else{
+				System.out.print("The content received is not json format!");				
+			}		
 			
+		 BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); 
+		 StringBuffer res = new StringBuffer();
+		 String line;
+		 while ((line = br.readLine()) != null) {
+			 	res.append(line);
+		 	}	   
+		 
+		 String res2=res.toString().replaceAll("\"", "'");
+		 JSONObject jsonObj = (JSONObject) JSONSerializer.toJSON(res2);  
+		 JSONArray rib_json_array = jsonObj.getJSONArray("rib");
+		 String router_id = jsonObj.getString("router-id");
+		       
+		 int size = rib_json_array.size();
+		 System.out.print("size:"+size+"\n");
+		 for (int j = 0; j < size; j++) {
+        JSONObject second_json_object = rib_json_array.getJSONObject(j);
+        String prefix = second_json_object.getString("prefix");
+        String nexthop = second_json_object.getString("nexthop");
+              			
+     		//insert each rib entry into the local rib;
+        RestClient.post("http://127.0.0.1:8090/wm/bgp/"+router_id+"/"+prefix+"/"+nexthop);
+          
+        
+        
+		 }
+		 br.close();
+		 conn.disconnect();
+
+		} catch (MalformedURLException e) {
+
+			e.printStackTrace();
+
+		} catch (IOException e) {
+
+			e.printStackTrace();
+
+		}
+	}
+	
+public static void post (String str) {
+		
+		if (str == null)
+			return;
+	
+		try {
+	 
+			URL url = new URL(str);
+			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+			conn.setDoOutput(true);
+			conn.setRequestMethod("POST");
+			conn.setRequestProperty("Content-Type", "application/json");		
+	 
+			if (conn.getResponseCode() != 200) {
+				throw new RuntimeException("Failed : HTTP error code : "
+						+ conn.getResponseCode());
+			}
+					
 			conn.disconnect();
 
 		} catch (MalformedURLException e) {
@@ -48,4 +105,38 @@
 
 		}
 	}
+	
+
+public static void delete (String str) {
+	
+	if (str == null)
+		return;
+
+	try {
+ 
+		URL url = new URL(str);
+		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+		conn.setRequestMethod("DELETE");
+		conn.setRequestProperty("Accept", "application/json");
+		
+ 
+		if (conn.getResponseCode() != 200) {
+			throw new RuntimeException("Failed : HTTP error code : "
+					+ conn.getResponseCode());
+		}
+ 
+		conn.disconnect();
+
+	} catch (MalformedURLException e) {
+
+		e.printStackTrace();
+
+	} catch (IOException e) {
+
+		e.printStackTrace();
+
+	}
+}
+	
+	
 }
