diff --git a/build.sbt b/build.sbt
index fb48094..715539a 100644
--- a/build.sbt
+++ b/build.sbt
@@ -17,7 +17,6 @@
 
   // added to assembly
   "org.scalatra"          %%  "scalatra"          % scalatraV,
-  "org.jhardware"         %   "jHardware"         % "0.8.4",
 
   // test dependencies
   "org.scalatra"          %%  "scalatra-scalatest"% scalatraV   % Test,
diff --git a/src/main/java/org/jutils/jhardware/HardwareInfo.java b/src/main/java/org/jutils/jhardware/HardwareInfo.java
new file mode 100644
index 0000000..f185183
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/HardwareInfo.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware;
+
+import java.util.Map;
+import java.util.Set;
+import org.jutils.jhardware.info.HardwareFactory;
+import org.jutils.jhardware.info.InfoType;
+import org.jutils.jhardware.model.BiosInfo;
+import org.jutils.jhardware.model.DisplayInfo;
+import org.jutils.jhardware.model.GraphicsCardInfo;
+import org.jutils.jhardware.model.MemoryInfo;
+import org.jutils.jhardware.model.MotherboardInfo;
+import org.jutils.jhardware.model.NetworkInfo;
+import org.jutils.jhardware.model.OSInfo;
+import org.jutils.jhardware.model.ProcessorInfo;
+
+/**
+ * Static class that allows to query for Hardware details.<p>
+ * Each method return the information related with a different component 
+ * (CPU, memory, motherboard....). There are some important data that comes
+ * typed in the response. This is the information that is common in different 
+ * system. The complete and specific information is returned in a Map.
+ * 
+ * @author Javier Garcia Alonso
+ */
+public class HardwareInfo {
+    
+    /**
+     * Hide constructor
+     */
+    private HardwareInfo() {
+    }
+    
+    /**
+     * Gets information related with CPU
+     * 
+     * @return object with typed common data and a map with full data
+     */
+    public static ProcessorInfo getProcessorInfo() {
+        return (ProcessorInfo)HardwareFactory.get(InfoType.PROCESSOR).getInfo();
+    }
+    
+    /**
+     * Gets information related with memory
+     * 
+     * @return object with typed common data and a map with full data
+     */
+    public static MemoryInfo getMemoryInfo() {
+        return (MemoryInfo)HardwareFactory.get(InfoType.MEMORY).getInfo();
+    }
+    
+    /**
+     * Gets information related with the Operating System
+     * 
+     * @return object with typed common data and a map with full data
+     */
+    public static OSInfo getOSInfo() {
+        return (OSInfo)HardwareFactory.get(InfoType.OS).getInfo();
+    }
+    
+    /**
+     * Gets information related with the Network
+     * 
+     * @return object with typed common data and a map with full data
+     */
+    public static NetworkInfo getNetworkInfo() {
+        return (NetworkInfo)HardwareFactory.get(InfoType.NETWORK).getInfo();
+    }
+    
+    public static void main(String [] args) {
+        ProcessorInfo info = HardwareInfo.getProcessorInfo();
+
+        System.out.println("Cache size: " + info.getCacheSize());        
+        System.out.println("Family: " + info.getFamily());
+        System.out.println("Speed (Mhz): " + info.getMhz());
+        System.out.println("Model: " + info.getModel());
+        System.out.println("Model name: " + info.getModelName());
+        System.out.println("Number of cores: " + info.getNumCores());
+        System.out.println("Stepping: " + info.getStepping());
+        System.out.println("Temperature: " + info.getTemperature());
+        System.out.println("Vendor Id: " + info.getVendorId());
+        
+        Set<Map.Entry<String, String>> fullInfos = info.getFullInfo().entrySet();
+
+        for(Map.Entry<String, String> fullInfo: fullInfos) {
+            System.out.println(fullInfo.getKey() + ": " + fullInfo.getValue());
+        }
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/info/HardwareFactory.java b/src/main/java/org/jutils/jhardware/info/HardwareFactory.java
new file mode 100644
index 0000000..a041b42
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/HardwareFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info;
+
+import org.jutils.jhardware.info.memory.unix.UnixMemoryInfo;
+import org.jutils.jhardware.info.network.unix.UnixNetworkInfo;
+import org.jutils.jhardware.info.os.unix.UnixOSInfo;
+import org.jutils.jhardware.info.processor.unix.UnixProcessorInfo;
+import org.jutils.jhardware.util.OSDetector;
+
+/**
+ * Factory class to get the right information
+ *
+ * @author Javier Garcia Alonso
+ */
+public class HardwareFactory {
+
+    /**
+     * Hide constructor
+     */
+    private HardwareFactory() {
+    }
+
+    public static HardwareInfo get(InfoType type) {
+        if (OSDetector.isUnix()) {
+            return getUnixInfo(type);
+        } else {
+            throw new UnsupportedOperationException("Your Operating System is not supported");
+        }
+    }
+
+    private static HardwareInfo getUnixInfo(InfoType type) {
+        switch (type) {
+            case PROCESSOR:
+                return new UnixProcessorInfo();
+            case MEMORY:
+                return new UnixMemoryInfo();
+            case OS:
+                return new UnixOSInfo();
+            case NETWORK:
+                return new UnixNetworkInfo();
+            default:
+                throw new IllegalArgumentException("Type of hardware not supported: " + type);
+        }
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/info/HardwareInfo.java b/src/main/java/org/jutils/jhardware/info/HardwareInfo.java
new file mode 100644
index 0000000..e2d95db
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/HardwareInfo.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info;
+
+import org.jutils.jhardware.model.ComponentInfo;
+
+/**
+ * Interface that represents a group of hardware information (cpu, memory, motherboard...)
+ * 
+ * @author Javier Garcia Alonso
+ */
+public interface HardwareInfo {
+    ComponentInfo getInfo();    
+}
diff --git a/src/main/java/org/jutils/jhardware/info/InfoType.java b/src/main/java/org/jutils/jhardware/info/InfoType.java
new file mode 100644
index 0000000..81238bd
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/InfoType.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info;
+
+/**
+ * The type of information to retrieve
+ * 
+ * @author Javier Garcia Alonso
+ */
+public enum InfoType {
+    PROCESSOR,
+    MEMORY,
+    OS,
+    NETWORK
+}
diff --git a/src/main/java/org/jutils/jhardware/info/memory/AbstractMemoryInfo.java b/src/main/java/org/jutils/jhardware/info/memory/AbstractMemoryInfo.java
new file mode 100644
index 0000000..b7acd3f
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/memory/AbstractMemoryInfo.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.memory;
+
+import java.util.Map;
+import org.jutils.jhardware.info.HardwareInfo;
+import org.jutils.jhardware.model.MemoryInfo;
+
+/**
+ * Information related to Memory
+ * 
+ * @author Javier Garcia Alonso
+ */
+public abstract class AbstractMemoryInfo implements HardwareInfo { 
+
+    /**
+     *
+     * @return
+     */
+    @Override
+    public MemoryInfo getInfo() {
+        return buildFromDataMap(parseInfo());
+    }
+    
+    protected abstract Map<String, String> parseInfo();
+    
+    protected MemoryInfo buildFromDataMap(Map<String, String> dataMap) {
+        MemoryInfo info = new MemoryInfo();
+        info.setFullInfo(dataMap);
+        if (dataMap != null && !dataMap.isEmpty()) {
+            info.setAvailableMemory(dataMap.get("MemAvailable"));
+            info.setFreeMemory(dataMap.get("MemFree"));
+            info.setTotalMemory(dataMap.get("MemTotal"));
+        }
+        
+        return info;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/info/memory/unix/UnixMemoryInfo.java b/src/main/java/org/jutils/jhardware/info/memory/unix/UnixMemoryInfo.java
new file mode 100644
index 0000000..2075c89
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/memory/unix/UnixMemoryInfo.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.memory.unix;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.jutils.jhardware.info.memory.AbstractMemoryInfo;
+import org.jutils.jhardware.util.HardwareInfoUtils;
+
+import java.util.List;
+/**
+ * Information related to Memory
+ * 
+ * @author Javier Garcia Alonso
+ */
+public final class UnixMemoryInfo extends AbstractMemoryInfo {
+    private static final String MEMINFO = "/proc/meminfo";
+    
+    private static String getMemoryData(){
+        List<String> streamMemoryInfo = HardwareInfoUtils.readFile(MEMINFO);
+        final StringBuilder buffer = new StringBuilder();
+
+        for (String line: streamMemoryInfo) {
+            buffer.append(line).append("\r\n");
+        }
+        
+        return buffer.toString();
+    }
+
+    @Override
+    protected Map<String, String> parseInfo() {
+        Map<String, String> memoryDataMap = new HashMap<>();
+        String[] dataStringLines = getMemoryData().split("\\r?\\n");
+
+        for (final String dataLine : dataStringLines) {
+            String[] dataStringInfo = dataLine.split(":");
+            memoryDataMap.put(dataStringInfo[0].trim(), (dataStringInfo.length == 2) ? dataStringInfo[1].trim() : "");
+        }
+
+        return memoryDataMap;
+    }    
+}
diff --git a/src/main/java/org/jutils/jhardware/info/network/AbstractNetworkInfo.java b/src/main/java/org/jutils/jhardware/info/network/AbstractNetworkInfo.java
new file mode 100644
index 0000000..6142737
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/network/AbstractNetworkInfo.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.network;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.jutils.jhardware.info.HardwareInfo;
+import org.jutils.jhardware.model.NetworkInfo;
+import org.jutils.jhardware.model.NetworkInterfaceInfo;
+
+/**
+ * Information related to Network
+ * 
+ * @author Javier Garcia Alonso
+ */
+public abstract class AbstractNetworkInfo implements HardwareInfo { 
+
+    /**
+     *
+     * @return
+     */
+    @Override
+    public NetworkInfo getInfo() {
+        return buildFromDataMap(parseInfo());
+    }
+    
+    protected abstract Map<String, String> parseInfo();
+    
+    protected NetworkInfo buildFromDataMap(Map<String, String> dataMap) {
+        NetworkInfo info = new NetworkInfo();
+        
+        List<NetworkInterfaceInfo> interfacesList = new ArrayList<>();
+        if (!dataMap.isEmpty()) {
+            int interfacesLength = Integer.parseInt(dataMap.get("interfacesLength"));
+            for (int i = 1; i<=interfacesLength; i++) {
+                NetworkInterfaceInfo interfaceInfo = new NetworkInterfaceInfo();
+                interfaceInfo.setName(dataMap.get("interface_" + i));
+                interfaceInfo.setType(dataMap.get("type_" + i));
+                interfaceInfo.setIpv4(dataMap.get("ipv4_" + i));
+                interfaceInfo.setIpv6(dataMap.get("ipv6_" + i));
+                interfaceInfo.setReceivedPackets(dataMap.get("received_packets_" + i));
+                interfaceInfo.setTransmittedPackets(dataMap.get("transmitted_packets_" + i));
+                interfaceInfo.setReceivedBytes(dataMap.get("received_bytes_" + i));
+                interfaceInfo.setTransmittedBytes(dataMap.get("transmitted_bytes_" + i));
+                interfacesList.add(interfaceInfo);
+            }
+        }
+        
+        info.setNetworkInterfaces(interfacesList);
+        
+        return info;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/info/network/unix/UnixNetworkInfo.java b/src/main/java/org/jutils/jhardware/info/network/unix/UnixNetworkInfo.java
new file mode 100644
index 0000000..9e152e0
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/network/unix/UnixNetworkInfo.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.network.unix;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.jutils.jhardware.info.network.AbstractNetworkInfo;
+import org.jutils.jhardware.util.HardwareInfoUtils;
+
+/**
+ * Information related to Network
+ *
+ * @author Javier Garcia Alonso
+ */
+public final class UnixNetworkInfo extends AbstractNetworkInfo {        
+
+    private static String getNetworkData() {
+        return HardwareInfoUtils.executeCommand("ifconfig", "-a");
+    }
+
+    @Override
+    protected Map<String, String> parseInfo() {
+        Map<String, String> networkDataMap = new HashMap<>();
+
+        String networkData = getNetworkData();
+        
+        if (networkData != null) {
+            String[] dataStringLines = networkData.split("\\r?\\n");
+
+            int count = 0;
+            for (final String dataLine : dataStringLines) {
+                if (!dataLine.startsWith(" ")) {
+                    count++;
+                    networkDataMap.put("interface_" + count, HardwareInfoUtils.extractText(dataLine, "([^\\s]+)"));
+                    networkDataMap.put("type_" + count, HardwareInfoUtils.extractText(dataLine, "Link encap:(.+?)  "));
+                } else {
+                    updateNetworkData(networkDataMap, count, dataLine);
+                }
+            }
+            networkDataMap.put("interfacesLength", String.valueOf(count));
+        }
+
+        return networkDataMap;
+    }
+
+    private static void updateNetworkData(Map<String, String> networkDataMap, int count, String dataLine) {
+        String lineType = HardwareInfoUtils.extractText(dataLine, "([^\\s]+)");
+        if (null != lineType) {
+            switch (lineType) {
+                case "inet":
+                    networkDataMap.put("ipv4_" + count, HardwareInfoUtils.extractText(dataLine, "addr:(.+?) "));
+                    break;
+                case "inet6":
+                    networkDataMap.put("ipv6_" + count, HardwareInfoUtils.extractText(dataLine, "addr:(.+?) "));
+                    break;
+                case "RX":
+                    if (dataLine.trim().startsWith("RX packets")) {
+                        networkDataMap.put("received_packets_" + count, HardwareInfoUtils.extractText(dataLine, "packets:(.+?) "));
+                    } else {
+                        networkDataMap.put("received_bytes_" + count, HardwareInfoUtils.extractText(dataLine, "RX bytes:(.+?) "));
+                        networkDataMap.put("transmitted_bytes_" + count, HardwareInfoUtils.extractText(dataLine, "TX bytes:(.+?) "));
+                    }
+                    break;
+                case "TX":
+                    networkDataMap.put("transmitted_packets_" + count, HardwareInfoUtils.extractText(dataLine, "packets:(.+?) "));
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    
+}
diff --git a/src/main/java/org/jutils/jhardware/info/os/AbstractOSInfo.java b/src/main/java/org/jutils/jhardware/info/os/AbstractOSInfo.java
new file mode 100644
index 0000000..c37afb3
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/os/AbstractOSInfo.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.os;
+
+import java.util.Map;
+import org.jutils.jhardware.info.HardwareInfo;
+import org.jutils.jhardware.model.OSInfo;
+
+/**
+ * Information related to Operating System
+ * 
+ * @author Javier Garcia Alonso
+ */
+public abstract class AbstractOSInfo implements HardwareInfo { 
+
+    /**
+     *
+     * @return
+     */
+    @Override
+    public OSInfo getInfo() {
+        return buildFromDataMap(parseInfo());
+    }
+    
+    protected abstract Map<String, String> parseInfo();
+    
+    protected OSInfo buildFromDataMap(Map<String, String> dataMap) {
+        OSInfo info = new OSInfo();
+        info.setFullInfo(dataMap);
+        
+        if (dataMap != null && !dataMap.isEmpty()) {
+            info.setName(dataMap.get("Name"));
+            info.setManufacturer(dataMap.get("Manufacturer"));
+            info.setVersion(dataMap.get("Version"));
+            info.setLastBootTime(dataMap.get("LastBootTime"));
+        }
+        
+        return info;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/info/os/unix/UnixOSInfo.java b/src/main/java/org/jutils/jhardware/info/os/unix/UnixOSInfo.java
new file mode 100644
index 0000000..f892eb8
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/os/unix/UnixOSInfo.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.os.unix;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import org.jutils.jhardware.info.os.AbstractOSInfo;
+import org.jutils.jhardware.util.HardwareInfoUtils;
+
+/**
+ * Information related to Operating System
+ *
+ * @author Javier Garcia Alonso
+ */
+public final class UnixOSInfo extends AbstractOSInfo {
+
+    private static final String OS_RELEASE = "/etc/os-release";
+    private static final String LINE_BREAK_REGEX = "\\r?\\n";
+
+    private static String getOSLsbReleaseData() {
+        String fullData = "";
+
+        fullData += HardwareInfoUtils.executeCommand("lsb_release", "-a");
+
+        return fullData;
+    }
+
+    private static String getOSStartTimeData() {
+        String fullData = "";
+
+        fullData += HardwareInfoUtils.executeCommand("last", "-x");
+
+        return fullData;
+    }
+
+    private static String getOSReleaseData() {
+        List<String> streamProcessorInfo = HardwareInfoUtils.readFile(OS_RELEASE);
+        final StringBuilder buffer = new StringBuilder();
+
+        for(String line: streamProcessorInfo) {
+            buffer.append(line).append("\r\n");
+        }
+
+        return buffer.toString();
+    }
+
+    @Override
+    protected Map<String, String> parseInfo() {
+        Map<String, String> osDataMap = new HashMap<>();
+        
+        String lsbRelease = getOSLsbReleaseData();
+        String[] dataStringLines = lsbRelease.split(LINE_BREAK_REGEX);
+
+        for (final String dataLine : dataStringLines) {
+            String[] dataStringInfo = dataLine.split(":");
+            osDataMap.put(dataStringInfo[0].trim(), (dataStringInfo.length == 2) ? dataStringInfo[1].trim() : "");
+        }
+        
+        String osRelease = getOSReleaseData();
+        dataStringLines = osRelease.split(LINE_BREAK_REGEX);
+
+        for (final String dataLine : dataStringLines) {
+            String[] dataStringInfo = dataLine.split("=");
+            osDataMap.put(HardwareInfoUtils.toCamelCase("OS_" + dataStringInfo[0].trim()), 
+                    (dataStringInfo.length == 2) ? dataStringInfo[1].trim().replaceAll("\"", "") : "");
+        }
+        
+        String startTimeFullData = getOSStartTimeData();
+        dataStringLines = startTimeFullData.split(LINE_BREAK_REGEX);
+
+        for (final String dataLine : dataStringLines) {
+            if (dataLine.startsWith("reboot")) {
+                osDataMap.put("LastBootTime", normalizeBootUpDate(dataLine.substring(39, 55)));
+                break;
+            }
+        }
+        
+        //Set named data
+        osDataMap.put("Manufacturer", osDataMap.get("Distributor ID"));
+        osDataMap.put("Name", osDataMap.get("Description"));
+        osDataMap.put("Version", osDataMap.get("Release"));
+      
+        return osDataMap;
+    }
+    
+    private static String normalizeBootUpDate(String rawBootUpdate) {
+         DateFormat df = new SimpleDateFormat("EEE MMM dd kk:mm yyyy", Locale.ENGLISH);
+         Date returnedDate;
+         try{
+             returnedDate = df.parse(rawBootUpdate + " " + Calendar.getInstance().get(Calendar.YEAR));
+         } catch(ParseException pe) {
+             return rawBootUpdate;
+         }
+         
+         return returnedDate.toString();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/jutils/jhardware/info/processor/AbstractProcessorInfo.java b/src/main/java/org/jutils/jhardware/info/processor/AbstractProcessorInfo.java
new file mode 100644
index 0000000..87eeae5
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/processor/AbstractProcessorInfo.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.processor;
+
+import java.util.Map;
+import org.jutils.jhardware.info.HardwareInfo;
+import org.jutils.jhardware.model.ProcessorInfo;
+
+/**
+ * Information related to CPU
+ * 
+ * @author Javier Garcia Alonso
+ */
+public abstract class AbstractProcessorInfo implements HardwareInfo {
+
+    @Override
+    public ProcessorInfo getInfo() {
+        return buildFromDataMap(parseInfo());
+    }
+    
+    protected abstract Map<String, String> parseInfo();
+    
+    protected ProcessorInfo buildFromDataMap(Map<String, String> dataMap) {
+        ProcessorInfo info = new ProcessorInfo();
+        info.setFullInfo(dataMap);
+        
+        if (dataMap != null && !dataMap.isEmpty()) {
+            info.setCacheSize(dataMap.get("cache size"));
+            info.setFamily(dataMap.get("cpu family"));
+            info.setMhz(dataMap.get("cpu MHz"));
+            info.setModel(dataMap.get("model"));
+            info.setModelName(dataMap.get("model name"));
+            info.setNumCores(dataMap.get("cpu cores"));
+            info.setStepping(dataMap.get("stepping"));
+            info.setTemperature(dataMap.get("temperature"));
+            info.setVendorId(dataMap.get("vendor_id"));
+        }
+        
+        return info;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/info/processor/unix/UnixProcessorInfo.java b/src/main/java/org/jutils/jhardware/info/processor/unix/UnixProcessorInfo.java
new file mode 100644
index 0000000..667cd4a
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/info/processor/unix/UnixProcessorInfo.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.info.processor.unix;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.jutils.jhardware.info.processor.AbstractProcessorInfo;
+import org.jutils.jhardware.util.HardwareInfoUtils;
+
+import java.util.List;
+/**
+ * Information related to CPU
+ *
+ * @author Javier Garcia Alonso
+ */
+public final class UnixProcessorInfo extends AbstractProcessorInfo {
+
+    private static final String CPUINFO = "/proc/cpuinfo";    
+
+    public static String getProcessorData() {
+        List<String> streamProcessorInfo = HardwareInfoUtils.readFile(CPUINFO);
+        final StringBuilder buffer = new StringBuilder();
+
+        for(String line: streamProcessorInfo) {
+            buffer.append(line).append("\r\n");
+        }
+        return buffer.toString();
+    }
+
+    @Override
+    protected Map<String, String> parseInfo() {
+        Map<String, String> processorDataMap = new HashMap<>();
+        String[] dataStringLines = getProcessorData().split("\\r?\\n");
+
+        for (final String dataLine : dataStringLines) {
+            String[] dataStringInfo = dataLine.split(":");
+            processorDataMap.put(dataStringInfo[0].trim(),
+                    (dataStringInfo.length == 2) ? dataStringInfo[1].trim() : "");
+        }
+
+        return processorDataMap;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/model/BiosInfo.java b/src/main/java/org/jutils/jhardware/model/BiosInfo.java
new file mode 100644
index 0000000..7076335
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/BiosInfo.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class BiosInfo implements ComponentInfo {
+    private String date;
+    private String manufacturer;
+    private String version;
+   
+    private Map<String, String> fullInfo;
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getManufacturer() {
+        return manufacturer;
+    }
+
+    public void setManufacturer(String manufacturer) {
+        this.manufacturer = manufacturer;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+    
+    public Map<String, String> getFullInfo() {
+        return fullInfo;
+    }
+
+    public void setFullInfo(Map<String, String> fullInfo) {
+        this.fullInfo = fullInfo;
+    }
+    
+}
diff --git a/src/main/java/org/jutils/jhardware/model/ComponentInfo.java b/src/main/java/org/jutils/jhardware/model/ComponentInfo.java
new file mode 100644
index 0000000..d29199d
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/ComponentInfo.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public interface ComponentInfo extends Serializable {
+    
+}
diff --git a/src/main/java/org/jutils/jhardware/model/Display.java b/src/main/java/org/jutils/jhardware/model/Display.java
new file mode 100644
index 0000000..56e0808
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/Display.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016 javier.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+/**
+ *
+ * @author javier
+ */
+public class Display {
+    private String name;
+    private String currentResolution;
+    private String refreshRate;
+    private String[] supportedResolutions;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public String getCurrentResolution() {
+        return currentResolution;
+    }
+
+    public void setCurrentResolution(String currentResolution) {
+        this.currentResolution = currentResolution;
+    }
+
+    public String getRefreshRate() {
+        return refreshRate;
+    }
+
+    public void setRefreshRate(String refreshRate) {
+        this.refreshRate = refreshRate;
+    }
+
+    public String[] getSupportedResolutions() {
+        return supportedResolutions;
+    }
+
+    public void setSupportedResolutions(String[] supportedResolutions) {
+        this.supportedResolutions = supportedResolutions;
+    }
+    
+    
+}
diff --git a/src/main/java/org/jutils/jhardware/model/DisplayInfo.java b/src/main/java/org/jutils/jhardware/model/DisplayInfo.java
new file mode 100644
index 0000000..3004b16
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/DisplayInfo.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.List;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class DisplayInfo implements ComponentInfo {
+    List<Display> displayDevices;
+
+    public List<Display> getDisplayDevices() {
+        return displayDevices;
+    }
+
+    public void setDisplayDevices(List<Display> displayDevices) {
+        this.displayDevices = displayDevices;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/model/GraphicsCard.java b/src/main/java/org/jutils/jhardware/model/GraphicsCard.java
new file mode 100644
index 0000000..c6078d1
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/GraphicsCard.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2016 javier.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+/**
+ *
+ * @author javier
+ */
+public class GraphicsCard {
+
+    private String name;
+    private String manufacturer;
+    private String chipType;
+    private String dacType;
+    private String deviceType;
+    private String temperature;
+    private String fanSpeed;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getManufacturer() {
+        return manufacturer;
+    }
+
+    public void setManufacturer(String manufacturer) {
+        this.manufacturer = manufacturer;
+    }
+
+    public String getChipType() {
+        return chipType;
+    }
+
+    public void setChipType(String chipType) {
+        this.chipType = chipType;
+    }
+
+    public String getDacType() {
+        return dacType;
+    }
+
+    public void setDacType(String dacType) {
+        this.dacType = dacType;
+    }
+
+    public String getDeviceType() {
+        return deviceType;
+    }
+
+    public void setDeviceType(String deviceType) {
+        this.deviceType = deviceType;
+    }
+
+    public String getTemperature() {
+        return temperature;
+    }
+
+    public void setTemperature(String temperature) {
+        this.temperature = temperature;
+    }
+
+    public String getFanSpeed() {
+        return fanSpeed;
+    }
+
+    public void setFanSpeed(String fanSpeed) {
+        this.fanSpeed = fanSpeed;
+    }
+
+}
diff --git a/src/main/java/org/jutils/jhardware/model/GraphicsCardInfo.java b/src/main/java/org/jutils/jhardware/model/GraphicsCardInfo.java
new file mode 100644
index 0000000..7b6c195
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/GraphicsCardInfo.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016 Javier Garcia Alonso.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.List;
+
+/**
+ * Model that encapsulates graphics card information
+ *
+ * @author Javier Garcia Alonso
+ */
+public class GraphicsCardInfo implements ComponentInfo {
+
+    List<GraphicsCard> graphicsCards;
+
+    public List<GraphicsCard> getGraphicsCards() {
+        return graphicsCards;
+    }
+
+    public void setGraphicsCards(List<GraphicsCard> graphicsCards) {
+        this.graphicsCards = graphicsCards;
+    }
+
+}
diff --git a/src/main/java/org/jutils/jhardware/model/MemoryInfo.java b/src/main/java/org/jutils/jhardware/model/MemoryInfo.java
new file mode 100644
index 0000000..6c7fdae
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/MemoryInfo.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class MemoryInfo implements ComponentInfo {
+    private String totalMemory;
+    private String freeMemory;
+    private String availableMemory;
+   
+    private Map<String, String> fullInfo;
+
+    public String getTotalMemory() {
+        return totalMemory;
+    }
+
+    public void setTotalMemory(String totalMemory) {
+        this.totalMemory = totalMemory;
+    }
+
+    public String getFreeMemory() {
+        return freeMemory;
+    }
+
+    public void setFreeMemory(String freeMemory) {
+        this.freeMemory = freeMemory;
+    }
+
+    public String getAvailableMemory() {
+        return availableMemory;
+    }
+
+    public void setAvailableMemory(String availableMemory) {
+        this.availableMemory = availableMemory;
+    }
+
+    public Map<String, String> getFullInfo() {
+        return fullInfo;
+    }
+
+    public void setFullInfo(Map<String, String> fullInfo) {
+        this.fullInfo = fullInfo;
+    }
+    
+    
+}
diff --git a/src/main/java/org/jutils/jhardware/model/MotherboardInfo.java b/src/main/java/org/jutils/jhardware/model/MotherboardInfo.java
new file mode 100644
index 0000000..2c789bd
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/MotherboardInfo.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class MotherboardInfo implements ComponentInfo {
+
+    private String name;
+    private String manufacturer;
+    private String version;
+
+    private Map<String, String> fullInfo;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getManufacturer() {
+        return manufacturer;
+    }
+
+    public void setManufacturer(String manufacturer) {
+        this.manufacturer = manufacturer;
+    }
+
+    public Map<String, String> getFullInfo() {
+        return fullInfo;
+    }
+
+    public void setFullInfo(Map<String, String> fullInfo) {
+        this.fullInfo = fullInfo;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+}
diff --git a/src/main/java/org/jutils/jhardware/model/NetworkInfo.java b/src/main/java/org/jutils/jhardware/model/NetworkInfo.java
new file mode 100644
index 0000000..ce2474e
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/NetworkInfo.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.List;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class NetworkInfo implements ComponentInfo {
+    private List<NetworkInterfaceInfo> networkInterfaces;
+
+    public List<NetworkInterfaceInfo> getNetworkInterfaces() {
+        return networkInterfaces;
+    }
+
+    public void setNetworkInterfaces(List<NetworkInterfaceInfo> networkInterfaces) {
+        this.networkInterfaces = networkInterfaces;
+    }
+    
+}
diff --git a/src/main/java/org/jutils/jhardware/model/NetworkInterfaceInfo.java b/src/main/java/org/jutils/jhardware/model/NetworkInterfaceInfo.java
new file mode 100644
index 0000000..6513652
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/NetworkInterfaceInfo.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class NetworkInterfaceInfo implements ComponentInfo{
+    private String name;
+    private String type;
+    private String ipv4;
+    private String ipv6;
+    private String receivedPackets;
+    private String transmittedPackets;
+    private String receivedBytes;
+    private String transmittedBytes;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getIpv4() {
+        return ipv4;
+    }
+
+    public void setIpv4(String ipv4) {
+        this.ipv4 = ipv4;
+    }
+
+    public String getIpv6() {
+        return ipv6;
+    }
+
+    public void setIpv6(String ipv6) {
+        this.ipv6 = ipv6;
+    }
+
+    public String getReceivedPackets() {
+        return receivedPackets;
+    }
+
+    public void setReceivedPackets(String receivedPackets) {
+        this.receivedPackets = receivedPackets;
+    }
+
+    public String getTransmittedPackets() {
+        return transmittedPackets;
+    }
+
+    public void setTransmittedPackets(String transmittedPackets) {
+        this.transmittedPackets = transmittedPackets;
+    }
+
+    public String getReceivedBytes() {
+        return receivedBytes;
+    }
+
+    public void setReceivedBytes(String receivedBytes) {
+        this.receivedBytes = receivedBytes;
+    }
+
+    public String getTransmittedBytes() {
+        return transmittedBytes;
+    }
+
+    public void setTransmittedBytes(String transmittedBytes) {
+        this.transmittedBytes = transmittedBytes;
+    }    
+}
diff --git a/src/main/java/org/jutils/jhardware/model/OSInfo.java b/src/main/java/org/jutils/jhardware/model/OSInfo.java
new file mode 100644
index 0000000..d22a5c8
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/OSInfo.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class OSInfo implements ComponentInfo {
+    private String version;
+    private String lastBootTime;
+    private String name;
+    private String manufacturer;
+    private Map<String, String> fullInfo;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getLastBootTime() {
+        return lastBootTime;
+    }
+
+    public void setLastBootTime(String lastBootTime) {
+        this.lastBootTime = lastBootTime;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getManufacturer() {
+        return manufacturer;
+    }
+
+    public void setManufacturer(String manufacturer) {
+        this.manufacturer = manufacturer;
+    }
+    
+    public Map<String, String> getFullInfo() {
+        return fullInfo;
+    }
+
+    public void setFullInfo(Map<String, String> fullInfo) {
+        this.fullInfo = fullInfo;
+    }
+    
+}
diff --git a/src/main/java/org/jutils/jhardware/model/ProcessorInfo.java b/src/main/java/org/jutils/jhardware/model/ProcessorInfo.java
new file mode 100644
index 0000000..092106e
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/model/ProcessorInfo.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.model;
+
+import java.util.Map;
+
+/**
+ * Model that encapsulates processor information
+ * 
+ * @author Javier Garcia Alonso
+ */
+public class ProcessorInfo implements ComponentInfo{
+    private String vendorId;
+    private String family;
+    private String model;
+    private String modelName;
+    private String stepping;
+    private String mhz;
+    private String cacheSize;
+    private String numCores;
+    private String temperature;
+    
+    private Map<String, String> fullInfo;
+
+    public String getVendorId() {
+        return vendorId;
+    }
+
+    public void setVendorId(String vendorId) {
+        this.vendorId = vendorId;
+    }
+
+    public String getFamily() {
+        return family;
+    }
+
+    public void setFamily(String family) {
+        this.family = family;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getModelName() {
+        return modelName;
+    }
+
+    public void setModelName(String modelName) {
+        this.modelName = modelName;
+    }
+
+    public String getStepping() {
+        return stepping;
+    }
+
+    public void setStepping(String stepping) {
+        this.stepping = stepping;
+    }
+
+    public String getMhz() {
+        return mhz;
+    }
+
+    public void setMhz(String mhz) {
+        this.mhz = mhz;
+    }
+
+    public String getCacheSize() {
+        return cacheSize;
+    }
+
+    public void setCacheSize(String cacheSize) {
+        this.cacheSize = cacheSize;
+    }
+
+    public String getNumCores() {
+        return numCores;
+    }
+
+    public void setNumCores(String numCores) {
+        this.numCores = numCores;
+    }
+
+    public String getTemperature() {
+        return temperature;
+    }
+
+    public void setTemperature(String temperature) {
+        this.temperature = temperature;
+    }
+
+    public Map<String, String> getFullInfo() {
+        return fullInfo;
+    }
+
+    public void setFullInfo(Map<String, String> fullInfo) {
+        this.fullInfo = fullInfo;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/util/HardwareInfoUtils.java b/src/main/java/org/jutils/jhardware/util/HardwareInfoUtils.java
new file mode 100644
index 0000000..a49e45d
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/util/HardwareInfoUtils.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.util;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author Javier Garcia Alonso
+ */
+public class HardwareInfoUtils {
+
+    private static final String CRLF = "\r\n";
+
+    private static final String NOT_FOUND = "NOT_FOUND";
+
+    private static final Logger log = Logger.getLogger(HardwareInfoUtils.class.getName());
+    
+    //Hide constructor
+    private HardwareInfoUtils() {
+
+    }
+
+    public static List<String> readFile(String filePath) {
+        Path path = Paths.get(filePath);
+
+        List<String> fileLines = new ArrayList<>();
+        try(BufferedReader reader = new BufferedReader(new FileReader(path.toFile()))) {
+            String line;
+            while(null != (line = reader.readLine())) {
+                fileLines.add(line);
+            }
+        } catch (IOException ex) {
+            log.log(Level.SEVERE, "Unable to read file " + filePath, ex);
+        }
+
+        return fileLines;
+    }
+    
+    public static String getSingleValueFromFile(String filePath) {
+        try(BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
+            return reader.readLine();
+        } catch (IOException ex) {
+            log.log(Level.SEVERE, "Unable to read file " + filePath, ex);
+            return null;
+        }
+    }
+
+    public static String executeCommand(String... command) {
+        String commandOutput = null;
+
+        try {
+            ProcessBuilder processBuilder = new ProcessBuilder(command);
+            processBuilder.redirectErrorStream(true); // redirect error stream to output stream
+
+            commandOutput = readData(processBuilder.start());
+        } catch (IOException ex) {
+            Logger.getLogger(HardwareInfoUtils.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+        return commandOutput;
+    }
+
+    private static String readData(Process process) {
+        StringBuilder commandOutput = new StringBuilder();
+        BufferedReader processOutput = null;
+
+        try {          
+             processOutput = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            
+            String line;
+            while ((line = processOutput.readLine()) != null) {
+                if (!line.isEmpty()) {
+                    commandOutput.append(line).append(CRLF);
+                }
+            }
+        } catch (IOException ex) {
+            Logger.getLogger(HardwareInfoUtils.class.getName()).log(Level.SEVERE, null, ex);
+        } finally {
+            try {
+                if (processOutput != null) {
+                    processOutput.close();
+                }
+            } catch (IOException ioe) {
+                Logger.getLogger(HardwareInfoUtils.class.getName()).log(Level.SEVERE, null, ioe);
+            }
+        }
+
+        return commandOutput.toString();
+    }
+
+    public static boolean isSudo() {
+        return executeCommand("sudo", "-n", "true").length() == 0;
+    }
+
+    public static String toCamelCase(String s) {
+        String[] parts = s.split("_");
+        String camelCaseString = "";
+        for (String part : parts) {
+            camelCaseString = camelCaseString + toProperCase(part);
+        }
+        return camelCaseString;
+    }
+
+    private static String toProperCase(String s) {
+        return s.substring(0, 1).toUpperCase()
+                + s.substring(1).toLowerCase();
+    }
+    
+    public static String removeAllSpaces(String s) {
+        return s.replaceAll("\\s+", "");
+    }
+    
+    public static String extractText(String text, String regex) {
+        if (text.trim().isEmpty()) {
+            return NOT_FOUND;
+        }
+
+        final Pattern pattern = Pattern.compile(regex);
+        final Matcher matcher = pattern.matcher(text);
+
+        matcher.find();
+        if (matcher.groupCount() > 0) {
+            return matcher.group(1);
+        }
+        return NOT_FOUND;
+    }
+}
diff --git a/src/main/java/org/jutils/jhardware/util/OSDetector.java b/src/main/java/org/jutils/jhardware/util/OSDetector.java
new file mode 100644
index 0000000..d292627
--- /dev/null
+++ b/src/main/java/org/jutils/jhardware/util/OSDetector.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jutils.jhardware.util;
+
+/**
+ * Detects used OS
+ * 
+ * @author Javier Garcia Alonso
+ */
+public class OSDetector {
+    private static final String OS = System.getProperty("os.name").toLowerCase();
+    
+     /**
+     * Hide constructor
+     */
+    private OSDetector() {
+    }    
+
+    public static boolean isWindows() {
+        return OS.contains("win");
+    }
+
+    public static boolean isMac() {
+        return OS.contains("mac");
+    }
+
+    public static boolean isUnix() {
+        return OS.contains("nix") || OS.contains("nux") || OS.contains("aix");
+    }
+
+    public static boolean isSolaris() {
+        return OS.contains("sunos");
+    }
+}
