Yup. The networking functionality is in the TPGNet object (PGNetworking unit). You can create your own instance or use the instance already created in the global application object PG.

[code=delphi]// open a local port
PG.Net.Open(1024);

// send some data
PG.Net.Send("host name or IP address", 1024, SomeData, SomeDataSize);

// set method to receive data
PG.Net.ReceiveEvent := MyClass.ReciveEvent;

// receive data
procedure MyClass.ReceiveEvent(const aHost: TPGString; aPort: Integer; aData: Pointer; aSize: Integer)
begin
// process data
end;[/code]

Data will be buffered and sent out in order and continue to send if there is an error until the timeout limit is reached. You can wrap around this what ever you need for your own projects. For example derive a new class that can serialize a TPGPeristentObject to a memory stream then send this over the wire. The ReceiveEvent is overridden to deserialize the data and recreate the object, thus giving you network object persistence.

In addition to UDP, there are some HTTP and SMTP methods as well:

[code=delphi] { Http }
function GetHttp(const aUserName, aPassword, aUrl: TPGString): TPGString; virtual;
function GetHttpResponseText: TPGString; virtual;
function GetHttpResponseCode: Integer; virtual;
{ Smtp }
function SendMail(const aMailAgent, aUserName, aPassword, aUserHost, aSubject, aTo, aFrom, aText: TPGString; aPort: Integer): TPGString; virtual;[/code]

Need to post data to a URL and get a response? No problem, just call:
PG.Net.GetHttp(...)

Need to send out some mail within your app? Again, not a problem, call:
PG.Net.SendMail(...)